MIPS。 C语言到MIPS汇编语言代码

时间:2014-06-25 21:13:23

标签: c assembly mips

假设变量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]]。 如果这个问题太多,我很抱歉,但我还是不明白。

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]]。通过修改一条指令就可以添加它;我会留给你弄清楚是什么。