1: 2004-12-11 (土) 18:57:52 |
2: 2004-12-12 (日) 00:06:53 |
| *** まずは開発環境の入手 | | *** まずは開発環境の入手 |
| -この記述は数ヶ月以内に更新されそうですが、とりあえず現状重視で。 | | -この記述は数ヶ月以内に更新されそうですが、とりあえず現状重視で。 |
| + | -[[downloads/dev]]のページへ行って、''最新版''のところの、「osa_dir2」というやつをダウンロードしてください。 |
| + | --2MB強ありますが、これはCコンパイラとかテストラン用のOSASKやエミュレータなどが入っているせいです。すみません。 |
| + | -これをどこでもいいですので、適当なところに解凍します。 |
| | | |
| + | *** プロジェクト作成 |
| + | -次に、新規にアプリを作りますので、z_new_oというディレクトリを探してください。これをコピーして、同じディレクトリにペーストします。すると、「コピー ~ z_new_o」とかいう名前のフォルダができます。これを「naskhelo」にリネームしてください。 |
| + | --もちろん他の好きな名前でもいいですよ。 |
| + | -改名が済んだら、naskheloの中に入って、Makefileを探し、これをテキストエディタで開きます。とりあえずはメモ帳で十分です。 |
| + | -そして一番上の行のTARGETの記述を以下のように直します。 |
| + | TARGET = naskhelo |
| + | -最後にnaskheloの中で 右クリック→新規作成→テキストドキュメント とやって、新規テキストドキュメントを作ります。そしてこれを、「naskhelo.nas」に改名します。拡張子を変更するとどうたらこーたらとかいいますが、無視してOKしてください。 |
| + | |
| + | *** ソース作成 |
| + | -さて、それではnaskhelo.nasを開いて、以下のソースをがしがしと入力してください。 |
| + | --ニーモニックやレジスタ名が大文字になっていますが、もちろん小文字でも構いません。 |
| + | [FORMAT "WCOFF"] |
| + | [INSTRSET "i486p"] |
| + | [OPTIMIZE 1] |
| + | [BITS 32] |
| + | [FILE "naskhelo.nas"] |
| + | ; 以上6行はおまじない。COFFモード、486命令利用可能、最適化ON、32bitモード、ソースファイル名。 |
| + | [SECTION .text] |
| + | GLOBAL _OsaskMain |
| + | _OsaskMain: |
| + | MOV EBX,func_init |
| + | CALL 0xc7:0 |
| + | MOV EBX,func_openwin |
| + | CALL 0xc7:0 |
| + | MOV EBX,func_titlebox |
| + | CALL 0xc7:0 |
| + | MOV EBX,func_settitle |
| + | CALL 0xc7:0 |
| + | MOV EBX,func_sleep |
| + | CALL 0xc7:0 |
| + | ; 永久スリープなので帰ってこない |
| + | |
| + | [SECTION .data] |
| + | ALIGNB 4 |
| + | |
| + | func_init: |
| + | DD 0x0004, work, 0x0000 |
| + | ; ファンクション番号0x04(API初期化), ワークエリアのポインタ, 終了ファンクション番号0x00 |
| + | |
| + | func_openwin: |
| + | DD 0x0020, window, 0x0200, 18 * 8, 3 * 16, 0x0000 |
| + | ; ファンクション番号0x20(ウィンドウオープン), window構造体のポインタ, スロット番号0x200, xサイズ(ドット単位), yサイズ(ドット単位), |
| + | ; 終了ファンクション番号0x00 |
| + | |
| + | func_titlebox: |
| + | DD 0x0028, 0x1000, wintitle, 0, 8, 1, 0, 0, window, 0x00c0, 0, 0x0000 |
| + | ; ファンクション番号0x28(テキストボックスオープン), オプション0x1000(ウィンドウタイトルモード), textbox構造体のポインタ, 背景色0, |
| + | ; xサイズ(キャラクタ単位), yサイズ(キャラクタ単位), 表示x位置0, 表示y位置0, window構造体のポインタ, |
| + | ; 標準キャラクタセット使用(0x00c0), リザーブ0, 終了ファンクション番号0x00 |
| + | |
| + | func_settitle: |
| + | DD 0x0040, 0x1000, 0, 0, wintitle, 0, 0, 0, 8, "naskhelo", 0x0000 |
| + | ; ファクション番号0x40(テキスト表示), オプション0x1000(8bitキャラクタモード), 表示x位置0, 表示y位置0, textbox構造体のポインタ, |
| + | ; 文字色0, 背景色0, キャラクタコードオフセット0, 文字数8, 文字列"naskhelo", 終了ファンクション番号0x00 |
| + | |
| + | func_sleep: |
| + | DD 0x0018, 0x0001, 0, 0, 0x0000 |
| + | ; ファンクション番号0x0018(シグナル関係の処理), オプション1(スリープ), パラメータ0, パラメータ0, 終了ファンクション番号0x00 |
| + | |
| + | ALIGNB 16 |
| + | work: |
| + | RESB 256 ; func_initに必要な256バイトのワークエリア |
| + | window: |
| + | RESB 128 ; ウィンドウ構造体 |
| + | wintitle: |
| + | RESB 64 ; テキストボックス構造体 |
| + | RESB 8 * 1 * 8 ; 8文字分 |
| + | |
| + | *** どうやってアセンブルするの? |
| + | -まず、コンソールを開きます。開き方は使っているOSによって違います。 |
| + | --Win2000, WinXPなどのNT系: !cons_nt.batをダブルクリック |
| + | --Win95, Win98などの9X系: !cons_9x.batをダブルクリック |
| + | -コンソールが出てきたら、makeとだけうってEnterを押してください。 |
| + | -これだけでリンクまで全自動でやってくれます。 |
| + | -できたアプリは、naskhelo.binです。 |
| + | --osa_dir2で作った場合は多分161バイトです。 |
| + | |
| + | *** どうやってテスト実行するの? |
| + | -同じくコンソールから、make runとだけうってEnterを押してください。 |
| + | -しばらく待っていると、勝手にOSASKがエミュレータ環境で起動します。 |
| + | -で、pokonの一番上の、 !BUILT.BIN を実行してください。 |
| + | -うまくいけばウィンドウが表示されます。 |
| + | |
| + | *** ほかのアセンブラになれている人へ |
| + | -naskはMASMとかとは少し文法が違います。NASMの文法とほとんど同じです。 |
| + | -GLOBAL文はいわゆるPUBLIC文です。 |
| + | -ラベルの扱いですが、何も書かないとみんなOFFSET指定とみなされます。というかOFFSETを書いたらエラーです。したがって |
| + | MOV EBX,func_init |
| + | -は、EBXに4が入るわけではなく、アドレスが入ります。メモリを参照させたいときは、[]でくくります。 |
| + | MOV EBX,[func_init] |
| + | -こうすればEBXには4が入ります。 |
| + | -[section .bss]を使えばBSSも使えるはずなのですが、osa_dir2のnaskは古いので、うまくいきません。全部.dataセクションにいれちゃってください。大丈夫です、オールゼロのデータは適当に圧縮されるのでほとんど問題ありません。 |
| + | --.bssが使えるバージョンをパッケージしたらここの記述は直しますね。 |
| + | -RESB文は何かと言うと、DB dupみたいなものです。 RESB 256 は DB 256 dup (0) に相当します。 |
| + | |
| + | *** ほかのOSのAPIになれている人へ |
| + | -OSASKではAPI呼び出しはメモリを経由したポインタ渡しです。メモリにファンクション番号とパラメータを並べて、その先頭アドレスをEBXにいれて、CALL 0xc7:0をするだけです。正常終了する限りにおいて、EBX以外のレジスタは保存されます(ファンクション0x04を除く)。フラグは保存されません。 |
| + | -毎回.dataセクションにパラメータをだらだら書かないといけないのか、という誤解をする人がいますが、そんなことはありません。スタック渡しっぽいことも簡単にできます。たとえばfunc_initの呼び出しは、以下のようにやってもいいのです。 |
| + | PUSH 0 |
| + | PUSH work |
| + | PUSH 4 |
| + | MOV EBX,ESP |
| + | CALL 0xc7:0 |
| + | ADD ESP,12 |
| + | -OSASKアプリのメモリモデルは、DS == ES == SS != CS です。つまり.textセクション内のデータにアクセスするにはCS:プリフィクスガ必須です。また、PUSH(CS); POP(ES);などをやってESにCSのセレクタを代入しても、.textセクションの内容を書き換えることはできません。リードオンリーです。無理やり書き換えようとすれば、一般保護例外になるだけです。 |
| + | |
| + | *** 雑な説明 |
| + | -結局のところ、これはAPI呼び出しCALLを5回やって、5つのAPIを実行しているだけです。 |
| + | -OSASKのAPIでは、必ず最後に終了ファンクション0x0000があります。これを書かないと、その次も通常ファンクションだとみなされます。逆にこの例の場合、5つのファンクションをつなげることもできるわけです。そうすればCALLは1回で済みます。 |
| + | -ファンクション0x0004は、[[gg00man/others]]の''lib_init''に相当します。 |
| + | --naskでの呼び出しでは、0を指定したら自動malloc、というサービスはありません。 |
| + | -ファンクション0x0020は、[[gg00man/window]]の''lib_openwindow''に相当します。 |
| + | --naskでの呼び出しでは、0を指定したら自動malloc、というサービスはありません。 |
| + | -ファンクション0x0028は、[[gg00man/text]]の''lib_opentextbox''に相当します。 |
| + | --naskでの呼び出しでは、0を指定したら自動malloc、というサービスはありません。 |
| + | -ファンクション0x0040は、[[gg00man/text]]の''lib_putstring1''に相当します。 |
| + | --optのbit14が0になっているところが違いますが。 |
| + | -ファンクション0x0018は、[[gg00man/signal]]の''lib_waitsignal''に相当します。 |
| + | -それぞれについてパラメータの意味などは上記の説明を参考にしてください。 |
| + | |
| + | *** もっと詳しく説明してくれー |
| + | -そのうちやるかもしれません。このページは長くなったので別のページで。 |
| + | -ほかのAPIとかも。 |
| + | ~ |
| + | ~ |
| + | -待てない人のための参考資料: |
| + | --I.Tak.さんのAPI資料: http://user.ecc.u-tokyo.ac.jp/~t40370/osask/p0cref.html |
| + | --[[GUIGUI00_man]] |
| | | |
| * こめんと欄 | | * こめんと欄 |
| + | -直ってしまったので、勝手に修正してしまいました。コメントアウトしてあります。 -- ''Zakky'' SIZE(10){2004-12-11 (土) 20:23:30} |
| + | -どうもありがとう。助かりました。 -- [[K]] SIZE(10){2004-12-11 (土) 20:52:16} |
| + | -とりあえずこんなものでどうでしょうか?>nikaさん リクエストがなければこの先は書かないでおきます。 -- [[K]] SIZE(10){2004-12-12 (日) 00:06:53} |
| + | |
| #comment | | #comment |