MARIE代码未添加Input却触发输入请求问题求助
问题分析与修复
你的代码触发输入请求的核心原因是PUSH子程序的返回逻辑错误导致死循环,最终破坏了程序指令,意外生成了Input指令,同时还有几处语法和逻辑问题:
错误点1:PUSH子程序的返回指令错误
MARIE的JnS指令会将返回地址存入子程序的第一个内存单元,然后跳转到子程序的下一个单元执行。你的PUSH子程序最后用JUMP PUSH直接跳转到子程序的起始地址,会把存在那里的返回地址当成指令执行,导致程序进入无限循环——PTR会不断递增,最终覆盖代码段的指令,当某个被覆盖的指令操作码变成1001(Input指令的操作码)时,就会触发输入请求。
正确的返回方式应该用JUMP I 0,通过间接寻址跳转到存在子程序第一个单元的返回地址,实现正常返回。
错误点2:注释语法错误
MARIE汇编器只识别双斜杠//作为注释开头,你在POP子程序里用了单斜杠/,可能被汇编器误解析为指令的一部分,导致生成无效或错误的指令。
错误点3:未调用POP子程序
你的主程序只执行了三次压栈操作,没有调用POP子程序,弹出功能根本不会执行。
修正后的代码
ORG 000 PTR, HEX 0002 // 栈指针初始指向栈的第二个单元(栈底第一个单元是1111) STACK, HEX 1111 HEX 2222 HEX 3333 HEX 4444 HEX 5555 HEX 6666 HEX 7777 A, HEX 0004 B, HEX 0006 C, HEX 0008 ONE, HEX 0001 PBUFF,HEX 1234 // 主程序:压入4、6、8 Load A Store PBUFF JnS PUSH Load B Store PBUFF JnS PUSH Load C Store PBUFF JnS PUSH // 弹出三个元素(顺序是8、6、4) JnS POP JnS POP JnS POP Halt // PUSH子程序:将PBUFF的值压入栈 PUSH, HEX 000 Load PBUFF StoreI PTR // 将值存入栈指针指向的地址 Output // 可选:输出压入的值 Load PTR Add ONE // 栈指针递增 Store PTR JUMP I 0 // 跳转到返回地址,完成子程序返回 // POP子程序:从栈顶弹出值并输出 POP, HEX 000 Load PTR // 加载当前栈指针 Subt ONE // 栈指针递减(指向栈顶元素) Store PTR // 更新栈指针 LoadI PTR // 加载栈顶元素 Output // 输出弹出的值 JUMP I 0 // 返回主程序 Halt
验证说明
修正后,程序会依次压入4、6、8,然后依次弹出8、6、4并输出,不会触发输入请求,也不会进入死循环。
内容的提问来源于stack exchange,提问作者HeyitsTremani
相关产品推荐
相关产品推荐

