【发布时间】:2014-08-16 14:34:10
【问题描述】:
假设变量 f、g、h、i 和 j 的值分别存储在寄存器 $s0、$s1、$s2、$s3 和 $s4 中。此外,整数数组 A 和 B 的基地址分别在寄存器 $s6 和 $s7 中。
为以下 C 语言语句编写 MIPS 汇编语言代码: f = g - A[B[4] + 2]
lw $s0, 16($s7) #$s0 = B[4]
sll $s0, $s0, 2 #$s0 = B[4] * 4
add $s0, $s6, $s0 #$s0 = A + B[4] * 4
lw $s0, 0($s0) #$s0 = A[B[4]]
sub $s0, $s1, $s0 #f = g – A[B[4]]
我在网上找到了上面的例子,但我不明白它是如何工作的。 第二行,不是逻辑左移吗?那么为什么在这里这样使用它,做操作 $s= B[4] * 4 而不是加 2? 第三行,为什么要添加而不是做第一行之类的事情? 第四行,0($s0)... 意思是我们得到索引 0?为什么?
我有 f = h + B[g] 和 f = g + A[h + B[1]]。 如果这个问题太多了,我很抱歉,但我就是不明白。
【问题讨论】:
-
我也觉得这种转变令人费解。没关系,第三个有效,因为你有基地址。 $s0 具有偏移量,因此仍然需要将两者相加。这只是获取地址,所以第四行实际加载它。
-
f = g – A[B[4]]似乎与f = g - A[B[4] + 2]不匹配... -
我同意,我认为应该是 add 而不是 sll。除非我在这里遗漏了一些东西