3: 2008-12-30 (火) 12:24:30 |
4: 2009-01-03 (土) 19:52:47 |
| MOV EAX,msg | | MOV EAX,msg |
| CALL [ESI] | | CALL [ESI] |
- | DB 0x50, 0x30, 0x30 ; [5 0 (!6_x) 3 EAX] [3] ; 5 0 (!6_x) 3 の後に(!6_0)がある | + | DB 0x53, 0x00 ; [5 (0) (!6_x) 3 EAX] ; 5 (0) (!6_x) 3 の後に!6がある |
| RET | | RET |
| | | |
| INCPATH = ../z_tools/guigui01/ | | INCPATH = ../z_tools/guigui01/ |
| include ../z_tools/com_mak.txt | | include ../z_tools/com_mak.txt |
- | -これを使ってmakeすると、77バイトのex0000.g01と57バイトのex0000.orgができるはずです。77バイトってC版(69バイト)よりも大きいじゃないか!と思うかもしれませんが、77バイトはtek5をかけた場合の大きさで、tek5しなければ57バイトなのです。つまり、.g01のほうは無視して、.orgのほうを使いましょう(.g01を消して.orgを.g01と改名してもいいです)。 | + | -これを使ってmakeすると、75バイトのex0000.g01と56バイトのex0000.orgができるはずです。75バイトってC版(68バイト)よりも大きいじゃないか!と思うかもしれませんが、75バイトはtek5をかけた場合の大きさで、tek5しなければ56バイトなのです。つまり、.g01のほうは無視して、.orgのほうを使いましょう(.g01を消して.orgを.g01と改名してもいいです)。 |
- | -57バイトってどういうこと!?18バイトになるんじゃなかったの?・・・ええまあそうなんですが、いきなり18バイト版を書くのはハードルが高いので、最初はこれでよしとしてください。 | + | -56バイトってどういうこと!?17バイトになるんじゃなかったの?・・・ええまあそうなんですが、いきなり17バイト版を書くのはハードルが高いので、最初はこれでよしとしてください。 |
| ---- | | ---- |
| -次はcharsをやってみましょう。 | | -次はcharsをやってみましょう。 |
| putcloop: | | putcloop: |
| CALL [ESI] | | CALL [ESI] |
- | DB 0x50, 0x51, 0x61, 0x03 ; [5 0 !5 1 AL] [3] | + | DB 0x55, 0x16, 0xb8 ; [5 (0) !5 1 AL] |
| INC AL | | INC AL |
| CMP AL,0x7f | | CMP AL,0x7f |
| RET | | RET |
| | | |
- | -Makefileはex0000.nasとほぼ同じなので省略しますね。これをmakeすると、46バイトのex0001.orgができます。やはり14バイトには遠く及ばないのですが、しかしCで書いたらこんなものではすまないので、アセンブラの優位性はしっかりと示されています。helloよりも小さくなったのは、やっぱり.dataセクションを作らないで済んでいるからというのが大きいです。 | + | -Makefileはex0000.nasとほぼ同じなので省略しますね。これをmakeすると、45バイトのex0001.orgができます。やはり13バイトには遠く及ばないのですが、しかしCで書いたらこんなものではすまないので、アセンブラの優位性はしっかりと示されています。helloよりも小さくなったのは、やっぱり.dataセクションを作らないで済んでいるからというのが大きいです。 |
| ---- | | ---- |
| -ということで、helloも.dataセクションなしで書いてみることにします。 | | -ということで、helloも.dataセクションなしで書いてみることにします。 |
| _G01Main: | | _G01Main: |
| CALL [ESI] | | CALL [ESI] |
- | DB 0x50, 0x10, "hello, wolrd", 0, 0x30 | + | DB 0x51, "hello, wolrd", 0 |
| RET | | RET |
| | | |
| -こんな風に書けば、ポインタ指定なしで直接データを置けるので、.dataセクションはいりません。 | | -こんな風に書けば、ポインタ指定なしで直接データを置けるので、.dataセクションはいりません。 |
- | -これをmakeすると、50バイトのex0002.orgができます。7バイトの減量ですね。 | + | -これをmakeすると、48バイトのex0002.orgができます。8バイトの減量ですね。 |
| ---- | | ---- |
| -もっと小さくしたいということなら(まあ普通はそこまでやる必要はなくてex0000レベルで十分なのですが・・・というか「ぐいぐい01」でありさえすればC版でも十分)、20バイト以上ある標準のC向けのスターアップルーチンを使わないようにするという選択肢があります。これはリンカも使わないということです(リンカは勝手にスタートアップを使おうとするので)。難易度は結構高いです。.text以外のセクションを使っている場合は、これはやらないほうがいいでしょう。リンカなしで.dataセクションを扱うのは至難の業です。 | | -もっと小さくしたいということなら(まあ普通はそこまでやる必要はなくてex0000レベルで十分なのですが・・・というか「ぐいぐい01」でありさえすればC版でも十分)、20バイト以上ある標準のC向けのスターアップルーチンを使わないようにするという選択肢があります。これはリンカも使わないということです(リンカは勝手にスタートアップを使おうとするので)。難易度は結構高いです。.text以外のセクションを使っている場合は、これはやらないほうがいいでしょう。リンカなしで.dataセクションを扱うのは至難の業です。 |
| _G01Main: | | _G01Main: |
| CALL [ESI] | | CALL [ESI] |
- | DB 0x50, 0x10, "hello, wolrd", 0, 0x30 | + | DB 0x51, "hello, wolrd", 0 |
| RET | | RET |
| | | |
| -こんな感じです。これはもうリンカとかは使わないので、Makefileなしでmakeします。 | | -こんな感じです。これはもうリンカとかは使わないので、Makefileなしでmakeします。 |
| efg01 ../z_tools/nask.g01 ex0003.nas ex0003.g01 ex0003.lst | | efg01 ../z_tools/nask.g01 ex0003.nas ex0003.g01 ex0003.lst |
- | -これで22バイトの.g01ができます。ついにきました。一気に「ぐいぐい01」らしいサイズです。 | + | -これで20バイトの.g01ができます。ついにきました。一気に「ぐいぐい01」らしいサイズです。 |
| ---- | | ---- |
- | -ここまできたらせっかくなので18バイトまで行きますかね(笑)。まず、.textの末尾のRETは省略できます。また、APIパケットは今、 [5 0 1 "hello, wolrd" 0] [3] になっているのですが、この最後の4bitの3を、1の後の「隙間の埋め用」の0のところに入れてもいい事になっています。さらに簡易形式用ヘッダの最後の4のところに1を足して5にしておけば、最初の CALL [ESI] を省略できます。 | + | -ここまできたらせっかくなので17バイトまで行きますかね(笑)。まず、.textの末尾のRETは省略できます。さらに簡易形式用ヘッダの最後の4のところに1を足して5にしておけば、最初の CALL [ESI] を省略できます。 |
| ; ex0004.nas | | ; ex0004.nas |
| [FORMAT "BIN"] | | [FORMAT "BIN"] |
| | | |
| _G01Main: | | _G01Main: |
- | DB 0x50, 0x13, "hello, wolrd", 0 | + | DB 0x51, "hello, wolrd", 0 |
| | | |
- | -これで完成です。これをnaskするとめでたく18バイトになります。・・・こんなDBしかないプログラムであれば、バイナリエディタだけで作ったほうが早いですけどね。 | + | -これで完成です。これをnaskするとめでたく17バイトになります。・・・こんなDBしかないプログラムであれば、バイナリエディタだけで作ったほうが早いですけどね。 |
| * こめんと欄 | | * こめんと欄 |
| + | - abcdw009向けの記述に修正。 -- [[K]] &new{2009-01-03 (土) 19:52:47}; |
| | | |
| #comment | | #comment |