Вернуться   Компьютерный форум > Компьютеры > Программы > Программирование
 
 
Опции темы
Старый 28.05.2011, 14:30   #1 (ссылка)
Стажёр
 
Аватар для Базаров
 
Регистрация: 11.11.2008
Сообщений: 2,051
Записей в блоге: 376
Репутация: 60
По умолчанию 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)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программы для 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


Текущее время: 14:56. Часовой пояс GMT +4. Powered by vBulletin® Version 5.8.9
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.