Индексная адресация
Индексная адресация без смещения
Команды индексной адресации без смещения являются однобайтовыми командами, обращающимися к данным по различным адресам. Младший байт X индексного регистра содержит младший байт условного адреса операнда; старший байт H индексного регистра содержит старший байт условного адреса. Благодаря использованию регистра H адресация не ограничивается первыми 256 байтами памяти, как это свойственно HC05.
Если не использовать команды HC08, модифицирующие H, (AIX; CBEQ (ix+); LDHX; MOV (dix+); MOV (ix+d); DIV; PULH; TSX), то значение H будет $00, что обеспечивает полную совместимость кодов с исходными кодами команд семейства HC05.
Индексные, без смещения, команды могут перемещать указатель по таблице или сохранять наиболее часто используемый адрес RAM или ячейку ввода/вывода (I/O).
В таблице 7 представлены команды, использующие индексную, без смещения, адресацию.
Индексная адресация с 8-разрядным смещением
Команды индексной, с 8-разрядным смещением, адресации являются двухбайтовыми командами, способными обращаться к данным по различным адресам. CPU прибавляет байты (без знака), находящиеся в индексном регистре (H:X), к байтам (без знака), следующим за операционным кодом. Сумма представляет собой действительный адрес операнда.
Если не использовать команды HC08, модифицирующие H, (AIX; CBEQ (ix+); LDHX; MOV (dix+); MOV (ix+d); DIV; PULH; TSX), то значение H будет $00, что обеспечивает полную совместимость кодов с исходными кодами команд семейства HC05.
Индексные, с 8-разрядным смещением, команды используются для выбора k-го элемента в n-элементной таблице. Таблица может начинаться в любом месте карты памяти и распространяться так далеко, насколько это позволит карта адресов. Значение k находится обычно в H:X, а адресом начала таблицы является байт, следующий за операционным кодом. При таком использовании H:X этот режим адресации ограничивается первыми 256 адресами памяти. Таблица может быть размещена в любом месте карты адресов если H:X использовать в качестве базового адреса а следующий за операционным кодом байт использовать в качестве смещения.
В таблице 7 приведен перечень команд, использующих индексную, с 8-разрядным смещением, адресацию.
Индексная адресация с 16-разрядным смещением
Команды индексной адресации с 16-разрядным смещением являются трехбайтовыми командами, способными обращаться к данным по адресам, размещенным во всем пространстве памяти. CPU суммирует содержимое (без знака) индексного регистра (H:X) с 16-разрядным (без знака) словом, сформированным двумя байтами, следующими за операционным кодом. Первый байт после операционного кода является старшим байтом 16-разрядного смещения, следующий байт является младшим байтом 16-разрядного смещения.
Как и при прямом и расширенном режимах адресации большинство ассемблеров определяет кратчайшую форму индексной адресации.
В таблице 7 приведен перечень команд, использующих индексную адресацию с 16-разрядным смещением.
Индексные, с 16-разрядным смещением, команды используются для выбора k-го элемента в n-элементной таблице. Таблица может начинаться в любом месте карты памяти и распространяться так далеко, насколько это позволит карта адресов. Значение k находится обычно в H:X, а адресом начала таблицы является байт, следующий за операционным кодом.
В нижеследующем примере для иллюстрации трех различных типов индексной адресации используется команда JMP (команда безусловного перехода).
Машинный код Метка Операция Операнд Комментарий
FC JMP , X ; Без смещения
; Переход к адресу, указанному в H:X
ECFF JMP $FF, X ; 8-разрядное смещение
; Переход к адресу, указанному в H:X + $FF
DC10FF JMP $10FF, X ; 16-разрядное смещение
; Переход к адресу, указанному
; в H:X + $10FF
Таблица 7. Команды индексной адресации
Команда |
Мнемоника |
Без смещения |
8-разрядное смещение |
16-разрядное смещение |
Сложить память и перенос с аккумулятором (Add Memory and Carry to Accumulator) |
ADC |
Ц |
Ц |
Ц |
Сложить память с аккумулятором (Add Memory and Accumulator) |
ADD |
Ц |
Ц |
Ц |
Выполнить логическое AND памяти с аккумулятором (Logical AND of Memory and Accumulator) |
AND |
Ц |
Ц |
Ц |
Арифметически сдвинуть память влево (Arithmetic Shift Left Memory) |
ASL* |
Ц |
Ц |
|
Арифметически сдвинуть память вправо (Arithmetic Shift Right Memory) |
ASR |
Ц |
Ц |
|
Поразрядно сравнить память с аккумулятором (Bit Test Memory with Accumulator) |
BIT |
Ц |
Ц |
Ц |
Очистить память (Clear Memory) |
CLR |
Ц |
Ц |
|
Сравнить аккумулятор с памятью (Compare Accumulator with Memory) |
CMP |
Ц |
Ц |
Ц |
Выполнить дополнение до двух содержимого памяти (Complement Memory) |
COM |
Ц |
Ц |
|
Сравнить младший байт индексного регистра с памятью (Compare X (Index Register Low) with Memory) |
CPX |
Ц |
Ц |
Ц |
Декрементировать память и перейти, если не равно ($00) (Decrement Memory and Branch if Not Equal ($00)) |
DBNZ |
Ц |
Ц |
|
Декрементировать память (Decrement Memory) |
DEC |
Ц |
Ц |
|
Выполнить исключающее OR памяти и аккумулятора (Exclusive OR Memory with Accumulator) |
EOR |
Ц |
Ц |
Ц |
Инкрементировать память (Increment Memory) |
INC |
Ц |
Ц |
|
Выполнить переход (Jump) |
JMP |
Ц |
Ц |
Ц |
Выполнить переход в подпрограмму (Jump to Subroutine) |
JSR |
Ц |
Ц |
Ц |
Загрузить аккумулятор содержимым памяти (Load Accumulator from Memory) |
LDA |
Ц |
Ц |
Ц |
Загрузить младший байт индексного регистра содержимым памяти (Load X (Index Register Low) from Memory) |
LDX |
Ц |
Ц |
Ц |
Выполнить логический сдвиг памяти влево (Logical Shift Left Memory) |
LSL* |
Ц |
Ц |
|
Выполнить логический сдвиг памяти вправо (Logical Shift Right Memory) |
LSR |
Ц |
Ц |
|
Выполнить дополнение до двух содержимого памяти (Negate Memory) |
NEG |
Ц |
Ц |
|
Выполнить включающее OR содержимого аккумулятора и памяти (Inclusive OR Accumulator and Memory) |
ORA |
Ц |
Ц |
Ц |
Выполнить вращение памяти влево через перенос (Rotate Memory Left through Carry) |
ROL |
Ц |
Ц |
|
Выполнить вращение памяти вправо через перенос (Rotate Memory Right through Carry) |
ROR |
Ц |
Ц |
|
Вычесть память и перенос из аккумулятора (Subtract Memory and Carry from Accumulator) |
SBC |
Ц |
Ц |
Ц |
Сохранить аккумулятор в памяти (Store Accumulator in Memory) |
STA |
Ц |
Ц |
Ц |
Сохранить младший байт индексного регистра в памяти (Store X (Index Register Low) in Memory) |
STX |
Ц |
Ц |
Ц |
Вычесть память из аккумулятора (Subtract Memory from Accumulator) |
SUB |
Ц |
Ц |
Ц |
Проверить память на отрицательное значение или ноль (Test Memory for Negative or Zero) |
TST |
Ц |
Ц |
|
*) - ASL = LSL
|