【问题标题】:MIPS addi instruction to array baseMIPS addi 指令到数组基础
【发布时间】: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]

任何帮助将不胜感激。

提前谢谢你!!

【问题讨论】:

标签: arrays add mips


【解决方案1】:

行:

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 最初保存的。

【讨论】:

    【解决方案2】:

    这条指令意味着你将存储在 $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 不会给您错误。它只会告诉你在你给它的地址所引用的主内存中的位置是什么。可以是空白、有效、标准或程序数据的其他部分。需要了解更多程序的上下文才能了解更多信息。

    【讨论】:

    • 谢谢。你让我坚持到最后一句话。所以我很清楚,假设 A[0] = 7 addi $t0, $s6, 4 意味着 $t0 = 11 A[0] 的值将保持不变,为 7 我不会在数组右侧添加另一个索引?
    【解决方案3】:

    大多数 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]

    【讨论】:

    • sw(存储字)和 lw(加载字)不遵循您所说的约定。 SW R1 R2 将获取 r1 中的值并将其存储在 r2 中引用的主存储器(ram)地址中。 lw r1 r2 获取由 r2 引用的主存储器的内容并将其存储在 r1 中。
    • @aaronburns 你是对的,只是编辑它以免引起混淆。谢谢
    • 我相信我现在理解得更多了......我误以为我正在以特定索引添加到数组的内容中。在将 4 添加到数组的基本索引的情况下,我将前进到数组中的下一个单词或索引。感谢大家的耐心和时间来引导我完成这一切!非常感谢。
    猜你喜欢
    • 2017-10-30
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多