我可以在GCC中使用x86汇编的Intel语法吗?

我想写一个小的底层程序。对于它的某些部分,我将需要使用汇编语言,但代码的其余部分将在C / C ++编写。

因此,如果我将使用GCC将C / C ++与汇编代码混合,是否需要使用AT&T语法或可以使用Intel语法?或如何以其他方式混合使用C / C ++和asm(intel语法)?

我意识到也许我别无选择,必须使用AT&T语法,但是我想确定一下。

如果没有选择,我在哪里可以找到有关AT&T语法的完整/官方文档?

谢谢!


偶然的你
浏览 1166回答 2
2回答

慕码人8056858

如果使用单独的程序集文件,gas会提供一条指令来支持Intel语法:.intel_syntax noprefix它使用Intel语法,并且在寄存器名称之前不需要%前缀。如果使用内联汇编,则可以使用 -masm=intel.intel_syntax noprefix在内联汇编开始时使用,然后切换回.att_syntax可以使用,但如果使用任何约束,都会中断m。内存引用仍将以AT&T语法生成。

慕妹3242003

您可以像ninjalj一样将内联汇编与-masm = intel一起使用,但是当您使用内联汇编包括C / C ++标头时,可能会导致错误。这是在Cygwin上重现错误的代码。sample.cpp:#include <cstdint>#include <iostream>#include <boost/thread/future.hpp>int main(int argc, char* argv[]) {&nbsp; &nbsp; using Value = uint32_t;&nbsp; &nbsp; Value value = 0;&nbsp; &nbsp; asm volatile (&nbsp; &nbsp; &nbsp; &nbsp; "mov&nbsp; %0, 1\n\t"&nbsp; &nbsp;// Intel syntax//&nbsp; &nbsp; &nbsp; "movl $1, %0\n\t"&nbsp; // AT&T&nbsp; syntax&nbsp; &nbsp; &nbsp; &nbsp; :"=r"(value)::);&nbsp; &nbsp; auto expr = [](void) -> Value { return 20; };&nbsp; &nbsp; boost::unique_future<Value> func { boost::async(boost::launch::async, expr) };&nbsp; &nbsp; std::cout << (value + func.get());&nbsp; &nbsp; return 0;}构建此代码时,下面出现错误消息。g++ -E -std=c++11 -Wall -o sample.s sample.cppg++ -std=c++11 -Wall -masm=intel -o sample sample.cpp -lboost_system -lboost_thread/tmp/ccuw1Qz5.s: Assembler messages:/tmp/ccuw1Qz5.s:1022: Error: operand size mismatch for `xadd'/tmp/ccuw1Qz5.s:1049: Error: no such instruction: `incl DWORD PTR [rax]'/tmp/ccuw1Qz5.s:1075: Error: no such instruction: `movl DWORD PTR [rcx],%eax'/tmp/ccuw1Qz5.s:1079: Error: no such instruction: `movl %eax,edx'/tmp/ccuw1Qz5.s:1080: Error: no such instruction: `incl edx'/tmp/ccuw1Qz5.s:1082: Error: no such instruction: `cmpxchgl edx,DWORD PTR [rcx]'为了避免这些错误,它需要将内联汇编(代码的上半部分)与需要boost :: future之类的C / C ++代码(下半部分)分开。-masm = intel选项用于编译包含Intel语法内联汇编的.cpp文件,而不是其他.cpp文件。sample.hpp:#include <cstdint>using Value = uint32_t;extern Value GetValue(void);sample1.cpp: compile with -masm=intel#include <iostream>#include "sample.hpp"int main(int argc, char* argv[]) {&nbsp; &nbsp; Value value = 0;&nbsp; &nbsp; asm volatile (&nbsp; &nbsp; &nbsp; &nbsp; "mov&nbsp; %0, 1\n\t"&nbsp; &nbsp;// Intel syntax&nbsp; &nbsp; &nbsp; &nbsp; :"=r"(value)::);&nbsp; &nbsp; std::cout << (value + GetValue());&nbsp; &nbsp; return 0;}sample2.cpp: compile without -masm=intel#include <boost/thread/future.hpp>#include "sample.hpp"Value GetValue(void) {&nbsp; &nbsp; auto expr = [](void) -> Value { return 20; };&nbsp; &nbsp; boost::unique_future<Value> func { boost::async(boost::launch::async, expr) };&nbsp; &nbsp; return func.get();}
打开App,查看更多内容
随时随地看视频慕课网APP