我必须回答有关6502汇编语言的以下问题:
“在堆栈上,有以下值(首先是顶部元素):0x01, 0x02, 0x03, 0x04, 0x05, 0x06
地址0xc000
是指令jsr 0xABCD
。在获取/执行周期之后,哪个值将存储在程序计数器中以及堆栈的顶部元素是什么?“
我知道程序计数器将是0xABCD
,但我对堆栈元素感到困惑。我知道在6502架构中,堆栈从顶部到底部(从0x01FF
到0x0100
)增长。所以,我假设,堆栈指针指向元素0x01
,对吧?
现在,返回地址应为program counter + 3
,因为有next
命令,所以我会说,0xc003
将被推入堆栈,但是以小端顺序,所以c0
将是最重要的元素。这是对的吗?
答案 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。