4: 2005-01-28 (金) 22:58:09 |
現: 2024-01-08 (月) 12:58:56 k-tan |
- | * ASKAでOSASKアプリを作ってみよう、のページ | + | TITLE:x |
| + | * ASKAでOSASKアプリを作ってみよう、のページ [#s3c5247c] |
| -(by [[K]], 2004.12.12) | | -(by [[K]], 2004.12.12) |
| -前半はnask編とほとんど同じです。 | | -前半はnask編とほとんど同じです。 |
| --nask編はこちら → [[guide/nask]] | | --nask編はこちら → [[guide/nask]] |
| | | |
- | *** まずは開発環境の入手 | + | *** まずは開発環境の入手 [#z9fc93ec] |
| -この記述は数ヶ月以内に更新されそうですが、とりあえず現状重視で。 | | -この記述は数ヶ月以内に更新されそうですが、とりあえず現状重視で。 |
| -[[downloads/dev]]のページへ行って、''最新版''のところの、「tolset08」というやつをダウンロードしてください(lzhでもsarでもどっちでもOK)。 | | -[[downloads/dev]]のページへ行って、''最新版''のところの、「tolset08」というやつをダウンロードしてください(lzhでもsarでもどっちでもOK)。 |
| -これをどこでもいいですので、適当なところに解凍します。 | | -これをどこでもいいですので、適当なところに解凍します。 |
| | | |
- | *** プロジェクト作成 | + | *** プロジェクト作成 [#acd950ca] |
| -次に、新規にアプリを作りますので、z_new_oというディレクトリを探してください。これをコピーして、同じディレクトリにペーストします。すると、「コピー ~ z_new_o」とかいう名前のフォルダができます。これを「askahelo」にリネームしてください。 | | -次に、新規にアプリを作りますので、z_new_oというディレクトリを探してください。これをコピーして、同じディレクトリにペーストします。すると、「コピー ~ z_new_o」とかいう名前のフォルダができます。これを「askahelo」にリネームしてください。 |
| --もちろん他の好きな名前でもいいですよ。 | | --もちろん他の好きな名前でもいいですよ。 |
| -最後にnaskheloの中で 右クリック→新規作成→テキストドキュメント とやって、新規テキストドキュメントを作ります。そしてこれを、「askahelo.ask」に改名します。拡張子を変更するとどうたらこーたらとかいいますが、無視してOKしてください。 | | -最後にnaskheloの中で 右クリック→新規作成→テキストドキュメント とやって、新規テキストドキュメントを作ります。そしてこれを、「askahelo.ask」に改名します。拡張子を変更するとどうたらこーたらとかいいますが、無視してOKしてください。 |
| | | |
- | *** ソース作成 | + | *** ソース作成 [#y71691d0] |
| -さて、それではaskahelo.askを開いて、以下のソースをがしがしと入力してください。 | | -さて、それではaskahelo.askを開いて、以下のソースをがしがしと入力してください。 |
| --asmout文の中以外では、大文字小文字の区別があるので注意してください。 | | --asmout文の中以外では、大文字小文字の区別があるので注意してください。 |
| segment CODE(USE32, PARA); /* おまじない */ | | segment CODE(USE32, PARA); /* おまじない */ |
| default(code == CODE); /* おまじない */ | | default(code == CODE); /* おまじない */ |
| + | |
| asmout("[FILE 'askahelo.ask']"); /* nask編参照 */ | | asmout("[FILE 'askahelo.ask']"); /* nask編参照 */ |
| asmout("GLOBAL _OsaskMain"); | | asmout("GLOBAL _OsaskMain"); |
| + | |
| /* 最初の[SECTION .text]は省略可能なので省略 */ | | /* 最初の[SECTION .text]は省略可能なので省略 */ |
| + | |
| void _OsaskMain() | | void _OsaskMain() |
| { | | { |
| asmout("MOV EBX,data.func_init"); /* ASKAはラベルへのgoto以外はうまくできないので、やむなくasmout。 */ | | asmout("MOV EBX,data.func_init"); /* ASKAはラベルへのgoto以外はうまくできないので、やむなくasmout。 */ |
| CALL(0xc7, 0); | | CALL(0xc7, 0); |
| + | |
| asmout("MOV EBX,data.func_openwin"); CALL(0xc7, 0); | | asmout("MOV EBX,data.func_openwin"); CALL(0xc7, 0); |
| asmout("MOV EBX,data.func_titlebox"); CALL(0xc7, 0); | | asmout("MOV EBX,data.func_titlebox"); CALL(0xc7, 0); |
| /* 永久スリープなので帰ってこない */ | | /* 永久スリープなので帰ってこない */ |
| } | | } |
| + | |
| asmout("[SECTION .data]"); | | asmout("[SECTION .data]"); |
| + | |
| void data() | | void data() |
| { | | { |
| asmout("DD 0x0004, data.work, 0x0000"); | | asmout("DD 0x0004, data.work, 0x0000"); |
| /* ファンクション番号0x04(API初期化), ワークエリアのポインタ, 終了ファンクション番号0x00 */ | | /* ファンクション番号0x04(API初期化), ワークエリアのポインタ, 終了ファンクション番号0x00 */ |
| + | |
| func_openwin: | | func_openwin: |
| asmout("DD 0x0020, data.window, 0x0200, 18 * 8, 3 * 16, 0x0000"); | | asmout("DD 0x0020, data.window, 0x0200, 18 * 8, 3 * 16, 0x0000"); |
| /* ファンクション番号0x20(ウィンドウオープン), window構造体のポインタ, スロット番号0x200, | | /* ファンクション番号0x20(ウィンドウオープン), window構造体のポインタ, スロット番号0x200, |
| xサイズ(ドット単位), yサイズ(ドット単位), 終了ファンクション番号0x00 */ | | xサイズ(ドット単位), yサイズ(ドット単位), 終了ファンクション番号0x00 */ |
| + | |
| func_titlebox: | | func_titlebox: |
| asmout("DD 0x0028, 0x1000, data.wintitle, 0, 8, 1, 0, 0, data.window, 0x00c0, 0, 0x0000"); | | asmout("DD 0x0028, 0x1000, data.wintitle, 0, 8, 1, 0, 0, data.window, 0x00c0, 0, 0x0000"); |
| 表示x位置0, 表示y位置0, window構造体のポインタ, 標準キャラクタセット使用(0x00c0), | | 表示x位置0, 表示y位置0, window構造体のポインタ, 標準キャラクタセット使用(0x00c0), |
| 空白キャラクタ0, 終了ファンクション番号0x00 */ | | 空白キャラクタ0, 終了ファンクション番号0x00 */ |
| + | |
| func_settitle: | | func_settitle: |
| asmout("DD 0x0040, 0x1000, 0, 0, data.wintitle, 0, 0, 0, 8, 'askahelo', 0x0000"); | | asmout("DD 0x0040, 0x1000, 0, 0, data.wintitle, 0, 0, 0, 8, 'askahelo', 0x0000"); |
| 表示x位置0, 表示y位置0, textbox構造体のポインタ, 文字色0, 背景色0, キャラクタコードオフセット0, | | 表示x位置0, 表示y位置0, textbox構造体のポインタ, 文字色0, 背景色0, キャラクタコードオフセット0, |
| 文字数8, 文字列"naskhelo", 終了ファンクション番号0x00 */ | | 文字数8, 文字列"naskhelo", 終了ファンクション番号0x00 */ |
| + | |
| func_sleep: | | func_sleep: |
| DD(0x0018, 0x0001, 0, 0, 0x0000); | | DD(0x0018, 0x0001, 0, 0, 0x0000); |
| /* ファンクション番号0x0018(シグナル関係の処理), オプション1(スリープ), パラメータ0, | | /* ファンクション番号0x0018(シグナル関係の処理), オプション1(スリープ), パラメータ0, |
| パラメータ0, 終了ファンクション番号0x00 */ | | パラメータ0, 終了ファンクション番号0x00 */ |
| + | |
| ALIGNB(16); /* align8で十分だった気がするけど、なんとなく気分で */ | | ALIGNB(16); /* align8で十分だった気がするけど、なんとなく気分で */ |
| work: | | work: |
| RESB(64); /* 8文字分 (8 * 1 * 8) */ | | RESB(64); /* 8文字分 (8 * 1 * 8) */ |
| } | | } |
| + | |
| | | |
- | | + | *** どうやってアセンブルするの? [#v2c5e547] |
- | *** どうやってアセンブルするの? | + | |
| -まず、コンソールを開きます。開き方は使っているOSによって違います。 | | -まず、コンソールを開きます。開き方は使っているOSによって違います。 |
| --Win2000, WinXPなどのNT系: !cons_nt.batをダブルクリック | | --Win2000, WinXPなどのNT系: !cons_nt.batをダブルクリック |
| --nask版よりも1バイト小さいのは、ウィンドウタイトルの違いのせいです。ウィンドウタイトルを同じにすると、1バイトも違いません(サイズだけではなく、内容も)。 | | --nask版よりも1バイト小さいのは、ウィンドウタイトルの違いのせいです。ウィンドウタイトルを同じにすると、1バイトも違いません(サイズだけではなく、内容も)。 |
| | | |
- | *** どうやってテスト実行するの? | + | *** どうやってテスト実行するの? [#f739fe04] |
| -同じくコンソールから、make runとだけうってEnterを押してください。 | | -同じくコンソールから、make runとだけうってEnterを押してください。 |
| -しばらく待っていると、勝手にOSASKがエミュレータ環境で起動します。 | | -しばらく待っていると、勝手にOSASKがエミュレータ環境で起動します。 |
| -うまくいけばウィンドウが表示されます。 | | -うまくいけばウィンドウが表示されます。 |
| | | |
- | *** ほかのアセンブラになれている人へ | + | *** ほかのアセンブラになれている人へ [#mef0ee17] |
| -ASKAはあまりおすすめできない''アセンブラ''です。読むのはそんなに大変ではないのですが、書くのはえらく骨が折れます。また、将来ASKAの文法はマシになるような気がするので、わざわざ今の癖の強い書き方を覚えることもないでしょう。 | | -ASKAはあまりおすすめできない''アセンブラ''です。読むのはそんなに大変ではないのですが、書くのはえらく骨が折れます。また、将来ASKAの文法はマシになるような気がするので、わざわざ今の癖の強い書き方を覚えることもないでしょう。 |
| -asmout文の中はnaskの文法で書きます。不明なところは[[guide/nask]]を見てください。 | | -asmout文の中はnaskの文法で書きます。不明なところは[[guide/nask]]を見てください。 |
| //-asmout("[section .bss]");を使えばBSSも使えるはずなのですが、osa_dir2のnaskは古いので、うまくいきません。全部.dataセクションにいれちゃってください。大丈夫です、オールゼロのデータは適当に圧縮されるのでほとんど問題ありません。 | | //-asmout("[section .bss]");を使えばBSSも使えるはずなのですが、osa_dir2のnaskは古いので、うまくいきません。全部.dataセクションにいれちゃってください。大丈夫です、オールゼロのデータは適当に圧縮されるのでほとんど問題ありません。 |
| //--.bssが使えるバージョンをパッケージしたらここの記述は直しますね。 | | //--.bssが使えるバージョンをパッケージしたらここの記述は直しますね。 |
- | -tolset08のnaskは新しいやつなので、asmout("[section .bss]");もOKです。bssセクションでは、RESB/RESW/RESDしか使えます。 | + | -tolset08のnaskは新しいやつなので、asmout("[section .bss]");もOKです。bssセクションでは、RESB/RESW/RESDしか使えません。 |
| -RESB文は何かと言うと、DB dupみたいなものです。 RESB 256 は DB 256 dup (0) に相当します。 | | -RESB文は何かと言うと、DB dupみたいなものです。 RESB 256 は DB 256 dup (0) に相当します。 |
| --ASKAもnaskでも、DBなどでdup構文を使うことはできません。 | | --ASKAもnaskでも、DBなどでdup構文を使うことはできません。 |
| -ASKAでは、 #define とか #include が使えます。 #if も #else も #endif もつかえます(というかCのプリプロセッサをそのまま使っています)。 | | -ASKAでは、 #define とか #include が使えます。 #if も #else も #endif もつかえます(というかCのプリプロセッサをそのまま使っています)。 |
| | | |
- | *** ほかのOSのAPIになれている人へ | + | *** ほかのOSのAPIになれている人へ [#v3292595] |
| -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セクションに置いちゃいます。そうすればややこしいセグメントに悩まされずに済みますからね。 |
| | | |
- | *** 雑な説明 | + | *** 雑な説明 [#h76e09bb] |
| -結局のところ、これはAPI呼び出しCALLを5回やって、5つのAPIを実行しているだけです。 | | -結局のところ、これはAPI呼び出しCALLを5回やって、5つのAPIを実行しているだけです。 |
| -OSASKのAPIでは、必ず最後に終了ファンクション0x0000があります。これを書かないと、その次も通常ファンクションだとみなされます。逆にこの例の場合、5つのファンクションをつなげることもできるわけです。そうすればCALLは1回で済みます。 | | -OSASKのAPIでは、必ず最後に終了ファンクション0x0000があります。これを書かないと、その次も通常ファンクションだとみなされます。逆にこの例の場合、5つのファンクションをつなげることもできるわけです。そうすればCALLは1回で済みます。 |
| -それぞれについてパラメータの意味などは上記の説明を参考にしてください。 | | -それぞれについてパラメータの意味などは上記の説明を参考にしてください。 |
| | | |
- | *** もっと詳しく説明してくれー | + | *** もっと詳しく説明してくれー [#fa4206ce] |
| -そのうちやるかもしれません。このページは長くなったので別のページで。 | | -そのうちやるかもしれません。このページは長くなったので別のページで。 |
| -ほかのAPIとかも。 | | -ほかのAPIとかも。 |
| --[[GUIGUI00_man]] | | --[[GUIGUI00_man]] |
| | | |
- | * こめんと欄 | + | * こめんと欄 [#lcf78b69] |
| -ASKAによるプログラミングはおすすめしがたいところがあるので、このページはネタです。 -- [[K]] SIZE(10){2004-12-12 (日) 20:07:06} | | -ASKAによるプログラミングはおすすめしがたいところがあるので、このページはネタです。 -- [[K]] SIZE(10){2004-12-12 (日) 20:07:06} |
| -定数計算まわりのじゃじゃ馬なところが改善されて、naskレベルのラベルをthroughしてくれる機能があれば、結構おすすめできるんですけどねえ・・・。 -- [[K]] SIZE(10){2004-12-12 (日) 20:09:04} | | -定数計算まわりのじゃじゃ馬なところが改善されて、naskレベルのラベルをthroughしてくれる機能があれば、結構おすすめできるんですけどねえ・・・。 -- [[K]] SIZE(10){2004-12-12 (日) 20:09:04} |
| -tolset08にあわせて説明を修正。 -- [[K]] SIZE(10){2005-01-28 (金) 22:58:09} | | -tolset08にあわせて説明を修正。 -- [[K]] SIZE(10){2005-01-28 (金) 22:58:09} |
| + | //- eHRLAf <a href="http://vkeemeshseko.com/">vkeemeshseko</a>, [url=http://octxdasuwgsx.com/]octxdasuwgsx[/url], [link=http://izntuxgfzozm.com/]izntuxgfzozm[/link], http://fiwsutgbrytr.com/ -- ''ifearxbbu'' &new{2012-03-29 (木) 03:43:31}; |
| | | |
- | #comment | + | //#comment |