Программирование на Ассемблере
Более
того, если код первой программы разместить с адреса $2000, то операнд
команды MOVE все равно будет браться из ячейки $1100, в то время как во
втором варианте MOVE будет корректно обращатся к переменной MARKER, адрес
которой будет теперь уже не $1100, а $2100. Таким образом, второй вариант
программы будет корректно работать в любом месте памяти.
Существует также вариант косвенного регистрового метода адресации с
8-битным смещением и индексным регистром, в котором все смещения указаны
относительно программного счетчика (PC) (например, MOVE M(PC,D0),D1). Нам осталось рассмотреть еще два метода адресации процессора MC68000:
косвенный регистровый с постинкрементом и косвенный регистровый с
предекрементом. В первом методе после обращения к памяти адресный регистр
увеличивается на 1, 2 или 4 (это зависит от размера команды), например: MOVE.L #$1000,A0
MOVE.B #1,(A0)+ Здесь по адресу $1000 запишется 1, а содержимое регистра A0 увеличится на 1
(так как указан суффикс .B). Постинкрементный метод очень полезен при
работе с таблицами, когда требуется последовательный доступ к элементам
(обычно используется в циклах, но об этом позднее).
Аналогично работает предекрементный метод, в котором перед обращением к
памяти адресный регистр уменьшается на 1, 2 или 4, например программа MOVE.L #$1000,A0
MOVE.B #1,-(A0) запишет 1 по адресу $FFF, так как содержимое регистра A0 СНАЧАЛА
декрементируется, а затем используется.
Эти методы адресации широко используются для работы со стеком. Например,
чтобы \"затолкнуть\" содержимое D0 в стек, можно написать MOVE D0,-(A7) ;используем предекремент, так как стек
;\"растет\" в сторону уменьшения адресов а чтобы \"вытолкнуть\" слово из стека в D0, можно написать MOVE (SP)+,D0 ;SP всегда указывает на последнее занесенное
;в стек значение Заметим, что указатель стека должен быть четным (так как стек используется
некоторыми командами процессора для размещения слов и длинных слов).
|