컴파일
본 장에서는 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 |
로그 레벨을 설정한다. 정수값만 쓸 수 있다.
|
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는 사용자가 로드하지 않은 프로그램 혹은 시스템에서 제공하는 프로그램인 경우 출력되는 프로그램 이름이다.
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"
}
}