use*_*875 3 assembly 6502 subroutine
我必须回答以下有关6502汇编语言的问题:
“在堆栈上,有以下值(顶部元素在前):0x01, 0x02, 0x03, 0x04, 0x05, 0x06
地址0xc000是指令jsr 0xABCD。在获取/执行周期后,哪个值将存储在程序计数器中,堆栈的顶部元素是什么?”
我知道程序计数器将为0xABCD,但我对堆栈元素感到困惑。我知道在 6502 架构中,栈是从上到下(从0x01FF到0x0100)增长的。所以,我假设,堆栈指针指向 element 0x01,对吗?
现在,返回地址应该是program counter + 3,因为有next命令,所以我会说,0xc003将被压入堆栈,但以小端顺序,因此c0将是顶部元素。那是对的吗?
从S等于的寄存器开始$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
Run Code Online (Sandbox Code Playgroud)
该JSR指令将地址最后一个字节的指令。在这种情况下,最后一个字节的地址是$C002。高字节先被压入,使低字节在低地址: push $C0,然后 push $02,然后跳转到$ABCD。在此之后,堆栈看起来像这样,以$C002小端字节顺序在顶部,并且S变成了$F7.
$01F8: 02 C0 01 02 03 04 05 06
Run Code Online (Sandbox Code Playgroud)
子程序 at$ABCD将以RTS指令结束,此处显示为$AC03。该指令拉出程序计数器的低字节和高字节。然后因为返回地址指向上一条指令的最后一个字节,所以它加了 1。$C002加一个是$C003,调用者中下一条指令的第一个字节的地址。