Каков наилучший способ справиться с наличием адреса возврата вызывающей функции поверх любых параметров, которые были помещены в стек, когда вам нужно получить доступ к параметрам «ниже» в стеке? Я использую процессор S12 Motorola/Freescale. (S12 имеет: регистр D с 16 битами, состоящий из регистров A и B, каждый из которых имеет 8 бит. Регистры индексов X и Y по 16 бит, программный счетчик и указатель стека) Пример кода:
MAIN ORG $1500 ;Set the start of the program
LDD #SomeValue ;Load the D register with a value
PSHD ;Push D onto the stack
JSR ROUTINE ;Go to the subroutine - pushes the PC to the SP
END_MAIN END
ROUTINE
PULD ;Pull the top of the stack into the D register
;D now holds the address for returning to the
;main function.
PSHD ;Push the return address back onto the stack
END_ROUTINE RTS ;Return to Main routine
Проблема в том, что вершина стека содержит адрес следующей инструкции, что затрудняет маневрирование. Например, если мне нужен параметр, который находится под адресом, мне придется либо вручную настроить SP (что кажется довольно хакерским), либо мне придется вытащить вершину стека и сохранить его в регистре, который принимает пространство. Изюминкой последнего подхода является сохранение адреса возврата в переменной. К сожалению, объявленные здесь переменные являются глобальными по своему охвату, что не кажется идеальным.
ReturnAddress EQU $2000 ;Declare variable at address $2000
STD ReturnAddress ;Store the D register's contents in variable
Есть ли другой вариант, которого я здесь не вижу?
LDAA 4, SP
. - person Jester   schedule 25.01.2017SP
. - person Jester   schedule 25.01.2017