Posso usar a syntax Intel do assembly x86 com o GCC?

Eu quero escrever um pequeno programa de baixo nível. Para algumas partes eu precisarei usar a linguagem assembly, mas o resto do código será escrito em C / C ++.

Então, se eu vou usar o GCC para misturar C / C ++ com código assembly, eu preciso usar a syntax AT & T ou posso usar a syntax da Intel? Ou como você mistura C / C ++ e asm (syntax da intel) de alguma outra forma?

Eu percebo que talvez eu não tenha escolha e deva usar a syntax da AT & T, mas quero ter certeza ..

E se não houver escolha, onde posso encontrar documentação completa / oficial sobre a syntax da AT & T?

Obrigado!

Se você estiver usando arquivos de assembly separados, o gás possui uma diretiva para suportar a syntax da Intel:

 .intel_syntax noprefix 

que usa a syntax da Intel e não precisa do prefixo% antes dos nomes dos registradores.


Se você estiver usando assembly embutido, você pode compilar com -masm=intel

Usando .intel_syntax noprefix no início do inline asm, e alternando de volta com .att_syntax pode funcionar, mas irá quebrar se você usar qualquer restrição de m . A referência de memory ainda será gerada na syntax da AT & T.

Você pode usar assembly in-line com -masm = intel como ninjalj escreveu, mas pode causar erros quando você inclui headers C / C ++ usando assembly in-line. Este é o código para reproduzir os erros no Cygwin.

 sample.cpp: #include  #include  #include  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 func { boost::async(boost::launch::async, expr) }; std::cout < < (value + func.get()); return 0; } 

Quando eu criei este código, recebi mensagens de erro abaixo.

 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]' 

Para evitar esses erros, ele precisa separar a assembly embutida (a metade superior do código) do código C / C ++ que requer boost :: future e similares (a metade inferior). A opção -masm = intel é usada para compilar arquivos .cpp que contêm o assembly in-line da syntax Intel, não para outros arquivos .cpp.

 sample.hpp: #include  using Value = uint32_t; extern Value GetValue(void); sample1.cpp: compile with -masm=intel #include  #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  #include "sample.hpp" Value GetValue(void) { auto expr = [](void) -> Value { return 20; }; boost::unique_future func { boost::async(boost::launch::async, expr) }; return func.get(); }