본문 바로가기
컴퓨터공학/시스템프로그래밍

SIC 어셈블러(Assembler)

by 책 읽는 개발자_테드 2021. 5. 1.
반응형

SIC 가상 머신의 어셈블리 코드를 기계어로 변환하고, 기호 레이블(symbolic label)에 기계 주소를 할당하는 과정을 이해하기 위해 필요한 지식들을 설명합니다. 

 

내용은 숭실대학교 최재영 교수님의 시스템프로그래밍 수업을 기반으로 합니다.

 

SIC 프로그램

다음은 SIC 프로그램의 어셈블리 코드 예시다.

 

어셈블러 지시어(Directives)

 

목적(Object) 프로그램에 영향은 주지만, 기계 명령어로 번역은 되지 않는다. 즉, 어셈블러 자체로 명령을 제공한다.

 

START: 프로그램의 이름과 시작 주소 이름을 명시한다.

END: 소스 프로그램의 끝을 나타낸다. 선택적으로 프로그램에서 최초로 실행할 명령어를 지시한다.

 

 

 

BYTE: 문자를 16진수 상수로 생성하고, 상수를 표현하는 데 필요한 만큼의 바이트를 차지한다.

WORD: 1 워드의 정수형 상수를 생성한다.

 

 

RESB: 메모리 데이터 영역을 지시된 숫자의 바이트 만큼 예약한다. 

RESW: 메모리 데이터 영역을 지시된 숫자의 워드 만큼 예약한다.  

 

Simple SIC 어셈블러

 

1) 니모닉 코드(mnemonic codes, 연상 기호: 기억을 돕는다는 의미)를 동등한 기계어로 변환한다. 

예시: 라인 10의 STL을 14로 변환한다.

  

2) 기호 피연산자(Symbolic operands)를 동등한 기계 주소로 변환한다.

예시: 라인 10의 RETADR을 1033로 변환한다. 

 

10 1000 FIRST STL RETADR

 

Forward reference

프로그램에서 다음에 정의된 레이블(label)을 참조한다. RETADR에 할당될 주소는 알지 못한다.

 

2 pass assembler

소스 프로그램을 두 번 스캔한다.

First pass

할당된 주소와 레이블(label) 정의를 위해 소스 프로그램을 스캔한다.

Second pass

이전에 설명한 대부분의 실제 변환을 수행한다.

 

3) 적절한 형식에 맞춰 기계 명령어를 생성한다.

4) 소스 프로그램의 데이터 상수를 내부 기계 표현으로 변환한다.

예시: EOF를 454F46으로 변환한다.

 

5) 목적(Object) 프로그램과 어셈블리 목록을 작성한다.

 

SIC 프로그램 목적 코드(Object Code)

다음은 위에서 설명한 SIC 프로그램의 오브젝트(목적) 코드다. (출처: 숭실대학교 최재영 교수님 시스템프로그래밍 수업)

 

오브젝트 코드는 3개의 레코드로 구성된다.

 

Header

프로그램의 이름, 시작 주소, 길이를 포함한다.

- Col. 1           H

- Col. 2~7       프로그램 이름

- Col. 8~13     오브젝트 프로그램의 시작 주소 (16진수)

- Col. 14~19    바이트로 표시된 오브젝트 프로그램의 길이(16진수)

Text

프로그램의 데이터와 변환된 명령어를 포함한다.

- Col. 1            T

- Col. 2~7        현재 레코드에서 목적 코드를 위한 시작 주소 (16진수)

- Col. 8~9        현재 레코드에서 바이트로 표시된 오브젝트 코드 길이 (16진수)

- Col. 10~69     16진수로 나타낸 오브젝트 코드 (바이트당 2개의 열)

End

목적 프로그램의 끝을 표시하고, 프로그램에서 주소를 지정한다.

- Col. 1            E

- Col. 2~7        목적 프로그램 중 첫 번째로 실행될 명령어의 주소 (16진수)

 

 

Two passes 어셈블러

Pass 1 - 기호 정의 (Define symbols)

1. 모든 명세(statement)에 주소 할당 

2. Pass 2에 사용하기 위해 모든 레이블(label)에 할당된 주소값을 저장

3. 어셈블러 지시어(directives)의 처리를 수행 (데이터 영역의 길이와 같은 주소 할당)

 

Pass 2 - 명령어 어셈블과 오브젝트 프로그램 생성

1. 명령어 어셈블 (연산자 코드를 번역하고, 주소를 조사) 

2. BYTE, WORD 등의 정의된 데이터 값을 생성

3. Pass 1 과정에서 끝나지 않은 어셈블러 지시어의 처리를 수행

4. 오브젝트 프로그램과 어셈블리 목록을 작성

 

어셈블러 테이블과 로직

1. Location Counter (LOCCTR)

- 주소 할당에 도움을 주는 변수

- START문으로 나타난 시작 주소로 초괴화

- 각각의 원시 프로그램(Source Statement)이 처리된 후에, 어셈블된 명령어 또는 생성된 데이터 영역 이가 LOCCRT에 더해진다. 

- 원시 프로그램에서 레이블을 만날 때마다 LOCCRT의 현재 값을 레이블의 주소로 할당한다.

 

2. Operation Code Table (OPTAB)

- 연산 명령어를 찾아 기계어로 번역한다.

- 니모닉 연산 코드와 해당 기계어 코드가 포함된다. 명령어 포맷과 길이 또한 포함된다.

- 니모닉 연산 코드를 조회&확인(Pass 1)하는 데 그리고 이것을 기계어로 번역하는(Pass 2) 데 사용된다. SIC에서는 두 개의 절차가 함께 발생한다. SIC/XE에서는 명령어 길이를 알기 위해 OPTAB 찾는 작업(Pass 1)과 명령어를 어셈블 하는데 사용하기 위해 명령어 포맷을 결정하는 작업(Pass 2)이 나뉜다.

- 주로 해시 테이블과 정적 테이블로 만들어 진다. 니모닉 연산 코드가 키로 제공된다. 최소한의 탐색으로 빠른 검색을 제공한다. 항목(Entries)은 일반적으로 추가, 삭제되지 않는다.

 

3. Symbol Table (SYMTAB)

- 레이블에 할당된 주소값을 저장하는데 사용한다.

- 각각의 레이블을 위해 이름과 주소 값을 포함한다. 오류 상태를 위한 플래그, 데이터 영역 또는 레이블이 붙여진 명령어 정보 역시 포함한다.

- Pass 1: LOCCTR로 부터 레이블과 그것들이 할당된 주소가 입력된다.   

- Pass 2: 피연산자로 사용된 기호(Symbol)의 주소를 SYMTAB을 조사해서 찾는다.

- 주로 해시테이블로 구성된다.

 

4. 중간(Intermediate) 파일

- 두 패스 사이의 의사소통을 위해 사용한다. 

- Pass 1에 의해 작성되고, Pass2의 입력 값으로 사용된다.

- 각각의 source statement를 포함한다. (할당된 주소,  오류 지시자 등)

 

로직 다이어그램

PASS 1 알고리즘

Pass 1 결과

SYMTAB

 

프로그램 길이 = 207A - 1000 = 107A

 

PASS 2 알고리즘

Pass 2 결과

 

추가 출처

 

yunsangq.github.io/articles/2014-06/sicassembler

m.blog.naver.com/PostView.nhn?blogId=dlrbtjd86&logNo=92768005&proxyReferer=https:%2F%2Fwww.google.com%2F

 

 

 

 

 

 

 

 

반응형

'컴퓨터공학 > 시스템프로그래밍' 카테고리의 다른 글

SIC의 구조  (0) 2021.03.28
SIC/XE의 구조  (0) 2021.03.27
SIC와 SIC/XE란?  (0) 2021.03.22

댓글