* APIのパラメータの渡し方 -[[OsaTech]]より -(by [[K]], 2009.07.14) *** (1) -第一世代OSASKのAPIを規定するに当たって、最初に検討したのはパラメータの渡し方だったように思う。これはOSASK-MLが始まる前から[[K]]と今原氏とで検討した。 -当時の僕たちはパラメータの渡し方には、以下の3つがあると考えた。 --レジスタ渡し ---BIOSのように、パラメータを所定のレジスタにいれ、APIを呼び出す。 --スタック渡し ---C言語の関数のように、パラメータをスタックにつんで、APIを呼び出す。 --ポインタ渡し ---すぐには例が思いつかないのだが、とにかくパラメータをメモリのどこかに所定の順序で並べて、その先頭アドレスをレジスタに入れて、APIを呼び出す。 -まずレジスタ渡しにはメリットがある。というのは、渡されたパラメータがメモリではなくレジスタ上にあるということだ。どんなパラメータにせよ、OSに渡す以上は、その値は当然OSに利用される。そしてOSが利用するということは、その値をレジスタに読んで計算したりI/Oしたりするということである。・・・スタック渡しやポインタ渡しは、アプリで計算したものを一度わざわざメモリに置き、そしてその値をOSが読むのである。これは大いに無駄である。 --一説によれば、最近のプログラムは結局、このような値の格納と読み取りという、実質的な処理ではないようなことに処理の時間の大半を費やしているとも言われる。CPUが速くなってもソフトが速くならないのは、そういう改悪が進んでいるからだと。 -しかし僕たちはレジスタ渡しを採用していない。というのは、x86ではとにかくレジスタが少なくて、結局一度メモリにレジスタの値を退避してからでなければ何も始められず、それならスタック渡しやポインタ渡しでも差は無いからである。 -そして僕はポインタ渡しを強く推した。というのは、スタックにパラメータをつんでも、EBX=ESP;などによってスタックトップのアドレスをポインタとして渡せば、ポインタ渡しでもスタック渡しと同じことが出来るからである。この場合純粋なスタック渡しと比べて劣るのはEBX=ESP;の1命令分だけで、これはスタック以外にもパラメータを置けるようになることを思えば、悪くない代償である。 -ということで、メモリにパラメータ列を並べて、その先頭アドレスをEBXにいれて、APIを呼び出すというのが、第一世代OSASKの基本形になった。 *** (2) * こめんと欄 #comment
(This host) = http://osask.net