LMC - 如何增加地址?

时间:2015-11-19 16:52:32

标签: little-man-computer

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

3 个答案:

答案 0 :(得分:0)

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

例如:A DAT将为变量A

保留一个内存地址

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

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

  • 让第一个输入指示将要跟随多少输入
  • 保留一个特殊值以指示输入的结尾,例如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标签之外。发生这种情况是因为DYN中的指令是在循环中动态更新的。因此,在第二次迭代中,它的确类似于STA ARR+1 -尽管不支持该语法。

在一个实际的用例中,您将对标签DONE上收集的数据进行处理,而在这里我们只是结束程序。