среда, 13 мая 2009 г.

Точка входа

После всех проделанных упражнений, пришла догадка, что точка входа в программу не обязательно должна находится в начале программы, а может быть, по идее где угодно. Решил сделать небольшой эксперимент. Чуток изменил программу hello.asm следующим образом (дал ей имя hello3.asm :-D ):

Далее транслируем прогу и смотрим в листинг.

Сделанные изменения – это перенос точки входа в программу. Внимательно изучаем текст и листинг. А теперь более подробно о команде безусловного перехода jmp next. Команда совершает безусловный переход на метку, указанную в ее операнде, в данном случае – next. Переход осуществляется на 19d байт назад, то есть на -19d байт. -19d = 11101101b = ED. Что мы и видим в ассемблированном коде листинга – EB ED. EB – это код команды jmp, а ED – смещение на -19 байт.
Замечаем, что точка входа в программу находится по смещению 000C.
Теперь смотрим hello3.exe в hex просмотровщике.

А теперь посмотрим hello3.exe с помощью знаменитой программы HIEW (версия 6.86). HIEW – это и hex редактор, и простой дизассемблер и … много чего еще и.
Загружаем прогу в HIEW жмем Enter два раза, чтобы получить дизассемблированный листинг. Жмем F5 вводим 200 и попадаем в начало сегмента кода, не путать с точкой входа в программу.

Hiew в режиме Decode (дизассемблера), «пустые» промежутки (00) между кодом и данными дизассемблировал как команду [bx][si],al. Сие надо учитывать при использовании дизассемблеров и отладчиков, так как они не знают где код, а где данные. В debug данные тоже можно вывести в виде команд ассемблера при помощи команды u. Ну это все пока так, на заметку.
Жмем F8 в HIEW и видим информацию заголовка программы.

Из заголовка можно видеть точку входа в программу, а так же начальное значение регистра IP. На что и помедитируем в дебагере.

Комментариев нет: