Я получил следующий простой код C ++:
#include
int main(void)
{
::printf("\nHello,debugger!\n");
}
А из WinDbg я получил следующий код дизассемблирования:
SimpleDemo!main:
01111380 55 push ebp
01111381 8bec mov ebp,esp
01111383 81ecc0000000 sub esp,0C0h
01111389 53 push ebx
0111138a 56 push esi
0111138b 57 push edi
0111138c 8dbd40ffffff lea edi,[ebp-0C0h]
01111392 b930000000 mov ecx,30h
01111397 b8cccccccc mov eax,0CCCCCCCCh
0111139c f3ab rep stos dword ptr es:[edi]
0111139e 8bf4 mov esi,esp
011113a0 683c571101 push offset SimpleDemo!`string' (0111573c)
011113a5 ff15b0821101 call dword ptr [SimpleDemo!_imp__printf (011182b0)]
011113ab 83c404 add esp,4
011113ae 3bf4 cmp esi,esp
011113b0 e877fdffff call SimpleDemo!ILT+295(__RTC_CheckEsp) (0111112c)
011113b5 33c0 xor eax,eax
011113b7 5f pop edi
011113b8 5e pop esi
011113b9 5b pop ebx
011113ba 81c4c0000000 add esp,0C0h
011113c0 3bec cmp ebp,esp
011113c2 e865fdffff call SimpleDemo!ILT+295(__RTC_CheckEsp) (0111112c)
011113c7 8be5 mov esp,ebp
011113c9 5d pop ebp
011113ca c3 ret
Мне трудно полностью его понять. Что здесь делает SimpleDemo! ILT ?
В чем смысл инструкции, сравнивающей ebp и esp на 011113c0 ?
Поскольку у меня нет локальных переменных в функции main (), почему все еще есть sub esp, 0C0h на месте 01111383 ?
Большое спасибо.
Хотя я все еще не Не знаю, что означает ILT , но __RTC_CheckESP предназначен для проверок во время выполнения. Этот код можно исключить, поместив следующую директиву перед функцией main () .
#pragma runtime_checks( "su", off )
Ссылка:
http://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx
http://msdn.microsoft.com/en-us/library/6kasb93x. aspx
Инструкция sub esp, 0C0h выделяет в стеке еще 0C0h байтов дополнительного места. Затем EAX заполняется 0xCCCCCCCC, это 4 байта, так как ECX = 30h, 4 * 30h = 0C0h, поэтому инструкция rep содержит dword ptr es: [edi] заполняет ровно лишние пробелы 0xCC. Но для чего это лишнее место в стеке? Это какой-то ремень безопасности? Также я заметил, что если я отключу проверку времени выполнения, как показывает Обновление 1, в стеке останется такое дополнительное пространство, хотя и намного меньше. И это пространство не заполнено 0xCC.
Код сборки без проверки времени выполнения выглядит следующим образом:
SimpleDemo!main:
00231250 55 push ebp
00231251 8bec mov ebp,esp
00231253 83ec40 sub esp,40h <-- Still extra space allocated from stack, but smaller
00231256 53 push ebx
00231257 56 push esi
00231258 57 push edi
00231259 683c472300 push offset SimpleDemo!`string' (0023473c)
0023125e ff1538722300 call dword ptr [SimpleDemo!_imp__printf (00237238)]
00231264 83c404 add esp,4
00231267 33c0 xor eax,eax
00231269 5f pop edi
0023126a 5e pop esi
0023126b 5b pop ebx
0023126c 8be5 mov esp,ebp
0023126e 5d pop ebp
0023126f c3 ret