[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 2781] Re: Smaller color



  こんにちは、川合です。


I.Tak. さんは 2001/12/23 12:47:33 の「[OSASK 2780] Re: Smaller c
olor」で書きました:

> call pioneeer は二回に抑えてあるので、1バイト減らせそうです。
>さらにコールの多い場合に圧縮したいと思います。ただ、tek0は1バイト
>変えるだけで4バイトぐらい圧縮効率が落ちたりするので微妙ですが。

  スタックを使うという方法を思い付きました。これはどうでしょう?

    /* この3命令(4バイト)を最初の方でやっておく */
    AL = 0xc7;
    PUSH(EAX); /* 0x00c7を積む */
    PUSH(ECX); /* 0を積む */

    /* スタックに積んだり、ポインタをセットしたりする */

    DB(0xff, 0x4c, 0x24, d8); /* CALLF [SS:ESP+d8] */

もしくは、

    DB(0xff, 0x0c, 0x24); /* CALLF [SS:ESP] */

  最初のtek0展開の時は、d8が必要なので普通に呼ぶより損です。しか
し2度目の呼び出しは3バイト形式が多分使えるでしょう。そうすれば2
回合わせたバイト数は、11バイトで、7+6=13よりも2バイトも減ります
。

  またtek0展開に際しては、EBXとEDI以外のレジスタは保存されます。
仕様を確認しました。これを利用して、上記の手法をさらに精練する事
もできます。

    /* この4命令(6バイト)を最初の方でやっておく */
    AL = 0xc7;
    PUSH(EAX); /* 0x00c7を積む */
    PUSH(ECX); /* 0を積む */
    ESI = ESP;

    /* スタックに積んだり、ポインタをセットしたりする */

    DB(0xff, 0x1e); /* CALLF [DS:ESI] */

  これなら、2回の合計は10バイトです。3回でも12バイトです。ESIが
使えなくなりますが。

> フラットでないことは重々承知しています。でも、NASMのbinモードは
>フラットになっているんです。あの書き方はbssセクションにwork構造体を
>直に配置して、そこのシンボルを参照していたころの名残です。

  ああなるほど、なごりだったんですね。

> さらに縮みそうですので、また報告します。

  はい、楽しみにしています。せっかくですから究極に到達してほしい
と思っています。

  それにしても、こんなことならc7じゃなくて、77とかにしておけばよ
かった・・・(笑)。



  それでは。

--
    川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/