Come si utilizza gcc per generare il codice assembly nella sintassi Intel?


151

L' gcc -Sopzione genererà il codice assembly nella sintassi AT&T, c'è un modo per generare file nella sintassi Intel? O c'è un modo per convertire tra i due?


5
puoi convertire facilmente singole istruzioni nella shell con llvm-mc: echo "packsswb mm0,[bp+si-0x54]" | llvm-mc-3.2 -x86-asm-syntax=intelgivespacksswb -84(%bp,%si), %mm0
Janus Troelsen,

Risposte:


198

Hai provato questo?

gcc -S -masm=intel test.c

Non testato, ma l'ho trovato in questo forum dove qualcuno ha affermato che ha funzionato per loro.

Ho appena provato questo su Mac e non è riuscito, quindi ho cercato nella mia pagina man:

   -masm=dialect
       Output asm instructions using selected dialect.  Supported choices
       are intel or att (the default one).  Darwin does not support intel.

Potrebbe funzionare sulla tua piattaforma.

Per Mac OSX:

clang++ -S -mllvm --x86-asm-syntax=intel test.cpp

Fonte: https://stackoverflow.com/a/11957826/950427


Nonostante il nome file errato att2intel.sed, quello script sed converte in altro modo, da Intel a ATT.
Jonathon Reinhart,

Qualcuno ha una soluzione per Mac?
Joshua Cheek,

Al momento Clang non può utilizzare la sintassi Intel. Vedi LLVM Bug 24232: [X86] Gli operandi di assembly inline non funzionano con .intel_syntax . Inoltre, Clang ignora prefix/ noprefix(non è sicuro che sia importante se Clang consuma il gruppo).
JWW

17

Il

gcc -S -masm=intel test.c

Funziona con me. Ma posso dire un altro modo, anche se questo non ha nulla a che fare con l'esecuzione di gcc. Compilare il file eseguibile o il file del codice oggetto, quindi disassemblare il codice oggetto nella sintassi Intel asm con objdump come di seguito:

 objdump -d --disassembler-options=intel a.out

Questo potrebbe aiutare.


3
come objdump -d -M intel
David 天宇 Wong,

5

Ho questo codice nel file CPP:

#include <conio.h>
#include <stdio.h>
#include <windows.h>

int a = 0;
int main(int argc, char *argv[]) {
    asm("mov eax, 0xFF");
    asm("mov _a, eax");
    printf("Result of a = %d\n", a);
    getch();
    return 0;
 };

Questo codice ha funzionato con questa riga di comando GCC:

gcc.exe File.cpp -masm=intel -mconsole -o File.exe

Risulterà un file * .exe e ha funzionato nella mia esperienza.

Notes:
immediate operand must be use _variable in global variabel, not local variable.
example: mov _nLength, eax NOT mov $nLength, eax or mov nLength, eax

A number in hexadecimal format must use at&t syntax, cannot use intel syntax.
example: mov eax, 0xFF -> TRUE, mov eax, 0FFh -> FALSE.

È tutto.


Non funziona con la mia Fedora:$ gcc -S -masm=intel -mconsole a.c -o a.out gcc: error: unrecognized command line option ‘-mconsole’
d33tah,

Funziona in Cygwin. Assembly va come intel, esce come intel nel file .s. Se lo usi -o a.outnon otterrai un file .s.
Orwellophile,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.