1. ホーム
  2. assembly

[解決済み] MIPSプログラムにおける`lw`と`sw`の実際の働きを理解する。

2022-03-07 20:12:13

質問

を理解するのに少し苦労しています。 swlw は、MIPSのプログラムではどうでしょうか。このトピックに関する私の理解は、私たちは lw はメモリからレジスタにデータを転送し、その逆は sw . しかし、これは具体的にどのように実現されているのでしょうか?

例えば、次のようなコード行があるとしよう。

lw Reg.Dest, Offset(Reg.Source)
sw Reg.Source, Offset(Reg.Dest)

に集中すると lw は、基本的にメモリからデータを保存しています。 Reg.Source とそのデータのアドレスを掛け合わせ、そのデータを Offset レジスタは32$ビット、メモリは8$ビットを扱うので、常に4$の倍数であり、レジスタ内の特定のアドレスに等しくなります。 Offset + Reg.Source - ということで、仮に Offset = 16, Reg.Source = $s1 = 12 とすると、レジスタはメモリからデータをレジスタのアドレス$28$に格納することになります。

を理解したと仮定すると lw が正しいのであれば、私の質問は、どのように sw が働くのでしょうか?

PS: 回答には、次のような一行だけの例も含めていただけると幸いです。 sw $t0, 32($s3) .

解決方法は?

lw (ロードワード) メモリからレジスタにワードをロードします。

lw $2, 4($4) # $2 <- mem($4+4)

2がデスティネーションレジスタ、4がアドレスレジスタです。そして、情報源はメモリです。

4はアドレスレジスタに加算(乗算ではない)されるオフセットです。このようなメモリアクセスはベースドアドレッシングと呼ばれ、多くの場面で有用である。例えば、$4が構造体のアドレスを保持している場合、オフセットによってその構造体の異なるフィールドを選択することができます。オフセットは4の倍数である必要はありませんが、(アドレスレジスタ+オフセット)は4の倍数でなければならず、ほとんどの場合、両方が4の倍数になっています。

Swは似ていますが、レジスタをメモリに格納します。

 sw $5, 8($7) # mem[$7+8] <- $5

ここでも$7がメモリアドレスを保持するレジスタ、8がオフセット、$5がメモリに書き込まれる情報の元となるレジスタです。

他のMIPS命令と異なり、第1オペランドは目的地ではなくソースであることに注意してください。これは、アドレスレジスタが、lwではデータ元のメモリアドレスを計算し、swではデータ先のメモリアドレスを計算するという、両命令で同様の役割を担っていることを強調するためと思われます。