Программирование на Ассемблере
Операнд
источника всегда указывается раньше операнда приемника. Это означает, что
нельзя писать так: MOVE D0,#1.
Команда MOVE #1,$1000 записывает число 1 в ячейку памяти с адресом $1000.
Адрес в данном примере выбран произвольно, и обычно в такой форме в
реальных программах не записывается. Вместо этого используют метки:
...
MOVE #1,MARKER
...
MARKER: DC.W 1 Программа состоит, в данном случае, из двух частей: первая часть - это
обычная команда MOVE, которая копирует число 1 в ячейку, помеченную как
MARKER. Вторая часть содержит псевдооперацию (pseudo-op) DC.W, которая не
является командой процессора. Псевдооперации - это директивы ассемблера
(напомним, что ассемблер - это специальная программа-компилятор для
перевода машинных команд из символьного представления в двоичное). В нашем
случае DC означает DеClare (определить переменную), а суффикс .W задает
размер переменной - одно слово (word). Возможны другие варианты суффиксов:
.B (байт) и .L (длинное слово). Такие же суффиксы (.B .W или .L) используются и при записи большинства
машинных команд для задания размера операции, например MOVE.L #$12345678,D0
пересылает длинное слово, а MOVE.B #$12,D0 - байт. Если суффикс опущен,
ассемблер использует размер по умолчанию - .W. Предостережение.
Если при работе с памятью используется размер .W (или .L), адрес должен
быть четным (оканчиваться на 0,2,4,6,8,A,C,E)!
Ассемблеры обычно имеют директиву \'EVEN\' (или \'ALIGN\'), которая служит для
выравнивания адресов по четности. Такая директива необходима, например, в
следующей ситуации:
...
VALUE1: DC.B 1
VALUE2: DC.W 1 Если переменная VALUE1 размещена по четному адресу, то VALUE2 автоматически
попадает на нечетный адрес. Если же использовать ALIGN (EVEN), то между
VALUE1 и VALUE2 (в случае необходимости) будет \"вставлен\" нулевой байт, и
адрес VALUE2 станет четным:
...
VALUE1: DC.B 1
ALIGN
VALUE2: DC.W 1 При выборке отдельных байтов (слов) из памяти необходимо иметь в виду
порядок их расположения.
|