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

[OSASK 2778] Re: Smaller color



  こんにちは、川合です。


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/