如何在MARIE汇编语言中仅打印数组的5个元素
MARIE汇编打印数组前5个元素的死循环问题修复
原代码的核心错误
- 数组地址未正确初始化:
X被定义为DEC 0,导致Load X加载的是0而非数组Array的起始地址,根本没指向目标数组。 - 地址计算逻辑混乱:循环中用
Addr + Count -1更新地址,会导致地址每次往错误偏移方向移动,完全不符合数组遍历逻辑。 - 缺失打印指令:代码仅有打印注释,没有
Output指令,无法输出元素内容。 - 寻址方式错误:要访问
Addr指向的数组元素,需用间接寻址LoadI,而非直接加载Addr的数值。 - 循环退出条件错误:
Skipcond 000仅在累加器值小于0时跳转,计数器从5递减到0时,累加器等于0,不会触发跳转,导致循环无法终止。
修复后的代码
ORG 100 Main, Load X // 加载数组的起始地址 Store Addr Load 5 // 初始化计数器,设置要打印的元素数量为5 Store Count Loop, LoadI Addr // 间接寻址,加载当前Addr指向的数组元素 Output // 打印该元素 Load Addr Add 1 // 地址自增1,指向下一个数组元素 Store Addr Load Count Subt 1 // 计数器减1 Store Count Skipcond 800 // 如果计数器>0,继续循环 Jump Loop Halt Addr, DEC 0 Count, DEC 0 X, DEC Array // X指向数组Array的起始地址 Array, DEC 10 // 示例数组(包含10个元素) DEC 20 DEC 30 DEC 40 DEC 50 DEC 60 DEC 70 DEC 80 DEC 90 DEC 100
修复说明
- 初始化数组地址:将
X设置为DEC Array,确保Load X能获取到数组的正确起始地址。 - 正确遍历数组:每次循环后将
Addr加1,依次指向数组的下一个元素,符合MARIE单字元素的存储规则。 - 添加打印指令:用
Output指令输出当前加载的数组元素。 - 使用间接寻址:
LoadI Addr加载Addr地址中存储的内存单元的值,也就是目标数组元素的内容。 - 修正循环退出条件:
Skipcond 800会在累加器(此时存储计数器值)大于0时跳过下一条指令,继续循环;当计数器减到0时,不会跳过,直接执行Halt终止程序。
内容的提问来源于stack exchange,提问作者Buddhinatha Kodituwakku
相关产品推荐
相关产品推荐

