MARIE汇编实现加减乘除时除法模块返回错误值的问题排查
MARIE汇编实现加减乘除时除法模块返回错误值的问题排查
看起来你在MARIE汇编的除法实现里踩了两个关键逻辑坑,导致输出的不是计算好的商,而是初始输入的x值。咱们一步步拆解问题,再给你修正后的代码:
问题1:除法循环的条件判断逻辑搞反了
MARIE的Skipcond指令规则是:
Skipcond 800:当AC>0时跳过下一条指令Skipcond 400:当AC=0时跳过下一条指令Skipcond 000:当AC<0时跳过下一条指令
你原来的代码里,执行Subt y后用Skipcond 800,意思是如果x-y>0才跳去累加商,但实际上我们需要的是:只要x-y≥0(还能减)就累加商,只有当x-y<0(不够减了)才退出循环。你的条件判断正好搞反了,导致循环的退出时机不对。
问题2:输出阶段的逻辑完全错误
你在输出部分写了:
output, Load x Store quotient Load quotient Output
这相当于把当前的x(此时是除法的余数)覆盖了之前计算好的quotient,然后输出这个被覆盖后的值——这就是为什么你看到返回的是x的原因!完全搞反了输出对象。另外,output这个标签和MARIE的Output指令重名,容易引发混淆,建议改成output_div这类独特的名字。
修正后的除法模块代码
/ Division Load zero Store quotient ; 初始化商为0 divloop, Load x ; 加载当前被除数x Subt y ; 计算x - y Skipcond 000 ; 如果AC < 0(x < y,不够减了),跳过下一条指令 Jump Adding ; 够减,跳去累加商 Jump output_div ; 不够减,跳去输出商 Adding, Store x ; 把减后的结果存回x(此时x = x - y ≥ 0) Load quotient Add one ; 商加1 Store quotient Jump divloop ; 回到循环继续减 /Output of Division output_div, Load quotient ; 加载计算好的商值 Output ; 输出商
修正后的逻辑说明
- 先初始化商
quotient为0 - 循环里不断用x减y,每次够减(x-y≥0)就把结果存回x,同时商加1
- 当x-y<0时,退出循环,直接输出之前累加好的
quotient(也就是除法的商) - 如果需要输出余数,你可以在输出商之后再加一段加载x并输出的逻辑
备注:内容来源于stack exchange,提问作者user22410271
相关产品推荐
相关产品推荐

