为什么0(SP)
传递的价值仅在4(SP)
时有效?例如,我需要将printn
传递给0(SP)
而不是4(SP)
(因为它在例行程序中使用),否则它将无效。我错过了什么?
MOVE #12,D0
MOVE D0,0(SP) here I use 0 offset
PRINTN:
MOVE 4(SP),D1 |and here 4. Shoudln't be the same?
MOVE #3,D0
TRAP #15
RTS
答案 0 :(得分:4)
根据你的代码,我猜PRINTN是子程序(函数,程序等),并且使用JSR调用它。如果是这样,你应该介意JSR的功能:它
所以,在它之后,你知道的所有超出SP的偏移量都将增加4.并且,是的,0(SP)中的值从子程序访问为4(SP),28(SP)将被替换为与32(SP)相同的方式,依此类推。 RTS反过来 - 它将SP增加4。
此外,每个PUSH和POP都会改变它;如果在堆栈上保存2个寄存器,则在这些PUSH之后,所有偏移量再增加8,直到执行相应的POP。这很容易被编译器跟踪,但更难 - 由人类;例如除了SP之外x86还发明了BP,这将是另一个论点。
答案 1 :(得分:3)
如果我们假设PRINTN
是JSR
/ BSR
所涉及的子程序,那么您的问题将由JSR
的操作说明回答:
SP – 4 → Sp; PC → (SP); Destination Address → PC
也就是说,返回地址现在位于堆栈的顶部,而JSR
现在位于4(SP)
之前的堆栈顶部是什么,依此类推。