2008-10-14 11 views
129

Die gcc -S Option generiert Assemblercode 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?Wie verwenden Sie gcc, um Assembly-Code in Intel-Syntax zu generieren?

+5

können Sie einfach Anweisungen in der Shell mit llvm-mc konvertieren: 'echo 'packsswb mm0, [bp + si-0x54]" | llvm-mc-3.2-x86-asm-syntax = intel' gibt 'packsswb \t -84 (% bp,% si),% mm0' –

Antwort

169

Haben Sie das versucht?

gcc -S -masm=intel test.c 

Ungeprüfte, aber ich fand es in diesem forum wo jemand behauptet, es für sie gearbeitet.

Ich habe gerade versucht, dies auf dem Mac und es versäumt, so sah ich in meinem Mann Seite:

-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 arbeiten.

Für Mac OSX:

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

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

+1

-masm = intel funktioniert auf meinem debian/i386. – Jichao

+1

Bestätigt, auch an Ubuntu Karmic x64 zu arbeiten. – Thomas

+0

Arbeitete an meinem MingGW 3.4.5. Danke vielmals! –

15

Die

gcc -S -masm=intel test.c 

bei mir nicht funktioniert. Aber ich kann es anders sagen, obwohl das nichts mit dem Ausführen von gcc zu tun hat. Kompilieren Sie die ausführbare Datei oder den Objektcode-Datei und dann die Syntax Objektcode in Intel asm zerlegen mit objdump wie folgt:

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

Diese helfen könnte.

+3

selbe wie objdump -d -M Intel –

5

Ich habe diesen Code in 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; 
}; 

, dass der Code mit dieser GCC Kommandozeile gearbeitet:

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

wird es * .exe-Datei zur Folge hat, und es funktionierte in meiner Erfahrung.

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.

+0

Funktioniert nicht auf meinem Fedora: '$ gcc -S -masm = Intel -mconsole ac -o a.out gcc: Fehler: unerkannte Befehlszeilenoption '-mconsole'' – d33tah

+0

Arbeitet in Cygwin. Die Assembly wird als Intelli eingegeben und als Intel in der .s-Datei ausgegeben. Wenn Sie -o a.out verwenden, erhalten Sie keine .s-Datei. – Orwellophile