我可以在GCC上使用x86汇编语言吗?
我想写一个小的低级程序。 对于它的某些部分,我将需要使用汇编语言,但其余的代码将写在C / C + +。
因此,如果我将使用GCC将C / C ++与汇编代码混合,是否需要使用AT&T语法,还是可以使用Intel语法? 或者你如何以其他方式混合使用C / C ++和asm(intel语法)?
我意识到,也许我没有select,必须使用AT&T的语法,但我想确定..
如果没有select,我可以在哪里find有关AT&T语法的完整/官方文档?
谢谢!
如果您使用单独的汇编文件,gas有一个指令来支持Intel语法:
.intel_syntax noprefix
它使用英特尔语法,在注册名称之前不需要%前缀。
如果使用内联汇编,则可以使用-masm=intel
编译
.intel_syntax noprefix
联asm开始时使用.intel_syntax noprefix
,并使用.att_syntax
切换回来可以正常工作,但是如果使用任何m
约束则会中断 。 内存引用仍将在AT&T语法中生成。
您可以使用内联汇编与-masm = intel作为ninjalj写道,但是当您使用内联汇编包含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; }
当我build立这个代码时,我得到了下面的错误信息。
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(); }