web-dev-qa-db-ja.com

MIPSアセンブリ言語-一時レジスタと保存済みレジスタ

これまで、レジスタ$ s0- $ s9を使用しており、レジスタ$ t0- $ t9と同じ方法で使用しています。ここで、そしてグーグルで違いを説明する無数のフォーラム投稿とパラグラフを読んだことがありますが、コーディング例はありません。プロシージャの使用に関連する違いを確認する必要があると言われていますが、保存されたレジスタと一時レジスタの違いを見つけるための手順を含む無数のシナリオを作成しましたが、失敗しました。

$ t0-9レジスタが$ s0-9レジスタと同じように機能せず、結果として異なる値を生成する比較的単純な例を見てみたい

23
shawn a

一時変数と保存された変数の動作には違いはありません。違いは、それらがどのように使用されるか、むしろ、どのように使用されるべきかにあります。

MIPS呼び出し規約は、さまざまなレジスタの使用方法を指定します-$vレジスタは関数の戻り値用、$aレジスタは関数の引数用、$t変数は一時的caller savedレジスタ、$sレジスタはcallee savedです。

保存される呼び出し先と呼び出し元の違いは次のとおりです。関数を呼び出すとき、慣例では$sレジスタについてはこれを保証しませんが、戻り後は$tレジスタが同じであることを保証します。もちろん、これは、ルーチンで$sレジスタを使用する場合、その値を保存および復元する必要があることを意味します。たとえば、関数Aがレジスタ$t0および$s0を使用してから関数Bを呼び出す場合、関数Bが戻った後に使用する場合は、レジスタ$t0を保存する必要があります。関数Bは、使用を開始する前に$s0を保存する必要があります。

例:

main:

    li $s0 7
    li $t0 7

    jal myFunction

    #$s0 guaranteed to equal 7
    #$t0 value not guaranteed

このリンク いくつかのより詳細な情報のように見えます。

もちろん、これはすべて慣習にすぎないため、関数呼び出しによって上書きされないように、あなたと他のプログラムが$sレジスタを保存および復元することによって規約を尊重する場合にのみ機能します。

46