【问题标题】:MIPS. C language to MIPS assembly language codeMIPS。 C 语言转 MIPS 汇编语言代码
【发布时间】: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。除非我在这里遗漏了一些东西

标签: c assembly mips


【解决方案1】:

第二行,不是逻辑左移吗?那么为什么在这里这样使用它,做操作 $s= B[4] * 4 而不是加 2?

执行逻辑左移 2 位将值乘以 4。虽然这里没有足够的上下文让我可以肯定地说,但很可能这是必要的,因为 A 是一个 32 位数组值,每个为 4 个字节。因此,B[4] 必须乘以 4 才能将其从索引转换为 A 内的偏移量。

第四行,0($s0)... 意思是我们得到索引 0?为什么?

因为此时$s0就是A[B[4]]的地址——用C语言来说就是指针&A[B[4]]。从该地址加载偏移量为 0 的字会取消对指针的引用。

您使用的示例代码似乎缺少+ 2。应该可以通过修改您所拥有的一条指令来添加它;我会让你弄清楚是什么。

【讨论】:

    最近更新 更多