Объясните странный блок пустой 'основной' функции C компилятором Visual C++

Я просто заметил некоторый странный код ассемблера пустого основного метода.

//filename: main.c
void main()
{

}

дизассемблирование:

push        ebp  
mov         ebp,esp  
sub         esp,0C0h; why on the earth is it reserving 192 bytes?  
push        ebx  
push        esi  
push        edi  ; good compiler. Its saving ebx, esi & edi values.
lea         edi,[ebp-0C0h]  ; line 1
mov         ecx,30h  ; line 2
mov         eax,0CCCCCCCCh  ; line 3
rep stos    dword ptr es:[edi]  ; line 4


xor         eax,eax  ; returning value 0. Code following this line is explanatory.
pop         edi  ; restoring the original states of edi,esi & ebx
pop         esi  
pop         ebx  
mov         esp,ebp  
pop         ebp  
ret   
  1. почему на земле это, резервируя 192 байта для функции, где нет никаких переменных
  2. что произошло с этими четырьмя строками: строка 1, строка 2, строка 3, строка 4? что это пытается сделать и ПОЧЕМУ?
14
задан claws 29 July 2010 в 13:26
поделиться

2 ответа

Четыре указанные вами строки кода представляют собой отладочную сборку, очищающую пространство локальных переменных с помощью специального значения «clear» ( 0xCCCCCCCC ).

Я не уверен, почему 192 байта кажутся мертвыми, но это может быть VC ++, создающий некое защитное пространство в вашей области локальной переменной, чтобы попытаться обнаружить разбиение стека.

Вы, вероятно, получите совсем другой результат, если переключитесь с отладки на сборку Release.

15
ответ дан 1 December 2019 в 08:16
поделиться

Грег уже объяснил, как компилятор генерирует код для диагностики неинициализированных локальных переменных, включенный опцией компиляции /RTCu. Значение 0xcccccccc было выбрано для того, чтобы оно было отличительным и легко распознавалось в отладчике. А также для того, чтобы программа завершалась при разыменовании неинициализированного указателя. А также для того, чтобы программа завершалась, когда она выполняется как код. 0xcc довольно идеально подходит для выполнения всех этих задач, это опкод инструкции INT3.

Загадочные 192 байта, выделенные в стековой рамке, предназначены для поддержки функции Edit + Continue, /ZI compile option. Она позволяет редактировать код, пока активна точка останова. При добавлении локальных переменных в функцию эти 192 байта выделяются для того, чтобы обеспечить пространство для добавленных локальных переменных. Превышение этого пространства заставит IDE перестроить программу.

Btw: это может вызвать проблему, если вы используете рекурсию в своем коде. Отладочная сборка будет бомбить с именем этого сайта намного быстрее. Обычно это не является большой проблемой, если вы отлаживаете с практическими размерами наборов данных.

18
ответ дан 1 December 2019 в 08:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: