Ассемблер Это просто! Учимся программировать


         

Программа будет работать нормально. Но


mov dx,109h

Программа будет работать нормально. Но для этого нам нужно высчитать самим этот адрес. Попробуйте вставить следующие команды, начиная со строки (07) в Примере № 3:

(07) int 20h (08) int 20h (09) My_name db 'Dima$' (10) CSEG ends (11) end _start

Просто продублируем команду int 20h (хотя, как Вы уже знаете, до строки (08) программа не дойдет).

Теперь ассемблируйте программу заново. Запускайте ее под отладчиком. Вы увидите, что в DX загружается не 109h, а другое число. Подумайте, почему так происходит. Это просто!

В окне "Memory" ("Память") отладчика CodeView (у AFD нечто подобное) Вы должны увидеть примерно следующее:

1234:0000CD 20 00 A0 00 9A F0 FE= .a.

№1№2№3№4

Позиция №1 (1234) - сегмент, в который загрузилась наша программа (может быть любым).

Позиция №2 (0000) - смещение в данном сегменте (сегмент и смещение отделяются двоеточием (:)).

Позиция №3 (CD 20 00 ... F0 FE) - код в шестнадцатеричной системе, который располагается с адреса 1234:0000.

Позиция №4 (= .a.) - код в ASCII (ниже рассмотрим), соответствующий шестнадцатеричным числам с правой стороны.

В Позиции №2 (смещение) введите значение, которое находится в регистре DX после выполнения строки (5). После этого в Позиции №4 Вы увидите строку "Dima$", а в Позиции №3 - коды символов "Dima$" в шестнадцатеричной системе... Так вот что загружается в DX! Это не что иное, как АДРЕС (смещение) нашей строки в сегменте!

Но вернемся. Итак, мы загрузили в DX адрес строки в сегменте, который мы назвали CSEG (строки (01) и (09) в Примере № 3). Теперь переходим к следующей команде: int 21h. Вызываем прерывание DOS с функцией 9 (mov ah,9) и адресом строки в DX (mov dx,offset My_name).

Как я уже говорил раньше, для использования прерываний в программах, в AH заносится номер функции. Номера функций желательно запоминать (хотя бы часто используемые) с тем, чтобы постоянно не искать в справочниках, что делает функция.




Содержание  Назад  Вперед