6502汇编程序 - RTS命令和堆栈

时间:2014-01-30 18:58:35

标签: assembly subroutine 6502

我必须回答有关6502汇编语言的以下问题:

“在堆栈上,有以下值(首先是顶部元素):0x01, 0x02, 0x03, 0x04, 0x05, 0x06 地址0xc000是指令jsr 0xABCD。在获取/执行周期之后,哪个值将存储在程序计数器中以及堆栈的顶部元素是什么?“

我知道程序计数器将是0xABCD,但我对堆栈元素感到困惑。我知道在6502架构中,堆栈从顶部到底部(从0x01FF0x0100)增长。所以,我假设,堆栈指针指向元素0x01,对吧?

现在,返回地址应为program counter + 3,因为有next命令,所以我会说,0xc003将被推入堆栈,但是以小端顺序,所以c0将是最重要的元素。这是对的吗?

2 个答案:

答案 0 :(得分:4)

从等待S的{​​{1}}寄存器开始,这意味着$F9页面中的所有内容都是堆栈。记忆内容如下:

$0100

$01FA: 01 02 03 04 05 06 $ABCD: A6 23 LDX $23 ; rest of the body of the subroutine $AC03: 60 RTS $C000: 20 CD AB JSR $ABCD $C003: BD 40 06 LDA $0640,X 指令按下指令的最后一个字节的地址。在这种情况下,最后一个字节的地址是JSR。首先按下高字节,使低字节位于较低地址:按$C002,然后按$C0,然后跳转到$02。在此之后,堆栈看起来像这样,顶部以小端字节顺序$ABCD$C002变为S

$F7

$01F8: 02 C0 01 02 03 04 05 06 处的子程序将以$ABCD指令结束,此处显示为RTS。该指令拉出程序计数器的低字节和高字节。然后因为返回地址指向前一条指令的最后一个字节,所以加上1 $AC03加1是$C002,即调用者中下一条指令的第一个字节的地址。

答案 1 :(得分:0)

我相信jsr上发生的事情是

stack[stack_pointer] = return_high
stack_pointer--
stack[stack_pointer] = return_low
stack_pointer--
pc = jsr address

所以如果你声称你的堆栈指针指向0x01而0x02是一个较小/较小的地址,那么0x01和0x02将被覆盖,当你点击你的子程序时,堆栈将指向0x03。