首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >6502汇编程序- RTS命令和堆栈

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

Stack Overflow用户
提问于 2014-01-31 02:58:35
回答 2查看 2.4K关注 0票数 3

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

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2014-11-11 00:19:24

从等于$F9S寄存器开始,这意味着$0100页面中之后的所有内容都是堆栈。内存内容如下:

代码语言:javascript
复制
$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

代码语言:javascript
复制
$01F8: 02 C0 01 02 03 04 05 06

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

票数 5
EN

Stack Overflow用户

发布于 2014-01-31 04:18:37

我相信在jsr上发生的事情是

代码语言:javascript
复制
stack[stack_pointer] = return_high
stack_pointer--
stack[stack_pointer] = return_low
stack_pointer--
pc = jsr address

因此,如果你声明你的堆栈指针指向0x01,而0x02是一个更低/更小的地址,那么0x01和0x02将被覆盖,当你命中子例程时,堆栈将指向0x03。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21465200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档