您的xx
程序中的 表明您没有从如何在 LMC(小型计算机)的不同地址中存储未知数量的输入中获得提示?
它解释了如何让自修改代码遍历数组——存储值或加载它们。
在您的尝试中,没有处理输出的部分。
对于程序的开始部分,我实际上建议先减去100,然后减去 899(相当于 999)。这样,您可以将(减少)输入保留在累加器中,而无需恢复它。
BRZ
此外,由于 LMC 规范中的含糊不清,在 a之后立即执行并不完全“安全” SUB
(这是因为当存在下溢时,累加器的内容是未定义/未指定的,所以理论上它可能是 0 )。在分支代码中执行 aBRP
之前,您应该始终先执行 a 。BRZ
但是,由于输入不能大于 999,因此 aBRP
足以检测相等性。
对于自我修改部分,您可以在数组数据部分设置结束标记,并定义将在数组末尾读取/存储值的LDA
and指令。每当您的代码有确切的指令时,您就知道您已经走到了尽头。STA
以下是它的工作原理:
LDA store # Initialise dynamic store instruction
STA dyna1
loop INP
dyna1 STA array
SUB toobig
BRP skip
LDA dyna1
ADD one
STA dyna1
SUB staend
BRP print
BRA loop
skip SUB trailer
BRP print # Safer to do BRP than BRZ
BRA loop # Input was less than 999
print LDA dyna1 # Convert dynamic store instruction
SUB store # ... to index
ADD load # ... to load instruction
STA dyna2
loop2 LDA dyna2
SUB one
STA dyna2
SUB load
BRP dyna2
end HLT # all done
dyna2 LDA array
OUT
BRA loop2
store STA array
load LDA array
staend STA after
one DAT 1
toobig DAT 100
trailer DAT 899
array DAT
DAT
DAT
DAT
DAT
DAT
DAT
DAT
DAT
DAT
after DAT
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.816/lmc.js"></script>
如您所见(在此处运行脚本时), 和 的指令在dyna1
执行dyna2
它们所在的循环期间被修改。