代码:
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 ",如何 明白这一点 ?我应该看哪本书?谢谢。
答案 0 :(得分:9)
在此上下文中,f
表示转发,b
表示向后。因此js 2f
表示如果符号设置,会跳转到标签2。
您需要查看gcc inline assembly
。我似乎无法在网上找到任何参考资料,但我知道你可以在Professional Assembly Language找到它。
为什么我们不能使用命名标签?引用这本书:
如果您的C代码中有另一个asm部分,则无法使用 再次使用相同的标签,或者由于重复而导致出现错误消息 使用标签。
那我们该怎么办?
解决方案是使用本地标签。有条件的和 无条件分支允许您指定一个数字作为标签 带有方向标志,指示处理器应该采用哪种方式 寻找数字标签。发现标签的第一次出现 将被采取。
关于修饰符:
使用f修饰符指示标签从跳转开始 指令。要向后移动,必须使用b修饰符。
答案 1 :(得分:1)
汇编程序的manual中记录了这一点。