what's meaning of f in "js 2f\n\t"?
assembly, gcc, inline-assembly, linux-kernel
Solution
In this context `f` means forward and `b` means backward. So `js 2f` means jump forward to label 2, if sign set.
You'll want to look into `gcc inline assembly`. I can't seem to find any reference online to include this bit, but I know you can find it in Professional Assembly Language.
Why can't we use named labels ? To quote from the book:
If you have another asm section in your C code, you cannot use the same labels again, or an error message will result due to duplicate use of labels.
So what can we do ?
The solution is to use local labels. Both conditional and unconditional branches allow you to specify a number as a label, along with a directional flag to indicate which way the processor should look for the numerical label. The first occurrence of the label found will be taken.
About modifiers:
Use the f modifier to indicate the label is forward from the jump instruction. To move backward, you must use the b modifier.
Problem
the codes: ``` extern inline int strncmp(const char * cs, const char * ct, int count) { register int __res; __asm__("cld\n" "1:\tdecl %3\n\t" "js 2f\n\t" "lodsb\n\t" "scasb\n\t" "jne 3f\n\t" "testb %%al, %%al\n\t" "jne 1b\n" "2:\txorl %%eax,%%eax\n\t" "jmp 4f\n" "3:\tmovl $1,%%eax\n\t" "j1 4f\n\t" "negl %%eax\n" "4:" :"=a" (__res):"D" (cs), "S" (ct), "c" (count):"si","di","cx"); return __res; } ``` I don't understand the f in "js 2f\n\t" and the b in "jne 1b\n", How to understand this ? which book I should look? Thank you.