ページへ戻る

− Links

 印刷 

OT​/0004 のバックアップ差分(No.5) :: OSASK計画

osaskwiki:OT/0004 のバックアップ差分(No.5)

« Prev[4]  Next »[5]
4: 2009-07-15 (水) 15:41:15 ソース[6] 5: 2009-11-17 (火) 12:06:26 ソース[7]
Line 33: Line 33:
-そこでエンコードを4bit単位のものに変更した。必要なら8bitや12bitなどより長い整数形式を使うことももちろんできる。→[[GUIGUI01/man0004]] これで無駄な上位の0は一掃され相当短くなった。 -そこでエンコードを4bit単位のものに変更した。必要なら8bitや12bitなどより長い整数形式を使うことももちろんできる。→[[GUIGUI01/man0004]] これで無駄な上位の0は一掃され相当短くなった。
-さらに第二世代OSASKでは、引数の一部分に対して、「ここの値はスタックの○○番目を参照」とか「ここの値は○○レジスタを参照」のような記述を許すことにした。これはパラメータに特別な数字を書くことで実現している。これは非常に強力で、今まで可変パラメータを含んだものはわざわざMOVなどで上書きしていたのだが、それが完全に不要になった。レジスタの値を利用できるので、パラメータのエンコードが上記のように複雑になっても、ほとんど問題にはならない(もしレジスタの値が利用できないのなら、それをメモリにストアするために、アプリがややこしいエンコードをしなければいけなかった)。 -さらに第二世代OSASKでは、引数の一部分に対して、「ここの値はスタックの○○番目を参照」とか「ここの値は○○レジスタを参照」のような記述を許すことにした。これはパラメータに特別な数字を書くことで実現している。これは非常に強力で、今まで可変パラメータを含んだものはわざわざMOVなどで上書きしていたのだが、それが完全に不要になった。レジスタの値を利用できるので、パラメータのエンコードが上記のように複雑になっても、ほとんど問題にはならない(もしレジスタの値が利用できないのなら、それをメモリにストアするために、アプリがややこしいエンコードをしなければいけなかった)。
--こうして結果的に、第二世代OSASKのAPIパケットは基本的に上書きしないものとなり、それゆえに.textに置いてもいいと思えるようになった。そこでEDI=0という特別形式を作り、この値でAPIが呼ばれたときには、OSはAPIパケットの先頭アドレスをEIPから取得する。そしてそのまま実行し、終了時にパケット終了アドレスの次のアドレスへreturn;する。これだとEDIへポインタを代入する手間が省ける(第二世代OSASKではEDIの初期が0なのだが、これを一度も変更しないアプリも存在するくらいである)。+-こうして結果的に、第二世代OSASKのAPIパケットは基本的に上書きしないものとなり、それゆえに.textに置いてもいいと思えるようになった。そこでEDI=0という特別形式を作り、この値でAPIが呼ばれたときには、OSはAPIパケットの先頭アドレスをEIPから取得する。そしてそのまま実行し、終了時にパケット終了アドレスの次のアドレスへreturn;する。これだとEDIへポインタを代入する手間が省ける(第二世代OSASKではEDIの初期値が0なのだが、これを一度も変更しないアプリも存在するくらいである)。
--これはつまりCALL命令の直後にDBでAPIパケットを並べればいいということである。 --これはつまりCALL命令の直後にDBでAPIパケットを並べればいいということである。
« Prev[4]  Next »[5]