【发布时间】:2012-05-19 12:50:23
【问题描述】:
我是 MIPS 的新手,很难理解这段代码的含义... 其中 $s6 是数组 A 的开头:
addi $t0,$s6,4
我不确定这是否意味着 $t0 = A[4] -或者- 如果这意味着 $t0 = A[0] + 4,则取 A[0] 中的值并将其添加 4 将其保存回 A[0]
任何帮助将不胜感激。
提前谢谢你!!
【问题讨论】:
我是 MIPS 的新手,很难理解这段代码的含义... 其中 $s6 是数组 A 的开头:
addi $t0,$s6,4
我不确定这是否意味着 $t0 = A[4] -或者- 如果这意味着 $t0 = A[0] + 4,则取 A[0] 中的值并将其添加 4 将其保存回 A[0]
任何帮助将不胜感激。
提前谢谢你!!
【问题讨论】:
行:
addi $t0,$s6,4
其中 $s6 是数组的基数,它取寄存器 $s6 的内容,将它们加 4 并将结果放入 $t0。因此,如果 $s6 中的地址是 0x00400000,那么在 addi 指令之后,$t0 将包含 0x00400004。
addi 指令将一个立即值(即整数值)添加到源寄存器并将结果存储在目标寄存器中,在本例中为 $t0。
所以如果 $s6 是 A[0],那么 $t0 变成 A[1],假设你有一个整数数组。如果你有一个字符数组,即一个字符串,那么 $t0 就变成了 A[3]。 $t0 不保存这些数组索引处的值,它保存了这些数组索引的地址,因为那是 $s6 最初保存的。
【讨论】:
这条指令意味着你将存储在 $s6 中的值加上 4 并将新值存储在 $t0 中。 $s6 中的值保持不变。 $s6 是一个保存的临时寄存器,因此任何时候您需要更改 $s_ 中的值时,都需要先将其保存到堆栈中。您没有更改 $s6 中的值,因此您不需要将其保存到堆栈中。您将它保存到一个临时寄存器中,您不必担心您覆盖了哪些内容。另外 $s6 实际上是 Regester 22 或 $R22 而 $t0 是 $r8....
您基本上是将数组增加一个 32 位字到下一个指令/数据字。
这是对您的评论的回应:
按照惯例,你说 A[0] = 7,你是说寄存器 $s6 的内容所引用的“内存地址”等于 7。$s6 不等于 7,而是它在主内存中指向的内容做。 s6 只保存一个我们解释或知道是地址的数字。我们将 4 添加到 $s6 是因为我们想要添加足够的字节来获取数组的下一个元素。一个字是 32 位是 4 个字节。按照惯例,我们要添加 4,它将以字节为单位到达下一个单词。一个字通常是 32 位或 4 个字节长。将 4 个字节添加到 s6 后,我们不知道结果,因为我们没有被告知 s6 最初是什么,但我们知道 t0 现在本质上指向 s6[1]。我不会说您正在向数组中添加另一个索引。该数组可能已经设置好,或者您可能会读到最后,但我知道 mips 不会给您错误。它只会告诉你在你给它的地址所引用的主内存中的位置是什么。可以是空白、有效、标准或程序数据的其他部分。需要了解更多程序的上下文才能了解更多信息。
【讨论】:
大多数 MIPS 指令是:
instruction $destination, $operands
这个具体的指令,在 $s6 上具有数组 A[] 开头的 内存地址,将 A[] 的第 4 个字节的位置存储在 $t0 上。
据我了解,在 $s6 中,您的内存地址为 A[0],而不是值 A[0]
也就是说,如果$s6 = @A[0]是地址值0x00,那么$t0 = $s6+4的值是0x04
根据数组 A[] 的类型(短、整数、长),这可能意味着您在 $t0 中指向数组的不同位置。
在 4 字节长整数数组的正常情况下,$t0 现在指向 A[1]
【讨论】: