我正在做作业,我必须翻译一些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
答案 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
才能将内存中的值带入特定的寄存器中。