SIC의 구조
시스템 프로그램은 하드웨어와 밀접한 관련이 있다. 하지만 실제 하드웨어는 매우 복잡하여 학습하기에 적합하지 않다. 이를 위해 SIC와 SIC/XE는 가상의 컴퓨터로 실제 컴퓨터 명령을 단순화하여 이해하기 쉽도록 만든 것이다.
이 중 SIC는 가상 컴퓨터의 스탠다드 모델이다. 이 글에서는 SIC가 어떤 구조로 이루어져 있는지 아래와 같은 목차로 나누어 알아본다.
- 메모리
- 레지스터
- 데이터포맷
- 명령어(Instruction) 포맷과 주소 지정 모드(Addressing mode)
- 명령어 집합
메모리
SIC는 1byte가 8bits로 구성되고, 1word는 3bytes로 구성된다.
컴퓨터에서 연산이 일어나는 기본 단위를 word라고 한다. 컴퓨터에서 수행하는 명령 또한 1 Word로 구성된다. word를 구성하는 3bytes 중 최하위 바이트의 위치로 주소가 지정된다.
SIC의 전체 메모리는 2^15 == 32,768 bytes 다.
레지스터
SIC에는 5개의 레지스터가 존재하며, 크기는 각각 24bit다. 레지스터는 숫자로된 표현과 Character 형식(Mnemonic)의 표현 두 가지를 가지고 있다.
Mnemonic |
Number |
Special Use |
A |
0 |
Accumulator register라고 불린다. 기본적인 산술 연산에 사용된다. 계산 결과를 임시저장한다. |
X |
1 |
indeX register라고 불린다. 주소를 저장하고 계산한다. loop을 지원하기 위해 존재한다. |
L |
2 |
Linkage register라고 불린다. 특정 메모리 주소로 점프하거나 반환된 주소들을 저장한다. return을 지원하기 위해 존재한다. |
PC |
8 |
Program Counter register라고 불리고, 연산을 위해 다음 명령어의 주소를 가리킨다. |
SW |
9 |
Status Word register(상태 레지스터)라고 불리고, 다양한 상태의 Flag들을 저장하는 CC 레지스터를 포함한다. |
데이터포맷
SIC는 두 가지 데이터 포맷, Character와 Integer를 갖는다. (Floating-point number 지원 x, SIC/XE에서 지원)
모든 Character는 8비트의 ASCII코드로 관리되고, Integer는 24비트의 2진수로 관리된다. 음수는 2의 보수로 표현된다.
명령어(Instruction) 포맷과 주소 지정 모드(Addressing mode)
명령어 포맷은 24비트로 되어있고, 세 가지 부분으로 나뉜다.
OPCODE(8) |
X |
Address(15) |
1. 맨 앞 8자리 opcode는 어떤 명령을 내릴 것인가를 나타낸다.
2. X는 Index-Address mode를 나타내는 플래그다.
모드 |
indication |
target address |
Direct |
x=0 |
TA = address |
Indexed |
x=1 |
TA = address + (x) |
Direct 모드는 index code 0 값을 갖고, target address가 실제 명령을 수행할 주소가 된다.
Indexed모드는 index code 1 값을 갖고, target address + (X register의 값)이 실제 명령을 수행할 주소가 된다.
이렇게 주소를 참조하는 방식이 2가지인 이유는 loop를 지원하기 위해서다.
예를 들어 배열 arr[i]를 i = 0 ~ 100까지 더하는 경우 target address를 매번 새로 지정하는 것이 아니라 arr[0]에서 X register 만큼 떨어진 주소의 메모리를 참조하고 이 X register의 값을 계속 증가시킨다.
3. Address는 메모리 주소를 나타낸다.
명령어 집합
SIC 머신의 어셈블리 명령어 종류는 다음과 같다.
1. Load와 Store
메모리에서 레지스터로 값을 불러온다.
LDA: LoaD A register의 약자. target address의 값을 1 Word 읽어 A 레지스터에 쓴다.
LDX: LDA와 같은 원리.
LDL: LDA와 같은 원리.
LDCH: Load CHaracter의 약자. target address에서 맨 오른쪽 1Byte를 읽어 A 레지스터에 저장한다.
레지스터의 내용을 메모리에 저장한다.
STA: STore A register의 약자. A register의 값을 target address에 저장한다.
STX: STA와 같은 원리.
STL: STA와 같은 원리.
STSW: STA와 같은 원리.
STCH: STore CHaracter의 약자. target address에 A 레지스터의 맨 오른쪽 1 Byte를 저장한다.
2. Arithmetic과 Logic
산술연산과 논리 연산을 수행하며, 다음과 같은 종류가 있다.
ADD, SUB, MUL, DIV, AND, OR, TIX
TIX를 제외한 연산은 A register를 사용하고, TIX는 X register를 사용한다. TIX는 X register를 1 증가시키고, X register의 값과 target address의 값을 비교한 결과를 CC register에 저장한다. X register를 사용하므로 loop에 사용되는 명령어임을 짐작할 수 있다.
3. Compare
크다, 작다, 같다 비교 연산을 수행한다.
COMP 명령어는 A register의 값과 target address의 값을 비교하고 결과를 CC register에 저장한다.
4. Control
다음은 CC(SW에 있는) register 값에 따라 PC 값을 변경하여 target address로 점프하는 명령어다.
J: CC 값에 관계 없이 PC 값을 변경한다.
JLT: CC 값보다 작으면 PC 값을 변경한다.
JEQ: CC값과 같으면 PC 값을 변경한다.
JGT: CC값보다 크면 PC 값을 변경한다.
다음 명령어는 점프 후 return을 하기 위한 명령어다.
JSUB: L register(링커, 리턴 할때 찾아 갈 값 보관)에 현재 PC+1을 저장하고, target address로 PC를 변경한다.
RSUB: return을 수행한다.
5. I/O
TD: Test Device의 약자. I/O 장치를 쓰기 전 사용 가능한지 확인하는 명령어다. 사용이 불가능하면 CC에 0을 저장하고, 사용이 가능하면 0이 아닌 값을 저장한다.
RD: Read Data의 약자. I/O에 1 Byte를 읽는 명령어다. target address에 Input Device로부터 1Byte를 읽어서 A register의 마지막 1 Byte에 저장한다.
WD: Write Data의 약자. A register의 마지막 1 Byte를 읽어 Output Device에 전달한다.
1 Word가 아니라 1 Byte 씩 읽고 쓰는 이유는 컴퓨터마다 1 Word의 정의가 다르기 때문에 I/O Device가 모든 컴퓨터에서 동일하게 동작할 수 있게 하기 위해서다.
https://dev2820.github.io/computer_science/시스템_프로그래밍/sic란/
https://ko.wikipedia.org/wiki/%EC%83%81%ED%83%9C_%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0
'컴퓨터공학 > 시스템프로그래밍' 카테고리의 다른 글
SIC 어셈블러(Assembler) (0) | 2021.05.01 |
---|---|
SIC/XE의 구조 (0) | 2021.03.27 |
SIC와 SIC/XE란? (0) | 2021.03.22 |
댓글