Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Организация ЭВМ и систем. Учебное пособие
.pdf
Суммарные сведения о постбайтных режимах адресации МП К1810 сведены в
таблице 8.3.
Таблица 8.3 – Постбайтные режимы адресации
D8=dispL (однобайтное смещение)
D16=dispH, dispL (двухбайтное смещение)
Примечание. Важно отчетливо понимать различие в смысловом использова-
нии термина "смещение". "Смещение" (displacement), содержащееся в команде, ин-
терпретируется как знаковое целое число, которое участвует в формировании эф-
фективного адреса (ЕА) операционным устройством. С другой стороны, из-за сег-
ментной организации памяти, весь ЕА является "смещением" (offset) относительно
базового адреса сегмента и интерпретируется как беззнаковое целое число.
Рассмотрим более подробно различные форматы команд на примере команды
MOV.
1. Формат «регистр-память» (2-4 байта):
MOV mem/reg1, mem/reg2
Эти команды описывают операции, в которых данные могут быть переданы
между регистром (операнд-регистр) и памятью (операнд-память), либо между двумя
регистрами (регистр-регистр). Бит «w» в первом байте определяет размер операндов: если «w» равно 1, то операнды имеют размер слова, иначе они имеют размер
131

байта. Бит «d» указывает, куда записывается результат: если «d» равно 1, результат
Код операции (КОП)
d w mod
reg
r/mem
1 0 0 0 1 0 1 1 1 1 0 0 0 0 1
1
АХ
ВХ 8 В С 3
Код операции (КОП)
d w mod
reg
r/mem
1 0 0 0 1 0 0 1 1 1 0 1 1 0 0
0
ВХ
АХ
8 9 D
8
записывается в регистр, который определен полем «reg» (регистр-регистр), а если
"d" равно 0, результат записывается в память или во второй регистр.
Трехбитовое поле «reg» во втором байте указывает на операнд-регистр (см.
таблицу 1). Двухбитовое поле «mod» определяет, сколько байтов занимает операндадрес в команде (00 - 0 байтов, 01 - 1 байт, 10 - 2 байта). Трехбитовое поле «mem»
указывает на способ модификации этого адреса (см. таблицу 8.2).
Замечания:
если в команде не задан адрес, то он считается нулевым;
если адрес задан в виде байта (D8), то он автоматически расширяется со
знаком до слова (D16);
случай «mod=00» и «mem=110» указывает на отсутствие регистров-
модификаторов, при этом адрес должен иметь размер слова (адресное выражение
[BP] в ассемблере транслируется в «mod=01» и «mem=110» при D8=0);
случай «mod=11» соответствует формату «регистр-регистр»;
машинный формат для данной команды может быть представлен в двух ви-
дах, в зависимости от того, какой регистр находится в поле reg.
Пример. Машинный формат для команды MOV AX, BX.
132

2. Формат «регистр-непосредственный операнд» (2-3 байта):
КОП
w
reg =CX
dataL
dataH
1 0 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 0 1
0
B 9 7 5 F
A
MOV reg, data
Команды этого формата описывают операции, в которых значение «immed»
(непосредственный операнд) назначается регистру (операция «reg:=immed»). Бит
«w» указывает на размер операндов: если «w» равно 1, то операнды имеют размер
слова, иначе они имеют размер байта. Поле «reg» определяет регистр-операнд, в который записывается значение «immed».
Непосредственный операнд может занимать 1 или 2 байта, в зависимости от
значения бита «w». При этом, если операнд-слово записывается в команде, оно
представляется в "перевернутом" виде, что означает, что байты могут быть пере-
ставлены.
Пример. Машинный формат для команды MOV CX, 0FA75h.
3.Формат «память-непосредственный операнд» (3-6 байтов):
MOV mem/reg, data
Команды этого формата описывают операции типа mem:=immed. Смысл всех
полей – тот же, что и в предыдущих форматах.
133

Пример. Машинный формат для команды MOV [BX+SI+35ACh], 75A8h.
КОП
w
mod
reg
r/mem
[bx+si+d16]
dispL
1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 C 7 8 0 A
C
dispH
dataL
dataH
0 0 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 1 1 1 0 1 0
1
3 5 A 8 7
5
Команды типа 4-5 позволяют обмениваться данными между аккумулятором
(регистры AL, AX) и ячейкой памяти, адресуемой полями dispL, dispH.
4. MOV ас, mem
5. MOV mem, ас
Следующие две команды предназначены для работы с сегментными регистрами.
6. MOV sreg, mem/ reg
7. MOV mem/ reg, sreg
134

8.3 Режимы адресации
При выполнении любой программы процессор обращается к памяти, где хра-
нятся как команды, так и данные. В командах, которые выполняют операции с дан-
ными, адреса операндов определяются, а в командах передачи управления указыва-
ются адреса команд, которым передается управление, то есть адреса переходов.
Способ определения в команде адреса операнда или адреса перехода называется ре-
жимом адресации или просто адресацией.
Для современных процессоров разработано более двадцати режимов адреса-
ции, которые различным образом удовлетворяют вышеуказанным требованиям. Ре-
жимы адресации значительно расширяют гибкость и удобство использования си-
стемы команд [16].
Назначение режима адресации заключается в указании способа формирования
эффективного (или исполнительного) адреса (ЕА). Этот адрес может быть либо ад-
ресом операнда (в командах, которые оперируют данными), либо адресом перехода
(в командах, которые передают управление).
Режимы адресации делятся на прямые и косвенные. В прямой адресации эф-
фективный адрес либо содержится в команде, либо вычисляется с использованием
значения, указанного в команде, и содержимого регистра (или двух регистров), та-
ким образом, адрес операнда определен непосредственно.
В случае косвенной адресации, эффективный адрес в команде указывает на
регистр или ячейку памяти, которая содержит окончательный эффективный адрес.
Большинство современных процессоров допускают только один уровень косвенно-
сти, хотя в принципе этот уровень может быть любым.
Давайте рассмотрим стандартные режимы адресации, учитывая вышеуказан-
ные особенности формирования эффективного адреса.
8.3.1 В регистровой адресации операнд находится в одном из общих регистров
процессора (МП), и в некоторых командах, операнд может находиться в одном из
сегментных регистров. Регистр, который содержит операнд, может быть определен в
байте кода операции или в постбайте режима адресации. В двухоперандных коман-
135

дах определяются два регистра. Регистры идентифицируются с использованием 3битных полей «reg» и «r/m» (когда «mod»=11). В зависимости от значения бита «w»
в операции, участвует либо 8-битный, либо 16-битный регистр (или регистры).
Команды, которые выполняют операции над содержимым регистров, обычно
являются наиболее короткими и быстрыми, так как они не требуют доступа к памя-
ти и, следовательно, не используют циклы шины данных для обращения к памяти.
В ассемблерных программах регистры обозначаются зарезервированными
именами, такими как AL, AH, AX, BL, BH, BX и т.д. Примеры ассемблерных команд
с регистровой адресацией приведены ниже.
MOV AX, SI ; передать содержимое SI в AX.
ADD DI, BX ; прибавить содержимое BX к DI.
AND CL, AX ; ошибка - несоответствие размеров.
XOR AL, AH ; исключающее ИЛИ регистров AL и AH.
8.3.2 В непосредственной адресации операнды представлены непосредственно
в командах и имеют длину 8 или 16 бит. Доступ к таким операндам выполняется
очень быстро, так как они находятся непосредственно внутри команды, и не требу-
ется цикл шины данных для их извлечения из памяти. Важно отметить, что непо-
средственные операнды нельзя изменить в ходе выполнения команды.
Этот режим адресации применяется для большинства двухоперандных ко-
манд. Наличие постбайта режима адресации в командах позволяет взаимодейство-
вать с непосредственными операндами и содержимым регистров или ячеек памяти.
Однако в архитектуре процессора нет команд для непосредственной загрузки сег-
ментных регистров и включения констант в стек, что может вызвать некоторые не-
удобства при программировании. Стандартный непосредственный операнд имеет
длину 16 бит, хотя также существуют короткие операнды, которые имеют длину 8
бит (при необходимости они расширяются со знаком до 16 бит).
Константы, представленные в командах, используются для различных целей,
таких как инициализация регистров и переменных в памяти, создание масок для
операций над отдельными битами, сравнение переменных с граничными значениями
и многое другое.
136

Непосредственные операнды в командах находятся в конце формата команды,
после смещения (если оно имеется), и первым следует младший байт константы.
Примеры записи команд с непосредственными операндами на языке ассем-
блера приведены ниже.
SUB AL, 30H ; вычесть из содержимого AL число 48.
MOV CL, 10 ; загрузить в регистр CL число 10.
AND AX, 0F000H ; выделить старшие четыре бита AX.
XOR DH, 1 ; инвертировать младший бит DH.
CMP BL, 40H ; сравнить содержимое BL с числом 64.
8.3.3 Прямая адресация представляет собой один из самых простых режимов
адресации, где эффективный адрес (ЕА) берется непосредственно из поля смещения
в команде, и никакие регистры не используются для вычисления адреса. Этот режим
адресации применяется для доступа к простым переменным, которые также назы-
ваются скалярами. В данном режиме нет необходимости выполнять вычисления для
получения адреса, и операция выполняется непосредственно по указанному смеще-
нию в команде.
Примеры ассемблерных команд с прямой адресацией приведены ниже.
MOV AX, GAMMА ; загрузить в AX переменную GAMMA.
ADD TEMP, BL ; прибавить (BL) к переменной TEMP.
Длинная прямая адресация представляет собой разновидность прямой адреса-
ции, в которой программа содержит и базовый адрес сегмента, и смещение. Этот
формат обеспечивает прямой доступ к операнду с любым логическим (и физиче-
ским) адресом. Однако длинная прямая адресация применяется только в командах,
связанных с межсегментными переходами и вызовами, и не может использоваться в
командах, которые оперируют данными. Метки, которым передается управление в
командах с данным режимом адресации, должны иметь тип FAR (far-метки). Этот
механизм позволяет осуществлять переходы и вызовы между разными сегментами
памяти и обеспечивает большую гибкость при организации программы.
8.3.4 Косвенная регистровая адресация. В этом режиме эффективный адрес ЕА
операнда находится в одном из базовых или индексных регистров (рисунок 8.3).
137

Рисунок 8.3 – Регистровая косвенная адресация
В косвенной адресации среди четырех адресных регистров BP, BX, SI и DI мо-
гут использоваться только регистры BX, SI и DI. Косвенная адресация через указа-
тель базы BP может быть моделирована с помощью базовой адресации с нулевым
смещением (см. ниже).
Этот режим адресации с некоторыми вариантами используется во всех совре-
менных процессорах. Он позволяет вычислять адреса во время выполнения про-
граммы, что часто требуется, например, при доступе к различным элементам регу-
лярных структур данных. Когда содержимое регистра изменяется, одна и та же ко-
манда оперирует разными ячейками памяти. Для изменения содержимого регистра
используется команда загрузки эффективного адреса LEA, а также все арифметиче-
ские и логические команды. Важно отметить, что в командах безусловного перехода
и вызова подпрограммы CALL с регистровой косвенной адресацией можно указы-
вать любой 16-битный общий регистр.
Ниже приведены примеры записи команд с косвенной регистровой адресацией
на языке ассемблера.
ADD AX, [DI] ; прибавить к AX содержимое ячейки памяти, адресуе-
; мой регистром D.I
MOV [SI], CL ; передать (CL) в ячейку памяти, адресуемую SI.
MOV DI, [DI] ; передать в DI содержимое ячейки памяти, адресуемой
; регистром DI.
JMP AX ; перейти по адресу, находящемуся в регистре AX.
CALL BX ; вызвать подпрограмму по адресу из ВХ.
138

8.3.5 Базовая адресация, также известная как адресация с использованием ба-
зы, представляет собой режим адресации, в котором эффективный адрес операнда
определяется как сумма значения смещения и содержимого регистров ВХ или ВР
(рисунок 8.4). В этом режиме адресации базовой регистром обычно служит регистр
ВХ или ВР, и смещение указывается в команде. Этот режим адресации позволяет
создавать адреса, которые могут изменяться во время выполнения программы, и ча-
сто используется для доступа к элементам структур данных или массивам, где каждый элемент имеет постоянное смещение относительно базового адреса.
Рисунок 8.4 – Базовая адресация
Использование регистра ВХ удобно при доступе к структурированным запи-
сям данных, расположенным в различных областях памяти. В этом случае базовый
адрес записи помещается в базовый регистр ВХ, и доступ к отдельным элементам
записи осуществляется путем задания их смещения относительно базы. При этом
для доступа к разным записям одной и той же структуры данных достаточно изме-
нить содержимое базового регистра соответствующим образом.
Допустим, вам нужно прочитать с диска учетные записи для ряда работников.
Каждая запись содержит информацию, такую как табельный номер работника, но-
мер отдела, номер группы, возраст, тарифная ставка и так далее. Если номер отдела
хранится в пятом и шестом байтах записи, и начальный адрес записи содержится в
регистре ВХ, то команда MOV AX, [BX]+4 загрузит в регистр АХ номер отдела, в
котором работает данный работник (см. рисунок 8.5). Обратите внимание, что сме-
щение равно 4, а не 5, потому что в адресации байтов считается с нуля.
139

Этот подход позволяет легко получать доступ к различным полям записей,
хранящимся в памяти, с использованием базового регистра и смещения, что упро-
щает работу с структурированными данными.
Рисунок 8.5 – Адресация по базе
Ассемблер фирмы IBM позволяет указывать адресуемые по базе операнды
тремя разными способами. Следующие команды эквивалентны.
MOV CX, [BX]+4 ; то стандартная форма записи.
MOV СX, 4[BX] ; но сдвиг можно указать на первом месте
MOV CX, [BX +4] ; или внутри скобок.
MOV CX, [BX]10 ; обе команды передают шестое слово
MOV AX, [BX +10] ; массива, адресуемого регистром BX.
ADD [BP]PRIM_1, SI ; прибавить SI к слову PRIM_1 в массиве, кото-
; рый находится в сегменте стека и адресуется
; регистром ВP.
Важно отметить, что при использовании регистра ВР в качестве базового ад-
реса, шинный интерфейс будет обращаться к операнду в текущем сегменте стека,
если не указан префикс замены сегмента. Это делает базовую адресацию с реги-
стром ВР очень удобной для доступа к данным, хранящимся в стеке. Этот механизм
становится необходимым, например, при передаче параметров в подпрограммы че-
рез стек, где данные ожидаются в текущем сегменте стека.
Использование регистра ВР для доступа к данным в стеке обеспечивает удоб-
ство и гибкость при работе с параметрами и локальными переменными в подпро-
140
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
