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

时间:2012-11-24 07:10:12

标签: gcc assembly linux-kernel inline-assembly

代码:

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;
}

我不明白" js 2f \ n \ t "中的 f b in" jne 1b \ n ",如何 明白这一点 ?我应该看哪本书?谢谢。

2 个答案:

答案 0 :(得分:9)

在此上下文中,f表示转发,b表示向后。因此js 2f表示如果符号设置,会跳转到标签2。

您需要查看gcc inline assembly。我似乎无法在网上找到任何参考资料,但我知道你可以在Professional Assembly Language找到它。

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

  

如果您的C代码中有另一个asm部分,则无法使用   再次使用相同的标签,或者由于重复而导致出现错误消息   使用标签。

那我们该怎么办?

  

解决方案是使用本地标签。有条件的和   无条件分支允许您指定一个数字作为标签   带有方向标志,指示处理器应该采用哪种方式   寻找数字标签。发现标签的第一次出现   将被采取。

关于修饰符:

  

使用f修饰符指示标签从跳转开始   指令。要向后移动,必须使用b修饰符。

答案 1 :(得分:1)

汇编程序的manual中记录了这一点。