Нам известно, как используются команды DC и DS для резервирования памяти. Мы начнем свое знакомство с командами работы с памятью с тех команд, одним из операндов которых является полное слово памяти. Первым операндом таких команд является регистр общего назначения. Приступим теперь к изучению команд пересылки формата RX.
КОМАНДЫ LOAD И STORE
Команда LOAD (ЗАГРУЗКА) производит пересылку полного слова памяти в регистр. Фактически при выполнении этой команды производится выборка слова из памяти и запись его в указанный регистр. Исходное слово в памяти не меняется, тогда как первоначальное содержание регистра теряется.
Символическое описание команды LOAD имеет вид
L R1,S2(X2) Load R1(S2(X2))F
В качестве первого операнда может быть указан любой из 16 регистров общего назначения. S2 — это символическое имя или выражение, значением которого является адрес памяти. Указанное символическое имя обычно встречается, кроме того, в команде DS или DC, резервирующей память для соответствующего операнда. Например, можно использовать команду
L 3,WORD
в программе, где имя WORD определено предложением WORD DS IF
В этом случае произойдет загрузка содержимого байта с адресом WORD и последующих трех байтов в регистр 3.
Как уже было указано, в качестве S2 может использоваться и выражение, например:
L 7.АВА+8
где АВА определено так:
ABA DS 10F
Результат выполнения команды LOAD в данном случае будет такой: третье слово области АВА будет загружено в регистр 7 (первое слово имеет адрес АВА+0, второе — АВА+4 и третье — АВА+8). Таким образом, в качестве S2 было использовано выражение (символический адрес памяти+модификатор).
Х2 — символическое обозначение индекс-регистра. Номер этого регистра может быть указан в скобках как часть операнда. Если использование индексного регистра не требуется, то (Х2) просто опускается, что и было продемонстрировано в предыдущих примерах. Подробно с применением регистра для индексирования мы познакомимся в разд. 7.2.
Результат выполнения команды LOAD символически изображен как
R1(S2 (Х2))F
Это означает, что содержимое полного слова с адресом S2 + (Х2) помещается в регистр R1. Символ F в данном случае означает, что производится пересылка полного слова. Конечно, при этом должно выполняться правило выравнивания: адрес полного слова должен быть кратен 4. Мы видели, что при задании в командах DC или DS резервируемых элементов памяти типов F или D выравнивание границ производится автоматически. Таким образом, если наш операнд был определен именно так, то с нас снимается забота о выравнивании. Однако эта проблема остается, если нам придется вычислять новые адреса, с чем нам придется вскоре познакомиться.
Теперь рассмотрим пример: пусть в программу включены предложения
X DC F'—3'
Y DC F'15'
Z DC F'100'
После трансляции в памяти, начиная с байта с именем X, будет расположена последовательность
FFFFFFFD0000000F00000064
Команда
L 10,X
произведет загрузку числа FFFFFFFD в регистр 10, а 00000064 можно переслать в регистр 3 с помощью команды
L 3,Z
Заметьте, что мы адресовали полные слова, указывая лишь их первые байты. Машине «известно», что по команде LOAD производится загрузка полных слов, поэтому в регистр попадают указываемый в команде байт и три последующих. Так производится выполнение всех команд, у которых операнд имеет длину, превышающую байт; в качестве адреса операнда указывается адрес его первого байта. Действительная длина операнда определяется либо самим типом команды, либо указывается особо.
Рассмотрим теперь команду
L 5,Х+4
Адрес операнда является адресом байта, отстоящего на 4 от X. Поскольку X выровнен по границе полного слова, значит, то же можно сказать и об Х+4. Результатом выполнения этой команды будет загрузка регистра 5 кодом 0000000F, чего можно было достичь и с помощью команды
L 5,Y
Командой, выполняющей действия, обратные загрузке, является команда STORE (ЗАПИСЬ В ПАМЯТЬ). По этой команде содержимое регистра помещается в полное слово памяти. Фактически производится выборка содержимого регистра и запись результата в память, при этом предыдущее содержимое используемого полного слова теряется.
ST |
R1,S2 (Х2) |
STore |
(R1)F |
Все операнды имеют тот же смысл, что и в предыдущей команде. R1 — один из 16 общих регистров, S2 — символическое имя или выражение и (Х2) — индекс-регистр, указание которого необязательно.
Команда ST и близкие к ней команды STH, STC и STM отличаются от других команд направлением перемещения информации. Здесь она перемещается вправо по отношению к порядку записи операндов. В остальных командах результат помещается на место первого операнда, т. е. первый операнд является «приемником» информации, тогда как второй — ее «источником». Например, в команде
AR 5,3
информация перемещается справа налево, так как содержимое регистра 3 добавляется к содержимому регистра 5, и результат остается в пятом регистре.
Но в командах записи в память первый операнд выступает в роли источника, тогда как второй — в роли приемника. Команда
ST 6, В
производит пересылку содержимого первого операнда во второй.
Пусть в программу включено предложение
SPACE DS 2F
и к моменту выполнения зарезервированная область содержит
4736507658ССА069
Предположим также, что
(5) = 00000008
(6) = FFFFFF10
перед выполнением команды
ST 6,SPACE
В результате выполнения этой команды содержимое области SPACE будет следующим:
FFFFFF1058CCA069
Содержимое регистра 6 было записано в качестве первого слова области SPACE.
Аналогично в результате выполнения команды ST 5,SPACE
содержимое области SPACE примет вид
0000000858ССА069 а в результате выполнения
Будет 47365076FFFFFF10
Комбинируя команды загрузки и записи в память, можно осуществлять любые пересылки полных слов. Пусть мы хотим переслать полное слово APPLE на место полного слова ORANGE. Результат будет достигнут после выполнения пары команд
L 6,APPLE
ST 6,ORANGE
Арифметические команды
Мы видели, что в арифметических командах формата RR, AR, SR, MR и DR первым операндом является регистр или пара регистров и что этот операнд выполняет функции накопителя. Вторым операндом также является регистр, его содержимое используется в качестве операнда арифметической операции и остается неизменным при выполнении команды.
Существуют аналогичные команды формата RX, а именно A, S, М и D соответственно. Разница заключается только в том, что теперь второй операнд — полное слово памяти, а не регистр общего назначения. Ни одна из этих команд не изменяет содержимого памяти. Команды А и S вырабатывают признак результата.
Команда AR производит сложение содержимого второго регистра с содержимым первого, помещая результат в первый регистр. По команде А полное слово памяти складывается с содержимым регистра первого операнда. Результат, как и в предыдущем случае, оказывается в этом же регистре. Итак, команду A (Add — СЛОЖЕНИЕ) можно описать следующим образом:
A R1,S2(X2) Add R1(R1) + (S2(X2))F
Символы R1 и S2 (Х2) имеют то же значение, что и для команд L и ST. Формирование признака результата командой А производится по тем же правилам, что и командой AR. После выполнения команды А может быть произведен условный переход в зависимости от того, каким оказался результат: положительным, отрицательным, нулевым или произошло переполнение.
Пусть
(5)=00000100
и в некоторый момент выполнения программы содержимым памяти, начиная с байта NUMS, является в этом случае после выполнения команды
A 5,NUMS
в регистре 5 окажется сумма исходного содержимого регистра 5 и полного слова NUMS, т. е.
(5)=00000123
Признак результата будет указывать на положительную сумму. Если теперь выполнится команда
A 5,NUMS+4
то по окончании ее выполнения
(5)=000000СЗ
Команда SUBTRACT (ВЫЧИТАНИЕ):
S Rl ,S2 (Х2) Subtract R1(Rl) —(S2(X2))F
помещает в R1 разность между первоначальным содержимым R1 — (R1) и содержимым полного слова с адресом S2 (Х2), устанавливая при этом признак результата. Если
(5)=00000100
а
NUMS: 00000023FFFFFF50 то результатом выполнения команды
S 5.NUMS;
будет
(5) = 00000100 — 00000023 = 00000100 + FFFFFFDD = 000000DD
Команда MULTIPLY (УМНОЖЕНИЕ)
М R1,S2 (Х2) Multiply R1.R1 + 1(Rl +1)X (S2 (X2))F
выполняется так же, как и MR, но второй операнд при этом выбирается , из памяти, а не из регистра. Получающееся двойное слово запоминается в регистре R1 (который должен быть регистром с четным номером) и следующем за ним регистре R1 + 1. Результат является произведением содержимого регистра R1 + 1 на содержимое полного слова с адресом S2(X2). Как и в случае команды MR, выполнение команды М не влияет на признак результата.
Если
(4) = 001286ЕС
(5) = 00000100
и снова содержимое восьми байтов, начиная с байта NUMS, имеет вид
NUMS: 00000023FFFFFF50
то после выполнения команды
М 4,NUMS+ 4
получим
(4) = FFFFFFFF
(5) = FFFF5000
Если вместо этого выполнить команду
М 4.NUMS
то результатом будет
(4) = 00000000
(5) = 00002300
И наконец, для формата RX аналогом команды DR является команда D (ДЕЛЕНИЕ):
D R1,S2 (X2) Divide (Rl,Rl + 1)/(S2(X2))F:
R1остаток R1 + 1
частное
Команда D, как и команда DR, использует делимое длиной в два слова, находящееся в регистре с четным номером R1 и следующем регистре R1+1. Делитель — полное слово, хранящееся по адресу S2(X2). После выполнения команды остаток попадает в регистр R1, частное — в R1 + 1.
В качестве последнего примера рассмотрим результат выполнения команды
D 4,NUMS
Если вначале
(4) = 00000000
(5) = 00000100
и
NUMS: 00000023FFFFFF50 этим результатом будет остаток
(4) = 0000001E
и частное
Команда сравнения
Команда COMPARE (СРАВНЕНИЕ)
С R1,S2(X2) Compare
Установка признака результата в соответствии со знаком разности (R1) — (S2(X2))F
сравнивает содержимое заданного регистра с полным словом по адресу S2(X2). Формируется признак результата, значение которого зависит от того, является ли разность (Rl)— (S2(X2))F положительной, отрицательной или нулевой.
Например, если
(11) = 00000010 и полное слово Р имеет вид
Р: 00000020 то в результате выполнения команды
С 11,Р
вырабатывается признак, соответствующий отрицательному результату. Команда СРАВНЕНИЕ не влияет на содержимое памяти или регистров.
Литералы
В гл. 5 мы видели, что загрузить регистры можно, используя команду следующего вида:
L Rl, = F'значение'
где «значение» — это десятичное число. Например, число 4 засылается в регистр 7 по команде
L 7, = F'4'
Мы, таким образом, рассмотрели пример применения литерала. Знак равенства указывает ассемблеру на необходимость внесения двоичного эквивалента данного числа в программу на машинном языке. В команде в качестве второго операнда должен указываться адрес памяти, поэтому на место литерала ассемблер ставит адрес уже заведенной константы. Мы можем считать команду, приведенную выше, краткой формой записи пары команд
L 7,FOUR
FOUR DC F'4'
При использовании литералов задача составления эквивалента DC- предложения решается самим ассемблером.
Литерал можно использовать в любой команде работы с памятью в качестве операнда-источника информации. Таким образом, можно сложить 10 с содержимым регистра 2, выполнив команду
А 2, = F'10'
а команда
М 6, = F'l 10'
производит умножение (7) на 110.