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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:36:02