首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么sp指向6502汇编程序上RAM的开始?

为什么sp指向6502汇编程序上RAM的开始?
EN

Stack Overflow用户
提问于 2021-06-14 16:46:20
回答 1查看 84关注 0票数 1

我正在使用ca65汇编程序(https://cc65.github.io/doc/ca65)来运行我的项目。我知道6502有SP寄存器指向堆栈位置的低位字节($01SP)。

但我不知道(sp)在代码中实际上是如何工作的。

在ca65的运行时,它有将A推入堆栈的函数:

代码语言:javascript
复制
pusha:  ldy     sp              ;
        beq     @L1             ;
        dec     sp              ; 
        ldy     #0              ;
        sta     (sp),y          ;
        rts                     ;

但是为什么它不把值推入堆栈呢?为什么它将值从0保存到内存中?

例如,如果我执行以下代码:

代码语言:javascript
复制
ldx #$ff
txs
lda #$cc
jsr pusha

我期望在堆栈的内存位置中看到$cc,但它将$cc保存到堆栈下的内存中。

我从模拟器的A,X,Y,SP寄存器,操作当前操作码,PC程序计数器,SPData堆栈的数据和MemData的日志中得到的结果是内存:

代码语言:javascript
复制
;Load stack pointer into X    
LDX 8001, A=0, X=0, Y=0, SP=0, addr=ff, op=a2, PC=8002, SPData=0,0,0,0,0,0,0,0,0, MemData=0,0,0,0,0,0,0,0,0
;Save stack pointer from X to SP
TXS 0, A=0, X=ff, Y=0, SP=0, addr=0, op=9a, PC=8003, SPData=0,0,0,0,0,0,0,0,0, MemData=0,0,0,0,0,0,0,0,0
;Load $CC into A
LDA 8004, A=0, X=ff, Y=0, SP=ff, addr=cc, op=a9, PC=8005, SPData=0,0,0,0,0,0,0,0,0, MemData=0,0,0,0,0,0,0,0,0
;Jump to ca65's runtime func "pusha" to save A into stack
JSR 810c, A=cc, X=ff, Y=0, SP=ff, addr=a4, op=20, PC=8008, SPData=0,0,0,0,0,0,0,0,0, MemData=0,0,0,0,0,0,0,0,0
LDY 0, A=cc, X=ff, Y=0, SP=fd, addr=0, op=a4, PC=810e, SPData=0,7,80,0,0,0,0,0,0, MemData=0,0,0,0,0,0,0,0,0
BEQ 8117, A=cc, X=ff, Y=0, SP=fd, addr=c6, op=f0, PC=8110, SPData=0,7,80,0,0,0,0,0,0, MemData=0,0,0,0,0,0,0,0,0
DEC 1, A=cc, X=ff, Y=0, SP=fd, addr=0, op=c6, PC=8119, SPData=0,7,80,0,0,0,0,0,0, MemData=0,0,0,0,0,0,0,0,0
DEC 0, A=cc, X=ff, Y=0, SP=fd, addr=0, op=c6, PC=811b, SPData=0,7,80,0,0,0,0,0,0, MemData=0,ff,0,0,0,0,0,0,0
STA 0, A=cc, X=ff, Y=0, SP=fd, addr=ff, op=91, PC=811d, SPData=0,7,80,0,0,0,0,0,0, MemData=ff,ff,0,0,0,0,0,0,0
;here I want to see $cc into SPData, but it was pushed into MemData
RTS 0, A=cc, X=ff, Y=0, SP=fd, addr=cc, op=60, PC=811e, SPData=0,7,80,0,0,0,0,0,0, MemData=cc,ff,0,0,0,0,0,0,0

要构建的控制台命令为:

代码语言:javascript
复制
    ca65 --cpu 6502 -I ${HOME}/cc65/asminc -U arch/boot.s -o arch/boot.o
EN

回答 1

Stack Overflow用户

发布于 2021-07-10 03:18:00

您说得对,6502在内存位置$0100到$01ff中有一个硬件堆栈。在6502中有一个堆栈指针,一个字节宽,称为S

但是ca65运行时也使用一个单独的堆栈,以不同的方式实现。它有一个名为sp的零页变量,该变量指向不同的区域。这个区域是pusha存储A的地方。

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

https://stackoverflow.com/questions/67967274

复制
相关文章

相似问题

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