【问题标题】:Why is value passed at 0(SP) is acessible only at 4(SP)?为什么在 0(SP) 传递的值只能在 4(SP) 访问?
【发布时间】:2013-12-22 05:46:16
【问题描述】:

为什么在0(SP) 传递的值只能在4(SP) 访问?例如,我需要通过0(SP) 而不是4(SP)(因为它在例程中使用)将一个数字传递给printn,否则它将不起作用。我错过了什么?

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

【问题讨论】:

    标签: assembly 68000 easy68k


    【解决方案1】:

    根据您的代码,我猜 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。这很容易被编译器跟踪,但更难被人类跟踪;例如将是 x86 除了 SP 之外还发明 BP 的另一个论据。

    【讨论】:

      【解决方案2】:

      如果我们假设PRINTN 是您通过JSR / BSR 获得的子例程,那么JSR 的操作描述会回答您的问题:

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

      也就是说,返回地址现在位于栈顶,而JSR 之前位于栈顶的任何东西现在都位于4(SP),以此类推。

      【讨论】:

        猜你喜欢
        • 2021-03-25
        • 1970-01-01
        • 2020-01-03
        • 1970-01-01
        • 2016-06-03
        • 2014-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多