【问题标题】:Understanding MIPS Assembly Code Segment了解 MIPS 汇编代码段
【发布时间】: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的反义词,是把值从寄存器传到内存,从这里开始自己继续。

标签: c arrays assembly mips


【解决方案1】:

自从我上次编写 MIPS 程序集以来已经有一段时间了。但是,从前几条指令中我可以理解:

sll $t0, $s0, 2     # t0 = 4 * f
add $t0, $s6, $t0   # t0 = &A[f]

s0 保存要访问数组A 的索引f。由于您将 f 乘以 4,因此 A 是一个具有 4 字节长度(可能是 int)的某种数据类型的数组。 s6 持有数组地址,因为要访问 A[f] 的地址,您基本上会这样做(在伪代码中)

address_of_A[f] = base_address_of(A) + offset_of_type_int(f)

在接下来的两条指令中原则上会发生相同的事情,但这次是针对数组B。之后:

lw $s0, 0($t0)      # f = A[f]
addi $t2, $t0, 4    # t2 = t0 + 4 

第一次加载很明显,s0得到地址t0的值,当然是A[f]。第二个将t0 增加4 并将其存储到t2,这意味着t2 现在包含地址&A[f+1],因为我们知道数组A 包含4 字节数据。

最后一个lw 命令:

lw $t0, 0($t2)

将值存储在$t0 上的地址$t2,所以$t0 现在是A[f+1]。

【讨论】:

    猜你喜欢
    • 2017-12-20
    • 2013-06-04
    • 2018-10-22
    • 1970-01-01
    • 2014-08-16
    • 2017-08-18
    • 2014-09-01
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多