К. Хамахер, З. Вранешич, С. Заки - Организация ЭВМ - 5-е издание (2003) (1114649), страница 31
Текст из файла (страница 31)
3.1. Регистры, доступ к памяти и пересылка данных 133 Таблица 3.1. Индексные режимы адресации процессора АЯМ Синтаксис языка ассемблера Формирование адреса Адресация С непосредственно заданным смещением ЕА-[Кп) е смещение ЕА-[Вп] ч смещение; Кл +- [Вл] е смещение ЕА=[Вл); Кп+- [Кп] е смещение [Кл, йсмещение] [Кп, йсмещение]! Преиндексация Преиндексация с обратной записью Постиндексация [Кл], помещение Со значением смещения в регистре Вт Преиндексация ЕА-[Кл] ~ [Кгл] со сдвигом ЕА-[Кл] я [Кт] со сдвигом; Вл +- [Вл] х [Кт] со сдвигом ЕА-[Вп]; Кп +- [Кп] й [Кт] со сдвигом ЕА-Адрес -[РС] е смещение [Кп, й Вт, сдвиг! [Вл, Х Кт, сдвиг]! Преиндексзция с обратной записью Постиндексация [Вп], Я Вгл, сдвиг Адрес Относительная (Пренндексация с непосредственно заданным смещением) Во всех трех режимах адресации смещение может быть задано непосредственно в команде как значение из диапазона ч-4095.
В качестве альтернативы это можно сделать в регистре Вгл, указав знак (направление) смещения, в виде префикса ч-, перед именем регистра. Например, команда [.[)К КО, [К1, — К2]! выполняет операцию КО +- ЦК1) — [К2)) Исполнительный адрес операнда этой команды, [К1) — [К2], загружается в регистр К1, поскольку восклицательный знак обозначает обратную запись. Когда смещение задается в регистре, оно умножается на степень двойки путем сдвига.
Сдвиг в языке ассемблера задается при помощи значения 1.5[. (сдвиг влево) илк 15К (сдвиг вправо). Данное значение и указанная после него величина смещения следуют за именем регистра, Кгл, как показано в табл. 3.1. Величина смещения ЕА — исполнительный адрес (енеспте аббгезз). Смещение — число со знаком, заданное в команде. Сдвиг направление В целое число, гле направление принимает значение 151 (слвиг влево) или !.БВ (сквиг вправо), з целое число — зто 5-битовое беззнаковое число, определяющее величнну сдвига вхм — значение смещения, хранящееся в регистре Кеь которое может быть прибавлено илн отнято от содержимого базового регистра Вл. 134 Глава 3. Системы команд процессоров АЯМ, Мо1ою!а и!п1е! задается как целое число из диапазона от 0 до 31. Например, перед использованием в качестве смещения содержимое регистра Е2 в приведенном выше примере может быть умножено на 16 следующим образом: ЕПК КО, ~К1, -Е2,13Е №41! Данная команда выполнит такую операцию: КО+- П٠— 16 ° (йгЦ а затем загрузит исполнительный адрес в регистр Е1.
В качестве базового регистра Вл может использоваться счетчик команд, РС. Этот случай соответствует относительному режиму адресации, описанному в разделе 2.5. Ассемблер определяет непосредственно заданное смещение как расстояние со знаком между адресом операнда и содержимым обновленного регистра РС. Если исполнительный адрес вычисляется во время выполнения программы, в регистр РС записывается адрес слова, расположенного на два машинных слова дальше текущей команды (в которой указывается относительный режим адресации).
Связано это с конвейерным выполнением команд, о котором рассказывается в главе 8. На рис. 3.3, а приведен пример относительного режима адресации. Адрес операнда, символически заданный в команде как 1ТЕМ, равен 1060. Архитектура АЕМ не предусматривает абсолютной адресации. Поэтому, когда в языке ассемблера адрес задается так, как показано на этом рисунке, всегда используется относительная адресация. Она реализуется как преиндексная адресация с непосредственно заданным смещением и с указанием регистра РС в качестве базового. Как следует из данного рисунка, вычисленное ассемблером смещение равно 52, поскольку в момент его определения в процессе выполнения программы обновленный регистр РС содержит значение 1008, а исполнительный адрес, который должен быть сгенерирован, равен 1060 - 1008 + 52.
Операнд должен находиться не более чем на 4095 байт выше или ниже адреса, содержащегося в обновленном регистре РС. Если заданный в команде адрес операнда находится вне этого диапазона, ассемблер сообщает об ошибке, и в таком случае должен использоваться другой режим адресации.
На рис. 3.3, 6 дан пример преиндексного режима адресации со смещением, указанным в регистре Кб, и базовым значением, указанным в регистре К5. Команда 3гоге (БТЕ) сохраняет содержимое регистра ЯЗ в слове памяти по адресу 1200. Представленные на рис. 3.4 примеры наглядно демонстрируют, для чего нужна обратная запись в постиндексном и преиндексном режимах адресации. На рис. 3.4, а показаны первые три числа списка из 25 чисел, хранящихся в памяти начиная с адреса 100 и отстоящих на 25 слов друг от друга.
Они составляют первую строку матрицы чисел 25 х 25, располагаюшуюся в памяти по столбцам. Первый столбец первой строки матрицы хранится по адресу 1000. Числа с адресами 1100, 1200, ..., 3400 составляют первую строку матрицы, а 25 чисел с адресами 1000, 1004, 1008, ..., 1096 — ее первый столбец. 3.1. Регистры, доступ к памяти и пересылка данных 135 Адрес памяти 1000 1004 1008 Смещение = 52 1ТКМ 1060 Базовый регистр 1000 Регистр смешения Т Смещение 200 1200 Рис.
3.3. Примеры режимов адресации процессора АПЧ; относительный(а), преиндексный(б) Для доступа к последовательным числам первой строки матрицы удобнее всего воспользоваться постиндексной адресацией с обратной записью и смещением в регистре. Предположим, что базовым регистром служит гс2 и что в нем содержится значение начального адреса 1000.
Регистр К10 предназначен для хранения смещения, и в него загружается значение 25. Далее может быть выполнен программный цикл, на каждом шаге которого команда 1ЛЖ КЦК21,210,) 51 №2 136 Глава 3. Системы команд процессоров АНМ, Мо1ого)а и )п1е) Адрес памяти 1000 Т Базовый регистр 100 - 25 х 4 1100 К10 Регистр смещения 100-. 25 х4 1200 Команда ).озд; ).ВК К1,[К2),К10,).Я. Г)2 Базовый регистр (указатель стека) 2008 КО 2012 Команда проталкивания в стек: 5ТК КО,[К5,Л-4)! Рис. 3.4. Режимы адресации процессора АЯМ, з которых используется обратная запись: постиндексный (е); преиндексный (б) будет загружать в регистр К1 очередной элемент первой строки матрицы. А теперь давайте рассмотрим эту программу более подробно.
Когда команда загрузки выполняется в первый раз, исполнительный адрес )К2] равен 1000. Расположенное по данному адресу число 6 помещается в регистр К1. Далее операция обратной записи изменяет содержимое регистра К2 с 1000 на 1100, для того чтобы он указывал на следующее число, — 17. Для этого содержимое регистра смещения К10, равное 25, сдвигается на два разряда влево и результат прибавляется к содержимому регистра К2. Содержимое регистра К10 при этом не меняется. Сдвиг влево эквивалентен умножению числа 25 на 4, так что в результате генерируется смещение 100. После добавления значения смешения к содержимому регистра К2 в этот регистр записывается новый адрес — 1100.
И когда команда загрузки выполняется повторно, на второй итерации цикла, в регистр К1 записывается второе число из хранящихся в матрице, то есть -17. Третье число, 321, загружается в К1 на третьей итерации и т. д. 3.1. Регистры, доступ к памяти и пересылка данных 137 В этом примере к содержимому базового регистра добавляется сдвинутое содержимое регистра смещения. Как следует из табл. 3.1, его можно не только добавлять, но и вычитать из содержимого регистра смещения, Допускается сдвиг вправо или влево на любое количество разрядов от 0 до 31. На рис. 3.4, б приведен пример проталкивания в стек содержимого регистра КО (числа 27).
Регистр К5 используется в качестве указателя стека. Первоначально он содержит число 2012 — адрес текущей вершины стека. Воспользовавшись преиндексной адресацией с обратной записью, операцию помещения в стек можно выполнить посредством такой команды: ЯТК КО,[К5,№-41! Непосредственно заданное смеьцение -4 добавляется к содержимому регистра К5 (числу 2012), а результат опять записывается в К5. Новый адрес вершины стека, 2008, используется как исполнительный адрес операции сохранения.
Эта операция, определяемая командой 5ТК, записывает по адресу 2008 содержимое регистра КО (число 27). Загрузка и сохранение нескольких операндов В дополнение к командам загрузки и сохранения, имеющим по одному операнду, процессор АКМ поддерживает еще две команды, которые могут загрузить и сохранил несколько операндов. Они называются командами блочной пересьия~ и предназначены для загрузки из памяти или сохранения в памяти любого подмножества регистров общего назначения. Допускается применение только операндов длиной в одно слово. Указанные команды называются 1.ПМ (1.оаб Мп11!р1е — множественная загрузка) и ЯТМ (Итоге Мп111р!е — множественное сохранение). В памяти операнды должны располагаться в последовательных словах.
Разрешаются все формы преиндексной и постиндексной адресации с обратной записью и без таковой. Они относятся к заданному в команде базовому регистру Кп. Смещение, производимое этими командами, всегда равно 4, поэтому задавать его явно не нужно. Список регистров должен быть создан в порядке возрастания их номеров в виде выражения языка ассемблера. В качестве примера рассмотрим случай, когда базовым регистром является КО, который первоначально содержит значение 1000.
Тогда команда 1.)эМ1А К10),(КО,К1,КО,К7) перешлет слова, расположенные в памяти по адресам 1000, 1004, 1008, 1012 в регистры КО, К1, Кб, К7, и после выполнения последней операции пересылки в регистре К10 останется адрес 1016. Суффикс 1А в коде операции означает «1псгеп1епг А(гегэ (постннкрементапия) и соответствует постиндексному режиму адресации.