まずは開発環境の入手
- この記述は数ヶ月以内に更新されそうですが、とりあえず現状重視で。
- downloads/devのページへ行って、最新版のところの、「tolset08」というやつをダウンロードしてください(lzhでもsarでもどっちでもOK)。
- 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 ; 本当はalign8で十分(ただの気分で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です。
- tolset08で作った場合は多分127バイトです。
どうやってテスト実行するの?
- 同じくコンソールから、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が入ります。
- tolset08のnaskは新しいやつなので、[section .bss]も使えます。bssセクションでは、RESB/RESW/RESDしかつかえませんが。
- RESB文は何かと言うと、DB dupみたいなものです。 RESB 256 は DB 256 dup (0) に相当します。
- NASMもnaskでも、DBなどでdup構文を使うことはできません。
ほかの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セクションの内容を書き換えることはできません。リードオンリーです。無理やり書き換えようとすれば、一般保護例外になるだけです。
- ということが面倒極まりないので、普通は全部のデータを.dataセクションにおきます。リードオンリーのデータも.dataセクションに置いちゃいます。そうすればややこしいセグメントに悩まされずに済みますからね。
雑な説明
- 結局のところ、これは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 2004-12-11 (土) 20:23:30
- どうもありがとう。助かりました。 -- K 2004-12-11 (土) 20:52:16
- とりあえずこんなものでどうでしょうか?>nikaさん リクエストがなければこの先は書かないでおきます。 -- K 2004-12-12 (日) 00:06:53
- ありがとうございます。とりあえずいい感じです。 -- nika 2004-12-12 (日) 08:27:30
- ほとんどDOSでしかやった事無いので、できれば具体的なこの先をリクエストしておきます。 -- nika 2004-12-13 (月) 02:47:57
- 続編作りました。> guide/wintro0000 この先も、たまに続きを書きますね。 -- K 2004-12-13 (月) 16:40:05
- naskでAPI引数が分かりにくいと思う人は, nasmでマクロを使おう! と言ってみるテスト。私のnasmアプリはほぼ全てそう。 -- I.Tak. 2004-12-17 (金) 11:54:54
- tolset08を前提に改訂。 -- K 2005-01-28 (金) 22:49:31
Counter: 358,
today: 1,
yesterday: 0
Princeps date: 2004-12-11 (Sat) 18:57:52
Last-modified: 2010-12-11 (Sat) 00:00:00 (JST) (337d) by k-tan
|
Page Info | Can Read | Can Edit | |||
---|---|---|---|---|---|---|
Page Name : | guide/nask | Groups : | All visitors | Groups : | All visitors | |
Page owner : | k-tan | Users : | All visitors | Users : | All visitors | |
Page aliases : | None |