【问题标题】:Bite/byte addressing in MIPSMIPS 中的位/字节寻址
【发布时间】:2017-09-08 01:34:13
【问题描述】:

你好 Stack Overflow 社区,

我目前正在学习计算机体系结构/组织课程的介绍,我们使用的教科书名为 David Patterson 和 John Hennessey 的计算机组织和设计(第 5 版),他们列出了一个示例如何使用 MIPS 访问数组中的元素。他们列出的例子是这样的:

给定 C 代码赋值:g = h + A[8];将以下内容转换为 MIPS。 其中 g = $s1,h = $s2,并且基本地址 A = $s3。

他们接着说,在 C 代码中表示相同指令的 MIPS 指令如下:

 (1) lw $t0, 8($s3) # Temporary register $t0 gets A[8]
 (2) add $s1,$s2,$t0 # g = h +A[8]

然后在另一页上,作者提到第 (1) 行也可以写成:

(3) lw $t0,32($s3)

我的问题是第 (1) 行和第 (3) 行之间的区别是什么?为什么这很重要?

谢谢!!!

【问题讨论】:

  • 这些例外在哪些页面上?我有同样的版本。这听起来不正确。如果您想要单词数组中的第 8 个单词,则需要将偏移量设为 index*word 大小,即 8*4 = 32。
  • 不知道为什么作者说这两行是等价的,32($s3)从寄存器$s3加载第8个词,而8($s3)只加载第2个词,所以第8个元素在在 32 + 基地址 $s3 即 32($s3) 处访问数组。总之,这两行是等价的
  • 第 69,71 和 72 页
  • 先生。 avenger12,这里没有人有那本书,所以页码不会有太大帮助。您可以编写第 3 行而不是第 1 行并让它执行相同操作的唯一方法是,如果寄存器 $s3 中的地址不同。我的猜测是缺少的:也许$s3 中已经有一个地址,并且已知它比A 的地址少24 个字节,而不是将A 的地址加载到$s3 中只是为了然后加载8($s3),而不是将A的地址加载到$s3中,而是加载32($s3),保存一条指令。这是我的猜测。
  • 所以我突然想到你可能是Ms. avenger12;如果是这样的话,没有任何冒犯的意思。

标签: mips


【解决方案1】:

如果寄存器$s3 中的地址不同,您可以编写第 3 行而不是第 1 行并让它执行相同操作的唯一方法。我的猜测是这就是缺少的:也许$s3 中已经有一个地址,并且已知它比A 的地址少24 个字节,而不是将A 的地址加载到$s3 中只是为了然后加载8($s3),而不是将A的地址加载到$s3中,而是加载32($s3),保存一条指令。这是我的猜测。

【讨论】:

    猜你喜欢
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多