为什么在0(IP)传递的值只能在4(SP)访问?

时间:2013-12-22 05:46:16

标签: assembly 68000 easy68k

为什么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

2 个答案:

答案 0 :(得分:4)

根据你的代码,我猜PRINTN是子程序(函数,程序等),并且使用JSR调用它。如果是这样,你应该介意JSR的功能:它

  • 将SP递减4
  • 按SP
  • 中的地址将返回地址(JSR之后的指令的开头)放入内存
  • 将子程序地址(来自JSR指令)放到PC

所以,在它之后,你知道的所有超出SP的偏移量都将增加4.并且,是的,0(SP)中的值从子程序访问为4(SP),28(SP)将被替换为与32(SP)相同的方式,依此类推。 RTS反过来 - 它将SP增加4。

此外,每个PUSH和POP都会改变它;如果在堆栈上保存2个寄存器,则在这些PUSH之后,所有偏移量再增加8,直到执行相应的POP。这很容易被编译器跟踪,但更难 - 由人类;例如除了SP之外x86还发明了BP,这将是另一个论点。

答案 1 :(得分:3)

如果我们假设PRINTNJSR / BSR所涉及的子程序,那么您的问题将由JSR的操作说明回答:

SP – 4 → Sp; PC → (SP); Destination Address → PC

也就是说,返回地址现在位于堆栈的顶部,而JSR现在位于4(SP)之前的堆栈顶部是什么,依此类推。