lw $s0,8($0)
はlw $s0,0($v0)
と同じですか?
違いはわかりません。 8はオフセットを表していると思います。つまり、$ 0のアドレスが必要であり、アドレスに2(8/4)を追加します。
編集:
私の質問は、lw命令とMIPSレジスタセットについてです。オフセットが正確にどのように機能するかを理解するのはかなり難しいです...
それらは同じではありませんが、状況によっては同じように動作します。 lw
命令の形式は次のとおりです。
_lw RegDest, Offset(RegSource)
_
ここで、RegDestとRegSourceはMIPSレジスタであり、Offsetは即時です。
これは、レジスタRegSourceの内容と指定されたオフセットを追加した結果のアドレスに含まれるワードをレジスタRegDestにロードすることを意味します。結果の送信元アドレスはワードアラインされている必要があります(つまり、4の倍数)
したがって、lw $s0,8($0)
は、_$s0
_プラス8で指定されたアドレスにあるWordの内容を_$0
_にロードすることを意味します。_$0
_はレジスタ_$zero
_であり常に定数ゼロが含まれ、絶対アドレス8にあるワードが_$s0
_にロードされます。
lw $s0,0($v0)
は、_$s0
_で指定されたアドレスにあるWordの内容を_$v0
_にロードすることを意味します。 _$v0
_に値8が含まれている場合、両方の命令は同じ効果を持ちます。 _$v0
_が4の倍数でない場合、命令はアドレス指定トラップを生成します。
通常、lw
は、アセンブラが命令を実行するために複数の命令を発行する可能性があるという意味で、疑似命令です。オフセット(変位)は16ビットの符号付き値である必要があります。命令にさらにビットのあるイミディエートがある場合、アセンブラは通常、一時レジスタ(_$at
_)を使用してイミディエートの内容を保持し、同等の命令を発行して目的の動作を実行します。逆アセンブラまたはMIPSモニターを使用してこれが実際に動作していることを確認できます(MARSシミュレーターでコードを検査することもできます)。