[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]
[OSASK 2778] Re: Smaller color
- Subject: [OSASK 2778] Re: Smaller color
- From: Hidemi KAWAI <kawai !Atmark! imasy.org>
- Date: Sun, 23 Dec 2001 02:23:22 -0000
こんにちは、川合です。
I.Tak. さんは 2001/12/22 22:32:50 の「[OSASK 2775] Smaller color
」で書きました:
> ついに、限界だろうというところまで来ました。とりあえず、205は
>切りました。(^^ ここ数日こんなことしか(^^;;;
>colorT 196 bytes
>counTdown 220 bytes
>helloT 153 bytes
す、すごいです。196!
> workをds:0に配置するとかちょっと汚いことも(問題なく動くので)
>やっています。問題ありませんよね。
はい、問題ありません。それは仕様の範囲内の行為です。・・・ただ
スタックが足りなくなるとワークエリアに入ってくるのでそれは注意し
てください。これが厄介なのはデバッグの時だけですが。
> 成果はいつものところで。ちょっと気付いたことなども書きましたので、
>さらになにか気付いたら教えてください。
>http://home1.catvmics.ne.jp/~msy/tak/osask/ostwkai6.htm
いうべき事はありません。というか、colorT3.asmの「shorter!」と
いう一言を見た時、僕はかなり笑ってしまいました。ああ、その気持ち
よく分かります。
しかし、おお、僕にも助言できる事が少しだけありました。
>call pioneerを減らす
> 7バイト命令ですから,なるべくループに入れたりショートジャンプしたりして再利用した方が縮みます。
これはまことにもっともなのですが、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:のプリフィクスはなくせます。
また、
> push dword data
は、dataの値からしてbyteで行けるのではないでしょうか?これで3バ
イトも節約できますよ。
それと、I.Tak.さんは少し誤解なさっているかもしれません。DSの中
には確かにスタックとスタティックデーターの展開サイズが含まれます
が、コードサイズはこれとは別です。ですからヘッダにコードサイズを
含める必要は全くありません。・・・多分、DSのどこかにコードがある
だろうと想像なさっているのでしょうが、そんな事はないのです。コー
ドが100KBあってもデーターが8KBで充分なら、ヘッダに書く値も8KBで
す。
先ほど思い付いたのですが、ESPの初期値の代入で
ESP = [CS:EAX+16];
という技も使えますね。しかしこれもSP=0x2000;と同じ4バイトの命令
でコードサイズ圧縮という点では役に立ちません。代わりに
AH = 0x20;
XCHG(EAX, ESP);
という方法なんていかがでしょう?これなら3バイトですよ。ESPへの代
入が1命令だけ遅れるのが難といえば難ですが(このせいでスタックが
使えなくて死んでしまうということはありません・・・その辺はうまく
設計してあります)。
それでは。
--
川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/