在 LMC 中对阵列进行编程

Programming arrays in LMC

提问人:julio11 提问时间:7/6/2021 最后编辑:trincotjulio11 更新时间:7/6/2021 访问量:812

问:

我正在努力应对这个挑战:

程序需要接受整数序列。它以数字 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 
阵列 排序 组装 小人计算机

评论

0赞 Peter Cordes 7/6/2021
为什么这里需要自修改代码? 在循环中不会改变,所以它一直都是 0。或者你把它省略了,它实际上是如何在 LMC(小人计算机)的不同地址中存储未知数量的输入的副本?我假设你的意思是,直到你澄清,否则在你的商店说明中使用标签显然是微不足道的。countarray[count++]array
0赞 julio11 7/6/2021
@PeterCordes 简而言之,整数被放置在一个限制为 10 个整数的列表中,然后以相反的顺序打印该列表。
0赞 Peter Cordes 7/6/2021
好吧,那我就猜对了你到底想做什么。这不是你的 C 代码所做的,除非修改全局 .input()count
0赞 julio11 7/6/2021
@PeterCordes你是摇滚明星!非常感谢。
0赞 julio11 7/6/2021
@PeterCordes我编辑了我的问题以反映我遇到的问题。

答:

3赞 trincot 7/6/2021 #1

您的程序中显示您尚未从如何在 LMC(小人计算机)的不同地址中存储未知数量的输入?xx

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

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

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

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

对于自修改部分,您可以在数组数据部分中设置结束标记,并定义将在数组末尾读取/存储值的 and 指令。每当你的代码有确切的指令时,你就知道你已经到达了终点。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/[email protected]/lmc.js"></script>

正如你所看到的(在这里运行脚本时),在执行它们所在的循环时,和的指令被修改了。dyna1dyna2

评论

1赞 julio11 7/6/2021
我现在了解了加载和存储指令的工作原理。感谢您抽出宝贵时间接受采访。