ЛКМ - Как увеличить адрес?

Я ввожу несколько переменных. Я хочу знать, как увеличивать адрес каждый раз, чтобы каждый из входов сохранялся по своему адресу. Я пытался добавить 1 каждый раз, но это может быть только для конкретных входов, а не для адресов.

2 ответа

Если вы знаете, сколько входов вы получите, просто сохраните каждый вход в заранее определенном месте (так: без цикла).

Если, с другой стороны, количество входов заранее неизвестно, тогда вы можете использовать самомодифицирующийся код.

Есть несколько способов получить переменное количество входов. Вот некоторые:

  • Пусть первый вход указывает, сколько входов последует
  • Зарезервируйте специальное значение для указания конца ввода, например 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, а здесь мы просто завершаем программу.

Я считаю, что вам нужно это DAT функция. Это резервирует адрес памяти, который вы можете затем STA (хранить) переменную в конкретном адресе памяти.

Так, например: A DAT зарезервировал бы адрес памяти для переменной A

          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
Другие вопросы по тегам