刚开始为我的一个类学习汇编,我对这段代码感到有点困惑。这是一个教科书问题,要求您将MIPS指令翻译为C.其余问题在附图中。
对于上面的MIPS装配说明,相应的是什么 C声明?假设变量f,g,h,i和j分别分配给寄存器$ s0,$ s1,$ s2,$ s3和$ s4。假设数组A和B的基址分别位于寄存器$ s6和$ s7中。
sll $t0, $s0, 2 # $t0 = f * 4
add $t0, $s6, $t0 # $t0 = &A[f]
sll $t1, $s1, 2 # $t1 = g * 4
add $t0, $s6, $t0 # $t1 = &B[g]
lw $s0, 0($t0) # f = A[f]
addi $t2, $t0, 4
lw $t0, 0($t2)
add $t0, $t0, $s0
sw $t0, 0($t1)
我对一些MIPS指令有基本的了解,但坦率地说,带阵列的东西让我感到困惑。这里有人能指出我正确的方向吗?谢谢!
答案 0 :(得分:0)
自从我上次写MIPS汇编以来已经有一段时间了。但是,根据我从前几条指令中可以理解的内容:
sll $t0, $s0, 2 # t0 = 4 * f
add $t0, $s6, $t0 # t0 = &A[f]
s0
包含您要访问数组f
的索引A
。由于您将f
乘以4,A
是一个长度为4个字节的数据类型的数组(可能是一个int)。 s6
持有数组地址,因为要访问基本上做A[f]
的地址(在伪代码中)
address_of_A[f] = base_address_of(A) + offset_of_type_int(f)
原则上在接下来的2条指令中会发生相同的事情,但这次是数组B
。之后:
lw $s0, 0($t0) # f = A[f]
addi $t2, $t0, 4 # t2 = t0 + 4
第一次加载很明显,s0
获取地址t0
的值,当然是A[f]
。第二个将t0
增加4并将其存储到t2
,这意味着t2
现在包含地址&A[f+1]
,因为我们知道数组A
包含4字节数据。
最后lw
命令:
lw $t0, 0($t2)
将地址$t2
的值存储在$t0
上,因此$t0
现在为A[f+1]
。