我是否需要在此MIPS代码中从内存中将数组的基地址加载到临时寄存器中?

时间:2019-04-20 02:12:25

标签: arrays mips mips32

我正在做作业,我必须翻译一些C代码 进入MIPS(32位)。

我可以将3个寄存器$s0用于变量x,将'$ s1'用于变量y 和'$ s3'表示数组'A []'的基址。

我的目标是能够执行一些条件if逻辑,该逻辑将数组'A'的某个索引与变量'y'(在这种情况下为A[x] < y)进行比较

到目前为止,我的代码:

sll $t0, $s0,2 # t0 = x *4

add $t0,$t0,$s3 # t0 = x*4 + &A[0] = A[x]

我的问题是:寄存器$ t0是否已经指向'A [x]'的内存地址,因此我可以继续进行目前的工作并开始比较值:

slt $t1,$t0,$s1 # if A[x] < y then $t1 = 1

还是我需要在代码开头使用“ lw”伪指令从内存中加载单词:

lw $t0, 0($s3) #temp reg $t0 gets A[0]

sll $t1, $s0,2 # t0 = x *4

add $t0,$t1,$t0 # t0 = x*4 + &A[0] = A[x]

rest of code goes here

1 个答案:

答案 0 :(得分:2)

您的$ t0将包含A [x]的存储位置。

“寄存器$ t0已经指向'A [x]'的内存地址,因此我可以继续使用到目前为止的内容并开始比较值:”

是的,您正确的是$ t0指向存储器地址'A [x]'。但 您尚无法比较,因为您拥有存储A [x]的地址,而不是该地址的值AT。因此,您需要执行加载字指令。

“我需要在代码开头使用'lw'伪指令从内存中加载单词:” 您是正确的,您需要从内存中加载单词。请记住,$ t0具有您要从内存中加载的感兴趣的地址。 ($ t0 = A [x]的地址)

您可以这样做:

lw $t0, 0($t0) # temp reg. $t0 gets A[x]

然后您可以进行比较。

注意:记得寄存器与存储器是分开的。为了与寄存器中的值和内存中的值进行比较,您需要使用带有适当地址的lw才能将内存中的值带入特定的寄存器中。