Assembler Detail (Algorithms)

1. 문제 개요

어셈블러 알고리즘과 자료구조를 바탕으로 앞선 레포트에서 했던 어셈블러 컴파일 과정을 알고리즘 Pass1, Pass2를 참조하여 프로그래밍 언어를 이용하여 프로그래밍과정으로 만들고 더 추가적인 기능이 있을 때 추가 하여라.


2. 문제 분석

 <알고리즘>

 Pass 1

1) 한 줄을 읽는 것으로 시작한다. 그리고 분기하는데, 읽은 첫 줄의 OPCODE 가 'start'가 아니라면, LOCCTR 을 0 으로 초기화하는 것으로 끝낸다. 반면, 'start'라면 시작 주소값으로서 OPERAND(immediate value)를 저장하고, LOCCTR 을 위의 시작 주소값으로 초기화한다. 그리고 파일 내 다음 줄을 읽어들인다. 그리고 이후부턴 OPCODE 가 'END' 가 아니라는 조건만 만족하면 이후의 내용을 계속 반복하는 구조이다.

2) 현재 line 모두가 주석문으로 이뤄진 문장라면 바로 파일 내 다음 줄을 읽어들이게 된다. 주의할 점은 이 동작은 line 모두가 주석문이 아니라는 조건에 해당되어도 마지막에 실행되는 동작으로,내부에 별도의 추가 동작의 실행 여부를 결정하는 조건들의 나열로 구성된다.

3) Label 영역내에 symbol 이 있다면, SYMTAB 에서 이 label 을 찾는다. 찾은 결과가 있다면, 해당 symbol 이 복사되었다는 의미로 error flag 를 설정한다. 찾은 결과가 없을 경우는 SYMTAB 에 Label 과 LOCCTR 을 추가한다.

4) 3번 항목의 결과와는 별개의 명령 구문으로, OPTAB 로부터 OPCODE 를 찾는다. 찾았다면 LOCCTR 에 3(이는 명령어의 길이를 의미하는 것으로, 확장형(+ 형태)을 만났을 때는 4로 배정이 된다.)을 더한다. 혹 다른 조건으로, OPCODE 가 'WORD' 일 때는 LOCCTR 에 3을 더하는 작업으로 끝내고, OPCODE 가 'RESW'나 'RESB' 일 때는 정의되는 데이터 영역의 길이를 합산하는 것으로, RESW 는 3 * OPERAND(immediate value)를, RESB 는 OPERAND(immediate value)를 LOCCTR 에 합산한다. OPCODE 가 'BYTE' 일 때는 연속되는 길이(Byte 기준)를 측정한 후 그 길이만큼을 LOCCTR 에 합산하는 결과를 보인다. 위의 조건들을 하나라도 만족하지 못하는 경우엔 유효하지 못한 operation code 란 의미로

error flag 를 설정한다.

5) 위 반복문의 조건에 어긋나는 'END' 문장을 만났을 경우 반복을 해제하고 마지막 줄을 읽어들여 현재의 LOCCTR 과 첫 시작 주소값의 차를 프로그램의 길이로서 저장한다.


Pass 2

1) 중간 파일로부터 첫 번째 줄을 읽는다. 만약 OPCODE 가 'START' 라면, 리스팅 파일에 쓰고  목적 파일에 헤더 레코드를 기입한다. 텍스트 레코드를 초기화 시킨다.

2) OPCODE가 ‘END'가 아닌 한 반복을 계속 한다. 반복 문 안에서 만약 읽은 줄이 주석 라인이 아니라면 이 후 나열할 명령을 수행한다.

3) OPCODE에서 OPTAB을 찾는다. 만약 OPREAND 필드에 심볼이 있다면 OPERAND의 SYMTAB을 찾고 OPERAND주소로써 심볼 값을 저장한다. 찾지 못했을 시에는 OPREAND주소에 0을 저장하고 에러 플래그(undefined symbol)를     나타낸다. 하지만 심볼이 없다면 OPERAND 주소에 0을 저장한다. 그리고 나서 위의 내용을 바탕으로 목적코드를 생성한다. 이 때, OPCODE에서 찾은 OPTAB이 ‘BYTE' 혹은 'WORD'일때는 바로 목적코드로 변환 한다.

4) 만약 목적코드를 현재의 텍스트 레코드에 저장하지 않을 경우에는 목적 프로그램에 텍스트 레코드를 생성한다. 목적코드를 텍스트 레코드에 작성한다.

5) 중간파일에서 읽은 줄을 위의 조건을 바탕으로 리스팅 파일을 작성하고 중간파일의 다음 줄을 읽는다. 그리고 이를 OPCODE가 'END'가 아닌 한 계속 반복한다.

6) 목적프로그램에 마지막 텍스트 레코드와 엔드 레코드를 작성한다. 그리고 리스팅 파일의 마지막 라인을 작성하고 프로그램을 마친다.