LC3程序中TRAP x21指令异常,模拟器显示TRAP xD0并报非法向量错误求助
问题分析与解决
我来帮你排查两个关键问题,这两个问题共同导致了你的异常和输出失败:
1. TRAP指令显示异常与非法向量错误
你提到模拟器中TRAP x21显示为TRAP xD0,还提示“非法向量号陷阱”,这大概率是因为代码中缺少ASCII标签的定义,或者汇编时出现了地址偏移错误。
在LC-3汇编中,LD R1, ASCII指令需要你在代码末尾定义ASCII标签(比如存储数字0的ASCII值)。如果没有定义这个标签,汇编器会无法正确解析这条指令,导致后续的指令(包括TRAP x21)被错误编码,最终把合法的TRAP x21变成了非法的TRAP xD0。
2. 数字转换逻辑错误
即使TRAP指令正常工作,你的代码逻辑也无法正确输出输入数字的两倍值,原因如下:
TRAP x23(IN指令)执行后,R0中存储的是输入字符的ASCII值(比如输入5,R0的值是x35,而不是数值5)。- 你的代码中
ADD R1, R1, R0是把两个ASCII值相加(如果ASCII是x30,结果是x30+x35=x65,对应ASCII字符'e'),完全偏离了“把ASCII数字转成数值”的目标。 - 最后你把这个错误的值翻倍后直接用
TRAP x21(OUT指令)输出,OUT指令需要的是可打印字符的ASCII值,但你计算出的结果并非有效可打印字符的ASCII,自然看不到输出。
修正后的代码示例
.ORIG x3000 ; 加载数字0的ASCII值到R1,用于ASCII和数值的转换 LD R1, ASCII_ZERO ; 输入字符(输入的ASCII值存入R0) TRAP x23 ; 将ASCII数字转换为数值:R0 = 输入ASCII - x30 SUB R0, R0, R1 ; 计算两倍值:R0 = R0 * 2 ADD R0, R0, R0 ; 将数值转换回ASCII(注:仅适用于输入0-4,因为5的两倍是10,对应ASCII换行符不可见,需额外处理) ADD R0, R0, R1 ; 输出结果 TRAP x21 ; 暂停程序 TRAP x25 ; 定义数字0的ASCII值标签 ASCII_ZERO .FILL x30 .END
额外说明
如果输入的数字≥5,两倍值会≥10,这时候TRAP x21无法直接输出可见字符(10的ASCII是换行符),你需要拆分十位和个位,分别转换为ASCII后输出,示例逻辑如下:
; 假设R0中是数值10 AND R2, R2, #0 ; R2存储十位数字 AND R1, R1, #0 ADD R1, R1, #10 DIVIDE: SUB R0, R0, R1 BRn END_DIVIDE ADD R2, R2, #1 BR DIVIDE END_DIVIDE: ADD R0, R0, R1 ; 恢复余数(个位数字) ; 输出十位 ADD R2, R2, x30 ADD R0, R2, #0 TRAP x21 ; 输出个位 ADD R0, R0, x30 TRAP x21
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

