Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Финогенов-основы_языка_ассемблера.doc
Скачиваний:
26
Добавлен:
17.09.2019
Размер:
3.35 Mб
Скачать

Глава 2

Основы программирования

49

В нашем примере программа должна начать выполняться с метки begin, поскольку именно эту метку мы указали в качестве операнда завершаю­щей директивы end. Эта метка относится к самой первой команде сегмен­та команд и ее значение (или, что то же самое, смещение первой коман­ды программы) должно быть равно 0. Поэтому исходное значение указа­теля команд, как это видно из рис. 2.4, тоже равно 0. В дальнейшем, по мере выполнения команд, значение IP будет возрастать. Выполним две первые команды программы, дважды нажав клавишу <F8>. Состояние программы после этой операции показано на рис. 2.5.

Ё File Edit Uieu Run Breakpoints Data Options Uindou Help HEADY

f — Mrvlii 1^ • rt Filp' n Л4?и V— — 1 — " ъ

IHJUUtl^' p [11C* p.tlirl • i l

^ boo ЙН.ОЭп

• пои DX, offset nsg |

c=0

; Завершим

IpRbeg in * ax 1207 cs:QOOQ B80712 «begin: nov AX, data ;Haci cs:0063 8ED8 * nou DS.AX ;на сегмент cs:0065HH09 * паи AH.OSh ; Функция ВО

bx 0000 ex 0600 dx 0060

z=0 s=0 o=0

codes

cs:6Q07 ВАЭО60 * пои DXjoffset nsg ;Адр cs:060A CD21 * int Zlh ; Вызов DOS cs:OQ6C B8064C * поч ftX,4CQOh ; Функция cs:60QF CD21 + int Zlh ; Вы зов DOS cs;0011 0060 add [bx^sil.al

si 0006 di 0000 bp 0060 sp 6106 ds 1207 es 11F5

p=0

а-Л

а-U

i=i d=o

cs:0013 0000 add U>x+si],al cs:0015 0000 add Cbx+sibal cs:0017 6000 add Ibx+sU.al cs:0619 0000 add [bx*sil,al

ss 1НОЭ cs 1205 ' ip 0005

es:60Q6 CD 26 7D 3D 06 9ft FO ГЕ - >3 ЪЁ|

es:0008 ID FO 32 OB B9 OF 6B 07 -EZdfl+k* es:0010 И 6D ZQ 08 14 6D 92 OB VtQlTId es:601B 01 01 61 60 62 06 FF FF 030 B»

ss:0162 0463 ss:6100>-52FB

Fl-Help FZ-Bkpt F3-t1od F4-Here F5-Zoon F6-Hext F7-Trftce F8-Step F9-Bun FlO-fleiu

Рис. 2.5. Состояние программы после выполнения двух первых команд.

Видно, что указатель команд получил значение 5 и показывает на очередную (еще не выполнявшуюся) команду mov AH,09h, относитель­ный адрес которой равен 5. Сегментный регистр DS получил значение 1207И, что должно соответствовать сегментному адресу сегмента данных. Вспомним, что сегмент команд у нас занимает llh байт и требует в памя­ти 2 параграфа. Сегмент команд имеет сегментный адрес 1205h, следова­тельно, сегментный адрес сегмента данных должен быть равен 1207U, что

мы и получили.

Обратим внимание на самую правую колонку в окне процессора, в которой индицируются состояния флагов процессора. Как уже говорилось, состояния флагов заново устанавливаются процессором после выполнения каждой команды, и по ним можно в определенной степени судить о ре­зультате команды. С самого начала у нас был устаноачен только флаг IF (i в окне отладчика), что свидетельствует о включенном механизме аппарат-

ных прерываний; остальные флаги сброшены. После выполнения двух пер­вых команд состояние регистра флагов не изменилось. Произошло это по­тому, что команда пересылки mov не изменяет состояния флагов. Поскольку в нашей программе нет никаких команд, кроме mov и hit, а команда int тоже состояния флагов обычно не изменяет, то наблюдать с помощью на­шего примера функционирование регистра флагов не удастся.

Рассмотрим теперь стек. Сегмент данных имеет у нас размер 14h байт, и под него в памяти надлежит выделить 2 параграфа. Это объясняет содер­жимое сегментного регистра стека SS — 12091г. Под стек отведено 256 байт, поэтому исходное положение SP (под дном стека) соответствует смеще­нию lOOh.

Наконец, стоит еще обратить внимание на нижнюю половину окна команд, заполненную странными командами add [bx+si],al. Таких команд, да еще в таком количестве, в нашей программе нет, их «придумал» отлад­чик, пытаясь деассемблировать промежуток между сегментом команд и сегментом данных, заполненный нулями. Код OOOOh соответствует коман­де add [bx+si],al, которую и изобразил отладчик.

Таким образом, рассмотрев информацию, предоставленную отладчи­ком, мы подтвердили все предыдущие рассуждения о расположении в памяти сегментов программы и об инициализации регистров процессора при загрузке программы в память.

Обратимся теперь к окну дампа. При запуске отладчика в окно дампа выводится содержимое памяти, начиная с адреса DS:OOOOh, т.е. начало префикса программы (см. рис. 2.4 и 2.5). Для того, чтобы вывести на экран что-либо иное, надо воспользоваться командой <Alt>+<F10>, которая для каждого внутреннего окна процессора открывает дополнительное меню. Вид этого меню зависит от того, какое окне было активным в момент ввода команды. На рис. 2.6 показано дополнительное меню окна дампа.

Goto... Search.. Hext Change.. Follou Previous

Display as Block

Рис. 2.6. Дополнительное меню окна дампа памяти.

Чаще всего приходится пользоваться первым пунктом этого меню Goto, с помощью которого можно задать любой адрес (входящий или не входя-Щий в сегменты программы), и получить дамп этого участка.. На рис. 2.7.

50