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