1. ホーム
  2. assembly

[解決済み] MIPS:lw(ロードワード)命令

2022-03-04 02:08:46

質問

lw $s0,8($0) と同じです。 lw $s0,0($v0) ?

違いがわかりません。8はオフセットを表していると思います。つまり、$0のアドレスが必要で、そのアドレスに2(8/4)を足すということです。

EDITです。

lw命令とMIPSのレジスタセットについて質問です。オフセットが正確にどのように機能するのかを理解するのはかなり難しいです...。

どのように解決するのですか?

状況によっては同じような動作をすることもありますが、同じではありません。 の書式は lw 命令は次のようになります。

lw RegDest, Offset(RegSource)

ここで RegDest と RegSource は MIPS レジスタで、Offset は即値です。

これは、レジスタRegSourceの内容と指定されたOffsetを加算した結果のアドレスに含まれるワードをレジスタRegDestにロードすることを意味します。結果のソース・アドレスは、ワード・アラインド(すなわち4の倍数)でなければなりません。

したがって lw $s0,8($0) で読み込むことを意味します。 $s0 で指定されたアドレスにあるワードの内容です。 $0 に8を加えたものです。として $0 はレジスタ $zero は常に定数0を含むので、絶対アドレス8に位置するワードを $s0 .

lw $s0,0($v0) で読み込むことを意味します。 $s0 で指定されたアドレスにあるワードの内容です。 $v0 . もし $v0 が値8を含んでいる場合、どちらの命令も同じ効果を持ちます。もし $v0 が4の倍数でない場合、この命令はアドレッシングトラップを発生させます。

通常 lw は、アセンブラがその命令を実現するために複数の命令を出す可能性があるという意味で、擬似命令です。オフセット(変位)は、16ビットの符号付き値でなければなりません。 もし命令がより多くのビットを持つ即値を持つ場合、アセンブラは通常、一時的なレジスタ( $at ) に即値の内容を保持させ、それと同等の命令を出して目的の動作をさせる。ディスアセンブラやMIPSモニタ(MARSシミュレータでのコード検査も可能)を使って、この動作を確認することができます。