[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