Косвенная адресация представляет собой метод, при котором адрес операнда указывает на другой адрес, содержащий фактическое значение. Этот подход позволяет программе быть более гибкой, но он занимает больше времени на исполнение, поскольку требует двойного обращения к памяти. Особенно полезной косвенная адресация становится при работе с массивами данных или когда программа должна адаптироваться к изменяющимся условиям хранения данных.
Косвенная адресация в электронно-вычислительных машинах использует адрес адреса операнда, что позволяет достичь большей гибкости в обработке данных. Например, команда ADD @ 100 означает сложение содержимого аккумулятора с содержимым ячейки памяти, адрес которой содержится в ячейке 100.
Особенности косвенной адресации:
- Более сложная обработка: Для выполнения операции необходимо сначала выбрать команду с косвенным адресом, затем получить исполнительный адрес и только после этого обработать данные.
- Большая гибкость: Косвенная адресация позволяет программе просто изменять содержимое ОЗУ, которое содержит действительный адрес данных.
- Медленнее прямой адресации: Требует дополнительного обращения к памяти для получения исполнительного адреса.
- Сложность для программистов: Многие программисты считают косвенную адресацию более сложной и подверженной ошибкам.
- Удобство для подпрограмм: Позволяет одной и той же подпрограмме обрабатывать данные из различных массивов памяти.
В целом, несмотря на свою кажущуюся сложность, косвенная адресация остаётся важным инструментом в арсенале современных электронно-вычислительных машин, обеспечивая гибкость и возможность эффективной работы с различными структурами данных.
Примеры косвенной адресации в процессорах Intel 8080 и Motorola 6800
Intel 8080
Команда косвенной адресации в Intel 8080 может выглядеть так:
MOV A, M ; Загрузить в аккумулятор данные из адреса, указанного в паре регистров HL
Здесь M
обозначает содержимое по адресу, указанному в регистрах H
(старший байт адреса) и L
(младший байт адреса). При использовании косвенной адресации, если пара регистров HL
содержит значение 1234h
, то MOV A, M
загрузит в A
значение из ячейки памяти 1234h
.
Motorola 6800
В случае Motorola 6800 косвенная адресация может использоваться так:
LDAA ,X ; Загрузить в аккумулятор A значение по адресу, хранящемуся в индексном регистре X
Эта команда использует содержимое индексного регистра X
как адрес памяти для загрузки в аккумулятор A
.
Таблица программы на Intel 8080 с использованием косвенной адресации
Пример простой программы, использующей косвенную адресацию для сложения двух чисел и сохранения результата:
Адрес | Код | Описание операции | Комментарий |
---|---|---|---|
0100 | 21h | LXI H, 0200h | Загрузка адреса 0200h в регистр HL |
0103 | 7Eh | MOV A, M | Загрузка в A значения по адресу из HL |
0104 | 23h | INX H | Увеличение содержимого HL на 1 |
0105 | 86h | ADD M | Сложение A с значением по новому адресу из HL |
0106 | 77h | MOV M, A | Сохранение результата обратно по адресу из HL |
0107 | 76h | HLT | Остановка выполнения программы |
Эта таблица демонстрирует использование регистров H
и L
для хранения адресов, что позволяет легко изменять место действия команд без изменения самих команд, что является примером гибкости, предоставляемой косвенной адресацией.
Таблица программы на Motorola 6800 с использованием косвенной адресации
Пример программы для Motorola 6800, которая использует косвенную адресацию для выполнения операций с данными, хранящимися в разных частях памяти. Эта программа сложит два числа, хранящихся в последовательных ячейках памяти, и сохранит результат в третьей ячейке.
Адрес | Код | Мнемоника | Описание операции |
---|---|---|---|
0200 | 86 | LDAA ,X | Загрузить в аккумулятор A значение по адресу из X |
0201 | EE | INX | Увеличить X на 1 |
0202 | AB | ADDA ,X | Прибавить к A значение по новому адресу из X |
0203 | EC | INX | Увеличить X на 1 |
0204 | A7 | STAA ,X | Сохранить A по адресу из X |
0205 | 3E | SWI | Программное прерывание (останов) |
Описание работы программы:
- LDAA ,X — загрузить в аккумулятор A значение из памяти по адресу, указанному в индексном регистре X. Например, если X содержит 0300h, то аккумулятор A получит значение из ячейки 0300h.
- INX — увеличить значение индексного регистра X на 1. Это изменяет адрес, на который указывает X, на следующую ячейку памяти.
- ADDA ,X — сложить значение в аккумуляторе A с значением из ячейки памяти, на которую теперь указывает X.
- INX — повторное увеличение X для перехода к адресу, где будет сохранён результат.
- STAA ,X — сохранить значение из аккумулятора A в ячейку памяти по адресу из X.
- SWI — команда, вызывающая программное прерывание для завершения программы или перехода к следующему этапу.
Этот пример показывает, как косвенная адресация может упростить обработку массивов данных, позволяя одной программе работать с различными наборами данных, что особенно удобно в больших и сложных приложениях.
Для ускорения процесса обращения к данным косвенная адресация зачастую используется вместе с регистрами.