我是 MIPS 的新手,很难弄清楚这段代码的含义......其中 $s6 是数组 A 的开头:
addi $t0,$s6,4
我不确定这是否意味着 $t0 = A[4] -或者- 如果它意味着 $t0 = A[0] + 4,则取 A[0] 中的值并将其添加 4 将其保存回 A[ 0]
任何帮助将非常感激。
先感谢您!!
该指令意味着您将存储在 $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 不会给您错误。它只会告诉你在你给它的地址所引用的主内存中的位置是什么。可以是空白、有效、stail 或您的程序数据的其他部分。需要了解更多程序的上下文才能了解更多信息。
该行:
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 最初保存的。
大多数 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]