4
for (i = 0; i < 64; i++) {
A[i] = B[i] + C[i];
}

上記のCコードのMIPS命令は次のとおりです。

add $t4, $zero, $zero   # I1 i is initialized to 0, $t4 = 0
Loop: 
add $t5, $t4, $t1       # I2 temp reg $t5 = address of b[i]
lw $t6, 0($t5)          # I3 temp reg $t6 = b[i]
add $t5, $t4, $t2       # I4 temp reg $t5 = address of c[i]
lw $t7, 0($t5)          # I5 temp reg $t7 = c[i]
add $t6, $t6, $t7       # I6 temp reg $t6 = b[i] + c[i]
add $t5, $t4, $t0       # I7 temp reg $t5 = address of a[i]
sw $t6, 0($t5)          # I8 a[i] = b[i] + c[i]
addi $t4, $t4, 4         # I9 i = i + 1
slti $t5, $t4, 256       # I10 $t5 = 1 if $t4 < 256, i.e. i < 64
bne $t5, $zero, Loop    # I11 go to Loop if $t4 < 256

I8の場合、 sw命令を命令に置き換えることはできませんaddiか?すなわちaddi $t5, $t6, 0

$t6のアドレスをにコピ​​ーするのと同じタスクを実行しません$t5か?違いと、どちらをいつ使うのか知りたいです。指導についても同じことが言えlwます。

また、関連する質問かもしれませんが、MIPSはポインタをどのように処理しますか?

編集:addi $ t6、$ t5、0を変更しました。

4

4 に答える 4

4

MIPSのsw命令は、定数値(0)でオフセットされた2番目の引数($ t5の値)のアドレスに最初の引数($ t6の値)を格納します。

$ t5アドレスを実際にレジスタに格納しようとしているのではなく、$t6の値を$t5の値で表されるメモリ位置に格納しようとしています。

$t5必要に応じて、の値をCポインターに類似していると見なすことができます。言い換えると、MIPSはポインターと値を異なる方法で処理しません。重要なのは、値を使用する場所だけです。レジスタの値をまたはへの2番目の引数として使用する場合、lwそのswレジスタをポインタとして効果的に使用しています。レジスタの値をまたはへの最初の引数として使用する場合、lwまたはsw他のほとんどの場所で使用する場合は、値を直接操作しています。(もちろん、Cポインター演算の場合と同様に、アドレスを操作して、データをメモリ内の別の場所に格納できるようにすることもできます。)

于 2012-06-13T14:55:16.670 に答える
3

I8の場合、sw命令をadd命令に置き換えることはできませんか?$t5のアドレスを$t0にコピーするのと同じタスクを実行しませんか?違いと、どちらをいつ使うのか知りたいです。

あなたは店の言葉が実際に何をしているのか混乱していると思います。I8では、$t6のレジスタの値が位置0の$t5に格納されています。addは、宛先レジスタに格納されているデータを他の2つのレジスタの値の合計で上書きします。

また、関連する質問かもしれませんが、MIPSはポインタをどのように処理しますか?

「ポインタ」は、(値ではなく)レジスタに格納されているメモリ内のアドレスです。

于 2012-06-13T14:54:19.097 に答える
3

lwそしてswメモリへの読み取り/書き込み。addiおよびその他の算術演算はレジスタを操作します。

レジスタは、CPUがデータを格納するために使用する小さなバケットのようなものです。MIPSアーキテクチャを正しく覚えていれば、5ビット程度でアドレス指定できます。

メモリは、アドレス指定に16ビットをはるかに超えるデータを必要とする膨大な量のデータのようなものです。したがって、実際にはアドレスをレジスタに保存する必要があります。

ポインタは単なるメモリアドレスです(32ビットアーキテクチャでは32ビット)。

于 2012-06-13T14:54:33.837 に答える
3

I8の場合、sw命令をaddi命令に置き換えることはできませんか?つまり、addi $ t6、$ t5、0

いいえ。sw命令は結果をメモリに保存します。addレジスタを操作するだけです。そしてlw、メモリから単語を取得します。これを行うのはMIPS命令だけです。(他のプロセッサには、addそのアクセスメモリのバージョンがある場合とありますが、MIPSにはありません。)

アセンブリ言語で作業するときは、考え方を調整する必要があります。レジスタとメモリは別です。高水準言語では、レジスターは(ほぼ)完全に隠されています。アセンブリでは、レジスタはプログラマが管理する必要のある別個のリソースです。そして、それらは希少な資源です。HLLコンパイラがこれを行いますが、アセンブリでプログラミングすることにより、あなたは自分で仕事を引き受けました。

MIPSはどのようにポインタを処理しますか?

MIPSでは、ポインタは(レジスタまたはメモリ内の)単なる整数であり、たまたまメモリアドレスになります。それらがデータ値と区別される唯一の方法はあなたの脳によるものです。「ポインタ」は、プログラマーの負担を軽減するために高級言語設計者によって発明されたものです。よく見ると、それが$t5実際にポインタを保持していることがわかります。これは、ロード元またはストア先のアドレスとして使用lwされるメモリアドレスです。sw

于 2012-06-13T15:04:24.843 に答える