什么是指针?
指针是指向内存位置的东西。我们使用指针将值放入内存位置。例如在 C 中:
int max;
int *ptr = &max;
*ptr = 22; // max = 22
在上面的例子中,ptr 指向一个内存位置 (max),我们通过取消引用来更改 max 到 ptr 的值。
如何在 MIPS 中正确使用它们?
要理解这一点,您需要了解指令语法以及每条指令采用的操作数。显然,我们无法在一个答案中完成所有说明,所以我将向您展示一些,以便您了解:
lw register, memory_location
sw register, memory_location
la register, memory_location
lw $t0, first
lw $t0, ($t5) # this is like, int t0 = *t5
-
sw 将 register 中的值存储到 内存位置。示例:
sw $t0, max # max = t1
sw $t0, ($t5) # *t5 = t0
la $t5, max # int *t5 = &max
现在让我们看看代码中的错误。这里:
lw $t5, max
上面会将max 的值加载到$t5。好像您创建了max 来存储最大值。在这里加载它似乎毫无意义,因为它甚至不包含任何内容。您想使用la 加载它的地址:
la $t5, max #load address of max variable into $t5
继续我们看到这条指令:
sw $t5, $t0
这不会组装。这将导致错误。 sw 将第一个操作数(源)作为寄存器,第二个操作数是“内存位置”,而不是寄存器。
sw register, memory_location
所以,如果你想存储一些东西,你会这样做:
sw $t5, ($t0) #store value inside $t5 at the 'address' inside $t0.
# Assume:
# $t5 = 23
# $t0 = 0x5555
# After executing this instruction, memory location 0x5555 would have value 23 in it
这只是解释。在上面的代码中,您分配了$t0 = first。它甚至没有指向内存位置!但是,如果您执行la $t5, max,$t5 将有一个内存位置。
所以,我假设你想这样做:
sw $t0, ($t5)
# After executing this, 'max' == $t0 because $t5 is pointing at max.
继续前进,我们看到了:
bgt $t0, $t5, swapmax
您一定已经猜到了,这是不正确的。原因:您正在将“地址”与值进行比较。 “地址”在 $t5 中,“值”在 $t0 中。如果要获取 $t5 中的值,则必须先加载它。也许使用另一个寄存器:
lw $t3, ($t5)
#OR
lw $t3, max # same thing, $t5 is pointing at 'max'
这些都是明显的错误。可能存在逻辑错误,但这是您的代码和程序,所以我会留给您根据需要修改您的逻辑