[解決済み] 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ではデータ先のメモリアドレスを計算するという、両命令で同様の役割を担っていることを強調するためと思われます。
関連
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】バイナリーボム - フェーズ4
-
[解決済み】単純なforループのためのMIPSアセンブリ
-
[解決済み] Lc3分割のしくみ
-
[解決済み] エラーです。操作サイズが指定されていません - NASm
-
[解決済み] アセンブリで値をnullに設定する
-
[解決済み] Binary Bomb Phase_6 Node Order?
-
[解決済み] x86-64におけるmovqとmovabsqの違いについて
-
[解決済み] MIPS分岐実行順序(beqz)
-
[解決済み] error: invalid effective address エラー:有効なアドレスがありません。
-
[解決済み] ワードptrとは何ですか?