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

如何解决为什么 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 的地方。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?