サイトトップへ
OSASK.NET
  サイトトップへ       新掲示板(閉鎖済)   Wiki(凍結済)   旧掲示板(廃止済)   ニュース(廃止済)  
1: 2004-12-11 (土) 18:57:52 ソース 2: 2004-12-12 (日) 00:06:53 ソース
Line 4: Line 4:
*** まずは開発環境の入手 *** まずは開発環境の入手
-この記述は数ヶ月以内に更新されそうですが、とりあえず現状重視で。 -この記述は数ヶ月以内に更新されそうですが、とりあえず現状重視で。
 +-[[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

トップ   差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ
新着

目次
メンバー一覧


最新の20件
2016-10-01 2016-09-08
  • @MenuBar.
2016-09-07 2016-09-04 2016-08-15 2015-09-23 2014-07-30 2014-07-04 2014-02-04 2013-10-26 2013-06-21 2013-06-17 2013-06-15 2013-04-02 2013-02-09 2013-02-04 2012-12-25 2012-12-01 2012-05-28 2012-03-31

トピック一覧
一般用コメント最新
新掲示板lina
2016/9/5 20:58
SandBoxゲスト
2016/9/4 12:01
RecentDeletedlina
2015/6/2 19:29
Old-OSASK-MLlina
2014/6/29 9:14
hideyosi/メールhideyosi
2014/1/6 20:17
hideyosi/募集中lina
2013/11/8 19:56

このサイトは川合秀実から委託を受けて、OSASKコミュニティによって管理・運営されています。