컴파일

본 장에서는 OpenFrame ASM 컴파일러를 사용하여 ASM 코드를 컴파일하는 방법에 대해 설명한다.

1. 컴파일 방법

OpenFrame ASM 컴파일러는 ASM 코드를 컴파일하여 OpenFrame ASM 가상머신(VM: Virtual Machine)에서 사용하기 위한 오브젝트 파일(Object file)을 생성한다.

ASM 코드를 컴파일하여 오브젝트 코드를 생성하는 방법은 다음과 같으며, 파일 이름에 .asm 확장자를 사용해야 한다는 것에 주의한다.

ofasm -E <파일이름>.asm

컴파일 과정은 전처리 단계와 어셈블리 단계의 2단계로 진행되며, 각 단계를 별도로 실행할 수도 있다.

  • 전처리 방법

    .asm 파일을 전처리하면 전처리 파일인 .asmi 파일이 생성된다. 전처리 과정은 매크로 명령 및 conditional assembly 명령들을 해석하고 실행한다.

    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..>

    command line에서 사용자가 지정한 매개변수에 대해 즉시 어셈블러 프로그램을 실행한다. 매개변수는 16진수 값만 사용할 수 있다.

    -f <filepath>

    이 옵션은 -x 옵션이 사용될 때만 함께 사용할 수 있다. 매개변수의 정보를 정의한 JSON 형식의 파일을 지정한다.

    -r <reg_no> <value>

    이 옵션은 -x 옵션이 사용될 때만 함께 사용할 수 있다. 실행하기 전의 레지스터 값을 지정한다.

    --entry <entryname>

    이 옵션은 -x 옵션이 사용될 때만 함께 사용할 수 있다. 실행할 entry 이름을 지정한다.

    --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>

    컴파일 시 사용할 Address Mode 를 지정한다. 이 값은 대상 파일에 정의된 AMODE 값을 덮어씌운다.

    --rmode <24,31,ANY>

    컴파일 시 사용할 Residence Mode 를 지정한다. 이 값은 대상 파일에 정의된 RMODE 값을 덮어씌운다.

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
        }
      },
      "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에 대한 설정은 별도의 디버그 바이너리에서만 적용된다.

해당 옵션은 런타임에서만 적용된다.

ONLINE / BATCH : Online, 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는 사용자가 로드하지 않은 프로그램 혹은 시스템에서 제공하는 프로그램인 경우 출력되는 프로그램 이름이다.

NETCOBOL_COMPATIBLE

NetCOBOL 제품과 OpenFrame ASM을 함께 사용할 때 이 필드를 ON하여 사용한다.

해당 옵션은 컴파일 타임과 런타임에서 적용된다.

설정값 설명

OFF

NetCOBOL 호환이 적용되지 않는다. (기본값)

ON

NetCOBOL 호환을 적용한다.

MAKE_PLIST_IN_EXIT

EXIT 인터페이스를 이용하여 ASM이 아닌 다른 어플리케이션을 호출할 때 고정 파라미터 형식일 경우 이 필드를 ON 하여 사용한다. 해당 옵션은 인터페이스 4 버전에서만 유효하다.

해당 옵션은 인터페이스 전환 타임과 런타임에서 적용된다.

설정값 설명

OFF

가변 파라미터 형식이고 파라미터가 10개 이하일 경우 가능한 옵션이다. (기본값)

ON

고정 파라미터 형식이고 파라미터 갯수가 특정되지 않을 경우 사용하는 옵션이다.

CHECK_OBJ_VERSION

런타임시 실행하는 모듈과 현재 ofasm 버전을 비교하여 다를 경우 Warning 메시지를 출력한다.

해당 옵션은 런타임에서 적용된다.

설정값 설명

OFF

런타임시 실행하는 모듈과 현재 ofasm 버전을 비교하여 달라도 Warning 메시지를 출력하지 않는다. (기본값)

ON

런타임시 실행하는 모듈과 현재 ofasm 버전을 비교하여 다를 경우 Warning 메시지를 출력한다.

VM_MEMORY_SIZE

OpenFrame ASM VM이 사용할 메모리의 크기를 메가바이트(MB) 단위로 설정한다. 최소값은 32이며, 최대값은 2048이며, 정수값만 쓸 수 있다.

해당 옵션은 런타임에서만 적용된다.

설정값 설명

0

1024MB(1GB)의 메모리를 사용한다. (기본값)

32 ~ 2048

설정한 값 만큼의 메모리를 메가바이트(MB) 단위로 사용한다.

USE_CODE_CONVERSION

OpenFrame ASM에서 제공하는 OFATOE, OFETOA 기계 명령어에서 사용할 Code page map(.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"
  }
}