想象一下,我在C中有一个有5个参数的函数。
sum(n1,n2,n3,n4,n5);
在集会中。我从寄存器4到7得到前四个参数,最后一个参数加入如下:
lw $8, 16($29)
第一个问题
如果lw $8, 16($29)
将n5放入寄存器$ 8,为什么不这样呢
lw $9, 0($29)
lw $10, 4($29)
lw $11, 8($29)
lw $12, 12($29)
将n1到n4放在$ 9到$ 12的寄存器中?
第二个问题
由于sum(n1,n2,n3,n4,n5);
中的参数存储在内存和汇编中,第一个参数位于$4
我如何获得$4
到$7
的内存地址?
如果我这样做:
.data
array: .word 3,4,2,6,12,7,18,26,2,14,19,7,8,12,13
.text
main:
li $8,1
la $9,array
最后一条指令将我的数组的地址位置放在$9
中。如果我做
main:
li $4,1
la $9,0($4)
$9
上的值仍为1,而不是$4
答案 0 :(得分:3)
第一个问题
要回答这个问题,您需要了解如何处理参数传递。参数传递有conventions。前四个参数总是通过寄存器$ 4到$ 7传递,剩余的参数通过堆栈传递。如果已经通过寄存器传递堆栈中的前四个参数是没有意义的,对吧?因此它只会将前四个之后剩下的东西推到堆栈。
第二个问题
registers和记忆之间存在区别。 CPU寄存器未映射到任何存储器地址。它们是内存的特殊“部分”,与RAM,ROM等的其余部分分开。它们比RAM中的内存快得多或ROM,因此有MIPS指令直接在上运行,而不是通过内存地址间接运行。
想想你到底在做什么:
main:
li $4,1
la $9,0($4)
第一条指令在做什么?它将值1加载到寄存器4中。
第二条指令在做什么?它将寄存器4中的值视为标签(或地址),向其添加0,并将结果存储在寄存器9中。因此,寄存器9的最终值为1
在MIPS和几乎所有架构中,没有寻址寄存器的概念。您直接在上操作。
编辑:我应该区分processor registers和hardware registers。当然,我指的是处理器寄存器。硬件寄存器(在CPU之外)是一个略有不同的概念,它们明确 可寻址。但是,我认为这超出了Favolas所要求的范围。