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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:15:11