为什么 sp 指向 6502 汇编器上 RAM 的开头?

问题描述

我正在使用 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 - 寄存器,OP - 当前操作码,PC - 程序计数器,SPData - 堆栈的数据,以及 MemData,它是 RAM:

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

要构建的控制台命令是:

    ca65 --cpu 6502 -I ${HOME}/cc65/asminc -U arch/boot.s -o arch/boot.o

解决方法

您是对的,6502 在内存位置 $0100 到 $01ff 中有一个硬件堆栈。 6502中有一个栈指针,一个字节宽,叫做S

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...