【发布时间】: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