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

Переменные и константы



Переменные и константы.

Современные компиляторы довольно эффективно оптимизируют исходный код, поэтому не всегда просто разобраться, где какая переменная работает. В первую очередь это касается того, что для хранения части переменных, насколько это возможно, компилятор использует регистры. Если ему не хватит регистров, он начнет использовать память.

Для примера я взял простую консольную программу, написанную на Borland C++. В текстовом варианте программа занимает полтора десятка строк, тогда как ЕХЕ-файл имеет размер более 50 Кб. Впрочем, размер исполняемых файлов давно уже никого не удивляет. Интересно другое: корректно справился с задачей, т.е. корректно выявил точку входа - метку _main, только один дизассемблер - IDA PRO. Т.е., конечно, реально работающий участок программы дизассемблировали все, но выявить, как происходит переход на участок, смог только упомянутый мной дизассемблер. Приятно также и то, что аккуратно была распознана функция _printf. На Рисунок 4.5.1 показан фрагмент дизассемблированной программы, соответствующей основной процедуре main. С другой стороны, в данном случае нет никаких видимых возможностей быстрого поиска данного фрагмента в отладчике. Осюда наглядно можно понять полезность совместного использования отладчика и дизассемблера.

CODE 00401108 _main proc near ; DATA XREF: DATA:0040B044 CODE 00401108 CODE 00401108 argc = dword ptr 8 CODE 00401108 argv = dword ptr 0Ch CODE 00401108 envp = dword ptr 10h CODE 00401108 CODE 00401108 push ebp CODE 00401109 mov ebp, esp CODE 0040110B push ebx CODE 0040110C mov edx, offset unk_40D42C CODE 00401111 xor eax, eax CODE 00401113 CODE 00401113 loc_401113: ; CODE XREF: _main+22 CODE 00401113 mov ecx, 1Fh CODE 00401118 sub ecx, eax CODE 0040111A mov ebx, ds:off_40B074 CODE 00401120 mov cl, [ebx+ecx] CODE 00401123 mov [edx+eax], cl CODE 00401126 inc eax CODE 00401127 cmp eax, 21h CODE 0040112A jl short loc_401113 CODE 0040112C mov byte ptr [edx+20h], 0 CODE 00401130 push edx ; char CODE 00401131 push offset aS ;_va_args CODE 00401136 call _printf CODE 0040113B add esp, 8 CODE 0040113E pop ebx CODE 0040113F pop ebp CODE 00401140 retn CODE 00401140 _main endp



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