8 個のブロックであると考えることができるレジスターがたくさんあります。いつでも、8 個のレジスターの 3 つの連続したブロックが現在のレジスター ウィンドウとして表示され、%o0
- %o7
、%l0
- %l7
、および
%i0
-のラベルが付けられ%i7
ます。(8 つのレジスタからなる 4 番目のブロック%g0
-%g7
があり、これらはウィンドウ配置の一部ではなくグローバルです。)
save
またはの場合restore
、ウィンドウは 8 の2ブロックずつ移動します。オーバーラップ ブロックにより、パラメーターと結果の受け渡しが可能になります。呼び出し元で名前が付けられているレジスタは、呼び出し先%o0
で%o7
名前が付けられているものと同じです
。(呼び出し先の 2 つの新しいブロックは、そのウィンドウ内でローカルに使用するためのプライベートな-と、呼び出し先が別の関数を呼び出したいときに使用できる - です。)%i0
%i7
%l0
%l7
%o0
%o7
それは絵でより明確です:
: :
+----------------------+
| Block of 8 registers | caller's window
+----------------------+ +----------------------+
| Block of 8 registers | | %i0 - %i7 | ---------.
+----------------------+ +----------------------+ | save
| Block of 8 registers | | %l0 - %l7 | v
+----------------------+ +----------------------+ +----------------------+
| Block of 8 registers | | %o0 - %o7 | | %i0 - %i7 |
+----------------------+ +----------------------+ +----------------------+
| Block of 8 registers | ^ | %l0 - %l7 |
+----------------------+ restore | +----------------------+
| Block of 8 registers | `--------- | %o0 - %o7 |
+----------------------+ +----------------------+
| Block of 8 registers | callee's window
+----------------------+
: :
呼び出し元はnum
引数を%o0
(ウィンドウ内に) 配置し、呼び出します。save
新しいウィンドウを設定すると、ウィンドウに表示されます%i0
。
.rem
2 つのパラメーターを取ります。これらを%o0
and %o1
(ウィンドウ内) に配置してから呼び出します。それらはその%i0
andに表示されます(新しいウィンドウをセットアップするために%i1
a を行うと仮定します)。それはあなたの であるsave
に答えを入れます。%i0
%o0
%i0
同様に、結果を;に入れる必要があります。あなたに電話した人は誰でも、彼らの にそれが表示されます%o0
。