6: 2009-11-17 (火) 12:08:39 [4] | 現: 2024-01-08 (月) 12:58:42 k-tan[5] [6] | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | * ぐいぐい01に関するメモ-18 | + | TITLE:x |
+ | * ぐいぐい01に関するメモ-18 [#u8295563] | ||
-(by [[K]], 2008.12.30) | -(by [[K]], 2008.12.30) | ||
-メモのうち重要な部分をそのうちまとめてまともなページを作る | -メモのうち重要な部分をそのうちまとめてまともなページを作る | ||
- | *** (33) naskで「ぐいぐい01」アプリを作る | + | *** (33) naskで「ぐいぐい01」アプリを作る [#r48a57b8] |
-OSASK-IRCで、なんとアセンブラで「ぐいぐい01」アプリを作ってみたいという人がいたので、その人の参考になりそうなことをメモしておきます。その人の参考にならないとしても、nikaさんやDAsoranさんやI.Tak.さんみたいな人ならきっと参考になると思います(この三人に読んで欲しいという意味ではなく、この三人くらいの人がOSASKコミュニティには時々出現してくれるから、将来のそういう人に役立てばそれでいいという意味)。 | -OSASK-IRCで、なんとアセンブラで「ぐいぐい01」アプリを作ってみたいという人がいたので、その人の参考になりそうなことをメモしておきます。その人の参考にならないとしても、nikaさんやDAsoranさんやI.Tak.さんみたいな人ならきっと参考になると思います(この三人に読んで欲しいという意味ではなく、この三人くらいの人がOSASKコミュニティには時々出現してくれるから、将来のそういう人に役立てばそれでいいという意味)。 | ||
---- | ---- | ||
Line 12: | Line 13: | ||
[BITS 32] | [BITS 32] | ||
GLOBAL _G01Main | GLOBAL _G01Main | ||
+ | |||
[SECTION .text] | [SECTION .text] | ||
+ | |||
_G01Main: | _G01Main: | ||
MOV EAX,msg | MOV EAX,msg | ||
Line 20: | Line 21: | ||
DB 0x53, 0x00 ; [5 (0) (!6_x) 3 EAX] ; 5 (0) (!6_x) 3 の後に!6がある | DB 0x53, 0x00 ; [5 (0) (!6_x) 3 EAX] ; 5 (0) (!6_x) 3 の後に!6がある | ||
RET | RET | ||
+ | |||
[SECTION .data] | [SECTION .data] | ||
+ | |||
msg DB "hello, world", 0 | msg DB "hello, world", 0 | ||
+ | |||
-こんな感じかなあ。ESIの値はアプリ起動時に渡される値を使えば上記で問題はないです。また、EDIもアプリ起動時は0になっていることが保証されているので、これで問題ないです。APIパケットでは、わざわざEAXレジスタを使って文字列の位置を与えていますが、これはラベルの値を直接APIパケットに含める方法をまだ十分にはサポートできていないためです(申し訳ない)。レジスタにせよなんにせよ、とにかくAPIで扱うポインタはDSもしくはSSでアクセスできる範囲になくてはいけないので、文字列はわざわざ.dataセクションにおいています。 | -こんな感じかなあ。ESIの値はアプリ起動時に渡される値を使えば上記で問題はないです。また、EDIもアプリ起動時は0になっていることが保証されているので、これで問題ないです。APIパケットでは、わざわざEAXレジスタを使って文字列の位置を与えていますが、これはラベルの値を直接APIパケットに含める方法をまだ十分にはサポートできていないためです(申し訳ない)。レジスタにせよなんにせよ、とにかくAPIで扱うポインタはDSもしくはSSでアクセスできる範囲になくてはいけないので、文字列はわざわざ.dataセクションにおいています。 | ||
-文字列の最後に0x0aが入っていませんが、これは入れても入れなくてもいいのです。「ぐいぐい01」では終了時に改行し忘れていると判断すれば、自動で改行してから終了しますので。 | -文字列の最後に0x0aが入っていませんが、これは入れても入れなくてもいいのです。「ぐいぐい01」では終了時に改行し忘れていると判断すれば、自動で改行してから終了しますので。 | ||
Line 31: | Line 32: | ||
MODE = g01 | MODE = g01 | ||
OBJS = ex0000.obj | OBJS = ex0000.obj | ||
+ | |||
INCPATH = ../z_tools/guigui01/ | INCPATH = ../z_tools/guigui01/ | ||
include ../z_tools/com_mak.txt | include ../z_tools/com_mak.txt | ||
Line 44: | Line 45: | ||
[BITS 32] | [BITS 32] | ||
GLOBAL _G01Main | GLOBAL _G01Main | ||
+ | |||
[SECTION .text] | [SECTION .text] | ||
+ | |||
_G01Main: | _G01Main: | ||
MOV AL,0x20 | MOV AL,0x20 | ||
Line 56: | Line 57: | ||
JB putcloop | JB putcloop | ||
RET | RET | ||
+ | |||
-Makefileはex0000.nasとほぼ同じなので省略しますね。これをmakeすると、45バイトのex0001.orgができます。やはり13バイトには遠く及ばないのですが、しかしCで書いたらこんなものではすまないので、アセンブラの優位性はしっかりと示されています。helloよりも小さくなったのは、やっぱり.dataセクションを作らないで済んでいるからというのが大きいです。 | -Makefileはex0000.nasとほぼ同じなので省略しますね。これをmakeすると、45バイトのex0001.orgができます。やはり13バイトには遠く及ばないのですが、しかしCで書いたらこんなものではすまないので、アセンブラの優位性はしっかりと示されています。helloよりも小さくなったのは、やっぱり.dataセクションを作らないで済んでいるからというのが大きいです。 | ||
---- | ---- | ||
Line 66: | Line 67: | ||
[BITS 32] | [BITS 32] | ||
GLOBAL _G01Main | GLOBAL _G01Main | ||
+ | |||
[SECTION .text] | [SECTION .text] | ||
+ | |||
_G01Main: | _G01Main: | ||
CALL [ESI] | CALL [ESI] | ||
DB 0x51, "hello, wolrd", 0 | DB 0x51, "hello, wolrd", 0 | ||
RET | RET | ||
+ | |||
-こんな風に書けば、ポインタ指定なしで直接データを置けるので、.dataセクションはいりません。 | -こんな風に書けば、ポインタ指定なしで直接データを置けるので、.dataセクションはいりません。 | ||
-これをmakeすると、48バイトのex0002.orgができます。8バイトの減量ですね。 | -これをmakeすると、48バイトのex0002.orgができます。8バイトの減量ですね。 | ||
Line 82: | Line 83: | ||
[INSTRSET "i486p"] | [INSTRSET "i486p"] | ||
[BITS 32] | [BITS 32] | ||
+ | |||
[SECTION .text] | [SECTION .text] | ||
+ | |||
DB 0x47, 0x01, 0x04 ; 簡易形式用ヘッダ | DB 0x47, 0x01, 0x04 ; 簡易形式用ヘッダ | ||
+ | |||
_G01Main: | _G01Main: | ||
CALL [ESI] | CALL [ESI] | ||
DB 0x51, "hello, wolrd", 0 | 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 | ||
Line 101: | Line 102: | ||
[INSTRSET "i486p"] | [INSTRSET "i486p"] | ||
[BITS 32] | [BITS 32] | ||
+ | |||
[SECTION .text] | [SECTION .text] | ||
+ | |||
DB 0x47, 0x01, 0x05 ; 簡易形式用ヘッダ | DB 0x47, 0x01, 0x05 ; 簡易形式用ヘッダ | ||
+ | |||
_G01Main: | _G01Main: | ||
DB 0x51, "hello, wolrd", 0 | DB 0x51, "hello, wolrd", 0 | ||
+ | |||
-これで完成です。これをnaskするとめでたく17バイトになります。・・・こんなDBしかないプログラムであれば、バイナリエディタだけで作ったほうが早いですけどね。 | -これで完成です。これをnaskするとめでたく17バイトになります。・・・こんなDBしかないプログラムであれば、バイナリエディタだけで作ったほうが早いですけどね。 | ||
- | * こめんと欄 | + | * こめんと欄 [#s178e662] |
- abcdw009向けの記述に修正。 -- [[K]] &new{2009-01-03 (土) 19:52:47}; | - abcdw009向けの記述に修正。 -- [[K]] &new{2009-01-03 (土) 19:52:47}; | ||
- abcdw014向けの記述に修正。 -- ''K'' &new{2009-01-15 (木) 19:30:35}; | - abcdw014向けの記述に修正。 -- ''K'' &new{2009-01-15 (木) 19:30:35}; | ||
#comment | #comment |
(This host) = http://osask.net