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
相关产品推荐
相关产品推荐

