Кто-нибудь может помочь мне интерпретировать эту простую дизассемблированную версию из WinDbg?

Я получил следующий простой код 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 ?

Большое спасибо.

Обновление 1

Хотя я все еще не Не знаю, что означает 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

Обновление 2

Инструкция 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

11
задан smwikipedia 26 October 2010 в 15:19
поделиться