MIPS从寄存器获取内存地址

时间:2012-04-21 18:18:31

标签: assembly mips

想象一下,我在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

的地址

1 个答案:

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