1. ホーム
  2. assembly

[解決済み] 着信側セーブレジスタ、発信側セーブレジスタとは何ですか?

2022-02-02 01:19:18

質問内容

呼び出し側と呼び出し側のセーブレジスタの違いと、いつ何を使えばいいのかがわからず困っています。

私はMSP430を使用しています。 :

の手順で行います。

mov.w #0,R7 
mov.w #0,R6 
add.w R6,R7 
inc.w R6 
cmp.w R12,R6 
jl l$loop 
mov.w R7,R12
ret

上記のコードはcalleeであり、教科書の例で使用されたものなので、慣習に従ったものです。R6とR7はcallee savedで、R12はcaller savedです。私の理解では、callee savedのREGは、プロシージャの中で値を変えてもプロシージャの外の値には影響しないという意味で、quot;global"ではないのだと思います。このため、最初に新しい値をcalleeのregに保存する必要があります。

R12、保存された呼び出し元は、言葉は悪いですが、"global"です。プロシージャが行うことは、呼び出し後のR12に永続的な影響を及ぼします。

私の理解は正しいのでしょうか?他に見落としていることはありますか?

どのように解決するのですか?

<ブロッククオート

呼び出し側で保存されるレジスタ (別名 揮発性 を登録するか、または コールクローバ ) は、一時的に保持する必要のある量を保持するために使用されます。 は呼び出しをまたいで保存されることはありません。

そのため、これらのレジスタをスタックにプッシュするか、どこか別の場所にコピーするのは呼び出し側の責任となります もし この値をプロシージャ呼び出し後に復元したい。

を持たせるのは普通です。 call は、これらのレジスタの一時的な値を破壊しますが。

コールセーブレジスタ (別名 不揮発性 レジスター、または コールプリザーブド ) は、長寿命の値を保持するために使用されます。 呼び出しにまたがって保存される。

呼び出し側がプロシージャを呼び出すとき、呼び出し側が戻った後もこれらのレジスタが同じ値を保持することを期待できます。したがって、呼び出し側の責任として、呼び出し側に戻る前にレジスタを保存して復元する必要があります。 あるいは、触らないことです。