7: 2004-12-17 (金) 11:54:55 |
現: 2024-01-08 (月) 12:58:56 k-tan |
- | * naskでOSASKアプリを作ってみよう、のページ | + | TITLE:x |
| + | * naskでOSASKアプリを作ってみよう、のページ [#j877c256] |
| -(by [[K]], 2004.12.11) | | -(by [[K]], 2004.12.11) |
| -そもそもnaskってなによ、っていうのがあると思いますが、naskは[[K]]が作ったアセンブラです。 | | -そもそもnaskってなによ、っていうのがあると思いますが、naskは[[K]]が作ったアセンブラです。 |
| --より詳しくはこちら → [[Z:GO/nask]] | | --より詳しくはこちら → [[Z:GO/nask]] |
| | | |
- | *** まずは開発環境の入手 | + | *** まずは開発環境の入手 [#y31fc570] |
| -この記述は数ヶ月以内に更新されそうですが、とりあえず現状重視で。 | | -この記述は数ヶ月以内に更新されそうですが、とりあえず現状重視で。 |
- | -[[downloads/dev]]のページへ行って、''最新版''のところの、「osa_dir2」というやつをダウンロードしてください。 | + | //-[[downloads/dev]]のページへ行って、''最新版''のところの、「osa_dir2」というやつをダウンロードしてください。 |
| + | -[[downloads/dev]]のページへ行って、''最新版''のところの、「tolset08」というやつをダウンロードしてください(lzhでもsarでもどっちでもOK)。 |
| --2MB強ありますが、これはCコンパイラとかテストラン用のOSASKやエミュレータなどが入っているせいです。すみません。 | | --2MB強ありますが、これはCコンパイラとかテストラン用のOSASKやエミュレータなどが入っているせいです。すみません。 |
| -これをどこでもいいですので、適当なところに解凍します。 | | -これをどこでもいいですので、適当なところに解凍します。 |
| | | |
- | *** プロジェクト作成 | + | *** プロジェクト作成 [#g7cfda6c] |
| -次に、新規にアプリを作りますので、z_new_oというディレクトリを探してください。これをコピーして、同じディレクトリにペーストします。すると、「コピー ~ z_new_o」とかいう名前のフォルダができます。これを「naskhelo」にリネームしてください。 | | -次に、新規にアプリを作りますので、z_new_oというディレクトリを探してください。これをコピーして、同じディレクトリにペーストします。すると、「コピー ~ z_new_o」とかいう名前のフォルダができます。これを「naskhelo」にリネームしてください。 |
| --もちろん他の好きな名前でもいいですよ。 | | --もちろん他の好きな名前でもいいですよ。 |
| -最後にnaskheloの中で 右クリック→新規作成→テキストドキュメント とやって、新規テキストドキュメントを作ります。そしてこれを、「naskhelo.nas」に改名します。拡張子を変更するとどうたらこーたらとかいいますが、無視してOKしてください。 | | -最後にnaskheloの中で 右クリック→新規作成→テキストドキュメント とやって、新規テキストドキュメントを作ります。そしてこれを、「naskhelo.nas」に改名します。拡張子を変更するとどうたらこーたらとかいいますが、無視してOKしてください。 |
| | | |
- | *** ソース作成 | + | *** ソース作成 [#h0130fbb] |
| -さて、それではnaskhelo.nasを開いて、以下のソースをがしがしと入力してください。 | | -さて、それではnaskhelo.nasを開いて、以下のソースをがしがしと入力してください。 |
| --ニーモニックやレジスタ名が大文字になっていますが、もちろん小文字でも構いません。 | | --ニーモニックやレジスタ名が大文字になっていますが、もちろん小文字でも構いません。 |
| CALL 0xc7:0 | | CALL 0xc7:0 |
| ; 永久スリープなので帰ってこない | | ; 永久スリープなので帰ってこない |
| + | |
| [SECTION .data] | | [SECTION .data] |
| ALIGNB 4 | | ALIGNB 4 |
| + | |
| func_init: | | func_init: |
| DD 0x0004, work, 0x0000 | | DD 0x0004, work, 0x0000 |
| ; ファンクション番号0x04(API初期化), ワークエリアのポインタ, 終了ファンクション番号0x00 | | ; ファンクション番号0x04(API初期化), ワークエリアのポインタ, 終了ファンクション番号0x00 |
| + | |
| func_openwin: | | func_openwin: |
| DD 0x0020, window, 0x0200, 18 * 8, 3 * 16, 0x0000 | | DD 0x0020, window, 0x0200, 18 * 8, 3 * 16, 0x0000 |
| ; ファンクション番号0x20(ウィンドウオープン), window構造体のポインタ, スロット番号0x200, xサイズ(ドット単位), yサイズ(ドット単位), | | ; ファンクション番号0x20(ウィンドウオープン), window構造体のポインタ, スロット番号0x200, xサイズ(ドット単位), yサイズ(ドット単位), |
| ; 終了ファンクション番号0x00 | | ; 終了ファンクション番号0x00 |
| + | |
| func_titlebox: | | func_titlebox: |
| DD 0x0028, 0x1000, wintitle, 0, 8, 1, 0, 0, window, 0x00c0, 0, 0x0000 | | DD 0x0028, 0x1000, wintitle, 0, 8, 1, 0, 0, window, 0x00c0, 0, 0x0000 |
| ; xサイズ(キャラクタ単位), yサイズ(キャラクタ単位), 表示x位置0, 表示y位置0, window構造体のポインタ, | | ; xサイズ(キャラクタ単位), yサイズ(キャラクタ単位), 表示x位置0, 表示y位置0, window構造体のポインタ, |
| ; 標準キャラクタセット使用(0x00c0), リザーブ0, 終了ファンクション番号0x00 | | ; 標準キャラクタセット使用(0x00c0), リザーブ0, 終了ファンクション番号0x00 |
| + | |
| func_settitle: | | func_settitle: |
| DD 0x0040, 0x1000, 0, 0, wintitle, 0, 0, 0, 8, "naskhelo", 0x0000 | | DD 0x0040, 0x1000, 0, 0, wintitle, 0, 0, 0, 8, "naskhelo", 0x0000 |
| ; ファクション番号0x40(テキスト表示), オプション0x1000(8bitキャラクタモード), 表示x位置0, 表示y位置0, textbox構造体のポインタ, | | ; ファクション番号0x40(テキスト表示), オプション0x1000(8bitキャラクタモード), 表示x位置0, 表示y位置0, textbox構造体のポインタ, |
| ; 文字色0, 背景色0, キャラクタコードオフセット0, 文字数8, 文字列"naskhelo", 終了ファンクション番号0x00 | | ; 文字色0, 背景色0, キャラクタコードオフセット0, 文字数8, 文字列"naskhelo", 終了ファンクション番号0x00 |
| + | |
| func_sleep: | | func_sleep: |
| DD 0x0018, 0x0001, 0, 0, 0x0000 | | DD 0x0018, 0x0001, 0, 0, 0x0000 |
| ; ファンクション番号0x0018(シグナル関係の処理), オプション1(スリープ), パラメータ0, パラメータ0, 終了ファンクション番号0x00 | | ; ファンクション番号0x0018(シグナル関係の処理), オプション1(スリープ), パラメータ0, パラメータ0, 終了ファンクション番号0x00 |
| + | |
| ALIGNB 16 ; 本当はalign8で十分(ただの気分で16にしてしまった) | | ALIGNB 16 ; 本当はalign8で十分(ただの気分で16にしてしまった) |
| work: | | work: |
| RESB 64 ; テキストボックス構造体 | | RESB 64 ; テキストボックス構造体 |
| RESB 8 * 1 * 8 ; 8文字分 | | RESB 8 * 1 * 8 ; 8文字分 |
| + | |
| | | |
- | | + | *** どうやってアセンブルするの? [#q4b118d4] |
- | *** どうやってアセンブルするの? | + | |
| -まず、コンソールを開きます。開き方は使っているOSによって違います。 | | -まず、コンソールを開きます。開き方は使っているOSによって違います。 |
| --Win2000, WinXPなどのNT系: !cons_nt.batをダブルクリック | | --Win2000, WinXPなどのNT系: !cons_nt.batをダブルクリック |
| -これだけでリンクまで全自動でやってくれます。 | | -これだけでリンクまで全自動でやってくれます。 |
| -できたアプリは、naskhelo.binです。 | | -できたアプリは、naskhelo.binです。 |
- | --osa_dir2で作った場合は多分161バイトです。 | + | //--osa_dir2で作った場合は多分161バイトです。 |
| + | --tolset08で作った場合は多分127バイトです。 |
| | | |
- | *** どうやってテスト実行するの? | + | *** どうやってテスト実行するの? [#xa59c86f] |
| -同じくコンソールから、make runとだけうってEnterを押してください。 | | -同じくコンソールから、make runとだけうってEnterを押してください。 |
| -しばらく待っていると、勝手にOSASKがエミュレータ環境で起動します。 | | -しばらく待っていると、勝手にOSASKがエミュレータ環境で起動します。 |
| -うまくいけばウィンドウが表示されます。 | | -うまくいけばウィンドウが表示されます。 |
| | | |
- | *** ほかのアセンブラになれている人へ | + | *** ほかのアセンブラになれている人へ [#a0a46fbd] |
| -naskはMASMとかとは少し文法が違います。NASMの文法とほとんど同じです。 | | -naskはMASMとかとは少し文法が違います。NASMの文法とほとんど同じです。 |
| -GLOBAL文はいわゆるPUBLIC文です。 | | -GLOBAL文はいわゆるPUBLIC文です。 |
| MOV EBX,[func_init] | | MOV EBX,[func_init] |
| -こうすればEBXには4が入ります。 | | -こうすればEBXには4が入ります。 |
- | -[section .bss]を使えばBSSも使えるはずなのですが、osa_dir2のnaskは古いので、うまくいきません。全部.dataセクションにいれちゃってください。大丈夫です、オールゼロのデータは適当に圧縮されるのでほとんど問題ありません。 | + | -tolset08のnaskは新しいやつなので、[section .bss]も使えます。bssセクションでは、RESB/RESW/RESDしかつかえませんが。 |
- | --.bssが使えるバージョンをパッケージしたらここの記述は直しますね。 | + | //-[section .bss]を使えばBSSも使えるはずなのですが、osa_dir2のnaskは古いので、うまくいきません。全部.dataセクションにいれちゃってください。大丈夫です、オールゼロのデータは適当に圧縮されるのでほとんど問題ありません。 |
| + | //--.bssが使えるバージョンをパッケージしたらここの記述は直しますね。 |
| -RESB文は何かと言うと、DB dupみたいなものです。 RESB 256 は DB 256 dup (0) に相当します。 | | -RESB文は何かと言うと、DB dupみたいなものです。 RESB 256 は DB 256 dup (0) に相当します。 |
| --NASMもnaskでも、DBなどでdup構文を使うことはできません。 | | --NASMもnaskでも、DBなどでdup構文を使うことはできません。 |
| | | |
- | *** ほかのOSのAPIになれている人へ | + | *** ほかのOSのAPIになれている人へ [#h35f30db] |
| -OSASKではAPI呼び出しはメモリを経由したポインタ渡しです。メモリにファンクション番号とパラメータを並べて、その先頭アドレスをEBXにいれて、CALL 0xc7:0をするだけです。正常終了する限りにおいて、EBX以外のレジスタは保存されます(ファンクション0x04を除く)。フラグは保存されません。 | | -OSASKではAPI呼び出しはメモリを経由したポインタ渡しです。メモリにファンクション番号とパラメータを並べて、その先頭アドレスをEBXにいれて、CALL 0xc7:0をするだけです。正常終了する限りにおいて、EBX以外のレジスタは保存されます(ファンクション0x04を除く)。フラグは保存されません。 |
| -毎回.dataセクションにパラメータをだらだら書かないといけないのか、という誤解をする人がいますが、そんなことはありません。スタック渡しっぽいことも簡単にできます。たとえばfunc_initの呼び出しは、以下のようにやってもいいのです。 | | -毎回.dataセクションにパラメータをだらだら書かないといけないのか、という誤解をする人がいますが、そんなことはありません。スタック渡しっぽいことも簡単にできます。たとえばfunc_initの呼び出しは、以下のようにやってもいいのです。 |
| --ということが面倒極まりないので、普通は全部のデータを.dataセクションにおきます。リードオンリーのデータも.dataセクションに置いちゃいます。そうすればややこしいセグメントに悩まされずに済みますからね。 | | --ということが面倒極まりないので、普通は全部のデータを.dataセクションにおきます。リードオンリーのデータも.dataセクションに置いちゃいます。そうすればややこしいセグメントに悩まされずに済みますからね。 |
| | | |
- | *** 雑な説明 | + | *** 雑な説明 [#xe58b860] |
| -結局のところ、これはAPI呼び出しCALLを5回やって、5つのAPIを実行しているだけです。 | | -結局のところ、これはAPI呼び出しCALLを5回やって、5つのAPIを実行しているだけです。 |
| -OSASKのAPIでは、必ず最後に終了ファンクション0x0000があります。これを書かないと、その次も通常ファンクションだとみなされます。逆にこの例の場合、5つのファンクションをつなげることもできるわけです。そうすればCALLは1回で済みます。 | | -OSASKのAPIでは、必ず最後に終了ファンクション0x0000があります。これを書かないと、その次も通常ファンクションだとみなされます。逆にこの例の場合、5つのファンクションをつなげることもできるわけです。そうすればCALLは1回で済みます。 |
| -それぞれについてパラメータの意味などは上記の説明を参考にしてください。 | | -それぞれについてパラメータの意味などは上記の説明を参考にしてください。 |
| | | |
- | *** もっと詳しく説明してくれー | + | *** もっと詳しく説明してくれー [#kb19841c] |
| -そのうちやるかもしれません。このページは長くなったので別のページで。 | | -そのうちやるかもしれません。このページは長くなったので別のページで。 |
| -ほかのAPIとかも。 | | -ほかのAPIとかも。 |
| --[[GUIGUI00_man]] | | --[[GUIGUI00_man]] |
| | | |
- | * こめんと欄 | + | * こめんと欄 [#e89ccf35] |
| -直ってしまったので、勝手に修正してしまいました。コメントアウトしてあります。 -- ''Zakky'' SIZE(10){2004-12-11 (土) 20:23:30} | | -直ってしまったので、勝手に修正してしまいました。コメントアウトしてあります。 -- ''Zakky'' SIZE(10){2004-12-11 (土) 20:23:30} |
| -どうもありがとう。助かりました。 -- [[K]] SIZE(10){2004-12-11 (土) 20:52:16} | | -どうもありがとう。助かりました。 -- [[K]] SIZE(10){2004-12-11 (土) 20:52:16} |
| -続編作りました。> [[guide/wintro0000]] この先も、たまに続きを書きますね。 -- [[K]] SIZE(10){2004-12-13 (月) 16:40:05} | | -続編作りました。> [[guide/wintro0000]] この先も、たまに続きを書きますね。 -- [[K]] SIZE(10){2004-12-13 (月) 16:40:05} |
| -naskでAPI引数が分かりにくいと思う人は, nasmでマクロを使おう! と言ってみるテスト。私のnasmアプリはほぼ全てそう。 -- [[I.Tak.]] SIZE(10){2004-12-17 (金) 11:54:54} | | -naskでAPI引数が分かりにくいと思う人は, nasmでマクロを使おう! と言ってみるテスト。私のnasmアプリはほぼ全てそう。 -- [[I.Tak.]] SIZE(10){2004-12-17 (金) 11:54:54} |
- | | + | -tolset08を前提に改訂。 -- [[K]] SIZE(10){2005-01-28 (金) 22:49:31} |
- | #comment | + | //#comment |