Адресация по указателю стека
Адресация по указателю стека с 8-разрядным смещением
Команды адресации по указателю стека с 8-разрядным смещением являются трехбайтовыми командами, адресующими операнды почти тем же способом, что и индексные, с 8-разрядным смещением, команды - разница заключается в том, что команды адресации по указателю стека суммируют 8-разрядное смещение с содержимым указателя стека, а не индексного регистра.
Режим адресации по указателю стека с 8-разрядным смещением обеспечивает простое обращение к данным, находящимся в стеке. CPU суммирует байт (без знака), находящийся в 16-разрядном регистре указателя стека (SP), с байтом (без знака), следующим за операционным кодом команды. Сумма и является действительным адресом операнда.
Если прерывания запрещены, то этот режим позволяет использовать указатель стека в качестве второго "индексного" регистра.
В таблице 8 приведен перечень команд, которые можно использовать в режиме адресации по указателю стека с 8-разрядным смещением.
Командами, связанными с указателем стека, для организации обращения используется дополнительный байт и, следовательно, при их выполнении затрачивается на один цикл больше, чем при выполнении аналогичных команд с индексной адресацией.
Адресация по указателю стека с 16-разрядным смещением
Команды адресации по указателю стека с 16-разрядным смещением являются четырехбайтовыми командами, используемыми для обращения к данным, связанным с указателем стека, по самым различным адресам в любой ячейке памяти. CPU суммирует содержимое (без знака) 16-разрядного регистра указателя стека (SP), с 16-разрядным словом (без знака), сформированным двумя байтами следующими за операционным кодом команды. Сумма и является действительным адресом операнда.
Как и в случае прямой и расширенной адресации, большинство ассемблеров автоматически используют кратчайшую форму адресации по указателю стека. Командами, связанными с указателем стека, для организации обращения используется дополнительный байт и, следовательно, при их выполнении затрачивается на один цикл больше, чем при выполнении аналогичных команд с индексной адресацией.
В таблице 8 приведен перечень команд использующих адресацию по указателю стека с 16-разрядным смещением.
Ниже приведены примеры кодов с использованием режима адресации по указателю стека с 8- и 16-разрядным смещением. В первом примере значение $20 сохраняется в ячейке $10, SP = $10 + $FF = $10F и, затем, содержимое ячейки декрементируется до состояния ноль. Во втором примере аккумулятор загружается содержимым ячейки $250, SP = $250 + $FF = $34F.
Машинный код Метка Операция Операнд Комментарий
450100 LDHX #$0100
94 TXS ; Сброс указателя стека в состояние $00FF
A620 LDA #$20 ; A = $20
9EE710 STA $10, SP ; Ячейка $10F = $20
9E6B10FC LP DBNZ $10, SP, LP ; 8-разрядное смещение
; Декремент содержимого ячейки $10F до
; состояния ноль
450100 LDHX #$0100
94 TXS ; Сброс указателя стека в состояние $00FF
9ED60250 LDA $0250, SP ; 16-разрядное смещение
; Загрузка A содержимым ячейки $34F
Команды адресации по указателю стека с 16-разрядным смещением используются для выбора k-го элемента в n-элементной таблице. Таблица может начинаться в любом месте карты памяти и распространяться так далеко, насколько это позволит карта адресов. При использовании этих четырехбайтовых команд значение k находится обычно в регистре указателя стека, а адрес начала таблицы размещается в двух байтах, следующих за двумя байтами операционного кода.
Таблица 8. Команды адресации по указателю стека
Команда |
Мнемоника |
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 |
Ц |
|
Загрузить аккумулятор содержимым памяти (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 |
Ц |
|
|