LC-3子程序持续循环问题:期望R0=1时终止却无法停止
问题分析与修复
你的LC-3子程序无法在R0=1时退出循环,问题出在X=1的判断逻辑上。原代码中使用BRnz QUIT会匹配所有≤1的情况(包括X=0或负数),且直接修改R0后再恢复的步骤存在隐含风险,可能导致条件判断未按预期触发。
修复后的代码
AND R3, R3, #0 ; Initialize step count to 0 ADD R4, R7, #0 LOOP ; Loop until X becomes 1 ADD R2, R0, #-1 ; 计算X-1,不修改原X BRz QUIT ; 仅当X=1时跳转QUIT ADD R2, R0, #0 ; Copy X into R2 AND R2, R2, #1 ; Check if X is odd BRz EVEN ; Branch to EVEN if X is even JSR MUL3ADD1 ; Run the MUL3ADD1 subroutine if odd ADD R0, R1, #0 ; Copy the result into X ADD R3, R3, #1 ; Increment the step count BRnzp LOOP ; Loop again EVEN JSR DIVIDEBY2 ; Run the DIVIDEBY2 subroutine if even ADD R0, R1, #0 ; Copy the result into X ADD R3, R3, #1 ; Increment the step count BRnzp LOOP ; Loop again QUIT ADD R7, R4, #0 ; resets R7 value RET
关键修改点
- 改用
ADD R2, R0, #-1将X-1的结果存入R2,不直接修改R0,避免后续恢复操作可能带来的错误。 - 将
BRnz QUIT替换为BRz QUIT,仅当X-1=0(即X=1)时触发跳转,判断逻辑更精准,排除了X≤1的其他无关情况干扰。
修改后,当R0的值变为1时,会直接跳转到QUIT分支执行返回操作,不会继续进入循环。
内容的提问来源于stack exchange,提问作者Sankalp Swamy
相关产品推荐
相关产品推荐

