Сборка LC-3 Доступ к значениям массива
Мне дали массив, определенный как:
.orig x6000
.fill -20
.fill 14
.fill 7
.fill 0
.fill -3
.fill 11
.fill 9
.fill -9
.fill 2
.fill -5
.end
Мне нужно перебрать эти значения в моей основной программе. Из того, что я понимаю, этот "массив" - это просто значения, хранящиеся в памяти далеко от места хранения инструкций. Мой вопрос: "Как мне загрузить эти значения?" Я знаю, что они начинаются с x6000
, но я не знаю, как добраться до них, используя инструкции.
1 ответ
Лучше всего прочитать LCA ISA и обратить особое внимание на LDR
инструкция.
Вот пример программы, которая поможет вам начать.
Вам нужно знать и отслеживать две вещи: (1) адрес массива и (2) длину массива / индекса во время итерации. Для (1) я решил использовать заполненное значение; для (2) длина массива определяется в самой инструкции. я AND R1, R1, 0
очистить реестр и добавить 10
, Мы могли бы так же легко получить заполненную стоимость LENGTH
равно 10
а также LD R1 LENGTH
,
Цикл начинается с уменьшения R1
и проверка, чтобы увидеть, если это отрицательно. Если R1
отрицательно, то цикл выходит. Сначала мы уменьшили длину, так что вы можете думать о "длине" (значение в R1
) в качестве индекса. Итак, если индекс < 0, то цикл завершается.
LDR R0, R2, 0
инструкция получает значение по адресу в реестре R2
смещено на 0
и помещает это в R0
, Предположительно, вы захотите что-то сделать с данными после этой строки.
Перед безусловным переходом к LOOP
, мы увеличиваем адрес массива, чтобы он указывал на следующий элемент.
.orig x3000
LD R2, ARRAY ; R2 = x6000
AND R1, R1, 0 ; R1 = 0 (clear before add)
ADD R1, R1, 10 ; R1 = 10 (length of array)
LOOP ADD R1, R1, -1 ; R1--
BRn DONE ; if R1 < 0 then halt, else...
LDR R0, R2, 0 ; R0 <-- mem[R2 + 0]
ADD R2, R2, 1 ; R2++
BR LOOP ; loop
DONE HALT ; halt
ARRAY .fill x6000
.orig x6000
.fill -20
.fill 14
.fill 7
.fill 0
.fill -3
.fill 11
.fill 9
.fill -9
.fill 2
.fill -5
.end