2012-04-21 245 views
1

想象一下,我有一个C中有5个参数的函数。MIPS从寄存器获取内存地址

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

有关MIPS调用约定的更多信息,请参阅http://stackoverflow.com/q/10214334/583570。 – markgz 2012-04-23 18:15:44

回答

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 registershardware registers。当然,我指的是处理器寄存器。硬件寄存器(在CPU之外)是一个略有不同的概念,他们明确地寻址。但是,我认为这超出了法沃拉斯所要求的范围。

+0

非常感谢您的有益解释 – Favolas 2012-04-21 19:50:39