ページビューの合計

イエスから目を離さないでいなさい。(へブル 12:2)

2017-07-29

リンクとその解除

#define  link()  (*--sp=fp ,fp=sp)
#define  unlk()  (sp=fp,  fp=*sp++)

とある。何をしているんだろうか?
spはスタックポインタだ。
新しく関数を実行したい。引数が2個以上だ。
こんなとき、スタックを利用する。
はじめる前に link() を実行し。そのときの
スタックポインタをfpに保存する。
「fpから関数処理に必要なデータがあるよ」
と言っている。
その関数処理が終わったら、
その前の関数処理を続けるため
fpの前の状態はスタックに保存する
2引数なら、*(fp-1)に第1引数の評価結果
*(fp-2)に関数定義を入れる。
第2引数の評価結果xを得たら
x,*(fp-1),*(fp-2)を使って関数を実行
*(fp-1)は *sp++ と記述してある。
終わったら、その前の関数処理に戻すため
unlk() を使い、sp, fp の値を戻す。

難しい、難しい