【发布时间】:2015-03-22 20:19:29
【问题描述】:
刚开始为我的一个课程学习汇编,我对这个代码段有点困惑。这是一个教科书问题,要求您将 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 指令有基本的了解,但坦率地说,数组的东西让我有点困惑。这里有人能指出我正确的方向吗?谢谢!
【问题讨论】:
-
那么你能描述一下这段代码的作用吗?
-
我在这里可能完全错了,但是在最后一个注释行之后的第一个添加立即命令是否只是将临时寄存器 t2 的值分配给 A[f+4] ?
-
由于我们并不真正知道
A的数据类型,所以很难说。。看起来它是4字节宽,如果问题没有错误的话 -
是的,我相信这是正确的,也是我们在本课程中应该做出的假设之一。基本上,我不明白最后一个 lw 命令,我有点不确定程序的整体功能。我知道它对数组执行操作,然后将值存储回内存,但仅此而已。
-
好吧,我对 MIPS 汇编不熟悉,这里只是凭直觉。因此
addi命令将4添加到t0,并将结果存储到t2。下一个lw,我想代表“加载字”,它正在使用t2指向的内存位置的值加载t0,即A[f+1](因为我们已经将f*4增加了另一个4。所以t2=A[f+1].sw是lw的反义词,是把值从寄存器传到内存,从这里开始自己继续。