Introduction


 

Macro Processor

Machine-Independent macro processor features

 


 

 

Macro Processors


Macro는 원시 프로그래밍 언어에서 일반적으로 사용되는 문장들의 그룹이다.

  • Macro 정의

macro-name  MACRO arguments

                      macro-body

                      MEND

 

  • Macro call

macro-name    actual-parameters

 

 

  • Macro expansion

Macro processor에 의해 각 매크로 명령어를 상응하는 원시 언어 문장들로 바꾸어 준다. 이것을 매크로 확장(expansion)이라고 한다.


기본적인 매크로 프로세서의 기능

C언어에서의 매크로 프로세서
SIC 프로그램에서의 매크로 프로세서


매크로를 사용한 SIC/XE program example

 

RDBUFF 매크로
WRBUFF 매크로
주프로그램, 190행, 210행, 220행에서 매크로 호출
매크로가 확장된 후 프로그램 190a ~ 190m
매크로가 확장된 후의 프로그램 210a ~ 210h
매크로가 확장된 후의 프로그램 220a ~ 220h

  • 매크로 명령어 정의는 매크로가 확장된 후에는 더 이상 필요하지 않기 때문에 삭제된다. 각 매크로 호출문은 매크로의 몸체를 구성하는 문장들로 확장되며, 매크로 프로토타입의 매개변수는 매크로 호출에서의 인자로 대체된다. 인자와 매개변수들은 위치에 따라 서로 연관되어 결정된다. 매크로 호출의 첫 번째 인자는 매크로 프로토타입의 첫 번째 매개변수에 대응된다. 예를 들면 190행의 매크로 호출을 확장할 때, 매개변수 &INDEV가 매크로 몸체에 나타날 때마다 인자 F1로 바뀐다. 마찬가지로 &BUFADR은 BUFFER로, &RECLTH는 LENGTH로 바뀐다.
  • 매크로 호출문 자체는 주석행으로서 포함되어 있다.
  • 210행과 220행의 두 번의 WRBUFF 호출은 다른 인자를 가지고 있어 다르게 확장되었다.
  • 매크로 호출문은 주석으로 처리될 것이고, 매크로 확장에서 생성된 문장들은 프로그래머에 의해 직접 쓰여진 것과 같이 어셈블될 것이다.
  • 일반적으로 매크로 확장을 형성하는 문장들은 매크로가 호출될 때마다 생성되고 어셈블된다. 그러나 서브루틴의 문장들은 서브루틴이 몇 번 호출되느냐에 상관없이 오직 한 번 나타난다. (서브루틴과 매크로의 차이)
  • JEQ * -3, JLT * -14와 같이 사용된 이유는 프로그램이 어셈블될 때 오류(레이블 중복 선언)을 방지하기 위해서다. (Generation of Unique Labels 에서 다룸)

매크로 프로세서 알고리즘과 자료구조

이중 패스 매크로 프로세서는 첫 번째 패스동안 모든 매크로 정의를 처리하고, 두 번째 패스동안 모든 매크로 호출을 확장한다.

 

그러나 이런 이중 패스 매크로 프로세서에서는 한 매크로 명령어의 몸체 속에 다른 매크로 정의를 포함하는 것을 허용하지 않는다.

 

그 이유는 모든 매크로들은 어떤 매크로 호출이 확장되기 전인 첫 번째 패스 동안 정의되어야 하기 때문이다. 

 

SIC 프로그램에서 매크로 몸체 내에서 매크로 정의의 예
SIC/XE 프로그램에서 매크로 몸체 내에서 매크로 정의의 예

 

 

자료구조

  • DEFTAB: 매크로 정의 테이블 - 매크로 정의 자체가 저장되며, 매크로 프로토타입과 매크로 몸체를 구성하는 문장들을 포함, 매크로 정의에서의 주석 행은 매크로 확장이 될 수 없으므로 DEFTAB에 들어갈 수 없다. 

 

  • NAMTAB: 매크로 이름 테이블 - DEFTAB의 인덱스 역할, DEFTAB 내에 매크로 정의의 시작과 끝을 가리키는 포인터를 가짐

 

  • ARGTAB: 인자(매개변수) 테이블 - 매크로가 확장되는 동안에 사용됨, 인자들은 인자 리스트의 위치에 따라 ARGTAB에 저장되고 확장 시 ARGTAB의 인자들은 매크로 몸체에 대응되는 매개변수를 대신해서 바뀐다.

 

 

A single pass macro process algorithm

procedure DEFINE

 

단일 매크로 프로세서 알고리즘

단일 패스 매크로 프로세서의 매크로 정의는 반드시 그 매크로를 호출하는 어떤 문장들보다도 앞에 나와야 한다.

 

GETLINE은 처리할 다음 행을 가져온다.

 

EXPAND는 ARGTAB의 인자 값을 구성하고 매크로 호출문을 확장한다.

 

 

매크로 안에서의 매크로 정의의 처리는 어떻게 하냐? (매크로 몸체 내에서 매크로 정의의 예를 확인)

 

매크로 정의가 DEFTAB에 들어갈 때, 보통의 방식은 MEND 지시자가 나올 때까지 계속된다.

 

하지만 이것은 매크로 정의 내에 매크로 정의가 포함된 상황에서 적용되지 않는다.

 

RDBUFF의 정의의 끝을 실제로 나타내는 3행의 MEND가 MACROS 정의의 끝으로 받아들이기 때문이다.

 

이 문제의 해결을 위해 프로시져 DEFINE은 LEVEL이란 이름의 counter(계수기)를 사용한다.

 

MACRO 지시자가 읽혀질 때마다 LEVEL 값을 1 증가시키고, MEND 지시자가 읽혀질 때마다 LEVEL의 값을 1씩 감소시킨다.

 

LEVLEL이 0이 되면 원래 MACRO에 상응하는 MEND 지시자를 찾은 것이다.


 

 

Machine-Independent macro processor features


 

Concatenation of macro parameters

대부분의 매크로 프로세서는 매개변수가 다른 문자열과 접합되는 것을 허용한다.

 

예를 들면, 프로그램이 XA1, XA2, ... 의 이름을 가진 일련의 변수들과 XB1, XB2, ... 의 이름을 가진 일련의 변수들을 가진다고 하자. 이들 각각의 일련의 변수들에게 유사한 과정이 수행된다면 A, B 부분을 대체하여 매크로 매개변수 &ID를 사용할 수 있다.

 

LDA X&ID1: 매개변수 &ID는 문자열 'X' 뒤에 그리고 문자열 '1' 앞에 접합(연결)된다.

 

근데 ? 매개변수가 &ID가 아니라 &ID1이면 어쩔텐가? 그래서! 매크로 프로세서는 접합 연산자 ->를 사용하여 이 문제를 해결할 수 있다.

 

LDA X&ID -> 1: 매개변수가 확실히 &ID임을 알겠다. 매크로 확장에는 ->가 나타나지 않는다. (ㅇㅎ)


Generation of Unique Labels

그림 4.7 (a)의 매크로 확장

일반적으로 매크로 명령어 몸체가 보통의 레이블을 가지는 것은 불가능하다. 이 때문에 점프 명령어는 상대적 피연산자 * -3과 * -14를 사용했다. 짧은 점프에서는 괜찮지만, 더 긴 점프의 경우 불편하고 오류를 유발하기 쉬우며 가독성이 떨어질 것이다.

 

위의 사진에서와 같이 매크로 몸체 안에 사용된 레이블들은 특수 문자 '$'로 시작된다. 그림 4.7은 매크로 확장 결과이다. $로 시작하는 기호들은 $AA로 교체되었는데, 이는 매크로 명령어들의 확장 횟수를 나타내는 두문자의 영문자 계수기다. 즉 확장되면 될 수록 AB, AC, AD ... 등등으로 설정될 것이다. 


Conditional Macro Expansion (조건부 매크로 확장)

1) 매크로 확장으로 생성되는 행은 아니다. 문자 &로 시작되고, 매크로 명령어 매개변수가 아닌 모든 기호는 매크로 시간 변수(설정 기호)로 간주된다. 얘네들은 0으로 초기화된다. &EORCK는 매크로 시간 변수로 매크로 확장 동안에 쓰이는 값을 저장하는데 쓰인다. &EOR 값이 not null 이라면(비어있지 않다면) 변수 &EORCK는 1로 설정된다. 그렇지 않은 경우에는 디폴트 값인 0으로 남아있게 된다. 

 

2, 4)  &EORCK가 1이라면 ENDIF까지의 문장들을 생성한다.

 

3) &MAXLTH 값이 null string이라면(상응하는 인자가 매크로 호출문에서 생략되었다.) 45행을 생성하고, 그렇지 않으면 47행을 생성한다.

 

 

 

매크로 정의에 포함된 IF문에 따른 세 가지 다른 확장

 

IF 문의 부울 식 테스트는 매크로가 확장될 때마다 수행된다.

 

 

아니? while문이 있네...

&CTR이 Less Equal (<=) &EORCT라면 반복한다.

 

%NITEMS는 인자 리스트의 구성원 개수를 값으로 반환한다. 즉 %NITEMS(&EOR)의 값은 3이다. (00, 03, 04)

 

65행과 70행의 문장들이 매개변수 &EOR에 상응하는 리스트의 각 구성원마다 한번씩 생성된다. [&CTR]은 인덱스로 볼 수 있다. (00, 03, 04)의 리스트를 접근하는 것과 마찬가지이다.

 

 

그림 4.9(b)의 매크로 호출문에서 매개변수 &EOR과 상응하는 리스트 (00, 03, 04)는 어느 것이나 레코드의 끝을 나타낼 수 있다.


Keyword Macro Parameters

 

지금까지 설명한 모든 매크로 명령어 정의는 위치 매개변수를 사용하였다. 즉, 매개변수와 인자는 매크로 호출문과 매크로 프로토타입에서의 위치에 따라 서로 연관되어 있다. 인자가 생략된다면 매크로 호출문에서 올바른 인자 위치들을 유지하기 위한 널 인자(,,)가 삽입되야만 한다.

 

GENER MACRO &1, &2, &type, ..., &channel, &10 (parameters)

 

GENER  , , DIRECT, , , , , , 3 (arguments) (불 - 편)

 

키워드 매크로 파라미터는 매크로가 다수의 매개변수들을 가지고, 호출 시에는 소수의 매개변수 값만 주어질 때 유용하다.

이 때, 각 인자 값은 상응되는 매개변수 이름인 키워드와 함께 쓰인다. 따라서 인자들은 어떤 순서로도 나타날 수 있다.

 

GENER TYPE=DIRECT, CHANNEL=3

GENER CHANNEL=3, TYPE=DIRECT

 

parameter = argument 형태 

&BUFADR =, &RECLTH= 와 같이 등호 다음이 비어있으면 argument를 넣어주어야 하고(디폴트 값이 없다), 등호 다음에 매개변수들의 디폴트 값이 지정될 수 있다. &INDEV의 디폴트 값은 F1이다.

&BUFADR 값은 BUFFER로, &RECLTH 값은 LENGT로 지정되었다.

&INDEV 값은 F3으로, &EOR 값은 널(null)로 지정되었다.

 

 

 


자료 출처

  • "System Software: An Introduction to Systems Programming" by Leland L. Beck
  • 동국대학교 엄진영 교수님 시스템 소프트웨어와 실습 강의 교안

'computer science > System software || OS' 카테고리의 다른 글

Operating system (2)  (0) 2022.12.07
Operating system (1)  (0) 2022.11.22
Linkers and Loaders (1)  (0) 2022.11.01
Linkers and Loaders (2)  (0) 2022.10.30
조원준입니다