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
修正说明
- 取消用X/Y存储字符串地址的逻辑,直接把地址写入零页指针,释放X/Y做计数器
- 拆分两个独立计数器:Y负责遍历字符串,X负责写入屏幕,逻辑无冲突
- 结束判断移到字符读取之后,自动识别字符串末尾的0结束符,不需要额外
tmp变量暂存计数器 - 如果你需要保留「字符串地址、X寄存器为入参」的接口设计,可在调用前把字符串低地址放A、高地址放Y,X存屏幕写入起始偏移,进函数后先暂存X值再初始化Y为0即可。
内容的提问来源于stack exchange,提问作者user2297996
相关产品推荐
相关产品推荐

