当您需要访问堆栈中“下方”的参数时,处理将调用函数的返回地址置于堆栈中的任何参数之上的最佳方法是什么?我正在使用 S12 摩托罗拉/飞思卡尔处理器。(S12 有:16 位 D 寄存器,由 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(这看起来相当 hacky)或者我将不得不拉出堆栈的顶部并将其存储在一个寄存器中向上空间。最后一种方法的一个转折是将返回地址存储在一个变量中,不幸的是,这里声明的变量是全局范围的,感觉并不理想。
ReturnAddress EQU $2000 ;Declare variable at address $2000
STD ReturnAddress ;Store the D register's contents in variable
还有其他我在这里看不到的选择吗?