hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
OpenHSPのチュートリアル/AXファイル構造 - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

AXファイル構造

  • HSPは実行するとコンピューターが読み取りやすい形式に変換し中間コードを生成します。この中間コードのファイルをAXファイルといいます。実行したときに生成される start.ax や obj がこれに当たります。
  • AXファイルはhspcmp.dllによって生成され、ランタイム(hsp3.exeなど)がそれを解釈し実行します。
  • 詳しいフォーマットは hsp3code.txt に載っています。
  • AXフォーマットの中はヘッダ,CS,DS,OT ... といくつものブロックに分かれています。

それぞれのブロックの簡単な説明

ブロック説明
ヘッダHSPHED構造体ファイルの先頭。メタデータ(変数の数など)や各ブロックのオフセットや長さが格納されている
Code Segment(CS)unsigned shortの配列ソースコードからコンパイルした中間コード。
Data Segment(DS)charの配列文字列データや実数値データ。たとえば文字列リテラルはDSに文字列データが格納され、その(DS先頭からの)オフセットがCSに格納される
Object Temp(OT)intの配列ラベルIDに対応したCSのインデックス。
Debug Info(DINFO)unsigned charの配列変数名やソースコードの行番号などのデバッグに使われる情報。
Lib Info(LINFO)LIBDAT構造体の配列ロードするDLLの情報。DLLファイル名情報や実行時にDLLハンドルを格納するための場所
Func Info(FINFO)STRUCTDAT構造体の配列#func,#cfunc,#deffunc,#defcfuncなどで定義された命令・関数の情報。フラグ、関数名、パラメータの数、LINFOインデックス、MINFOインデックス、関数ポインタやラベルIDなど
Mod Info(MINFO)STRUCTPRM構造体の配列パラメータに関する情報。型情報など
HPI Info(HPIBUF)HPIDAT構造体の配列#regcmdで登録されるHSPプラグインに関する情報

Code Segment(CS) について

  • CSにはソースコードからコンパイルした中間コードが格納されています。
  • CS上には式が逆ポーランド記法の順番で格納されます。
  • スタックと逆ポーランド記法についての説明はここでは割愛しますが、例えば 「a = 1 + 2」 というHSPスクリプトはCS上に 「ID0の変数, =, 1, 2, +」 のような形で格納されています。(注:スタックにと逆ポーランド記法についての詳細は スタック - Wikipedia逆ポーランド記法 - Wikipedia をそれぞれ参照してください。)
  • CS内には Type, Ex0フラグ, Ex1フラグ, Ex2フラグ, Code の5つの値をセットにしたコードが並んでいます。一つのコードのサイズは32ビットもしくは48ビットです。Codeの値が0〜0xffffの場合はファイルサイズ削減のため32ビットになります。コードが48ビットか32ビットは最上位ビットで調べることができます。
  • 詳細はhsp3code.txtの「hsp3中間コードフォーマット」を参照。
  • Ex1フラグは文の先頭であることのフラグ、Ex2フラグは直前にカンマがあるフラグです。
  • Ex0フラグは、そのコードの値だけで1つの式になっていることを示すフラグです。文字列(TYPE_STRING)、実数(TYPE_DNUM)、整数(TYPE_INUM)のコードにのみつきます。
    • 実行時に式を計算するための準備を省略し、高速化するためのものです。

CS内がどんな構造になっているかは実際に簡単なスクリプトをコンパイルした結果を表示してみると理解しやすいと思います。

+  axファイルのCSを分かりやすく表示するスクリプト

このスクリプトで「mes 111 + 222」のCSを表示させてみると以下のようになります。

位置タイプ文頭カンマif/elseの飛び先値の意味
0TYPE_EXTCMD15yes--mes
2TYPE_INUM111---111
4TYPE_INUM222---222
6TYPE_MARK0---CALCCODE_ADD
8TYPE_PROGCMD17yes--stop
10TYPE_PROGCMD0yes--goto
12TYPE_LABEL0---8
  • タイプ、値、文頭、カンマがそれぞれ、Type値、Code値、Ex1値、Ex2値を表します。
  • 位置はunsigned short単位です。
  • 最後の3つ(stopとgoto)は自動的に末尾に追加されるコードです。

コメント

  • hsp3code.txtにあるFINFO2がよく分かりません!おしえてください! -- n? 2009-10-13 (火) 00:08:20
  • FINFO2は今は何にも使ってないですね。HSP2時代の名残みたいです。 -- fujidig? 2009-10-13 (火) 06:15:10

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2012-11-10 (土) 16:57:54 (393d)