Команды работы с памятью

{toc_noshowall}Нам известно, как используются команды 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)FS2(X2)

Все операнды имеют тот же смысл, что и в предыдущей команде. 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.

Расскажи друзьям
 
Статьи раздела