Wie generiert man mit gcc Assembler-Code in Intel-Syntax?

151

Die gcc -SOption generiert Assemblycode in AT & T-Syntax. Gibt es eine Möglichkeit, Dateien in Intel-Syntax zu generieren? Oder gibt es eine Möglichkeit, zwischen den beiden zu konvertieren?

hyperlogisch
quelle
5
Sie können einzelne Anweisungen einfach in der Shell mit llvm-mc konvertieren: echo "packsswb mm0,[bp+si-0x54]" | llvm-mc-3.2 -x86-asm-syntax=intelgibtpacksswb -84(%bp,%si), %mm0
Janus Troelsen

Antworten:

198

Hast du das versucht?

gcc -S -masm=intel test.c

Ungetestet, aber ich fand es in diesem Forum, wo jemand behauptete, es würde für sie funktionieren.

Ich habe es gerade auf dem Mac versucht und es ist fehlgeschlagen, also habe ich in meiner Manpage nachgesehen:

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

Es kann auf Ihrer Plattform funktionieren.

Für Mac OSX:

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

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

Jason Dagit
quelle
Trotz des falschen Dateinamens att2intel.sed konvertiert dieses sed-Skript in die andere Richtung, von Intel zu ATT.
Jonathon Reinhart
Hat jemand eine Lösung für Mac?
Joshua Cheek
Clang kann derzeit keine Intel-Syntax verwenden. Siehe LLVM-Fehler 24232: [X86] Inline-Assembly-Operanden funktionieren nicht mit .intel_syntax . Außerdem ignoriert Clang prefix/ noprefix(nicht sicher, ob es wichtig ist, ob Clang die Baugruppe verbraucht).
JWW
17

Das

gcc -S -masm=intel test.c

Funktioniert bei mir Aber ich kann einen anderen Weg sagen, obwohl dies nichts mit dem Ausführen von gcc zu tun hat. Kompilieren Sie die ausführbare Datei oder die Objektcodedatei und zerlegen Sie den Objektcode in der Intel asm-Syntax mit objdump wie folgt:

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

Dies könnte helfen.

Phoxis
quelle
3
das gleiche wie objdump -d -M Intel
David 天宇 Wong
5

Ich habe diesen Code in der CPP-Datei:

#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;
 };

Dieser Code funktioniert mit dieser GCC-Befehlszeile:

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

Es wird * .exe-Datei ergeben, und es hat meiner Erfahrung nach funktioniert.

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.

Das ist alles.

RizonBarns
quelle
Funktioniert nicht auf meinem Fedora:$ gcc -S -masm=intel -mconsole a.c -o a.out gcc: error: unrecognized command line option ‘-mconsole’
d33tah
Arbeitet in Cygwin. Assembly wird als Intel eingegeben und als Intel in der .s-Datei ausgegeben. Wenn Sie verwenden, erhalten -o a.outSie keine .s-Datei.
Orwellophile