汇编程序循环无法终止求助:输入数字后循环超10仍运行
问题分析与修复方案
核心错误:循环终止条件判断逻辑错误
你的程序无法终止的根本原因是SKIPCOND 000的使用完全偏离需求:
SKIPCOND 000的作用是当累加器(AC)值小于0时,跳过下一条指令- 而需求是当
X < 10时继续循环,需要判断X与10的大小关系,而非判断X是否为负数
修复步骤
1. 新增常量10的定义
在代码末尾添加用于比较的常量:
TEN, DEC 10 / 常量10
2. 修正循环条件判断
替换原有的条件判断代码块:
LOAD X / 加载X的值 SKIPCOND 000 / 若AC<0(X小于10),则继续循环 JUMP ENDLOOP / 若X不小于10,则终止循环
改为:
LOAD X / 加载当前X的值 SUB TEN / 计算X - 10,结果存入AC SKIPCOND 000 / 若AC < 0(即X < 10),跳过下一条JUMP指令,继续循环 JUMP ENDLOOP / 若AC >= 0(即X >= 10),跳转到循环结束处
3. 调整计数器初始值(满足输入5时输出迭代次数10的需求)
原代码计数器初始为固定值1,输入5时循环6次后计数器为7,不符合输出10的要求。需要将计数器初始值设为用户输入的X值:
替换原代码中的:
LOAD ONE / 加载常量1 STORE Counter / 将其存入Counter内存单元
改为:
LOAD X / 加载用户输入的X值 STORE Counter / 将输入值作为计数器初始值
完整修复后的代码
ORG 400 / 起始地址为400 INPUT / 获取用户输入的数字 STORE X / 将输入值存入内存单元X LOAD X / 加载用户输入的X值 STORE Counter / 将输入值作为计数器初始值 LOOP, LOAD X / 加载X的值 OUTPUT / 显示当前X的值 ADD ONE / 将X自增1 STORE X / 存储更新后的X值 LOAD Counter / 加载当前计数器值 ADD ONE / 将计数器自增1 STORE Counter / 存储更新后的计数器值 LOAD X / 加载当前X的值 SUB TEN / 计算X - 10 SKIPCOND 000 / 若X < 10,跳过JUMP指令继续循环 JUMP ENDLOOP / 若X >= 10,终止循环 LOAD Counter / 加载最终计数器值 OUTPUT / 显示计数器值 ENDLOOP , HALT / 终止程序 X, DEC 0 / X的内存单元(初始化为0) Counter, DEC 0 / Counter的内存单元(初始化为0) ONE, DEC 1 / 常量1 TEN, DEC 10 / 常量10
验证结果
输入5时,程序会依次输出:
5 6 7 8 9 10 10
完全符合需求,且循环会在X等于10时正确终止。
内容的提问来源于stack exchange,提问作者ZiwaseemiZ
相关产品推荐
相关产品推荐

