假设变量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]]。 如果这个问题太多,我很抱歉,但我还是不明白。
答案 0 :(得分:3)
第二行,它不是逻辑左移?那么为什么在这里使用这样的操作,操作$ s = B [4] * 4而不是添加2?
执行左移2位的逻辑移位将值乘以4.虽然这里没有足够的上下文供我确定,但最有可能的是,这是必要的,因为{{1} }是一个32位值的数组,每个值为4个字节。因此,A
必须乘以4才能将其从索引转换为B[4]
内的偏移量。
第四行,0($ s0)...意味着我们得到索引0?为什么呢?
因为此时A
是$s0
的地址 - 在C术语中,它是指针A[B[4]]
。将该字加载到该地址的偏移量0处取消引用指针。
您使用的示例代码似乎缺少&A[B[4]]
。通过修改一条指令就可以添加它;我会留给你弄清楚是什么。