我得到了一个数组,定义为:
.orig x6000
.fill -20
.fill 14
.fill 7
.fill 0
.fill -3
.fill 11
.fill 9
.fill -9
.fill 2
.fill -5
.end
我需要在主程序中迭代这些值。据我所知,这是#34;阵列"只是存储在远离指令存储位置的内存中的值。我的问题是,"如何加载这些值?"我知道他们是从x6000
开始的,但我不知道如何使用说明找到他们。
答案 0 :(得分:1)
最好的办法是阅读the LC3 ISA并特别注意LDR
指令。
这是一个帮助您入门的示例程序。
您需要知道并跟踪两件事:(1)数组的地址和(2)迭代时数组/索引的长度。对于(1),我选择使用填充值; for(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