繁体   English   中英

在GCC中的Intel和ATT模式之间切换

[英]Switching between Intel and ATT mode in GCC

因此,我拥有此内联汇编代码以及C代码,并且我想针对此对asm()的特定调用使用intel语法,但是我需要切换回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。

由于您尚未接受答案(<hint> <hint>),让我添加第三个想法:

1)在1中执行以下操作,而不是使用3条asm语句:

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

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

3)可以在同一时间同时支持英特尔和ATT。 这样,无论为-masm传递了什么值,您的代码都可以工作:

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

我还要指出,您的asm可能无法正常工作。 由于您正在更新dst的内容(而不是覆盖它),因此您可能要使用“ + r”而不是“ = r”。 您确实意识到该代码实际上并没有使用src,对吗?

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

我会尝试做以下测试:

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

asm(".att_syntax prefix");

在多个不同的位置。 然后将C代码编译为目标文件并反汇编这些目标文件(在此测试中,编译为汇编程序将无效)。

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

如果“ .att_syntax前缀”行确实是切换回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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM