ЛКМ - Как увеличить адрес?
Я ввожу несколько переменных. Я хочу знать, как увеличивать адрес каждый раз, чтобы каждый из входов сохранялся по своему адресу. Я пытался добавить 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