Может кто-нибудь объяснить эти пару сборочных линий? - PullRequest
1 голос
/ 03 октября 2011

C ++

int main(void)
{
    int a = 3;
    int b = 10;
    int c;
    c = a + b;
    return 0;
}
008C1353  sub         esp,0E4h 
......
008C135C  lea         edi,[ebp+FFFFFF1Ch]  
008C1362  mov         ecx,39h  
008C1367  mov         eax,0CCCCCCCCh  
008C136C  rep stos    dword ptr es:[edi]  
     3:     int a = 3;
008C136E  mov         dword ptr [ebp-8],3  
     4:     int b = 10;
008C1375  mov         dword ptr [ebp-14h],0Ah  
     5:     int c;
     6:     c = a + b;

Несколько вещей, которые я не понимаю.

(1) G ++ будет иметь выравнивание стека 16 байтов, а выполнение в Visual Studio составляет 228 байтов??

(2) Делая это в Windows, стек растет вверх или вниз?Я сбит с толку.Я знаю, как должен выглядеть стек

[Parameter n          ]
...
[Parameter 2          ]
[Parameter 1          ]
[Return Address       ]   0x002CF744
[Previous EBP         ]   0x002CF740  (current ebp)
[Local Variables      ]   

Так будет ли младший адрес нисходящим?

(3) Когда мы помещаем переменную a в стек, это ebp - 8Почему же это восемь байтов?(4) Точно так же, почему int b ebp - 14?

Может кто-нибудь объяснить мне это?(-4, -8 соответственно)

Используя GDB, смещение имеет для меня больший смысл.

Спасибо.

1 Ответ

4 голосов
/ 03 октября 2011

При компиляции в режиме debug компилятор Microsoft добавляет в ваш сгенерированный код довольно много дополнений и другого кода проверки безопасности.Заполнение стека байтами 0xCC является одной из таких проверок.Это может сбить вас с толку по сравнению с сгенерированным кодом gcc.

В режиме release эти проверки безопасности обычно отключены, но оптимизация включена.Оптимизация может усложнить выполнение кода сборки.

Для достижения наилучших результатов вы можете попробовать создать новую конфигурацию, начиная с режима выпуска и, в частности, отключив оптимизацию.

...