MARIE汇编实现数组和为K元素对查找 索引引用异常排查
MARIE 整数对查找程序索引错误修复
核心错误梳理
- 变量定义混乱:重复定义
One/one/onee三个存值为1的变量,MARIE汇编对标识符大小写敏感,部分引用取值错误。 - 指针未重置:数组打印流程结束后,
Indexposition已经指向数组末尾后的内存地址,没有重置回数组基地址就直接进入查找循环,起始寻址位置完全错误。 - 地址计算逻辑缺失:双循环的下标
i``j没有做「数组基地址+下标偏移」的换算,间接寻址取数时访问的是错误内存位置,根本拿不到对应数组元素。 - 条件判断与输出错误:相等匹配的跳转逻辑写反,找到结果后输出的是跑飞的地址值,不是实际的元素下标;内层循环每次启动没有重置
j的初始值为i+1,循环边界判断错误会越界访问。
修正后可运行代码
// 程序起始地址 ORG 100 // -------------------------- // 第一步:输入数组大小,填充数组 // -------------------------- INPUT STORE ArraySize OUTPUT LOAD Arr STORE Indexposition CLEAR STORE index GetVal, LOAD ArraySize SUBT index SKIPCOND 800 // AC>0即index < ArraySize时跳过跳转,继续填值 JUMP Print INPUT STOREI Indexposition LOAD Indexposition ADD incr STORE Indexposition LOAD index ADD incr STORE index JUMP GetVal // -------------------------- // 第二步:打印已输入的数组做校验 // -------------------------- Print, LOAD Arr STORE Indexposition CLEAR STORE index PrintVal, LOAD ArraySize SUBT index SKIPCOND 800 JUMP InputK LOADI Indexposition OUTPUT LOAD Indexposition ADD incr STORE Indexposition LOAD index ADD incr STORE index JUMP PrintVal // -------------------------- // 第三步:输入目标值K,开始双循环查找 // -------------------------- InputK, INPUT STORE Kvalue CLEAR STORE i // 外层循环i从0开始 // 外层循环:i从0到n-2 OuterLoop, LOAD i SUBT ArraySize SKIPCOND 000 // i < ArraySize时跳过结束跳转,继续循环 JUMP EndProg // 计算A[i]地址:基地址Arr + i LOAD Arr ADD i STORE addrI // 内层循环j从i+1开始 LOAD i ADD incr STORE j InnerLoop, LOAD j SUBT ArraySize SKIPCOND 000 // j < ArraySize时跳过内层结束跳转,继续循环 JUMP OuterNext // 计算A[j]地址:基地址Arr +j LOAD Arr ADD j STORE addrJ // 计算A[i]+A[j],和K做比较 LOADI addrI ADDI addrJ SUBT Kvalue SKIPCOND 000 // 和小于K,跳过匹配成功跳转 SKIPCOND 800 // 和大于K,跳过匹配成功跳转 JUMP Found // 只有和等于K时执行跳转 // 没匹配到,j自增继续内层 LOAD j ADD incr STORE j JUMP InnerLoop OuterNext, LOAD i ADD incr STORE i JUMP OuterLoop // -------------------------- // 找到结果,输出i、j下标 // -------------------------- Found, LOAD i OUTPUT LOAD j OUTPUT HALT EndProg, HALT // 变量定义区 index, dec 0 i, dec 0 j, dec 0 Indexposition, hex 0 ArraySize, dec 0 incr, dec 1 Arr, hex 28 // 数组基地址,从0x28开始存元素 Kvalue, dec 0 addrI, dec 0 addrJ, dec 0
验证说明
用题目给出的测试用例验证:
- 输入数组大小
6,依次输入元素3/7/11/5/-2/1 - 输入目标K值
12 - 程序会依次输出
1和3,对应Num[1]=7、Num[3]=5,和为12,符合预期。 - 逻辑严格对应给出的C++双循环实现,不会重复使用同一个元素,题目约定有唯一解时会直接输出对应下标停机。
内容的提问来源于stack exchange,提问作者crystle00
相关产品推荐
相关产品推荐

