1

我正在输入几个变量。我想知道如何每次增加地址,所以每个输入都保存在不同的地址中。我每次都尝试添加 1,但它只能用于特定输入,不能用于地址。

4

3 回答 3

1

如果您知道将获得多少输入,则只需将每个输入存储在预定义的位置(因此:无循环)。

另一方面,如果事先不知道输入的数量,那么您可以使用自修改代码。

有几种方法可以获得可变数量的输入。这里有一些:

  • 让第一个输入指示接下来有多少输入
  • 保留一个特殊的值来指示输入的结束,例如 0。这意味着 0 不能是出现在该结束标记之前的“真实”输入的一部分。

这是一个程序,它将输入存储在连续的内存位置,直到输入 0:

#input: 1 2 3 0
LOOP   INP
       BRZ DONE
DYN    STA ARR
       LDA DYN  ; read the opcode
       ADD ONE
       STA DYN  ; modifying code!
       BRA LOOP
DONE   HLT

ONE    DAT 1
ARR    DAT    ; start of the array
       

<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.73/lmc.js"></script>

运行此代码时,您会注意到数据超出了ARR标签写入。发生这种情况是因为 at 指令在DYN循环中动态更新。所以在第二次迭代中,它确实类似于STA ARR+1-- 尽管这是一种不受支持的语法。

在实际用例中,您将在 label 处对收集的数据做一些事情DONE,而这里我们只是结束程序。

于 2020-10-18T22:03:22.737 回答
0

我相信你需要的是DAT功能。这会保留一个内存地址,然后您可以将STA变量(存储)到特定的内存地址中。

例如:A DAT将为变量保留一个内存地址A

于 2015-12-02T11:39:07.737 回答
0
          INP
        STA N
LOOP    LDA A
        SUB N
        BRP ENDLOOP
        LDA A
        OUT
        LDA B
        ADD A
        STA ACC
        LDA B
        STA A
        LDA ACC
        STA B
        BRA LOOP
ENDLOOP HLT
A       DAT 0
B       DAT 1
N       DAT
ACC     DAT 1
于 2016-04-20T18:18:45.800 回答