c - 在 GCC 中切换 Intel 和 ATT 模式

标签 c gcc assembly nasm

所以我有这个内联汇编代码和我的 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。

最佳答案

既然你还没有接受答案(),让我补充第三个想法:

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) 可以同时支持intel 和att。这样,无论为 -masm 传递什么值,您的代码都可以工作:

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

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

哦,你原来的 asm 不是英特尔格式(1 美元是赠品)。

关于c - 在 GCC 中切换 Intel 和 ATT 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28135523/

相关文章:

c - 试图将 C 程序翻译成 x86 汇编

c - C 中的 FreeBSD SysCall -> 函数的隐式声明 'modfind'

c - 为什么将未使用的函数参数值转换为 void?

c - 为什么 Unicode 字符在 GCC 终端中显示不正确?

c - 试图粉碎堆栈

c++ - std::atomic<X>::value_type 发生了什么?

汇编语言 move.l p, -(A3)

linux - 共享库中的重定位条目

c - openssl Elliptic_Curve_Cryptography - 定义 "custom"曲线

c - 从管道中读取整数会跳过 C 中的值