【问题标题】:Switching between Intel and ATT mode in GCC在 GCC 中在 Intel 和 ATT 模式之间切换
【发布时间】:2015-03-24 00:06:15
【问题描述】:

所以我有这个内联汇编代码和我的 C 代码,我想使用 intel 语法来调用 asm(),但是我需要切换回 ATT 语法,否则它会给出一长串错误。

asm(".intel_syntax prefix");
     asm volatile (
        "add %0, $1 \n\t"
         : "=r" (dst)
         : "r" (src)); 

asm(".att_syntax prefix");

现在它给出了以下错误

/tmp/ccDNa2Wk.s: Assembler messages:
/tmp/ccDNa2Wk.s:180: Error: no such instruction: `movl -16(%ebp),%eax'
/tmp/ccDNa2Wk.s:187: Error: no such instruction: `movl %eax,-12(%ebp)'

我不明白如何修复错误,我的代码的任何部分都没有调用 movl。

【问题讨论】:

标签: c gcc assembly nasm


【解决方案1】:

由于您还没有接受答案(),让我补充第三个想法:

1) 不要使用 3 个 asm 语句,而是使用 1 个:

asm(".intel_syntax prefix\n\t"
    "add %0, 1 \n\t"
    ".att_syntax prefix"
     : "=r" (dst)
     : "r" (src));

2) 更改编译选项以包含 -masm=intel 并省略 2 个语法语句。

3) 可以同时支持both intel 和att。这样,您的代码就可以使用为 -masm 传递的任何值:

asm("{addl $1, %0 | add %0, 1}"
     : "=r" (dst)
     : "r" (src));

我还应该提到您的 asm 可能无法按预期工作。由于您正在更新 dst 的内容(而不是覆盖它),您可能想要使用“+r”而不是“=r”。而且你确实意识到这段代码实际上并没有使用 src,对吧?

哦,你原来的 asm 不是 intel 格式($1 是赠品)。

【讨论】:

    【解决方案2】:

    我会尝试做以下测试:

    在一些不包含内联汇编的 C 代码中插入该行

    asm(".att_syntax prefix");
    

    在多个不同的位置。然后将 C 代码编译为目标文件并反汇编这些目标文件(编译到汇编器不适用于此测试)。

    然后将原始代码的反汇编与包含“.att_syntax”行的代码的反汇编进行比较。

    如果“.att_syntax prefix”行确实是切换回 AT&T 模式的正确行,则反汇编必须相等且编译必须无任何错误。

    在下一步中,获取您的代码并编译为汇编程序而不是目标代码(GCC 的“-S”选项)。然后就可以看汇编代码了。

    我的想法是这样的:

    如果您在内联汇编程序中使用数据交换(例如“=r”和“r”),GCC 需要插入进行数据交换的代码:

     asm(".intel_syntax prefix");
     // GCC inserts code moving "src" to "%0" here
     asm volatile (
        "add %0, $1 \n\t"
         : "=r" (dst)
         : "r" (src)); 
     // GCC inserts code moving "%0" to "dst" here
     asm(".att_syntax prefix");
    

    GCC 插入的这段代码当然是 AT&T 语法。

    如果您想在内联汇编中使用 Intel 语法,您必须在同一个内联汇编块中使用“.att_syntax”和“.intel_syntax”指令,就像这样:

     // GCC inserts code moving "src" to "%0" here
     asm volatile (
        ".intel_syntax prefix \n\t"
        "add %0, $1 \n\t"
        ".att_syntax prefix \n\t"
         : "=r" (dst)
         : "r" (src)); 
     // GCC inserts code moving "%0" to "dst" here
    

    【讨论】:

      猜你喜欢
      • 2020-08-24
      • 1970-01-01
      • 2011-10-25
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多