【问题标题】:what's meaning of f in "js 2f\n\t"?“js 2f\n\t”中的 f 是什么意思?
【发布时间】:2012-11-12 09:54:53
【问题描述】:

代码:

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和“jne 1b”中的b \n", 如何 明白此事 ?我应该看哪本书?谢谢。

【问题讨论】:

    标签: gcc assembly linux-kernel inline-assembly


    【解决方案1】:

    在此上下文中,f 表示前进,b 表示后退。所以js 2f 表示如果设置了符号,则向前跳到标签 2

    您需要查看gcc inline assembly。我似乎无法在网上找到任何参考来包含这一点,但我知道你可以在 Professional Assembly Language 中找到它。

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

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

    那么我们能做些什么呢?

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

    关于修饰符:

    使用 f 修饰符表示标签从跳转开始向前 操作说明。要向后移动,您必须使用 b 修饰符。

    【讨论】:

    • 这是否意味着同一个标签可以在同一个块中出现多次?
    • @NPE 不,这意味着您可以在一个块中定义标签,而不必担心同一翻译单元中的其他块。
    • 我明白了。现在它是有道理的。感谢您的澄清。
    【解决方案2】:

    这在汇编程序的manual 中有记录。

    【讨论】:

      猜你喜欢
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 2018-11-24
      • 2020-03-03
      • 1970-01-01
      相关资源
      最近更新 更多