1

5つのパラメーターを持つCの関数があると想像してください。

sum(n1,n2,n3,n4,n5);

組み立て中。レジスター4から7から最初の4つのパラメーターを取得し、最後のパラメーターは次のようにアクセスされます。

 lw $8, 16($29)

最初の質問

n5をレジスター$8に入れる場合lw $8, 16($29)、なぜこれを行わないのですか?

lw      $9, 0($29)
lw      $10, 4($29)
lw      $11, 8($29)
lw      $12, 12($29)

n1からn4をレジスタ$9から$12に入れますか?

2番目の質問

のパラメータは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

4

1 に答える 1

3

最初の質問

これに答えるには、パラメーターの受け渡しが一般的にどのように処理されるかを理解する必要があります。パラメータの受け渡しには規則があります。最初の 4 つのパラメーターは常にレジスター $4 から $7 を介して渡され、残りのパラメーターはスタックを介して渡されます。最初の 4 つのパラメーターが既にレジスターによって渡されている場合、スタックに渡しても意味がありませんよね? したがって、最初の 4 つの後に残っているものだけがスタックにプッシュされます。

2 番目の質問

レジスタとメモリには違いがあります。CPU レジスタは、どのメモリ アドレスにもマップされません。これらは、RAM や ROM などの残りの部分から分離された特別なメモリの「断片」です。RAM や ROM のメモリよりもはるかに高速であるため、間接的ではなく、直接操作する MIPS 命令があります。メモリアドレスを介して。

あなたがしていることを正確に考えてください:

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

最初の命令は何をしているのですか?値 1 をレジスタ 4 にロードしています。

2 番目の命令は何をしているのですか? レジスタ 4内の値をラベル (またはアドレス) として扱い、それに 0 を追加し、その結果をレジスタ 9 に格納します。もちろん、レジスタ 9 の値は 1 になります。

MIPS およびほぼすべてのアーキテクチャでは、レジスタをアドレス指定するという概念はありません。それらを直接操作します。

編集:プロセッサ レジスタハードウェア レジスタを区別する必要があります。もちろん、私はプロセッサレジスタについて言及しています。ハードウェア レジスタ (CPU の外部) は少し異なる概念であり、明示的アドレス指定できます。しかし、それはFavolasが求めている範囲を超えていると思います.

于 2012-04-21T18:46:55.143 に答える