如何计算LC-3汇编中加载地址x3100到寄存器R1的偏移量?
LC3 比对程序修复方案
- 你提到的
LD R1, x0030确实是错误地址,你已经在代码末尾定义了存储基地址x3100的常量,只需给该常量加标签后通过LD加载即可实现需求 - 遗漏了输入值转移逻辑:TRAP x23输入服务的返回值默认存在R0中,你当前代码没有将输入值转移到R3,比对逻辑无法拿到用户输入的数字
- 输出逻辑存在寄存器错误:TRAP x21输出服务要求待输出字符存放在R0中,原代码将结果存在R3中会导致输出异常
修复后完整代码如下:
.ORIG x3000 AND R5, R5, #0 ; 初始化匹配计数器R5为0 LD R1, BASE_ADDR ; 加载数据段基地址x3100到R1 TRAP x23 ; 读取用户输入,字符存在R0 ADD R3, R0, #0 ; 将输入字符转移到R3,符合功能要求 LDR R4, R1, #0 ; 读取迭代次数(x3100存储的5) ADD R2, R4, #-5 BRz #8 NOT R4, R4 ADD R4, R4, #1 ADD R4, R4, R3 BRnp #1 ADD R5, R5, #1 ; 匹配成功计数器+1 ADD R1, R1, #1 ; 地址+1,访问下一个比对值 LDR R4, R1, #0 BRnzp #-10 LD R3, #5 ADD R3, R3, R5 ADD R0, R3, #0 ; 结果转移到R0供输出服务使用 TRAP x21 ; 输出结果 TRAP x25 ; 程序结束 BASE_ADDR .FILL x3100 ; 数据段基地址常量,加标签供LD调用 .END .ORIG x3100 .FILL x0005 ; 迭代次数 .FILL x0032 ; 字符'2'的ASCII码 .FILL x0032 .FILL x0034 ; 字符'4'的ASCII码 .FILL x0034 .FILL x0034 .END
内容的提问来源于stack exchange,提问作者alex quintanilla
相关产品推荐
相关产品推荐

