3

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

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

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

现在,返回地址应该是program counter + 3,因为有next命令,所以我会说,0xc003将被压入堆栈,但以小端顺序排列,因此c0将是顶部元素。那是对的吗?

4

2 回答 2

5

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

指令压入指令最后一个字节JSR地址。在这种情况下,最后一个字节的地址是。先推高字节,使低字节在低地址: push ,然后 push ,然后跳转到。在此之后,堆栈看起来像这样,在顶部以 little-endian 字节顺序排列,并且变成了.$C002$C0$02$ABCD$C002S$F7

$01F8: 02 C0 01 02 03 04 05 06

子程序$ABCD将以RTS指令结束,此处显示在 处$AC03。该指令拉取程序计数器的低字节和高字节。然后因为返回地址指向上一条指令的最后一个字节,所以它加了 1$C002加一个是$C003,调用者中下一条指令的第一个字节的地址。

于 2014-11-10T16:19:24.183 回答
1

我相信 jsr 上发生的事情是

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

因此,如果您声称堆栈指针指向 0x01 并且 0x02 是较低/较小的地址,那么 0x01 和 0x02 将被覆盖,当您点击子程序时,堆栈将指向 0x03。

于 2014-01-30T20:18:36.757 回答