"js 2f \n\t"中f的含义是什么?

lxg*_*eek 3 assembly gcc inline-assembly linux-kernel

代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

我不理解" js 2f \n\t "中的f和" jne 1b \n "中的b,如何理解这一点?我应该看哪本书?谢谢.

cni*_*tar 9

在这种情况下f意味着向前和b向后意味着.因此,如果符号设置,则js 2f意味着跳转到标签2.

你会想看看gcc inline assembly.我似乎无法在网上找到任何参考,但我知道你可以在专业汇编语言中找到它.

为什么我们不能使用命名标签?引用这本书:

如果您的C代码中有另一个asm部分,则不能再次使用相同的标签,否则将因重复使用标签而导致出现错误消息.

所以,我们能做些什么 ?

解决方案是使用本地标签.条件和无条件分支都允许您指定一个数字作为标签,以及一个方向标志,以指示处理器应该查找数字标签的方式.将首先出现标签.

关于修饰符:

使用f修饰符指示标签是从跳转指令转发的.要向后移动,必须使用b修饰符.