在 LMC

问题描述

我正在应对这个挑战:

程序需要接受一个整数序列。它以数字 999 结尾。整数(999 除外)放在一个列表中。 整数必须小于或等于 99。任何大于 99 的输入都不会放入列表中。

如果输入的数字超过十个,则只存储前十个。

999 不是输出的一部分。

我不知道如何将列表长度限制为十 (10) 个数字。另外我不知道如何以相反的顺序输出列表。

这是我的代码

start   INP
        STA temp
        SUB big
        BRZ doout
        LDA temp
        SUB hundred
        BRP start
        sub one
        STA N
    
xx      STA ARR
        LDA xx
        add one
        sta xx
        BRA start
doout   HLT
temp    dat 0
big     dat 999
hundred dat 100
ARR     dat
one     dat 1
N       dat 10 

解决方法

您程序中的 xx 表明您没有接受 How can I store an unknown number of inputs in different addresses in LMC (little-man-computer)? 的提示

它解释了如何使用自修改代码遍历数组——存储值或加载它们。

在您的尝试中,没有处理输出的部分。

对于程序的开始部分,我实际上建议先减去 100,然后减去 899(等于 999)。这样您就可以将(减少的)输入保留在累加器中,而无需恢复它。

此外,由于 LMC 规范中的歧义,在 BRZ 之后立即执行 SUB 并不完全“安全”(这是因为累加器的内容未定义/下溢时未指定,因此理论上可能为 0)。在分支代码中执行 BRP 之前,您应该始终先执行 BRZ。但是,由于输入不能大于 999,因此 BRP 足以检测相等性。

对于自修改部分,您可以在数组数据部分设置结束标记,并定义将在末尾读取/存储值的 LDASTA 指令 数组。每当您的代码有确切的指令时,您就知道您已经到达终点。

这是它的工作原理:

          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>

如您所见(在此处运行脚本时),dyna1dyna2 处的指令在它们所在的循环执行期间被修改。