Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

what's meaning of f in "js 2f\n\t"?

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.

like image 858
lxgeek Avatar asked Oct 21 '25 19:10

lxgeek


1 Answers

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.

like image 167
cnicutar Avatar answered Oct 24 '25 19:10

cnicutar



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!