コンパイル
本章では、OpenFrame ASMコンパイラを使用してASMコードをコンパイルする方法について説明します。
1. コンパイルの方法
OpenFrame ASMコンパイラは、ASMコードをコンパイルしてOpenFrame ASMの仮想マシン(VM:Virtual Machine)で使用するためのオブジェクト・ファイルを生成します。
ASMコードをコンパイルしてオブジェクト・コードを生成する方法は次のとおりです。ファイル名に .asm
拡張子を使用することに注意してください。
ofasm -E <ファイル名>.asm
コンパイル・プロセスは前処理とアセンブリの2つのステップで行われます。各ステップを別々に実行することもできます。
-
前処理方法
.asm
ファイルを前処理すると、前処理ファイルの.asmi
ファイルが作成されます。前処理プロセスでは、マクロ命令と条件付きアセンブリ命令を解析して実行します。OpenFrame ASMの前処理は、以下のように実行します。
ofasm -E <ファイル名>.asm
-
アセンブリ方法
.asmi
ファイルをアセンブリすると、.asmo
ファイルが作成されます。.asmo
ファイルは、OpenFrame ASMのVMが実行できる形式のファイルです。OpenFrame ASMアセンブリは、以下のように実行します。
ofasm -S <ファイル名>.asmi
2. ofasmコマンド
以下は、OpenFrame ASMでコンパイル・コマンドを使用する方法です。
ofasm ソースファイル ... [コマンドオプション...]
-
ソース・ファイル
ASMソース・ファイルとして認識させるには、ファイルの拡張子がasmである必要があります。
-
コマンド・オプション
以下は、ソース・ファイルをコンパイルするためのデフォルト・コマンド・オプションです。
オプション 説明 -o <ファイル名>
オブジェクト・ファイル名を指定します。このオプションを使用しない場合は、
<入力ファイル名>.asmo
に指定されます。--debug
前処理やコンパイル関連のログ・メッセージを表示します。
-L <dir>
マクロ・ライブラリのパスを設定します。
-h(H) または --help
ヘルプを表示します。
--version
OpenFrame ASMのバージョン情報を表示します。
-E
前処理プロセスのみを実行します。入力として
.asm
ファイルを受け取り、出力としては.asmi
ファイルを生成します。-S
アセンブリ・プロセスのみを実行します。入力として
.asmi
ファイルを受け取り、出力としては.asmo
ファイルを生成します。--enable-cics
CICSライブラリを有効にします。
--list
OpenFrame ASMでサポートできるmacro、copybookとmachineおよびassembler instruction、outdated instructionを表示します。
-x <params..>
コマンドラインでユーザーが指定したパラメータに対し、アセンブラ・プログラムを実行します。パラメータは16進の値のみを使用できます。
-f <filepath>
このオプションは、-xオプションが指定されている場合にのみ使用できます。パラメータの情報を定義したJSON形式のファイルを指定します。
-r <reg_no> <value>
このオプションは、-xオプションが指定されている場合にのみ使用できます。実行する前のレジスタの値を指定します。
--entry <entryname>
このオプションは、-xオプションが指定されている場合にのみ使用できます。実行するエントリ名を指定します。
--save-punch
PUNCHレコード情報の出力ファイルを生成します。
--enable-spm
構造化プログラミング(Structured programming)マクロを有効にします。
--license
ライセンス情報を表示します。
--force-rmode31
対象プログラムのオブジェクト・コードは、31ビットRMODEが強制適用されます。
--no-reuse
対象プログラムは、OpenFrame ASMにロードされるたびにプログラム・インスタンスが新しく生成されます。
--sysparm <string>
対象プログラムの前処理に使用される&SYSPARMの値を指定します。
--enable-outdated
対象プログラムに対し、古いバージョンのコマンドを使用するように設定します。対象コマンドは、--listオプションを使用したときに出力される「outdated instruction」を参照してください。
--amode <24,31,ANY>
コンパイル時に使用するアドレス・モードを指定します。この値は、対象ファイルに定義されているAMODE値を上書きします。
--rmode <24,31,ANY>
コンパイル時に使用するレジデンス・モードを指定します。この値は、対象ファイルに定義されているRMODE値を上書きします。
--report
アセンブル時の詳細情報を {ファイル名}.asmrという別ファイルに出力します。この情報には、ロケーション・カウンターやオブジェクト・コードなどのアセンブル情報、およびバージョン、オプション、コンパイル日時が含まれます。
3. 環境設定ファイル
OpenFrame ASMでコンパイルタイムおよびランタイムに適用されるオプションは、properties.confを使用して設定できます。コンパイルタイムに適用されるオプションを変更する場合は、すべてのアセンブラ・ファイルを再コンパイルしてから実行する必要があります。
-
パス
$OFASM_HOME/config/properties.conf
-
オプション
{ "OFASM_LOG" : { "ONLINE" : { "OFASM_LOG_LEVEL": 0, "OFASM_LOG_AFTER": 0 }, "BATCH" : { "OFASM_LOG_LEVEL": 0, "OFASM_LOG_AFTER": 0 }, "RUNTIME" : { "SVC" : "OFF", "CICS" : "OFF", "SYSTEM" : "OFF", "UTIL" : "OFF", "FILE I/O" : "OFF" } }, "NETCOBOL_COMPATIBLE" : "OFF", "MAKE_PLIST_IN_EXIT" : "OFF", "CHECK_OBJ_VERSION" : "OFF", "VM_MEMORY_SIZE" : 0, "USE_CODE_CONVERSION" : { "ASCII_TO_EBCDIC" : "", "EBCDIC_TO_ASCII" : "", "SORT_TYPE" : 0 }, "HEAP_MONITOR" : "OFF", "USE_TCFH_FILE_IO" : "NO", "FORCE_RMODE_31" : [], "USER_SVC" : {} }
OFASM_LOG
ASMプログラムの実行中にstdoutとして出力されるログのオプションを設定することができます。OFASM_LOGの設定は、別途のデバッグ・バイナリでのみ適用されます。
-
BATCH/ONLINE:ログレベルや、何件目のログから出力するかを設定できます。
-
RUNTIME:ランタイム・モジュールごとにログの出力をオンまたはオフにできます。
このオプションは、ランタイムでのみ適用されます。 |
BATCH/ONLINE
ONLINE / BATCH : Onine、Batch製品に適用するログ・オプションを設定します。
設定値 | 説明 |
---|---|
OFASM_LOG_LEVEL |
ログ・レベルを設定します。整数値のみ指定できます。
|
OFASM_LOG_AFTER |
何番目のログから出力するかを設定します。整数値のみ指定できます。
|
以下は、各ログレベルによる出力結果の例です。
-
Level 1: 一部の無視できるエラーを出力します。
-
Level 2: Level 1に加え、分岐時の対象ラベルとOFASM内でプログラムの切り替え時にプログラム名を出力します。
// 初期状態(VM_ENTER)からTESTプログラムに切り替えます。 [VM_ENTER] (VM_ENTER) > (TEST ) // TESTラベルに分岐します。アドレスは0x0001f7b0です。 [TEST ] 0001f7b0 >> (TEST)TEST Addr=[0000000000128954], Length=[0000000000000005], Hex=[0x48454c4c4f], Char=[HELLO] // TESTプログラムから指定されていないプログラムのXXXXXXXXに切り替えます。 [TEST ] (TEST ) > (XXXXXXXX) // XXXXXXXXからVMRETURNに戻ります。 [XXXXXXXX] (XXXXXXXX) > (VMRETURN)
-
Level 3: Level 2に加え、実行された機械語命令を出力します。
[VM_ENTER] (VM_ENTER) > (TEST ) [TEST ] 0001f7b0 >> (TEST)TEST [TEST ] 0001f7b0 >> LR 12,15 [TEST ] 0001f7b2 >> DBGMEM 10(5,12),2(0) Addr=[0000000000128954], Length=[0000000000000005], Hex=[0x48454c4c4f], Char=[HELLO] [TEST ] 0001f7b8 >> BCR 15,14 [TEST ] 0001f7b8 >> 00002000 [TEST ] (TEST ) > (XXXXXXXX) [XXXXXXXX] (XXXXXXXX) > (VMRETURN)
-
Level 4: Level 3に加え、実行された機械語命令の前に実行された順序を付けます。
[VM_ENTER][0000000000] (VM_ENTER) > (TEST ) [TEST ][0000000001] 0001f7b0 >> (TEST)TEST [TEST ][0000000001] 0001f7b0 >> LR 12,15 [TEST ][0000000002] 0001f7b2 >> DBGMEM 10(5,12),2(0) Addr=[0000000000128954], Length=[0000000000000005], Hex=[0x48454c4c4f], Char=[HELLO] [TEST ][0000000003] 0001f7b8 >> BCR 15,14 [TEST ][0000000003] 0001f7b8 >> 00002000 [TEST ][0000000003] (TEST ) > (XXXXXXXX) [XXXXXXXX][0000000004] (XXXXXXXX) > (VMRETURN)
-
Level 5: Level 4に加え、プログラムの切り替えとリターン時のパラメータ情報やその他の詳しいログを出力します。
// VMの起動 [VM_ENTER][0000000000] VM::start() // プログラムのロード・ステップ [VM_ENTER][0000000000] Loader::loadProgram() // ASMプログラムのロード・ステップ [VM_ENTER][0000000000] Loader::loadAsmProgram() // 現在のプログラムのRMODEが24に決定 [VM_ENTER][0000000000] Global RMODE : 24 // ロードするプログラム・ファイルのパス [VM_ENTER][0000000000] ./TEST.asmo[REUSE] // プログラム・ファイル内のエントリ名 [VM_ENTER][0000000000] TEST [VM_ENTER][0000000000] (VM_ENTER) > (TEST ) // パラメータのロード・ステップ [TEST ][0000000000] Loader::loadParameters() // パラメータ・リストの作成ステップ [TEST ][0000000000] Loader::buildParameterAddressList() [TEST ][0000000001] 0001f7b0 >> (TEST)TEST [TEST ][0000000001] 0001f7b0 >> LR 12,15 [TEST ][0000000002] 0001f7b2 >> DBGMEM 10(5,12),2(0) Addr=[0000000000128954], Length=[0000000000000005], Hex=[0x48454c4c4f], Char=[HELLO] [TEST ][0000000003] 0001f7b8 >> BCR 15,14 [TEST ][0000000003] 0001f7b8 >> 00002000 [TEST ][0000000003] (TEST ) > (XXXXXXXX) // パラメータ・リストの解放ステップ [XXXXXXXX][0000000004] Loader::freeParameterAddressList() // パラメータ・リストの返却ステップ [XXXXXXXX][0000000004] Loader::storeParameters() [XXXXXXXX][0000000004] VM::end() // VMの終了 [XXXXXXXX][0000000004] (XXXXXXXX) > (VMRETURN)
ログ内のプログラム名「XXXXXXX」は、ユーザーがロードしていないプログラム、またはシステムが提供するプログラムの場合に出力されるプログラム名です。 |
RUNTIME
-
"SVC"
-
"ON"に設定すると、SVCを呼び出した場合に使用されたSVC番号に対応するマクロ名と詳細情報が出力されます。
-
-
"CICS"
-
"ON"に設定すると、発行されたCICSコマンドのうち、OFASMが別途処理するコマンド名とその詳細情報が出力されます。
-
-
"SYSTEM"
-
"ON"に設定すると、GENCBやRPLなど、OFASM内部でSYSTEM関数を呼び出した場合に、そのシステム関数名と詳細情報が出力されます。
-
-
"UTIL"
-
"ON"に設定すると、IDCAMSやDFSORTなどのOpenFrameユーティリティが呼び出された際に、ユーティリティ名とパラメータ情報が出力されます。
-
-
"FILE I/O"
-
"ON"に設定すると、GETやPUTのようにデータセットに対する入出力マクロが発行された場合、対象データセットの情報と入出力内容が出力されます。
-
NETCOBOL_COMPATIBLE
NetCOBOL製品とOpenFrame ASMを一緒に使用する場合は、このフィールドをONにしてください。
このオプションは、コンパイルタイムとランタイムで適用されます。
設定値 | 説明 |
---|---|
OFF |
NetCOBOLと互換しません。(デフォルト値) |
ON |
NetCOBOLと互換します。 |
MAKE_PLIST_IN_EXIT
EXITインターフェースを使用してASM以外のアプリケーションを呼び出すとき、固定パラメータ(fixed parameter)形式の場合はこのフィールドをONにして使用します。このオプションは、インターフェース4バージョンでのみ有効です。
このオプションは、インターフェース切り替え時間とランタイムで適用されます。
設定値 | 説明 |
---|---|
OFF |
可変パラメータ形式であり、パラメータが10個以下の場合に使用できます。(デフォルト値) |
ON |
固定パラメータ形式であり、パラメータの数が指定されていない場合に使用します。 |
CHECK_OBJ_VERSION
ランタイム時に実行するモジュールと現在のofasmバージョンを比較し、異なる場合に警告メッセージを出力します。
このオプションは、ランタイムで適用されます。
設定値 | 説明 |
---|---|
OFF |
ランタイム時に実行するモジュールと現在のofasmバージョンが異なる場合でも警告メッセージを出力しません。(デフォルト値) |
ON |
ランタイム時に実行するモジュールと現在のofasmバージョンが異なる場合は警告メッセージを出力します。 |
VM_MEMORY_SIZE
OpenFrame ASM VMが使用するメモリ・サイズ(MB)を設定します。最小値は32、最大値は2048です。整数値のみ指定できます。
このオプションは、ランタイムでのみ適用されます。
設定値 | 説明 |
---|---|
0 |
1024MB(1GB)のメモリを使用します。(デフォルト値) |
32~2048 |
設定されたメモリ・サイズ(MB)を使用します。 |
USE_CODE_CONVERSION
OpenFrame ASMで提供される OFATOE
、OFETOA
機械語命令で使用されるコード・ページ・マップ(.cpm
)ファイルを指定します。
このオプションは、ランタイムでのみ適用されます。
-
ASCII_TO_EBCDIC/EBCDIC_TO_ASCII : OFATOEとOFETOAに使用される
cpm
ファイルを指定します。設定値 説明 <空>
cpmファイルを使用しません。(デフォルト値)
<ファイル名>.cpm
指定したファイル名を持つ
cpm
ファイルを使用します。
指定したcpmファイルは、$OPENFRAME_HOME/cpmディレクトリ内に格納されている必要があります。 |
-
SOSI_TYPE:
OFATOE
とOFETOA
機械語命令で使用する基本的なSO/SI変換オプションを整数値で表現します。現在はデフォルト値として「1」のみサポートしています。設定値 説明 <空>
1を使用します。(デフォルト値)
1 = so[EBC]si → so[ASC]si
SOSI値を変換しません。
HEAP_MONITOR
OpenFrame ASMのVMでメモリの割り当てと解放関連のログを出力します。
このオプションは、ランタイムでのみ適用されます。
設定値 | 説明 |
---|---|
OFF |
メモリの割り当てと解放関連のログを使用しません。(デフォルト値) |
ON |
メモリの割り当てと解放関連のログを使用します。 |
USE_TCFH_FILE_IO
OpenFrame ASMのVMで使用するOpenFrame baseモジュールを指定します。
このオプションは、ランタイムでのみ適用されます。
設定値 | 説明 |
---|---|
NO |
tcfh baseモジュールを使用しません。古いバージョンとの互換性のために使用します。(デフォルト値) |
YES |
tcfh baseモジュールを使用します。 |
FORCE_RMODE_31
このリストに指定されたプログラムは、31ビットRMODEを強制適用してロードします。
たとえば、以下のように作成すると、TEST01とTEST02プログラムに31ビットのRMODEを適用してロードします。
{
"FORCE_RMODE_31" : ["TEST01", "TEST02"],
}
USER_SVC
SVC200~255はユーザーSVCであり、ホストが提供するSVCではなく、ユーザーが指定して使用するSVCです。
ユーザーSVCを使用するためには、まず、ユーザーSVCモジュールが存在するディレクトリパスをOFASM_USERSVCLIB環境変数として設定します。
export OFASM_USERSVCLIB=<ユーザーSVCのディレクトリパス>
そして、SVCに対して使用するモジュールをproperties.configファイルに以下のように定義します。
{
"USER_SVC" :
{
"IGC00<SVCの番号>" : "<プログラム名>"
}
}
以下は、SVC239に対してTESTモジュールを呼び出す例です。
{
"USER_SVC" :
{
"IGC00239" : "TEST"
}
}