인터페이스 생성

본 장에서는 OpenFrame ASM에서 제공하는 ofasmif 툴을 이용하여 어셈블러 인터페이스를 생성하는 방법에 대해서 설명한다.

1. 인터페이스 3버전 명세 파일

ofasmif는 인터페이스 3버전 명세 파일을 통해 cpp 형태의 인터페이스 소스를 생성해낸다. 인터페이스는 asm to non-asm 또는 non-asm to asm 간의 호출을 지원하기 위해 필요한 프로그램이다.

ENTRY 인터페이스 명세

ENTRY 인터페이스 명세(버전 3)는 non-asm 에서 asm 를 호출하기 위해 만들어야하는 파일이다. 아래와 같은 구조를 갖는다.

{
  "entry_list":
  [
    {
      "entry_name" : "ENTRYNAME1",
      "fixed_parameter_list" :
      [
        {
          "param_size" : (PARASIZE),
          "param_type" : (PARATYPE),
          "pointer_offset_list" : [OFFSET_POSITION, ...],
          "pointer_size_list" : [POINTER_SIZE, ...]
        },
      ]
    },
    {
      "entry_name" : "ENTRYNAME2",
      "variable_parameter_list" :
      {
        "max_length" : (MAXLEN)
      }
    }
  ],
  "program_name" : "PROGNAME",
  "version" : 3,
  "interface_type" : "entry"
}
  • entry_list

    프로그램에 존재하는 entry에 대한 명세가 JSON array 형태로 있다.

    하나의 entry에는 프로그램의 진입점에 대응되는 entry_name과 프로그램에 진입할 때 넘겨지는 파라미터에 대한 정보(fixed_parameter_list, variable_parameter_list)가 기술되어 있다.

    • entry_name

      진입점에 대한 이름이다(프로그램 이름과는 다르다).

    • fixed_parameter_list

      특정 entry에 대한 고정된 개수의 파라미터를 가지는 파라미터 리스트에 대한 정보가 JSON array 형태로 있다. 각 파라미터는 param_size 및 param_type으로 구성된다.

      Pointer 타입 파라미터인 경우에는 pointer_offset_list와 pointer_size_list가 반드시 추가로 구성되어야 한다.

      항목 설명

      param_size

      파라미터의 바이트 크기를 기술한다.

      param_type

      파라미터의 종류를 지정한다.

      하나의 entry에는 프로그램의 진입점에 대응되는 entry_name과 프로그램에 진입할 때 넘겨지는 파라미터에 대한 정보가 기술되어 있다.

      • P : Pointer 타입 파라미터

      • NP : Non-Pointer 타입 파라미터

      • V : 가변 길이(Variable length)를 가지는 파라미터

      • PCB : PCB 타입 파라미터

      pointer_offset_list

      Pointer 타입 파라미터일 경우 파라미터 구조체 안에 포함되어 있는 포인터의 오프셋 리스트를 지정한다. 구조체 내에서 포인터가 위치한 오프셋 값을 차례대로 정의한다.

      pointer_size_list

      Pointer 타입 파라미터일 경우 파라미터 구조체 안에 포함되어 있는 포인터의 크기 리스트를 지정한다.

      pointer_offset_list와 마찬가지로 포인터의 크기 정보를 차례대로 정의한다. 리스트의 개수는 pointer_offset_list에 정의되어 있는 개수와 같아야 하며 쌍으로 이루어져야 한다.

    • variable_paramter_list

      가변 개수의 파라미터를 가지는 파라미터 리스트에 대한 정보를 JSON Object 형태로 기술한다.

      항목 설명

      max_length

      본 파라미터 리스트가 가질 수 있는 최대 파라미터 개수를 정의한다.

  • program_name

    어셈블러 프로그램 이름을 지정한다. 어셈블러 프로그램은 확장자가 asmo인 파일에 해당된다.

  • interface_type

    Entry 인터페이스의 경우 "entry"를 입력한다.

  • version

    인터페이스 명세 버전을 입력한다. 인터페이스 명세는 ofasmif 명령어의 버전을 따른다.

    현재 ofasmif 명령어에서 제공하는 인터페이스 명세의 최신 버전은 4이다.

EXIT 인터페이스 명세

EXIT 인터페이스 명세(버전 3)는 asm에서 non-asm를 호출하기 위해 만들어야하는 파일이다. 아래와 같은 구조를 갖는다.

{
  "entry_list":
  [
    {
      "entry_name" : "ENTRYNAME1",
      "fixed_parameter_cnt" : (PARAMCOUNT)
    }
  ],
  "program_name" : "PROGNAME",
  "version" : 3,
  "interface_type" : "exit"
}
  • interface_type

    Exit 인터페이스의 경우 "exit"를 입력한다.

각 항목에 대한 설명은 "ENTRY 인터페이스 명세"를 참고한다. fixed_parameter_cnt 항목에는 non-asm에서 받는 파라미터의 개수를 기재한다.

LOAD 인터페이스 명세

LOAD 인터페이스 명세(버전 3)는 asm에서 CICS LOAD 커맨드에 의해 다른 모듈을 호출할 경우 만들어야하는 파일이다. 아래와 같은 구조를 갖는다.

{
  "entry_list":
  [
    {
      "entry_name" : "ENTRYNAME1",
      "fixed_parameter_list" :
      [
        {
          "param_size" : (PARASIZE),
          "param_type" : (PARATYPE),
          "pointer_offset_list" : [OFFSET_POSITION, ...],
          "pointer_size_list" : [POINTER_SIZE, ...]
        }
      ]
    }
  ],
  "program_name" : "PROGNAME",
  "version" : 3,
  "interface_type" : "load"
}
  • interface_type

    LOAD 인터페이스의 경우 "load"를 입력한다.

각 항목에 대한 설명은 "ENTRY 인터페이스 명세"를 참고한다.

2. 인터페이스 4버전 명세 파일

ofasmif는 인터페이스 4버전 명세 파일을 통해 cpp 형태의 인터페이스 소스를 생성해낸다. 인터페이스는 asm to non-asm 또는 non-asm to asm 간의 호출을 지원하기 위해 필요한 프로그램이다.

ENTRY 인터페이스 명세

ENTRY 인터페이스 명세(버전 4)는 non-asm 에서 asm 를 호출하기 위해 만들어야하는 파일이다. 아래와 같은 구조를 갖는다.

{
  "entry_list":
  [
    {
      "entry_name" : "ENTRYNAME1",
      "fixed_parameter_list" :
      [
        {
          "param_size" : (PARASIZE),
          "param_type" : (PARATYPE),
          "pointer_offset_list" : [OFFSET_POSITION, ...],
          "pointer_size_list" : [POINTER_SIZE, ...],
          "child_list" :
          [
            {
              "index" : (INDEX),
              "param_size" : (PARASIZE),
              "pointer_offset_list" : [OFFSET_POSITION, ...],
              "pointer_size_list" : [POINTER_SIZE, ...]
            },
            ...
          ]
        },
        ...
      ]
    },
    {
      "entry_name" : "ENTRYNAME2",
      "variable_parameter_list" :
      {
        "max_length" : (MAXLEN)
      }
    },
    ...
  ],
  "program_name" : "PROGNAME",
  "version" : 4,
  "interface_type" : "entry"
}
  • entry_list

    프로그램에 존재하는 entry에 대한 명세가 JSON array 형태로 있다.

    하나의 entry에는 프로그램의 진입점에 대응되는 entry_name과 프로그램에 진입할 때 넘겨지는 파라미터에 대한 정보(fixed_parameter_list, variable_parameter_list)가 기술되어 있다.

    • entry_name

      진입점에 대한 이름이다(프로그램 이름과는 다르다).

    • fixed_parameter_list

      특정 entry에 대한 고정된 개수의 파라미터를 가지는 파라미터 리스트에 대한 정보가 JSON array 형태로 있다. 각 파라미터는 param_size 및 param_type으로 구성된다.

      Pointer 타입 파라미터인 경우에는 pointer_offset_list와 pointer_size_list가 반드시 추가로 구성되어야 한다.

      항목 설명

      param_size

      파라미터의 바이트 크기를 기술한다.

      param_type

      파라미터의 종류를 지정한다.

      하나의 entry에는 프로그램의 진입점에 대응되는 entry_name과 프로그램에 진입할 때 넘겨지는 파라미터에 대한 정보가 기술되어 있다.

      • P : Pointer 타입 파라미터

      • NP : Non-Pointer 타입 파라미터

      • V : 가변 길이(Variable length)를 가지는 파라미터

      • PCB : PCB 타입 파라미터

      pointer_offset_list

      Pointer 타입 파라미터일 경우 파라미터 구조체 안에 포함되어 있는 포인터의 오프셋 리스트를 지정한다. 구조체 내에서 포인터가 위치한 오프셋 값을 차례대로 정의한다.

      pointer_size_list

      Pointer 타입 파라미터일 경우 파라미터 구조체 안에 포함되어 있는 포인터의 크기 리스트를 지정한다.

      pointer_offset_list와 마찬가지로 포인터의 크기 정보를 차례대로 정의한다. 리스트의 개수는 pointer_offset_list에 정의되어 있는 개수와 같아야 하며 쌍으로 이루어져야 한다.

      child_list

      P타입 파라미터에 대해 사용할 수 있다. P타입 파라미터에서 지정한 각 포인터가 가리키는 데이터에 추가적인 포인터가 들어있을 때 사용한다. 이 필드는 재귀적으로 사용할 수 있다.

      • index : pointer_offset_list/pointer_size_list에 지정된 포인터 중 몇 번째 포인터에 대해 정의할 것인지 지정한다.

      • param_size : 해당 포인터가 가리키는 데이터의 크기를 기술한다. pointer_size_list[index] 값과 동일하게 지정한다.

      • pointer_offset_list : 해당 포인터가 가리키는 데이터에 포함된 각각의 포인터의 오프셋을 기술한다.

      • pointer_size_list : 해당 포인터가 가리키는 데이터에 포함된 각각의 포인터가 가리키는 데이터의 크기를 기술한다.

    • variable_paramter_list

      가변 개수의 파라미터를 가지는 파라미터 리스트에 대한 정보를 JSON Object 형태로 기술한다.

      항목 설명

      max_length

      본 파라미터 리스트가 가질 수 있는 최대 파라미터 개수를 정의한다.

  • program_name

    어셈블러 프로그램 이름을 지정한다. 어셈블러 프로그램은 확장자가 asmo인 파일에 해당된다.

  • interface_type

    ENTRY 인터페이스의 경우 "entry"를 입력한다.

  • version

    인터페이스 명세 버전을 입력한다. 인터페이스 명세는 ofasmif 명령어의 버전을 따른다.

    현재 ofasmif 명령어에서 제공하는 인터페이스 명세의 최신 버전은 4이다.

EXIT 인터페이스 명세

EXIT 인터페이스 명세(버전 4)는 asm 에서 non-asm 를 호출하기 위해 만들어야하는 파일이다. 아래와 같은 구조를 갖는다.

{
  "entry_list":
  [
    {
      "entry_name" : "ENTRYNAME1",
      "fixed_parameter_list" :
      [
        {
          "param_type" : "NP"
        },
        {
          "param_size" : (PARASIZE),
          "param_type" : "P",
          "pointer_offset_list" : [OFFSET_POSITION, ...],
          "pointer_size_list" : [POINTER_SIZE, ...]
        }
      ]
    }
  ],
  "program_name" : "PROGNAME",
  "version" : 4,
  "interface_type" : "exit"
}
  • interface_type

    EXIT 인터페이스의 경우 "exit"를 입력한다.

    각 항목에 대한 설명은 "ENTRY 인터페이스 명세"를 참고한다. param_size의 경우 param_type이 "NP" 혹은 "F" 일 때는 기재하지 않아도 된다.

LOAD 인터페이스 명세

LOAD 인터페이스 명세(버전 4)는 asm에서 CICS LOAD 커맨드에 의해 다른 모듈을 호출할 경우 만들어야하는 파일이다. 아래와 같은 구조를 갖는다.

{
  "entry_list":
  [
    {
      "entry_name" : "ENTRYNAME1",
      "fixed_parameter_list" :
      [
        {
          "param_size" : (PARASIZE),
          "param_type" : (PARATYPE),
          "pointer_offset_list" : [OFFSET_POSITION, ...],
          "pointer_size_list" : [POINTER_SIZE, ...]
        }
      ]
    }
  ],
  "program_name" : "PROGNAME",
  "version" : 4,
  "interface_type" : "load"
}
  • interface_type

    LOAD 인터페이스의 경우 "load"를 입력한다.

각 항목에 대한 설명은 "ENTRY 인터페이스 명세"를 참고한다.

3. ofasmif 명령어

다음은 OpenFrame ASM에서 제공하는 ofasmif 명령어의 사용 방법이다.

ofasmif [명령 옵션...]
  • 명령 옵션

    다음은 소스 파일을 컴파일하는 기본 명령어 옵션에 대한 설명이다.

    옵션 설명

    -i <파일이름>

    입력 파일을 설정한다. cpp 파일을 생성하고 g++로 컴파일을 수행한다. 파일의 확장자가 'json’으로 되어야 인터페이스 명세 파일로 인식한다.

    --cpp-only

    cpp 파일만 생성한다. -i 옵션과 함께 사용해야 한다.

    --comp-only

    cpp 파일을 g++로 컴파일한다. -i 옵션과 함께 사용해야 한다.

    -g <인터페이스 타입>

    생성할 JSON 파일의 인터페이스 타입을 지정한다.

    -n <프로그램 이름>

    프로그램 이름으로 사용될 JSON 파일 이름을 지정한다. -g 옵션과 함께 사용해야 한다.

    -e <엔트리 이름>

    생성할 JSON 파일의 엔트리명을 지정한다. -g 옵션과 함께 사용해야 하며 생략될 경우 프로그램 이름이 엔트리 이름으로 사용된다.

    -t <파라미터 타입>

    파라미터 타입(V, F, PCB, JCL)을 지정한다. -e 옵션과 함께 사용해야 한다.

    -m <파라미터 개수>

    파라미터의 최대 개수를 지정한다. -t V(가변 파라미터)일 경우 사용한다.

    -s <사이즈 리스트>

    파라미터의 사이즈 리스트를 지정한다. -t F(고정 파라미터)일 경우 사용한다.

    --ptr-offset <포인터 파라미터 오프셋 리스트>

    -t F(고정 파라미터)이고 포인터 파라미터가 존재하는 경우 포인터 파라미터의 오프셋 리스트를 지정한다. --ptr-size 옵션과 함께 사용해야 하며 리스트의 배열이 동일해야 한다.

    --ptr-size <포인터 파라미터 사이즈 리스트>

    -t F(고정 파라미터)이고 포인터 파라미터가 존재하는 경우 포인터 파라미터의 사이즈 리스트를 지정한다. --ptr-offset 옵션과 함께 사용해야 하며 리스트의 배열이 동일해야 한다.

    -p <파일이름>

    입력 파일의 단락을 자동으로 맞춘다.

    -h(H)

    도움말을 출력한다.

인터페이스 생성 예시

다음은 ofasmif -g 옵션을 사용하여 다양한 인터페이스를 파라미터 타입 별로 생성하는 예시이다.

  • 기본적인 가변 파라미터 엔트리 인터페이스를 생성한다. 파라미터는 최대 10개까지 지정할 수 있다.

    ofasmif -g entry -n TEST -e TEST
  • 가변 파라미터 ENTRY 인터페이스를 생성한다. 파라미터 최대 개수를 지정해야 한다.

    ofasmif -g entry -n TEST -e TEST -t V -m 10
  • 고정 파라미터 ENTRY 인터페이스를 생성한다. 포인터 파라미터가 없는 경우에 대한 예시이다.

    ofasmif -g entry -n TEST -e TEST -t F -s 100,200,300
  • 고정 파라미터 ENTRY 인터페이스를 생성한다. 포인터 파라미터가 있는 경우에 대한 예시이다.

    ofasmif -g entry -n TEST -e TEST -t F -s 100,14,24 --ptr-offset “[(),(0,4),(4,8)]” --ptr-size “[(),(100,200),(200,300)]”
  • PCB 파라미터 ENTRY 인터페이스를 생성한다. 최대 PCB 파라미터 개수를 지정한다.

    ofasmif -g entry -n TEST -e TEST -t PCB -m 100
  • JCL 파라미터 ENTRY 인터페이스를 생성한다.

    ofasmif -g entry -n TEST -e TEST -t JCL
  • EXIT 인터페이스를 생성한다. 포인터 파라미터가 없는 경우에 대한 예시이다.

    ofasmif -g exit -n TEST -e TEST -m 10
  • EXIT 인터페이스를 생성한다. 포인터 파라미터가 있는 경우에 대한 예시이다.

    ofasmif -g exit -n TEST -e TEST -t F -s 100,14,24 --ptr-offset “[(),(0,4),(4,8)]” --ptr-size “[(),(100,200),(200,300)]”
  • LOAD 인터페이스를 생성한다. 고정 파라미터 ENTRY 인터페이스 생성 방법과 동일하다.

    ofasmif -g exit -n TEST -e TEST -t F -s 1024
  • ENTRY가 여러 개일 경우에 대한 인터페이스 생성 예시이다.

    ofasmif -g entry -n TEST -e ENTRY_1 -t F -s 100,200 -e ENTRY_2 -t V -m 10