You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C64汇编中如何保存复用寄存器?打印字符串代码无输出是什么问题?

代码错误点

  • 首次循环直接触发退出:初始化时你给tmp存入了#$00,第一次执行到ldx tmp后X值为0,紧接着的beq done会直接跳转到结束逻辑,根本没有执行字符写入操作,这是无输出的核心原因。
  • 零页间接寻址用法错误:6502汇编的lda (zpb),y寻址规则是取零页zpb处存储的16位基地址,加上Y寄存器的值作为最终读取地址。你当前把Y寄存器存为字符串的高地址,没有用Y做字符偏移,读出来的都是错误地址的无效值。
  • 计数器逻辑冲突:你用tmp暂存的X既用来存字符串低地址,又用来当屏幕写入偏移,逻辑完全混乱,正确设计应该拆分读取、写入两个独立计数器。
  • 语法瑕疵:ldx tmp.末尾多了多余的.,部分汇编器会识别为语法错误。

修正后参考代码

jsr cls
        ; 写入字符串地址到零页指针
        lda #<scr1
        sta zpb+0
        lda #>scr1
        sta zpb+1
        ldy #$00        ; Y作为字符串读取偏移计数器
        ldx #$00        ; X作为屏幕写入偏移计数器(可改为入参传入初始值)
printToScreen
        lda (zpb),y     ; 读取当前偏移位置的字符
        beq done        ; 读到字符串末尾的0结束符就退出
        sta screen_start,x  ; 写入屏幕对应位置
        iny             ; 字符串偏移+1
        inx             ; 屏幕写入偏移+1
        bne printToScreen
done
        rts

tmp = $C8
zpb = $fb
scr1 byte 'some text'
byte 0

修正说明

  1. 取消用X/Y存储字符串地址的逻辑,直接把地址写入零页指针,释放X/Y做计数器
  2. 拆分两个独立计数器:Y负责遍历字符串,X负责写入屏幕,逻辑无冲突
  3. 结束判断移到字符读取之后,自动识别字符串末尾的0结束符,不需要额外tmp变量暂存计数器
  4. 如果你需要保留「字符串地址、X寄存器为入参」的接口设计,可在调用前把字符串低地址放A、高地址放Y,X存屏幕写入起始偏移,进函数后先暂存X值再初始化Y为0即可。

内容的提问来源于stack exchange,提问作者user2297996

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:45:02