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

[OSASK 2780] Re: Smaller color



Hidemi KAWAI さん、こんにちは。I.Tak. です。

Sun, 23 Dec 2001 02:23:22 -0000 の
[OSASK 2778] Re: Smaller color
に返信です。

>  これはまことにもっともなのですが、2回目以降は、努力次第でかな
>り短くできます。
>
>  一回目のcall pioneerのアドレスがCS:0x0030だとしたら、
>
>    PUSH(0x0031);
>    POP(EDI);
>    DB(0x2e, 0xff, 0x1f); /* CALLF [CS:EDI] */
>
>の6バイトで呼び出せますし、EDIの値が変わらなければ3回目以降はわ
>ずか3バイトで呼び出せます。もしかしたら、スタティックデーター内
>にDD(0); DW(0xc7);という部分を作ってしまうのが得策なのかもしれ
>ません。そうすれば、CS:のプリフィクスはなくせます。

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

>>    push dword data
>は、dataの値からしてbyteで行けるのではないでしょうか?これで3バ
>イトも節約できますよ。

 なるほど、たしかにコードが短いのでできますね。

>  それと、I.Tak.さんは少し誤解なさっているかもしれません。DSの中
>には確かにスタックとスタティックデーターの展開サイズが含まれます
>が、コードサイズはこれとは別です。ですからヘッダにコードサイズを
>含める必要は全くありません。・・・多分、DSのどこかにコードがある
>だろうと想像なさっているのでしょうが、そんな事はないのです。コー
>ドが100KBあってもデーターが8KBで充分なら、ヘッダに書く値も8KBで
>す。

 フラットでないことは重々承知しています。でも、NASMのbinモードは
フラットになっているんです。あの書き方はbssセクションにwork構造体を
直に配置して、そこのシンボルを参照していたころの名残です。
 binモードでbssセクションを使ってds:0とかのシンボルを作るのは無理
なので、bssセクションを使うのはやめようと思っています。ASKAのように
構造体を使っても同じなので。

 フラットがいやならリンカを使えということなんでしょう。

>  AH = 0x20;
>  XCHG(EAX, ESP);
>という方法なんていかがでしょう?これなら3バイトですよ。ESPへの代
>入が1命令だけ遅れるのが難といえば難ですが(このせいでスタックが
>使えなくて死んでしまうということはありません・・・その辺はうまく
>設計してあります)。

 やりますね、xchgは気がつきませんでした。

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

------------------------------------------------------------
I.Tak. <msy !Atmark! catvmics.ne.jp>
http://home1.catvmics.ne.jp/~msy/takhome.htm