28.05.2011, 14:30 | #1 (ссылка) |
Стажёр
|
MASM. Исследование программы в отладчике
Штудирую Калашникова. Помогите разобраться. Цитирую:
Теперь рассмотрим, как все это происходит, на конкретном примере (листинг). (01) CSEG segment (02) org 100h (03) _start: (04) mov ah,9 (05) mov dx,offset String (06) int 21h (07) int 20h (08) String db 'Test message$' (09) CSEG ends (10) end _start Итак, строки (01) и (09) описывают сегмент: CSEG (даем имя сегменту) segment (оператор ассемблера, указывающий, что имя CSEG - это название сегмента); CSEG ends (END Segment - конец сегмента) указывает ассемблеру на конец сегмента. Строка (02) сообщает о том, что код программы будет располагаться начиная со смещения 100h. По этому адресу в память всегда загружаются программы типа СОМ. Запускаем программу из листинга под отладчиком AFD Pro. Допустим, она загрузилась всвободный сегмент 1DF1h. Первая команда встроке (04) будет располагаться по такому адресу: 1DF1h:0100h (т.е. cs = 1DF1h, а ip = 0100h) Обратите внимание на регистры cs и ip! Перейдем к следующей команде. Для этого в отладчике AFD нажмите клавишу <F1>, в CodeView - <F8>, в другом - посмотрите, какая клавиша нужна; будет написано что-то вроде <F8>+<Step> или <F7>+<Trace>. Теперь вы видите, что изменились следующие регистры: ах = 0900h (точнее, ah = 09h, a al = 0, т.к. мы загрузили командой mov ah,9 число 9 в регистр ah, при этом не трогая al. Если бы al был равен, скажем, 15h, то после выполнения данной команды в ах находилось бы число 0915h); ip = 102h (т.е. указывает на адрес следующей команды). Из этого можно сделать вывод, что команда mov ah,9 занимает 2 байта: 102h - 100h = 2. Следующая команда (нажимаем клавишу <F8>/<F1>) изменяет регистры dx и ip. Теперь dx указывает на смещение строки 'Test message$' относительно начала сегмента, то есть 109h, a ip равняется 105h (адрес следующей команды). Нетрудно посчитать, что команда mov dx,offset String занимает 3 байта (105h - 102h = 3) Обратите внимание, что в ассемблере мы пишем: mov dx,offset String а в отладчике видим следующее: mov dx,109 ; 109 - шестнадцатеричное число, но CodeView и многие другие отладчики символ 'h' не ставят. Это надо иметь в виду. Почему так происходит? Дело в том, что в процессе обработки нашего файла, программа-ассемблер (MASM/TASM) подставляет вместо offset String реальный адрес строки с именем String в памяти (ее смещение). Можно, конечно, записать сразу: mov dx,109h Данная программа будет работать корректно. Но для этого нам нужно высчитать самим этот адрес. В этом я, с горем пополам, вроде бы разобрался. А вот дальше - ступор! Попробуйте вставить следующие команды, начиная со строки (07), в листинг: ... (07) int 20h (08) int 20h (09) String db 'Test message$' (10) CSEG ends (11) end _start Просто продублируем команду int 20h (хотя, как вы уже знаете, выполнение программы прекратится на строке (07)). Теперь ассемблируйте программу заново. Запускайте ее под отладчиком. В качестве демонстрации воспользуемся отладчиком CodeView, при этом программа может загрузиться в другой сегмент, так как отладчики имеют разные размеры и, соответственно, занимают разное количество оперативной памяти. Пусть теперь сегмент, в который загрузилась наша программа, будет равен 0A09h. Выполняйте шаг за шагом программу до тех пор, пока не дойдете до загрузки смещения строки в регистр dx. Вы увидите, что в dx загружается не 109h, а другое число. Подумайте, почему так происходит. Вот! Что-то я не въехал к чему меня подводили и почему так происходит. Туп, наверное! Растолкуйте плиз! |
Ads | |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
программы для wi-fi | ivan43 | Интернет и сети | 0 | 21.04.2011 18:00 |
программы | Павел 666 | Windows 7 | 8 | 13.04.2011 16:45 |
Не отвечают программы. | Indi | Windows Vista | 15 | 17.03.2011 21:29 |
программы | miltik | Программы | 3 | 13.02.2011 02:22 |
Программы х64 | Влад Нагибин | Windows 7 | 1 | 24.01.2011 16:22 |
Установка программы | Emperor | Мультимедиа | 11 | 28.10.2010 11:32 |
Log из программы AVZ | wuzzluv | Безопасность | 20 | 25.02.2010 00:54 |
Лог из программы AVZ | Respect | Безопасность | 2 | 22.02.2010 17:40 |
программы | fury | Неисправности, настройка | 12 | 17.06.2009 21:17 |
Не могу скомпилировать прогу через MASM 6.11 | Начинающий Прогер | Программирование | 0 | 23.04.2009 01:52 |
Почтове программы и программы для просмотра Вэб-страниц | gurd081 | Интернет и сети | 1 | 21.03.2009 09:49 |