[解決済み] MIPSプログラムにおける`lw`と`sw`の実際の働きを理解する。
質問
を理解するのに少し苦労しています。
sw
と
lw
は、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ではデータ先のメモリアドレスを計算するという、両命令で同様の役割を担っていることを強調するためと思われます。
関連
-
[解決済み] popまたはadd esp、4 ? その差は何ですか?
-
[解決済み] ミップスアセンブリの文字列の長さ
-
[解決済み] BL命令ARM - その仕組み
-
[解決済み] ループ内で配列の個々の要素にアクセスするにはどうしたらよいですか?
-
[解決済み] アセンブリMIPS .ALIGNとメモリアドレスの理解
-
ファイルまたはアセンブリを読み込めませんでした ... 不正なフォーマットでプログラムをロードしようとしました。
-
[解決済み] objdumpの出力にあるdata16とはどういう意味ですか?
-
[解決済み] アセンブリ言語 jeジャンプ機能
-
[解決済み] ワードptrとは何ですか?
-
[解決済み] LC3 LEA 命令と格納された値
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン