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

[OSASK 2791] Re: Smaller color



  こんにちは、川合です。


I.Tak. さんは 2001/12/26 00:16:40 の「[OSASK 2789] Re: Smaller c
olor」で書きました:

> 来ましたよ〜。おそらくまた(^^; 限界です。
>helloT1 146
>colorT4 184
>cnTdwn3 200

  来ましたねえ。

  今はSeldon, Adelaidの開発中なのであまり詳しくは確認できていま
せんが、colorT4はよく読んでみました。

  それでいまさらになって気がついたことをいくつか。

>    add  esp, byte 4*6

これって、ESP = ESI;にすれば、1バイト減らせるんじゃないでしょう
か?・・・というか、別にこの命令自体を省略してしまってもいいんじ
ゃないかと。無くてもスタックを24バイト浪費するだけなので・・・。
いかがでしょう?

  EBX = 0;の代わりに、XCHG(EAX, EBX);を使うのはさすがだと思いま
した。もはや僕よりもXCHGの使い方がうまくなりましたね(笑)。x座
標をXCHGで交換するのもさすがです。

  ・・・いやまてよ、

>    xchg [ebx +LIB_PutString.x_pos], ch

の代わりに、

    xor dword [ebx +LIB_PutString.x_pos], byte 10

の方がいいんじゃないでしょうか?確かにここでは1バイトの損ですが
CXへの代入をCLの代入に変更できてそこで2バイト得しますし、さらに
CL--;をECX--;に変更できるのでここで1バイト得して、トータルでは2
バイトの得です。

  いやここまでやるならループ条件をnsからnzに変更して、LOOP命令を
使いましょう。これでさらに1バイト減らせます。

>    push dword data_size

  これは実は、ちょっと縮められます。というのは、data_sizeがたま
たま、0x0100になっているからです。そんなわけで、

    BH = 0x01;
    PUSH(EBX);

に変更することをお勧めします。2バイト減らせます。・・・この手法
は意外に応用が利くかもしれません。データーイメージの最後に00を書
き連ねておいて、data_sizeを256バイトアラインしておけば、いつでも
使えます。あとはtek0がこの余計な0をパックするのにどれだけ要する
か、にかかってきますが。

  ついでに、これはちょっと得なのか損なのかはっきりとは分からない
のですが、struct bssのところで、

>.winwork:   resb 128
>.titlework: resb 64+ titlelength*8
>.textwork:  resb 64+ textlength*8

の部分を

 .winwork:   resb 128 + 128
 .titlework: resb 64+ titlelength*8 + 144
 .textwork:  resb 64+ 20*8*8

にしたらtek0でパックしたときのサイズに影響は出るでしょうか?

  ああ、それにしてもこんなに小さくなるとは・・・。僕の変更をすべ
てそのまま採用すればとりあえず176バイトにはなるはずで、そうなる
とかつてのHELLO0.BINとたったの4バイトしか違わないわけです。そのh
elloはもっと縮んでいるんですが(笑)。

  今のサイズでさえ、colorT4.binをダンプしてみると、本当に小さい
と思います。芸術ですよ、ここまで来ると(笑)。

>ついにパリティまで動員しました。正式ASKAだとどう書くのか…… :->

  正式ASAKでは、

    if (PF == 0) goto ...

などと書きます。簡単ですね。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/