You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:24:58