Ассемблер для Windows

       

Дизассемблированный код функции main с Рисунок Дизассемблер IDA PRO



Рисунок 4.5.8. Дизассемблированный код функции main с Рисунок 4.5.7. Дизассемблер IDA PRO.

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

  1. Оператор new сводится к выполнению библиотечной процедуры: unknown_libname_8. Последняя процедура выделяет память для свойств экземпляра объекта (300 байт).
  2. Конструктор хранится и выполняется непосредственно в теле программы. Это связано с тем, что и сам конструктор определен в тексте класса. Для эксперимента попробуйте вынести текст конструктора в отдельную функцию, и Вы увидите, что конструктор будет вызываться из main, как обычная функция.
  3. Процедуру @_InitExceptBlockLDTC вставляет транслятор для поддержки так называемых исключений (Exception). Вы можете удалить информацию для использования исключений, несколько сократив получившийся код, но тогда Вы не сможете использовать операторы исключений, такие как try или catch.
  4. При вызове какого-либо метода в стек всегда помещается, по крайней мере, один параметр - указатель на экземпляр объекта.
  5. Приведу теперь фрагмент той же дизассемблированной программы, но с использованием опции -x, что для транслятора Borland C++ означает - не использовать исключения. Как видите, текст программы оказался значительно проще.

    .text 00401122 _main proc near ; DATA XREF: .data:0040B0C8 .text 00401122 .text 00401122 argc = dword ptr 8 .text 00401122 argv = dword ptr 0Ch .text 00401122 envp = dword ptr 10h .text 00401122 .text 00401122 push ebp .text 00401123 mov ebp, esp .text 00401125 push ebx .text 00401126 push 12Ch .text 0040112B call unknown_libname_8 .text 00401130 pop ecx .text 00401131 mov ebx, eax .text 00401133 test eax, eax .text 00401135 jz short loc_40115D .text 00401137 push offset aPrivet ; src .text 0040113C push ebx ; dest .text 0040113D call _strcpy .text 00401142 add esp, 8 .text 00401145 push offset aPrivet_0 ; src .text 0040114A lea edx, [ebx+0C8h] .text 00401150 push edx ; dest .text 00401151 call _strcpy .text 00401156 add esp, 8 .text 00401159 mov ecx, ebx .text 0040115B jmp short loc_40115F .text 0040115D ;-----------------———-—----—-—---——— .text 0040115D .text 0040115D loc_40115D: ; CODE XREF: _main+13 .text 0040115D mov ecx, ebx .text 0040115F .text 0040115F loc_40115F: ; CODE XREF: _main+39 .text 0040115F mov ebx, ecx .text 00401161 push ebx ; dest .text 00401162 call sub_401108 .text 00401167 pop ecx .text 00401168 push ebx ; char .text 00401169 push offset aS ; _va_args .text 0040116E call _printf .text 00401173 add esp, 8 .text 00401176 push ebx ; handle .text 00401177 call _rtl_close .text 0040117C pop ecx .text 0040117D xor eax, eax .text 0040117F pop ebx .text 00401180 pop ebp .text 00401181 retn .text 00401181 _main endp



    Содержание раздела