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

Я получил следующий простой код C ++:

#include <stdio.h>
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! ИЛТ дела здесь?

Какой смысл инструкции сравнивать ebp и esp в011113c0?

Поскольку у меня нет никаких локальных переменных в функции main (), почему до сих порsub esp, 0C0h в месте отдыха01111383?

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

Обновление 1

Хотя я до сих пор не знаю, чтоИЛТ означает, но __RTC_CheckESP для проверки во время выполнения. Этот код можно устранить, поместив следующую прагму передглавный() функция.

#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, поэтому инструкцияreps stos 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

Ответы на вопрос(5)

Ваш ответ на вопрос