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

LC-3课程作业汇编程序出现无限循环问题求助

LC-3程序错误分析与修正

你的代码存在三个核心问题,直接导致了无限循环和无法输出字符的现象:

1. 缺少终止条件判断,且未移动数据指针

你的BRnzp LOOP是无条件跳转指令,既没有检查当前读取的数据是否为终止值x0000,也没有在每次循环后递增存储数据地址的R0寄存器——这会导致程序永远重复读取第一个数据值,陷入无限循环。

2. OUT指令使用不符合LC-3规范

LC-3的OUT指令要求要输出的ASCII字符必须存储在R0寄存器中,你现在把计算结果放在R2里就直接调用OUT,硬件不会读取R2的值,自然无法输出任何内容。

修正后的代码

.ORIG x3000

; Data to process
DATA .FILL x0033 ; 'C' ASCII value
     .FILL x0053 ; 'S' ASCII value
     .FILL x0000 ; Terminating value

; Initialize variables
LEA R0, DATA ; Load address of data into R0
AND R1, R1, #0 ; Initialize index to zero

; Loop to process data
LOOP
    LDR R2, R0, #0 ; Load data value into R2
    ADD R2, R2, #0 ; 检查当前数据是否为终止值(x0000)
    BRz END_LOOP   ; 如果是0,跳转到停机
    
    ADD R0_TEMP, R2, R1 ; 计算索引+数据值
    ADD R0, R0_TEMP, #0 ; 将结果存入R0,满足OUT指令要求
    OUT                 ; 输出ASCII字符
    
    ADD R1, R1, #1 ; 递增索引
    ADD R0, R0, #1 ; 移动数据指针到下一个地址
    BRnzp LOOP     ; 重复循环

END_LOOP
HALT ; Halt the program

.END

修正说明

  • 每次加载数据后,先通过ADD R2, R2, #0设置条件码,再用BRz判断是否为终止值,是则跳转到停机逻辑
  • 将计算结果存入R0后再调用OUT,严格遵循LC-3指令的寄存器要求
  • 每次循环结束后递增R0,确保下一次读取下一个数据的地址

内容的提问来源于stack exchange,提问作者Wremmurg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:11:05