サイトトップへ
OSASK.NET
  サイトトップへ       新掲示板(閉鎖済)   Wiki(凍結済)   旧掲示板(廃止済)   ニュース(廃止済)  
1: 2004-12-12 (日) 18:54:44 ソース 現: 2024-01-08 (月) 12:58:56 k-tan ソース
Line 1: Line 1:
-* 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]]のページへ行って、''最新版''のところの、「osa_dir2」というやつをダウンロードしてください。+-[[downloads/dev]]のページへ行って、''最新版''のところの、「tolset08」というやつをダウンロードしてください(lzhでもsarでもどっちでもOK)。
--2MB強ありますが、これはCコンパイラとかテストラン用のOSASKやエミュレータなどが入っているせいです。すみません。 --2MB強ありますが、これはCコンパイラとかテストラン用のOSASKやエミュレータなどが入っているせいです。すみません。
-これをどこでもいいですので、適当なところに解凍します。 -これをどこでもいいですので、適当なところに解凍します。
-*** プロジェクト作成+*** プロジェクト作成 [#acd950ca]
-次に、新規にアプリを作りますので、z_new_oというディレクトリを探してください。これをコピーして、同じディレクトリにペーストします。すると、「コピー ~ z_new_o」とかいう名前のフォルダができます。これを「askahelo」にリネームしてください。 -次に、新規にアプリを作りますので、z_new_oというディレクトリを探してください。これをコピーして、同じディレクトリにペーストします。すると、「コピー ~ z_new_o」とかいう名前のフォルダができます。これを「askahelo」にリネームしてください。
--もちろん他の好きな名前でもいいですよ。 --もちろん他の好きな名前でもいいですよ。
Line 18: Line 19:
-最後にnaskheloの中で 右クリック→新規作成→テキストドキュメント とやって、新規テキストドキュメントを作ります。そしてこれを、「askahelo.ask」に改名します。拡張子を変更するとどうたらこーたらとかいいますが、無視してOKしてください。 -最後にnaskheloの中で 右クリック→新規作成→テキストドキュメント とやって、新規テキストドキュメントを作ります。そしてこれを、「askahelo.ask」に改名します。拡張子を変更するとどうたらこーたらとかいいますが、無視してOKしてください。
-*** ソース作成+*** ソース作成 [#y71691d0]
-さて、それではaskahelo.askを開いて、以下のソースをがしがしと入力してください。 -さて、それではaskahelo.askを開いて、以下のソースをがしがしと入力してください。
---ニーモニックやレジスタ名が大文字になっていますが、もちろん小文字でも構いません。+--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);
Line 40: Line 41:
     /* 永久スリープなので帰ってこない */      /* 永久スリープなので帰ってこない */
 }  }
- +  
- asmout("[section .data]"); + asmout("[SECTION .data]"); 
 + 
 void data()  void data()
 {  {
Line 49: Line 50:
     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 * 3, 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:
-     DD 0x0028, 0x1000, wintitle, 0, 8, 1, 0, 0, window, 0x00c0, 0, 0x0000 +     asmout("DD 0x0028, 0x1000, data.wintitle, 0, 8, 1, 0, 0, data.window, 0x00c0, 0, 0x0000"); 
- ファンクション番号0x28(テキストボックスオープン), オプション0x1000(ウィンドウタイトルモード), textbox構造体のポインタ, 背景色0+    /* ファンクション番号0x28(テキストボックスオープン), オプション0x1000(ウィンドウタイトルモード), 
- ;      xサイズ(キャラクタ単位), yサイズ(キャラクタ単位), 表示x位置0, 表示y位置0, window構造体のポインタ, +        textbox構造体のポインタ, 背景色0, xサイズ(キャラクタ単位), yサイズ(キャラクタ単位), 
- ;      標準キャラクタセット使用(0x00c0), リザーブ0, 終了ファンクション番号0x00 +         表示x位置0, 表示y位置0, window構造体のポインタ, 標準キャラクタセット使用(0x00c0)
 +        空白キャラクタ0, 終了ファンクション番号0x00 */ 
 + 
 func_settitle:  func_settitle:
-     DD 0x0040, 0x1000, 0, 0, wintitle, 0, 0, 0, 8, "naskhelo", 0x0000 +     asmout("DD 0x0040, 0x1000, 0, 0, data.wintitle, 0, 0, 0, 8, 'askahelo', 0x0000"); 
- ファクション番号0x40(テキスト表示), オプション0x1000(8bitキャラクタモード),   表示x位置0, 表示y位置0, textbox構造体のポインタ, +    /* ファクション番号0x40(テキスト表示), オプション0x1000(8bitキャラクタモード), 
- ;      文字色0, 背景色0, キャラクタコードオフセット0, 文字数8, 文字列"naskhelo", 終了ファンクション番号0x00 +         表示x位置0, 表示y位置0, textbox構造体のポインタ, 文字色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+  
 +     ALIGNB(16); /* align8で十分だった気がするけど、なんとなく気分で */
 work:  work:
-     RESB 256 ; func_initに必要な256バイトのワークエリア+     RESB(256); /* func_initに必要な256バイトのワークエリア */
 window:  window:
-     RESB 128 ; ウィンドウ構造体+     RESB(128); /* ウィンドウ構造体 */
 wintitle:  wintitle:
-     RESB 64 ; テキストボックス構造体 +     RESB(64); /* テキストボックス構造体 */ 
-     RESB  8 * 1 * 8 ; 8文字分+     RESB(64); /* 8文字分 (8 * 1 * 8) */ 
 + } 
 + ;
-*** どうやってアセンブルするの?+*** どうやってアセンブルするの? [#v2c5e547]
-まず、コンソールを開きます。開き方は使っているOSによって違います。 -まず、コンソールを開きます。開き方は使っているOSによって違います。
--Win2000, WinXPなどのNT系: !cons_nt.batをダブルクリック --Win2000, WinXPなどのNT系: !cons_nt.batをダブルクリック
Line 88: Line 91:
-コンソールが出てきたら、makeとだけうってEnterを押してください。 -コンソールが出てきたら、makeとだけうってEnterを押してください。
-これだけでリンクまで全自動でやってくれます。 -これだけでリンクまで全自動でやってくれます。
--できたアプリは、naskhelo.binです。 +-できたアプリは、askahelo.binです。 
---osa_dir2で作った場合は多分161バイトです。+//--osa_dir2で作った場合は多分160バイトです。 
 +--tolset08で作った場合は多分126バイトです。 
 +--nask版よりも1バイト小さいのは、ウィンドウタイトルの違いのせいです。ウィンドウタイトルを同じにすると、1バイトも違いません(サイズだけではなく、内容も)。
-*** どうやってテスト実行するの?+*** どうやってテスト実行するの? [#f739fe04]
-同じくコンソールから、make runとだけうってEnterを押してください。 -同じくコンソールから、make runとだけうってEnterを押してください。
-しばらく待っていると、勝手にOSASKがエミュレータ環境で起動します。 -しばらく待っていると、勝手にOSASKがエミュレータ環境で起動します。
Line 97: Line 102:
-うまくいけばウィンドウが表示されます。 -うまくいけばウィンドウが表示されます。
-*** ほかのアセンブラになれている人へ +*** ほかのアセンブラになれている人へ [#mef0ee17] 
--naskはMASMとかとは少し文法が違います。NASMの文法とほとんど同じです。 +-ASKAはあまりおすすめできない''アセンブラ''です。読むのはそんなに大変ではないのですが、書くのはえらく骨が折れます。また、将来ASKAの文法はマシになるような気がするので、わざわざ今の癖の強い書き方を覚えることもないでしょう。 
--GLOBAL文はいわゆるPUBLIC文です。 +-asmout文の中はnaskの文法で書きます。不明なところは[[guide/nask]]を見てください。 
--ラベルの扱いですが、何も書かないとみんなOFFSET指定とみなされます。というかOFFSETを書いたらエラーです。したがって +//-asmout("[section .bss]");を使えばBSSも使えるはずなのですが、osa_dir2のnaskは古いので、うまくいきません。全部.dataセクションにいれちゃってください。大丈夫です、オールゼロのデータは適当に圧縮されるのでほとんど問題ありません。 
-     MOV EBX,func_init +//--.bssが使えるバージョンをパッケージしたらここの記述は直しますね。 
--は、EBXに4が入るわけではなく、アドレスが入ります。メモリを参照させたいときは、[]でくくります。 +-tolset08のnaskは新しいやつなので、asmout("[section .bss]");もOKです。bssセクションでは、RESB/RESW/RESDしか使えません。
-     MOV EBX,[func_init+
--こうすればEBXには4が入ります。 +
--[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構文を使うことはできません。+--ASKAもnaskでも、DBなどでdup構文を使うことはできません。 
 +-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の呼び出しは、以下のようにやってもいいのです。
-     PUSH 0 +     PUSH(0); 
-     PUSH work +     asmout("PUSH data.work"); 
-     PUSH 4 +     PUSH(4); 
-     MOV  EBX,ESP +     EBX = ESP; 
-     CALL 0xc7:+     CALL(0xc7, 0); 
-     ADD  ESP,12+     ESP += 12;
-OSASKアプリのメモリモデルは、DS == ES == SS != CS です。つまり.textセクション内のデータにアクセスするにはCS:プリフィクスが必須です。また、PUSH(CS); POP(ES);などをやってESにCSのセレクタを代入しても、.textセクションの内容を書き換えることはできません。リードオンリーです。無理やり書き換えようとすれば、一般保護例外になるだけです。 -OSASKアプリのメモリモデルは、DS == ES == SS != CS です。つまり.textセクション内のデータにアクセスするにはCS:プリフィクスが必須です。また、PUSH(CS); POP(ES);などをやってESにCSのセレクタを代入しても、.textセクションの内容を書き換えることはできません。リードオンリーです。無理やり書き換えようとすれば、一般保護例外になるだけです。
--ということが面倒極まりないので、普通は全部のデータを.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回で済みます。
-ファンクション0x0004は、[[gg00man/others]]の''lib_init''に相当します。 -ファンクション0x0004は、[[gg00man/others]]の''lib_init''に相当します。
---naskでの呼び出しでは、0を指定したら自動malloc、というサービスはありません。+--ASKAでの呼び出しでは、0を指定したら自動malloc、というサービスはありません。
-ファンクション0x0020は、[[gg00man/window]]の''lib_openwindow''に相当します。 -ファンクション0x0020は、[[gg00man/window]]の''lib_openwindow''に相当します。
---naskでの呼び出しでは、0を指定したら自動malloc、というサービスはありません。+--ASKAでの呼び出しでは、0を指定したら自動malloc、というサービスはありません。
-ファンクション0x0028は、[[gg00man/text]]の''lib_opentextbox''に相当します。 -ファンクション0x0028は、[[gg00man/text]]の''lib_opentextbox''に相当します。
---naskでの呼び出しでは、0を指定したら自動malloc、というサービスはありません。+--ASKAでの呼び出しでは、0を指定したら自動malloc、というサービスはありません。
-ファンクション0x0040は、[[gg00man/text]]の''lib_putstring1''に相当します。 -ファンクション0x0040は、[[gg00man/text]]の''lib_putstring1''に相当します。
--optのbit14が0になっているところが違いますが。 --optのbit14が0になっているところが違いますが。
Line 136: Line 138:
-それぞれについてパラメータの意味などは上記の説明を参考にしてください。 -それぞれについてパラメータの意味などは上記の説明を参考にしてください。
-*** もっと詳しく説明してくれー+*** もっと詳しく説明してくれー [#fa4206ce]
-そのうちやるかもしれません。このページは長くなったので別のページで。 -そのうちやるかもしれません。このページは長くなったので別のページで。
-ほかのAPIとかも。 -ほかのAPIとかも。
Line 145: Line 147:
--[[GUIGUI00_man]] --[[GUIGUI00_man]]
-* こめんと欄 +* こめんと欄 [#lcf78b69] 
--直ってしまったので、勝手に修正してしまいました。コメントアウトしてあります。 -- ''Zakky'' SIZE(10){2004-12-11 () 20:23:30+-ASKAによるプログラミングはおすすめしがたいところがあるので、このページはネタです。 -- [[K]] SIZE(10){2004-12-12 () 20:07:06
--どうもありがとう。助かりました。 -- [[K]] SIZE(10){2004-12-11 () 20:52:16+-定数計算まわりのじゃじゃ馬なところが改善されて、naskレベルのラベルをthroughしてくれる機能があれば、結構おすすめできるんですけどねえ・・・。 -- [[K]] SIZE(10){2004-12-12 () 20:09:04
--とりあえずこんなものでどうでしょうか?>nikaさん  リクエストがなければこの先は書かないでおきます。 -- [[K]] SIZE(10){2004-12-12 () 00:06:53+-tolset08にあわせて説明を修正。 -- [[K]] SIZE(10){2005-01-28 () 22:58:09
--ありがとうございます。とりあえずいい感じです。 -- ''nika'' SIZE(10){2004-12-12 () 08:27:30}+//- 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

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

目次
メンバー一覧


最新の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コミュニティによって管理・運営されています。