使用TRAP x22后输出乱码'y'的LC3程序问题排查求助
解决你的LC-3程序问题:奇怪字符与缺失符号的修复方案
看起来你遇到了两个典型的LC-3汇编问题:控制台输出奇怪的'y'字符,以及模拟器找不到CAS2S符号。我来帮你逐一排查修复:
一、先解决CAS2S符号找不到的问题
这个问题通常和字符串的定义方式或位置有关:
- 检查字符串定义语法:确保CAS2S和CAS1S一样,用
.STRINGZ指令定义(这个指令会自动在字符串末尾添加0x00终止符,这对PUTS指令至关重要)。不要用.STRING,它不会加终止符,还可能导致符号识别问题。 - 确认符号拼写与位置:LC-3汇编器对大小写敏感,检查你在跳转和加载时用的标签是不是和定义的
CAS2S完全一致(比如别写成CAS2或Cas2s)。另外,把字符串定义放在代码逻辑之后、.END之前,这样汇编器能正确识别前向引用的符号。
二、消除奇怪的'y'字符输出
这个问题大概率和字符串终止符缺失或者输入处理错误有关:
- 确保字符串有终止符:如果CAS2S没正确用
.STRINGZ定义,PUTS指令会一直打印内存内容,直到遇到0x00,中间就可能出现随机字符(比如'y',它的ASCII是0x79,刚好可能是内存里的某个值)。 - 简化输入值计算逻辑:你原来的ASCII减49的逻辑,其实可以直接用
ADD R2, R0, #-49来实现,比取反加1更直观,也不容易出错。这样输入'1'(0x31)时R2=0,输入'2'(0x32)时R2=1,分支判断更准确。 - 检查输入处理流程:确认你用的是
TRAP x20(GETC)读取输入,这个指令会把输入字符的ASCII码放到R0里,不要额外修改R0的值,避免分支判断错误导致打印错误内容。
完整的修复示例代码
我把正确的逻辑整理成了可运行的代码,你可以参考:
.ORIG x3000 START TRAP x20 ; 读取用户输入到R0 ADD R2, R0, #-49; 转换为0(对应'1')或1(对应'2') BRz CASE1 ; 输入是'1',跳转到Case1 BRp CASE2 ; 输入是'2',跳转到Case2 ; 可选:处理非法输入的情况 INVALID LEA R0, ERR_MSG TRAP x22 BR END CASE1 LEA R0, CAS1S TRAP x22 ; 打印Case1字符串 BR END CASE2 LEA R0, CAS2S TRAP x22 BR END ; 字符串定义,确保都用.STRINGZ CAS1S .STRINGZ "Case 1 selected!\n" CAS2S .STRINGZ "Case 2 selected!\n" ERR_MSG .STRINGZ "Invalid input! Please enter 1 or 2.\n" END TRAP x25 ; 程序终止 .END
模拟验证小技巧
在LC-3模拟器里运行时,可以做这几步验证:
- 查看符号表,确认CAS2S已经被正确识别,地址和CAS1S是连续的(中间隔了CAS1S的长度)。
- 单步执行到
LEA R0, CAS2S时,检查R0的值是否等于CAS2S的起始地址。 - 执行
TRAP x22前,查看CAS2S起始地址的内存内容,确认最后一个字节是0x00(终止符)。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

