Kick Assembler循环中backCounter变量修改失效问题求助
问题根源:
.var是汇编时变量,不是运行时内存变量 你踩了Kick Assembler的一个常见坑:.var backCounter = $39定义的是汇编阶段用来计算的预处理器变量,它不会被分配到C64的运行内存里——编译完成后这个变量就消失了,CPU在运行时根本看不到它。
为什么INC counter能生效?
你能正常用INC修改的counter,肯定是用.byte/.word或者直接指定内存地址定义的运行时内存变量(比如counter: .byte $30)。这类变量会被分配到C64的内存中,CPU的INC指令是直接操作这个内存地址里的字节值,自然能生效。
为什么DEC/SBC改不动backCounter?
当你写DEC backCounter时,汇编器会直接把.var定义的backCounter替换成它的初始值$39,最终编译出的指令是DEC $39——这时候CPU操作的是内存地址$0039(零页地址)里的内容,根本不是你以为的那个"计数器"。如果用SEC/SBC #$1操作它,本质也是在操作错误的内存地址,当然达不到你要的反向计数效果。
解决办法:把.var改成运行时内存变量
把原来的.var定义替换成内存分配指令,让CPU能在运行时访问到这个变量:
; 可以把变量放在零页(比如$0200开始的区域,或者其他未被占用的内存) backCounter: .byte $39 ; 分配1字节内存,初始值设为$39
之后你就可以正常用DEC或者SEC/SBC来修改它了:
print_loop_backwards: DEC backCounter ; 直接递减内存中的计数器值 LDA backCounter ; 加载计数器值到A寄存器 ; 这里加上打印字符的逻辑(比如STA $0400+偏移量) CMP #$30 ; 判断是否到'0'($30是ASCII码) BNE print_loop_backwards ; 没到就继续循环
或者用SBC的写法:
print_loop_backwards: LDA backCounter SEC SBC #$01 STA backCounter ; 打印逻辑... CMP #$30 BNE print_loop_backwards
内容的提问来源于stack exchange,提问作者Black.Jack
相关产品推荐
相关产品推荐

