[解決済み] MIPS: スタックポインタ($sp)とスタックの関連した使用法
2022-02-04 16:39:03
質問
現在、コンピュータ組織の中間試験に向けて勉強していますが、スタックポインタとスタックを完全に理解しようとしています。私はこの概念にまつわる次のような事実を知っています。
- 先入れ先出しの原則に従う
-
そして、スタックに何かを追加するには、2段階のプロセスが必要です。
addi $sp, $sp, -4 sw $s0, 0($sp)
私が思うに、私が完全に理解するのを止めているのは、スタックポインタでデータを追跡する必要がある、またはしたい、関連する自明な状況を思いつくことができないからです。
どなたか、全体的なコンセプトを詳しく説明し、有用なコード例を教えていただけませんか?
解決するには?
スタックの重要な使い方は、サブルーチン呼び出しのネストです。
各サブルーチンは、そのサブルーチンのローカル変数のセットを持つことができます。これらの変数は、スタック上の スタックフレーム . 呼び出しの規則によっては、スタック上で引数を渡すものもあります。
サブルーチンを使うということは、呼び出し元、つまりリターンアドレスを追跡する必要があるということでもあります。 この目的のために専用のスタックを持つアーキテクチャもあれば、暗黙のうちに通常のスタックを使用するアーキテクチャもあります。MIPSではデフォルトでレジスタのみを使用しますが、非リーフ関数(つまり他の関数を呼び出す関数)では、リターンアドレスは上書きされます。したがって、元の値をローカル変数の間のスタックに保存する必要があります。呼び出しの規約で、あるレジスタの値を関数呼び出しの間保存しなければならないことが宣言されている場合もありますから、同様にスタックを使って保存したり復元したりすることができます。
次のようなC言語の断片があるとします。
extern void foo();
extern int bar();
int baz()
{
int x = bar();
foo();
return x;
}
MIPSのアセンブリは、次のようになります。
addiu $sp, $sp, -8 # allocate 2 words on the stack
sw $ra, 4($sp) # save $ra in the upper one
jal bar # this overwrites $ra
sw $v0, ($sp) # save returned value (x)
jal foo # this overwrites $ra and possibly $v0
lw $v0, ($sp) # reload x so we can return it
lw $ra, 4($sp) # reload $ra so we can return to caller
addiu $sp, $sp, 8 # restore $sp, freeing the allocated space
jr $ra # return
関連
-
[解決済み】アセンブリJLEのjmp命令例
-
[解決済み] x86 - C言語のsscanf関数
-
[解決済み] アセンブリ - CMP後のJG/JNLE/JL/JNGE
-
[解決済み] MIPS分岐実行順序(beqz)
-
[解決済み] cmovlオペコードの中で何と何が比較されるのですか?
-
[解決済み] movsbl 命令は何をするのですか?重複
-
[解決済み] エラー: `push' の命令サフィックスが無効です [重複].
-
[解決済み] テストのポイント %eax %eax [重複]。
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み】ベースポインタとスタックポインタとは一体何でしょうか?これらは何を指しているのでしょうか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】単純なforループのためのMIPSアセンブリ
-
[解決済み】x86アセンブリ。AT&Tの構文で「subl」コマンドはどのように動作するのか
-
[解決済み] エラーです。操作サイズが指定されていません - NASm
-
[解決済み] アセンブリ - CMP後のJG/JNLE/JL/JNGE
-
[解決済み] ビットシフト演算子を使って10進数を2進数で表示するMIPS
-
[解決済み] アセンブリMIPS。配列の初期化および合計
-
[解決済み] SRLとSRAの違いは何ですか?[重複しています]。
-
[解決済み] アセンブリMIPS .ALIGNとメモリアドレスの理解
-
[解決済み] LC3 LEA 命令と格納された値
-
[解決済み] この状況でのlwとbneは何を意味するのか?