MARIE代码运算符逻辑错误:加法变减法、其余运算异常排查
MARIE汇编运算逻辑错误分析与修复
问题核心原因
你的代码出现运算逻辑颠倒的问题,本质是运算符判断分支的条件匹配错误,具体表现为:
- 加法判断的分支条件未正确触发,导致输入
+时跳转到了减法执行代码 - 减法、乘法、除法的判断条件失效,使得这三种运算符的输入都落入了加法执行的默认分支
常见触发点:
Skipcond指令的条件码使用错误(比如用000/200代替100判断相等)- 跳转标签与运算逻辑对应颠倒(比如判断
+后跳转到减法标签) - 运算符比较的减法顺序搞反(比如用常量减运算符而非运算符减常量,导致相等判断时AC值不为0)
修复步骤
1. 明确MARIE判断逻辑
MARIE的Skipcond XYY指令中,X代表判断规则:
0:AC < 0 时跳过下一条指令1:AC = 0 时跳过下一条指令2:AC > 0 时跳过下一条指令
判断运算符匹配的标准逻辑:加载输入运算符 → 减去目标运算符的ASCII值 → 用Skipcond 100判断AC是否为0(即运算符相等)
2. 修正运算符判断分支
以下是标准判断逻辑示例(假设已定义存储输入数的Num1、Num2,存储运算符的Op,以及各运算符常量):
; 定义运算符ASCII常量 OnePlus, DEC 43 ; '+'的ASCII值 OneMinus, DEC 45 ; '-'的ASCII值 OneMult, DEC 42 ; '*'的ASCII值 OneDiv, DEC 47 ; '/'的ASCII值 ; 开始判断运算符 StartJudge, Load Op Sub OnePlus Skipcond 100 ; 若AC=0(Op是'+'),跳过下一条Jump指令 Jump CheckMinus Jump DoAdd ; 匹配加法,跳转到加法执行 CheckMinus, Load Op Sub OneMinus Skipcond 100 Jump CheckMult Jump DoSub ; 匹配减法,跳转到减法执行 CheckMult, Load Op Sub OneMult Skipcond 100 Jump CheckDiv Jump DoMult ; 匹配乘法,跳转到乘法执行 CheckDiv, Load Op Sub OneDiv Skipcond 100 Jump InvalidOp ; 不匹配任何运算符,跳转到错误处理 Jump DoDiv ; 匹配除法,跳转到除法执行 ; 各运算执行逻辑 DoAdd, Load Num1 Add Num2 Jump OutputResult DoSub, Load Num1 Sub Num2 Jump OutputResult DoMult, ; MARIE无乘法指令,循环累加实现 Load Num2 Store Counter Load Zero Store Result MultLoop, Load Result Add Num1 Store Result Load Counter Sub One Store Counter Skipcond 000 Jump MultLoop Load Result Jump OutputResult DoDiv, ; MARIE无除法指令,循环减法实现 Load Num1 Store Dividend Load Zero Store Result DivLoop, Load Dividend Sub Num2 Skipcond 000 ; 被除数<除数时停止循环 Jump DivEnd Store Dividend Load Result Add One Store Result Jump DivLoop DivEnd, Load Result Jump OutputResult InvalidOp, ; 错误处理:输出提示或终止 Halt OutputResult, Output Halt ; 辅助变量 Zero, DEC 0 One, DEC 1 Counter,DEC 0 Result, DEC 0 Dividend,DEC 0
3. 额外检查点
- 确认输入的运算符被正确存储到
Op变量(输入用Input指令,未被后续操作覆盖) - 验证乘法、除法的自定义循环逻辑,避免循环错误导致结果异常
- 移除默认加法分支,所有判断失败后跳转到错误处理而非执行加法
内容的提问来源于stack exchange,提问作者EeryTester87
相关产品推荐
相关产品推荐

