Pep 9中使用LDBA直接寻址打印姓名出现乱码(Ñ)的原因咨询
为什么Pep 9中用LDBA直接寻址打印姓名会出现乱码?
让我帮你拆解这个乱码问题——你看到的Ñ本质是加载了错误的内存字节导致的,核心原因是你硬编码的直接地址和实际数据段的位置不匹配,咱们一步步理清楚:
首先先回顾你参考的示例代码的逻辑:
;File: fig0433.peph ;Computer Systems, Fifth edition ;Figure 4.33 LDBA 0x000D,d ;Load byte accumulator 'H' STBA 0xFC16,d ;Store byte accumulator output device LDBA 0x000E,d ;Load byte accumulator 'i' STBA 0xFC16,d ;Store byte accumulator output device STOP ;Stop .ASCII "Hi" ;ASCII "Hi" characters .END
示例里的0x000D和0x000E不是随便写的!Pep 9的汇编器会按顺序给指令和数据分配内存:前面的所有指令占用的总字节数,刚好是0x000D(也就是13字节),所以.ASCII "Hi"的第一个字符'H'就存在0x000D,第二个字符'i'在0x000E。咱们算一下:
- 每条
LDBA addr,d和STBA addr,d都是3字节(操作码1字节+地址2字节) STOP是1字节- 总指令字节数:3+3+3+3+1 = 13 → 十六进制就是
0x000D
那你遇到乱码的问题就很明确了:
你照搬了示例里的0x000D这类硬编码地址,但你的代码和示例不一样——要么你多写/少写了指令,要么你的姓名长度和"Hi"不同,导致你的姓名数据段的起始地址根本不是0x000D!此时你加载的0x000D地址里的字节,已经不是你姓名的ASCII编码,而是某个随机的内存值(Ñ的ASCII是0xD1,说明你加载的字节刚好是这个值),自然输出乱码。
解决方法
别再手动算地址了,用符号寻址才是Pep 9的正确姿势,汇编器会自动帮你计算数据的正确地址:
; 打印姓名的正确示例(用符号标签) LDBA myName,d ; 加载姓名第一个字符 STBA 0xFC16,d ; 输出到设备 LDBA myName+1,d ; 加载第二个字符 STBA 0xFC16,d LDBA myName+2,d ; 加载第三个字符(按需添加更多行) STBA 0xFC16,d STOP ; 终止程序 myName: .ASCII "你的姓名" ; 用标签标记数据起始位置 .END
这样不管你怎么修改指令或者姓名长度,汇编器都会自动更新myName对应的地址,再也不会出现地址不匹配的乱码问题。
内容的提问来源于stack exchange,提问作者IRedSonI
相关产品推荐
相关产品推荐

