2016-10-17 3 views
1

я следующий простой кодБуферы на стек в Ассамблее

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

    int main() { 
     test(); 
    } 

Узел выводит это

Разборка секции .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 

я я предполагаю буфер размер от этой сборки? Похоже, что много нечего делать со стеклом.

+2

Компилятор оптимизирует локальный, поскольку на него не ссылаются. Попробуйте что-то сделать с этим. –

+0

Bingo 4: c6 45 e0 63 movb $ 0x63, -0x20 (% rbp), но что означает эта инструкция? -0x20 +% rpb = 0x63? – flyinghigh

+0

Вы предположительно написаны 'buffer [x] = 99;' или аналогичные. – Jester

ответ

0

Вы можете использовать https://godbolt.org/ в реальное время исследовать полученный машинный код C++ Источник:
(я использую синтаксис Intel .. переключатель, если выключены, в случае, если вы хотите AT & T)

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

компилирует :

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 

надлежащий C компилятор не будет пытаться «много, чтобы пойти на», вместо этого он будет пытаться достичь все определенное/желаемое поведение вашего источника C с минимальным количеством инструкций ... На самом деле я думаю, что с достаточно высоким уровнем оптимизации он полностью удалит вызов test(), так как он ничего не делает, и компилятор знает об этом.


редактировать: да, с -O3 ССАГПЗ будет производить только rep ret для всей test(). Работает. (rep используется для более старых процессоров AMD, чтобы не задушить очередь предварительной выборки, когда одиночный ret следует за некоторым условным прыжком в ветви ... Вы можете рассматривать его как простое ret, это просто дополнительный барабанный байт, чтобы сделать ret 2 байтовый код операции).

Смежные вопросы