4
for (i = 0; i < 64; i++) {
A[i] = B[i] + C[i];
}

上述 C 代码的 MIPS 指令为:

add $t4, $zero, $zero   # I1 i is initialized to 0, $t4 = 0
Loop: 
add $t5, $t4, $t1       # I2 temp reg $t5 = address of b[i]
lw $t6, 0($t5)          # I3 temp reg $t6 = b[i]
add $t5, $t4, $t2       # I4 temp reg $t5 = address of c[i]
lw $t7, 0($t5)          # I5 temp reg $t7 = c[i]
add $t6, $t6, $t7       # I6 temp reg $t6 = b[i] + c[i]
add $t5, $t4, $t0       # I7 temp reg $t5 = address of a[i]
sw $t6, 0($t5)          # I8 a[i] = b[i] + c[i]
addi $t4, $t4, 4         # I9 i = i + 1
slti $t5, $t4, 256       # I10 $t5 = 1 if $t4 < 256, i.e. i < 64
bne $t5, $zero, Loop    # I11 go to Loop if $t4 < 256

对于I8,不能用 sw指令代替addi指令吗?IEaddi $t5, $t6, 0

它不会完成复制$t6into的地址的相同任务$t5吗?我想知道区别以及何时使用它们中的任何一个。关于lw指令也可以这样说。

另外,也许是一个相关的问题,MIPS 如何处理指针?

编辑:更改了 addi $t6, $t5, 0。

4

4 回答 4

4

MIPS 中的sw指令将第一个参数($t6 中的值)存储到第二个参数($t5 中的值)中偏移常量值 (0) 的地址。

您实际上并没有尝试将 $t5 地址存储到寄存器中,而是将 $t6 中的值存储到由 $t5 的值表示的内存位置中。

如果你愿意,你可以认为 in 的值$t5类似于 C 指针。换句话说,MIPS 不会以不同的方式处理指针和值——重要的是你在哪里使用这些值。如果您使用寄存器的值作为lwor的第二个参数sw,那么您实际上是将该寄存器用作指针。如果您使用寄存器的值作为 or 的第一个参数,lw或者sw在大多数其他地方,您将直接对该值进行操作。(当然,就像在 C 指针算术中一样,您可以操作一个地址,以便将一条数据存储在内存中的其他位置。)

于 2012-06-13T14:55:16.670 回答
3

对于I8,sw指令不能用add指令代替吗?将$t5 的地址复制到$t0 中,它不会实现相同的任务吗?我想知道区别以及何时使用它们中的任何一个。

我认为您对 store 单词的实际作用感到困惑。在 I8 中,$t6 中寄存器的值被存储到 $t5 的零位置。加法将用其他两个寄存器值的总和覆盖存储在目标寄存器中的任何数据。

另外,也许是一个相关的问题,MIPS 如何处理指针?

“指针”只是存储在寄存器中的内存地址(与值相反)。

于 2012-06-13T14:54:19.097 回答
3

lwsw读/写内存。addi和其他算术运算对寄存器进行操作。

寄存器就像 CPU 用来存储数据的小桶。如果我没记错我的 MIPS 架构,它们可以用 5 位左右来寻址。

内存就像浩瀚的数据海洋,需要超过 16 位才能寻址。因此,您实际上必须将地址存储在寄存器中。

指针只是内存地址(32 位架构上的 32 位)。

于 2012-06-13T14:54:33.837 回答
3

对于I8,sw指令不能用addi指令代替吗?即addi $t6, $t5, 0

不会。sw指令将结果存储到内存中。add只是操纵寄存器。并lw从记忆中得到一个词。这是唯一这样做的 MIPS 指令。(其他处理器可能并且确实具有add该存取存储器的版本,但没有 MIPS。)

使用汇编语言工作时,有必要调整您的思维。寄存器和内存是分开的。在高级语言中,寄存器(几乎)完全隐藏。在汇编中,寄存器是程序员必须管理的独立资源。而且它们是稀缺资源。HLL 编译器会为您执行此操作,但通过汇编编程,您已经完成了这项工作。

MIPS 如何处理指针?

在 MIPS 中,指针只是恰好是内存地址的整数(在寄存器或内存中)。将它们与数据值区分开来的唯一方法是通过您的大脑。“指针”是高级语言设计者为减轻程序员的负担而发明的。如果您仔细观察,您会发现它$t5实际上包含一个指针。它是一个内存地址,被lw用作sw加载或存储的地址。

于 2012-06-13T15:04:24.843 回答