【问题标题】:Conversions to Mips assembly转换为 Mips 程序集
【发布时间】:2015-08-13 02:20:53
【问题描述】:

我在理解如何将指令转换为 MIP 程序集方面遇到了一些问题。问题是。为以下说明编写 MIPS 程序集。假设变量 a – j 分配给临时寄存器 $0 – $8。假设数组 A 和 D 的基地址分别为 $9 和 $10。如果您需要一个寄存器来存储中间结果,您可以使用任何剩余的临时或保存的寄存器或注册 $at(汇编程序临时寄存器)。将汇编代码转换为机器码

D[i]=A[j]

现在,我已经设置成这样了

  1. 0$
  2. 1美元一个
  3. 2$ b
  4. 3$ c
  5. 4 美元
  6. 5 美元
  7. 6$ 克
  8. 7美元我
  9. 8$ j

    1. 9美元一个
    2. 10 美元乙

我很困惑,因为在课堂上,我的老师总是从我们做的 2 个示例的 SLL(逻辑左移)命令开始。我的问题是我们总是这样做吗?我不确定我是否理解 SLL 的实际含义/作用,所以我真的看不出它是否会对这个问题有益。到目前为止,我有第一个指令,这是假设 SLL 是发生的第一件事。我想也许LW会先来。这就是我得到的答案

  1. SLL $11 , $8 , 6 2.加$12、$9、$11
  2. 13.0 美元(12 美元)
  3. 售价 $14,$7,2
  4. 加$15,$14,$10
  5. sw $13,0(15$)

【问题讨论】:

  • 这些数组是以字还是字节为索引的?临时寄存器只有 10 个,不是 11 个,它们是 $8-$15$24-$25,而不是 $0-$8。请把你的问题说清楚一点。

标签: assembly mips pipeline


【解决方案1】:

好吧,您在帖子中提到的一些事情很难理解。

假设您想将D[i] = A[j] << 6 转换为 MIPS 程序集,知道这一点

  • $8 包含 i 索引
  • $9 包含 j 索引
  • $10 包含 A 数组地址
  • $11 包含 D 数组地址
  • $12$13 可以包含我们想要的任何内容,作为临时寄存器

我们从右侧开始,优先级最高的运算符:[]。我们知道A + j 是元素A[j] 的地址,假设j 包含距数组基址的字节偏移量。因此,

add $12, $10, $9  ; $12 = A + j
lw $12, 0($12)    ; $12 = the word at $12 (A[j])

现在我们使用 sll 自己进行转换

sll $12, $12, 6   ; $12 = $12 << 6

$12 填充了计算的右侧,我们需要另一个寄存器来寻址D[i]

add $13, $11, $8  ; $13 = $11 + $8
sw $12, 0($13)    ; stores $12 (right side) to $13 (D[i])

【讨论】:

  • 我很抱歉,但这正是问题的提出方式,哈哈。为什么 8$ 包含 i 而 9$ 包含 j?
  • 我也不知道为什么我的指令会这样横着发出来
  • 我尽可能地修复了帖子
  • 临时寄存器只有10个,命名为$t0$t9。您的代码将无法正常工作,因为它比检索要转移的数据更快地执行转移。为什么你不能使用这个代码?将寄存器更改为其他寄存器只需几秒钟。
  • 请注意,在使用 A[j] 加载之前,您应该将 j 按元素大小(单词为 4)缩放。
猜你喜欢
  • 2021-09-13
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多