1

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

第二个问题

由于 in 中的参数sum(n1,n2,n3,n4,n5);存储在内存和程序集中的某个位置,因此第一个参数是$4如何获取$4to的内存地址$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)

on 的值$9仍然是 1 而不是地址$4

4

1 回答 1

3

第一个问题

要回答这个问题,您需要了解通常如何处理参数传递。参数传递有一些约定。前四个参数始终通过寄存器 $4 到 $7传递,其余参数通过堆栈传递。如果堆栈中的前四个参数已经由寄存器传递,那么传递堆栈上的前四个参数是没有意义的,对吧?所以它只会将前四个之后剩下的东西推入堆栈。

第二个问题

寄存器和内存是有区别的。CPU 寄存器没有映射到任何内存地址。它们是与 RAM、ROM 等其他部分分开的特殊内存“片段”。它们比 RAM 或 ROM 中的内存快得多,因此有 MIPS 指令直接在它们上操作,而不是间接操作通过内存地址。

仔细想想你在做什么:

main:
    li  $4,1
    la  $9,0($4)

第一条指令在做什么?它将值 1 加载到寄存器 4 中。

第二条指令在做什么?它将寄存器 4 中的视为标签(或地址),将其加 0,并将结果存储在寄存器 9 中。所以当然寄存器 9 最终的值为 1。

在 MIPS 和几乎所有架构中,没有寻址寄存器的概念。您直接对它们进行操作。

编辑: 我应该区分处理器寄存器硬件寄存器。当然,我指的是处理器寄存器。硬件寄存器(在 CPU 之外)是一个稍微不同的概念,它们明确地可寻址的。但是,我认为这超出了 Favolas 所要求的范围。

于 2012-04-21T18:46:55.143 回答