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

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

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

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

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

谢谢!

Hlib asked 2019-10-08T13:22:50Z
2个解决方案
73 votes

如果使用单独的程序集文件,gas会提供一条指令来支持Intel语法:

.intel_syntax noprefix

它使用Intel语法,并且在寄存器名称之前不需要%前缀。


如果使用内联汇编,则可以使用.intel_syntax noprefix进行编译

在内联汇编开始时使用.intel_syntax noprefix,然后使用.att_syntax切换回是可以的,但如果使用任何m约束,则会中断。 内存引用仍将以AT&T语法生成。

ninjalj answered 2019-10-08T13:23:32Z
7 votes

您可以像ninjalj所写那样将内联汇编与-masm = intel一起使用,但是当您使用内联汇编包括C / C ++标头时,可能会导致错误。 这是在Cygwin上重现错误的代码。

sample.cpp:
#include <cstdint>
#include <iostream>
#include <boost/thread/future.hpp>

int main(int argc, char* argv[]) {
    using Value = uint32_t;
    Value value = 0;
    asm volatile (
        "mov  %0, 1\n\t"   // Intel syntax
//      "movl $1, %0\n\t"  // AT&T  syntax
        :"=r"(value)::);

    auto expr = [](void) -> Value { return 20; };
    boost::unique_future<Value> func { boost::async(boost::launch::async, expr) };
    std::cout << (value + func.get());
    return 0;
}

构建此代码时,下面出现错误消息。

g++ -E -std=c++11 -Wall -o sample.s sample.cpp
g++ -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[]) {
    Value value = 0;
    asm volatile (
        "mov  %0, 1\n\t"   // Intel syntax
        :"=r"(value)::);
    std::cout << (value + GetValue());
    return 0;
}

sample2.cpp: compile without -masm=intel
#include <boost/thread/future.hpp>
#include "sample.hpp"
Value GetValue(void) {
    auto expr = [](void) -> Value { return 20; };
    boost::unique_future<Value> func { boost::async(boost::launch::async, expr) };
    return func.get();
}
Zettsu Tatsuya answered 2019-10-08T13:24:18Z
translate from https://stackoverflow.com:/questions/9347909/can-i-use-intel-syntax-of-x86-assembly-with-gcc