STR指令未存储预期值,LC3汇编两数取大代码修改后运行错误排查
问题根本原因
你错误理解了LC3架构中STR指令的功能,指令方向完全用反了:
- LC3的
STR是存储指令,语法为STR 源寄存器, 基址寄存器, 偏移量,作用是把源寄存器里的值,写入「基址寄存器的值 + 偏移量」对应的内存地址,完全不会修改源寄存器的值。 - 你写的
STR R4, R2, #0执行的操作是:把R4的初始随机值,写入地址为R2的值(也就是0x007)的内存空间,没有完成「把R2的值赋值给R4」的需求。
执行完这两行错误的STR指令后,R4、R5还保留着程序启动时的随机初始值,后续的比较、取反、分支逻辑全部基于错误的数值计算,最终R1的结果自然不符合预期。
修复方案
你要实现寄存器到寄存器的数值复制,不需要调用内存操作指令,直接用加法指令即可,比你最初的实现还更简洁:
.ORIG 0x300 V1: .FILL 0x007 V2: .FILL 0x020 LD R2, V1 ;R2=V1 LD R3, V2 ;R3=V2 ; 替换原来的STR指令,直接用ADD完成寄存器复制 ADD R4, R2, #0 ; R4 = R2 ADD R5, R3, #0 ; R5 = R3 NOT R5, R5 ADD R5, R5, #1 ;R5=-R3 ADD R4, R4, R5 ; R4 = V1 - V2 BRN SECOND_BIGGER LD R1, V1 JSR END SECOND_BIGGER: LD R1, V2 END: .END
额外说明:如果你确实要通过内存操作完成赋值,应该用读取指令LDR而非存储指令STR,但寄存器间复制完全没必要走内存,会增加指令周期。
内容的提问来源于stack exchange,提问作者Shark44
相关产品推荐
相关产品推荐

