ページへ戻る

− Links

 印刷 

GUIGUI01​/memo18 の変更点 :: OSASK計画

osaskwiki:GUIGUI01/memo18 の変更点

« Prev[3]  
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
« Prev[3]