2016-10-17 2 views
1

Ich habe den folgenden einfachen CodeBuffers auf dem Stapel in Assembly

void test() { 
     char buffer[20]; 
     return 0; 
    } 

    int main() { 
     test(); 
    } 

Die Montage ist es gibt

Disassembly des Abschnitts .text:

0000000000000000 <test>: 
    0: 55      push %rbp 
    1: 48 89 e5    mov %rsp,%rbp 
    4: 5d      pop %rbp 
    5: c3      retq 

0000000000000006 <main>: 
    6: 55      push %rbp 
    7: 48 89 e5    mov %rsp,%rbp 
    a: b8 00 00 00 00   mov $0x0,%eax 
    f: e8 00 00 00 00   callq 14 <main+0xe> 
    14: 5d      pop %rbp 
    15: c3      retq 

ich mutmaßen I den Puffer Größe von dieser Versammlung? Es scheint nicht viel los zu sein mit dem Stack.

+2

Der Compiler optimiert das lokale, da es nicht referenziert wird. Versuche etwas damit zu machen. –

+0

Bingo 4: c6 45 e0 63 movb $ 0x63, -0x20 (% rbp), aber was bedeutet dieser Befehl eigentlich? -0x20 +% rpb = 0x63? – flyinghigh

+0

Sie haben vermutlich 'buffer [x] = 99;' oder ähnliches geschrieben. – Jester

Antwort

0

Sie https://godbolt.org/ zur Echtzeit erkunden die resultierende Maschinencode von C verwenden ++ Quelle:
(ich benutze Intel Syntax .. wechseln, wenn ausgeschaltet, falls Sie AT & T)

void test() { 
    char buffer[400]; 
    buffer[0] = 0; 
    return; 
} 

Compiliert zu

test(): 
    ; { 
     push rbp 
     mov  rbp, rsp 
     sub  rsp, 280 ; reserves more space at stack for local variables 

    ; buffer[0] = 0; 
     mov  BYTE PTR [rbp-400], 0 

    ; return; .. sort of .. or just padding 
     nop 

    ; } 
     leave 
     ret 

eine richtige C-Compiler „viel weiter zu gehen“ nicht versuchen wird, stattdessen wird es versuchen, alle zu erreichen: definiertes/gewünschtes Verhalten deiner C-Quelle mit minimaler Menge an Anweisungen ... Eigentlich denke ich mit hoch genugem Optimierungslevel würde es den test() Aufruf komplett entfernen, da es nichts macht und der Compiler es weiß.


edit: ja, mit O3 der gcc nur rep ret für ganze test() produzieren. Funktioniert. (rep wird für ältere AMD-CPUs verwendet, um die Prefetch-Warteschlange nicht zu ersticken, wenn Single ret einen bedingten Verzweigungssprung folgt ... Sie können es als einfach behandeln ret, es ist nur zusätzliche Junk-Byte zu ret 2-Byte-Opcode machen).

Verwandte Themen