コンパイル

本章では、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

ログ・レベルを設定します。整数値のみ指定できます。

  • 0 : ログを無効にします。(デフォルト値)

  • 1 ~ 5 : ログを有効にします。

  • 6 : ログレベル5形式にタイムスタンプを追加します。

OFASM_LOG_AFTER

何番目のログから出力するかを設定します。整数値のみ指定できます。

  • 0 : ログを無効にします。(デフォルト値)

  • 1+ : 何番目のログから出力するかを設定します。

以下は、各ログレベルによる出力結果の例です。

  • 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で提供される OFATOEOFETOA 機械語命令で使用されるコード・ページ・マップ(.cpm)ファイルを指定します。

このオプションは、ランタイムでのみ適用されます。

  • ASCII_TO_EBCDIC/EBCDIC_TO_ASCII : OFATOEとOFETOAに使用される cpm ファイルを指定します。

    設定値 説明

    <空>

    cpmファイルを使用しません。(デフォルト値)

    <ファイル名>.cpm

    指定したファイル名を持つ cpm ファイルを使用します。

指定したcpmファイルは、$OPENFRAME_HOME/cpmディレクトリ内に格納されている必要があります。
  • SOSI_TYPE: OFATOEOFETOA 機械語命令で使用する基本的な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"
  }
}