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