我正在使用ca65汇编程序(https://cc65.github.io/doc/ca65)来运行我的项目。我知道6502有SP寄存器指向堆栈位置的低位字节($01SP)。
但我不知道(sp)在代码中实际上是如何工作的。
在ca65的运行时,它有将A推入堆栈的函数:
pusha: ldy sp ;
beq @L1 ;
dec sp ;
ldy #0 ;
sta (sp),y ;
rts ;但是为什么它不把值推入堆栈呢?为什么它将值从0保存到内存中?
例如,如果我执行以下代码:
ldx #$ff
txs
lda #$cc
jsr pusha我期望在堆栈的内存位置中看到$cc,但它将$cc保存到堆栈下的内存中。
我从模拟器的A,X,Y,SP寄存器,操作当前操作码,PC程序计数器,SPData堆栈的数据和MemData的日志中得到的结果是内存:
;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要构建的控制台命令为:
ca65 --cpu 6502 -I ${HOME}/cc65/asminc -U arch/boot.s -o arch/boot.o发布于 2021-07-10 03:18:00
您说得对,6502在内存位置$0100到$01ff中有一个硬件堆栈。在6502中有一个堆栈指针,一个字节宽,称为S。
但是ca65运行时也使用一个单独的堆栈,以不同的方式实现。它有一个名为sp的零页变量,该变量指向不同的区域。这个区域是pusha存储A的地方。
https://stackoverflow.com/questions/67967274
复制相似问题