2009-09-26 9 views
10

Ich habe mir schon eine Weile selbst GNU Assembly beigebracht, indem ich Anweisungen in C geschrieben, sie mit "gcc -S" kompiliert und die Ausgabe studiert habe. Dies funktioniert gut auf x86 (und Kompilieren mit -m32), aber auf meiner AMD64-Box, für diesen Code (nur als Beispiel):Reinigen Sie die x86_64-Assembly-Ausgabe mit gcc?

int main() 
{ 
    return 0; 
} 

GCC gibt mir:

 .file "test.c" 
.text 
.globl main 
.type main, @function 
main: 
.LFB2: 
pushq %rbp 
.LCFI0: 
movq %rsp, %rbp 
.LCFI1: 
movl $0, %eax 
leave 
ret 
.LFE2: 
.size main, .-main 
.section .eh_frame,"a",@progbits 
.Lframe1: 
.long .LECIE1-.LSCIE1 
.LSCIE1: 
.long 0x0 
.byte 0x1 
.string "zR" 
.uleb128 0x1 
.sleb128 -8 
.byte 0x10 
.uleb128 0x1 
.byte 0x3 
.byte 0xc 
.uleb128 0x7 
.uleb128 0x8 
.byte 0x90 
.uleb128 0x1 
.align 8 
.LECIE1: 
.LSFDE1: 
.long .LEFDE1-.LASFDE1 
.LASFDE1: 
.long .LASFDE1-.Lframe1 
.long .LFB2 
.long .LFE2-.LFB2 
.uleb128 0x0 
.byte 0x4 
.long .LCFI0-.LFB2 
.byte 0xe 
.uleb128 0x10 
.byte 0x86 
.uleb128 0x2 
.byte 0x4 
.long .LCFI1-.LCFI0 
.byte 0xd 
.uleb128 0x6 
.align 8 
.LEFDE1: 
.ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3" 
.section .note.GNU-stack,"",@progbits

Verglichen mit:

 .file "test.c" 
.text 
.globl main 
.type main, @function 
main: 
leal 4(%esp), %ecx 
andl $-16, %esp 
pushl -4(%ecx) 
pushl %ebp 
movl %esp, %ebp 
pushl %ecx 
movl $0, %eax 
popl %ecx 
popl %ebp 
leal -4(%ecx), %esp 
ret 
.size main, .-main 
.ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3" 
.section .note.GNU-stack,"",@progbits

auf x86.

Gibt es eine Möglichkeit, GCC-S auf x86_64 Ausgabe Assembly ohne Flusen machen?

+0

GCC 4.8 erzeugt jetzt standardmäßig eine klarere Ausgabe. Es wäre auch cool, zusammenzufassen, was du mit "sauber" meinst: Die Dinge, die du entfernst, würden eine andere ELF-Ausgabe erzeugen ;-) –

Antwort

5

Das Zeug, das in .eh_frame Abschnitt geht, ist Abwicklungsdeskriptoren, die Sie nur Stack (z. B. mit GDB) abwickeln müssen. Während Sie die Montage lernen, können Sie sie einfach ignorieren. Hier ist eine Möglichkeit, die gewünschte "Säuberung" durchzuführen:

gcc -S -o - test.c | sed -e '/^\.L/d' -e '/\.eh_frame/Q' 
     .file "test.c" 
     .text 
.globl main 
     .type main,@function 
main: 
     pushq %rbp 
     movq %rsp, %rbp 
     movl $0, %eax 
     leave 
     ret 
     .size main,.Lfe1-main 
+0

Fantastisch! Danke :-) – John

+0

Warum nicht einfach -no-exceptions -fno-rtti benutzen? – Trass3r

+2

Das Entfernen aller '.L' lokalen Labels wird nicht sehr gut für Funktionen mit Schleifen oder Verzweigungen sein: / –

5

Sie können versuchen, den Code, den Sie untersuchen möchten, in einer Funktion zu platzieren.

Z. B .:

int ftest(void) 
{ 
    return 0; 
} 

int main(void) 
{ 
    return ftest(); 
} 

Wenn Sie bei der Montage-Quelle für Test aussehen wird es so sauber, wie Sie benötigen.

+0

Die Baugruppe für Haupt ist schon ziemlich sauber ... –

+0

Ja, aber er lernt (wie ich) & je weniger "Krempel", desto besser. – slashmais

3

Ich habe festgestellt, dass die Verwendung der -Os Flagge Dinge klarer macht. Ich habe es versucht, dein kleines Beispiel, aber es hat sehr wenig Unterschied gemacht.

Das sagte, ich erinnere mich, dass es hilfreich war, wenn ich Montage lernte (auf einem Sparc).