title: Project - SIC/XE Assembler
date: 2022-07-07
tags:
- Project
Implementation of SIC/XE Assembler & GUI Simulator
Introduction
SIC/XE Machine에서 사용하는 Assembler 및 GUI Simulator를 구현하였다.
Assembler
- 처음 구현한
Assembler_Former
는 하나의 함수에서 너무 많은 작업이 이루어져 좋은 코드도 아니고, 유지보수 혹은 확장이 매우 어려웠다. - 하나의 함수에서 진행하는 과한 작업들을 여러 함수로 나누어 확장성을 염두에 두어 개선하였다.
- 명령어의 정보를 가지는
inst.data
, 프로그램이 작성된input.text
가 주어진다. - 2 PASS 방식으로 작성된 프로그램이 주어진다. 매크로 이후의 기능은 사용되지 않는다고 가정, base relative 방식은 구현하지 않았다.
- 필요한 정보를 하나씩 저장하며, 최종적으로 object code로 변환하여 파일로 저장한다.
- 함수에 따라 갱신되는 정보가 다르며, 해당 Assembler의 특성상 본 프로그램의 성능은 좋지 않으나 확장성을 염두에 두고 구현하였다.
- 현재
object_code.obj
파일에 저장한다. 파일 저장 대신 네트워크 연결을 통해 정보를 보낼 경우, 알맞은 포맷으로 변환 후 정보를 보내는 함수 하나만 추가하면 된다.
GUI Simulator
- 처음 구현한
Assembler_Former
에서 만들어진 .obj 파일을 통해 파싱 후 시뮬레이션이 이루어진다. - 해당 .obj 파일은 문제가 있는 파일이며, 파싱 및 파싱한 정보를 저장하여 꺼내는 과정을 수정하면
Assembler
에서 만들어진 .obj 파일을 사용할 수 있다. - 두 .obj 파일의 차이는 빈칸을 추가적으로 사용하였는지만 다르다. 변경한 이유는
1. Assembler
문단에서 설명하겠다. - 본 프로그램은
F1
파일을 읽고05
라는 파일에 프로그램을 복사 후 마지막에 EOF를 추가한다.
Purpose
SIC/XE Machine에서 사용하는 Assembler와 GUI Simulator를 구현하여 assembler의 동작 원리 및 실제 동작을 확인한다.
이를 통해 하이 레벨에서의 명령어를 실행하기 위해 assembler에서 많은 명령어가 필요하다는 넓은 시각을 얻는다.
1. Assembler
C를 이용하여 SIC/XE Assembler로 작성된 프로그램을 object code로 변환한다.
Object Code 변환 과정에서 짧은 명령어들을 통해 많은 정보들을 얻어낸다.
하나의 구조체에 모든 정보를 몰아넣기에는 너무 커지고, 처리도 매우 복잡해진다. 이로 인해 정보의 종류에 따라 여러 구조체로 나누었다.
2 PASS 방식으로 구현하였다. 2 PASS 방식은 각 명령어의 주소와 label, literal 등의 정보 처리 -> 각 명령어를 object code로 변환 과정이다.
각 PASS 과정에서 많은 정보들을 처리하며, 이를 여러 함수로 나누어 처리하였다.
input을 각 line별로 처리 - 토큰 파싱 - 토큰별 byte 처리 - symbol 및 literal 처리 - 주소와 nixbpe 처리 - Displacement 처리 - Object code로 변환 과정이다.
각 함수를 더욱 나누기에는 너무 과한 분리라고 판단하였고, 몇몇 함수를 합치기에는 너무 과한 기능 처리라고 판단하였다.
최종적으로 object program 생성에 필요한 정보는 g_ObjectCode_table
에 저장이 된다. 구현한대로 파일로 출력할 수도 있으며, 이를 이용하여 JSON 방식으로 변환할 수도 있도록 유연한 프로그램을 작성하였다.
이전에 구현한 .obj 파일과는 다르게 각 정보 사이에 공백을 집어넣어 정보가 겹치지 않도록 분리하였다.
LDA =X'4F'
LDT =C'0000F0'
...
LTORG
위 예시처럼 프로그램이 작성되었다고 가정하자. LTORG 이후에 4F
와 0000F0
literal에 대한 할당이 이루어진다.
이전에 구현한 방식에서는 4F0000F0
처럼 저장이 될 것이다. 앞의 3바이트인 4F0000
은 RSUB 명령어에 대한 object code와 동일하다.
LTORG에 대한 정보는 object code 이후에서는 확인할 수 없으며, 메모리를 보았을 때 이것이 4F
0000F0
인지, 혹은 4F0000
F0
인지 확인할 방법이 없다.
이로 인해 두 literal에 대한 정보는 유지되어도, 이를 RSUB이라는 명령어로 인식하여 오작동할 가능성이 존재하는 것이다.
이를 해결하기 위해 각 명령어 단위로 공백을 집어넣어 잘못 파싱이 되는 경우가 없도록 수정하였다.
아래의 GUI Simulator에서 사용한 object code의 경우 이러한 문제가 없도록 작성한 프로그램을 사용하였다.
2. GUI Simulator
Java를 이용하여 object code의 동작을 GUI 환경에서 확인할 수 있는 Simulator를 구현하였다.VisualSimulator
클래스 동작과 함께 GUI 화면이 구성이 된다.
이와 동시에 SicLoader
클래스는 명령어의 정보를 담은 inst.data
와 object code에 대한 정보를 담은 output.obj
를 읽어 각 정보를 load한다.
프로그램의 정보 Extdef, Extref 등의 정보와 메모리는 ResourceManager
클래스에 가상으로 구현이 된다.
각 명령어의 정보를 확인하여 InstLauncher
클래스로 보내주며, InstLauncher
클래스는 명령어의 정보를 파싱한 후 각 명령어에 알맞은 동작을 수행한다.InstLauncher
에서 구현되지 않은 명령어의 경우, 추후 배우게 될 명령어들로 더욱 깊은 내용을 다루고 있으므로 구현하지 않았다.
Conclusion
Assembler를 구현하고 동작을 확인하는 과정에서 assembler에 대한 이해를 할 수 있었으며, 넓은 시야를 얻을 수 있었다.
Literal table과 Symbol table의 분리 혹은 통합, 기능의 분산으로 인한 성능 저하, GUI Simulator에서의 파일 입출력 등 개선해야할 부분은 여전히 많이 남아 있다.
그러나 해당 프로젝트에 시간을 더욱 투자하는 것보다는 이쯤에서 마무리하고 다른 프로젝트를 진행하는 것이 더욱 좋을 것이라 판단하였다.
앞으로 Assembler 레벨에서 작업할 일은 거의 없을 것이다. 하지만 Assembler를 잘 다루기 위한 프로젝트가 아닌, 동작을 이해하여 넓은 시야를 가지기 위해 진행한 프로젝트이다.
절반의 성공을 얻고, 시야를 넓힐 수 있었으며, 성장하면서 고민해야할 점을 인지한 것으로 만족한다.
'Project' 카테고리의 다른 글
Project - 다잇슈 개요 (0) | 2023.05.03 |
---|---|
Project - Community Issue Keyword 개편 및 진행 (0) | 2022.12.28 |
Project - Community Issue Keyword 마감 및 회고 (0) | 2022.09.18 |
Project - Community Issue Keyword 2주차 정리 (0) | 2022.09.05 |
Project - Community Issue Keyword 1주차 정리 (0) | 2022.08.30 |