[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]
[OSASK 2781] Re: Smaller color
- Subject: [OSASK 2781] Re: Smaller color
- From: Hidemi KAWAI <kawai !Atmark! imasy.org>
- Date: Sun, 23 Dec 2001 06:22:10 -0000
こんにちは、川合です。
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/