Иллюстрированный самоучитель по Assembler


Способы адресации - часть 9


Рассмотрим применение косвенной адресации со смещением на примере прямого вывода в видеобуфер.

mov AX,0B800h ;Сегментный адрес


mov ES,AX ;видеобуфера в ES


mov DI, 80*2*24 ;Смещение к нижней строке экрана


mov byte ptr ES: [DI] ,'О' ;Символ на экран


mov byte ptr ES:2[DI],'К' ;Запишем символ в следующую позицию


mov byte ptr ES:4[DI],' ! ' ;Запишем символ в следующую позицию

В этом примере в качестве базового выбран регистр DI; в него заносится базовый относительный адрес памяти, в данном случае смещение в видеобуфере к началу последней строки экрана. Модификация этого адреса с целью получить смещение по строке экрана осуществляется с помощью констант 2 и 4, которые при вычислении процессором исполнительного адреса прибавляются к содержимому базового регистра DI.

Иногда можно встретиться с альтернативными обозначениями того же способа адресации, которые допускает ассемблер. Вместо, например, 4[ВХ] можно с таким же успехом написать [ВХ+4], 4+[ВХ] или [ВХ]+4. Такая неоднозначность языка ничего, кроме путаницы, не приносит, однако ее надо иметь в виду, так как с этими обозначениями можно столкнуться, например, рассматривая текст деассемблированной программы.

Рассмотрим теперь пример использования базовой адресации со смещением при обращении к стеку:

;Основная программа


push DS ;В стек загружаются значения


push ES ;трех регистров,


push SI ;передаваемых подпрограмме


call mysub ;Вызов подпрограммы mysub,


;использующей эти параметры


;Подпрограмма mysub


mov BP,SP ;Поместим в ВР текущий адрес вершины стека


mov АХ,2[ВР], ;Читаем в АХ последний параметр (SI)


mov ВХ,4[ВР] ;Читаем в ВХ предыдущий параметр (ES)


mov CX,6[BP] ;Читаем в СХ первый параметр (DS)

Здесь продемонстрирован классический прием чтения содержимого стека без извлечения из него этого содержимого. После того, как основная, программа сохранила в стеке три параметра, которые потребуются подпрограмме, командой call вызывается подпрограмма mysub. Эта команда сохраняет в стеке адрес возврата (адрес следующего за call предложения основной программы) и осуществляет переход на подпрограмму. Состояние стека при входе в подпрограмму приведено на рис. 2.15.




- Начало -  - Назад -  - Вперед -



Книжный магазин