Следующая команда:
mov ax,[bx+2]
помещает в регистр AX слово, находящееся в сегменте, указанном в DS, со смещением на 2 большим, чем число, находящееся в BX.
Такая форма адресации используется в тех случаях, когда в регистре находится адрес начала структуры данных, а доступ надо осуществить к какому-нибудь элементу этой структуры. Другое важное применение косвенной адресации со сдвигом — доступ из подпрограммы к параметрам, переданным в стеке, используя регистр BP (EBP) в качестве базы и номер параметра в качестве смещения.
Другие допустимые формы записи этого способа адресации:
mov ax,[bp]+2
mov ax,2[bp]
mov ax,2+[bp]
Начиная с 80386 и старше, процессоры Intel позволяют дополнительно использовать EAX, EBX, ECX, EDX, EBP, ESP, ESI и EDI, так же как и для обычной косвенной адресации. С помощью этого метода можно организовывать доступ к одномерным массивам байт: смещение соответствует адресу начала массива, а число в регистре — индексу элемента массива, который надо считать. Очевидно, что, если массив состоит не из байт, а из слов, придется умножать базовый регистр на два, а если из двойных слов — на четыре. Для этого предусмотрен специальный метод адресации – косвенная адресация с масштабированием.
Рассмотрим применение косвенной адресации со смещением на примере прямого вывода в видеобуфер.

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


Теперь медитация в отладчике... Скрин ниже сделан после выполнения первых двух команд инициализации регистра DS.

Так же видим, что одна команда push offset bt1 транслировалась в 5 машинных команд, соответственно и две другие команды, заносящие смещение наших символов в стек, так же транслировались каждая в 5 машинных инструкций. Обращаем внимание на смещение в этик командах, указывающее на наши символы в сегменте данных.
Едем дальше... Следующий скрин сделан после исполнения команды push offset bt1, вернее соответствующих ей 5 машинных команд:

Теперь выполняем следующую команду push offset bt2...



Следующие три команды производят очистку экрана. Команда mov bp,sp поместит содержимое SP. Если бы подпрограмма просто сняла со стека находящиеся там параметры, она первым делом изъяла бы из стека адрес возврата, и лишила бы себя возможности вернуться в основную программу. Поэтому в данном случае вместо команд pop удобнее воспользоваться командами mov для получения нужных значений из стека. Следующие две команды настраивают сегментный регистр ES на работу с видеобуфером. Затем в регистр DI помещается смещение к первому знакоместу экрана. А вот следующую команду mov si,6[bp] рассмотрим более подробно.
Следующий скриншот сделан после выполнения трех команд:
mov si,6[bp]
mov cx,[si]
mov byte ptr es:[di],cl
Смотрим и просветляемся...

1 комментарий:
m
Отправить комментарий