LMC 中的数组编程

Programming arrays in LMC

我正在应对这个挑战:

The program needs to accept a sequence of integers. It ends with number 999. The integers (except 999) are placed in a list. The integers must be less than or equal to 99. Any inputs greater than 99 are not placed in the list.

If the input would have more than ten numbers, only the first ten are stored.

999 is not part of the output.

我不知道如何将列表长度限制为十 (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 表明你没有接受

的提示

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

在您的尝试中,没有涉及输出的部分。

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

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

对于自修改部分,您可以在数组数据部分设置结束标记,并定义 LDASTA 指令,这些指令将 read/store 处的值数组的 end。只要您的代码有准确的指令,您就知道您已经到达终点。

这是它的工作原理:

          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 处的指令在它们所在的循环执行期间被修改。