가상의 컴퓨터로 실제 컴퓨터 명령어를 단순화시켜 이해하기 쉽게 만들어 놓은 것이다. SIC은 8비트가 한 byte로 이루어져 있고 모든 주소는 byte로 표현되며 저장된다. 3bytes가 한 word로 이루어져 있으며 SIC의 전체 메모리는 2의 15승이다. SIC은 가상 컴퓨터의 standard 모델이고 SIC/XE는 확장된 모델이다.
Registers
SIC은 특수한 목적을 가지는 레지스터가 5개가 존재하고 그 길이는 각각 24bit이다.
Instruction Formats and Addressing Mode
명령어 포멧은 24비트로 되어 있다. OPCODE는 8bit로 어떤 명령을 내릴 것인지를 나타낸다. X는 Index-Address mode를 나타내며, X=1이면 Indexed addressing mode로 동작하고 X=0이면 direct addressing mode로 동작한다. Direct address는 그 주소를 직접 사용하지만 Index address는 해당 주소에 index 레지스터의 값을 더한 것을 사용한다.(주소 + X)
Registers
5 registers as SIC + 4 additional ones(B, S, T and F)
Instruction Formats
6bits | 1 | 1 | 1 | 1 | 1 | 1 | 12 |
---|---|---|---|---|---|---|---|
opcode | n | i | x | b | p | e | address |
6bits | 1 | 1 | 1 | 1 | 1 | 1 | 20 |
---|---|---|---|---|---|---|---|
opcode | n | i | x | b | p | e | address |
Addressing Mode
Load or Store instructions : LDA, LDX, STA, STX etc
LDA ALPHA : 데이터를 ALPHA에 가서(ALPHA의 주소로 가서) 값을 load하여 A 레지스터에 넣어라.
STA GAMMA : 데이터를 A 레지스터에 가서 값을 읽어 GAMMA에 store하라.
Integer Arithmetic operations : ADD, SUB, MUL, DIV
A 레지스터와 관련이 있고, A를 주어로 생각하고 해석하면 된다. A는 항상 생략되어 있다.
ADD ALPHA : A register <- A register + ALPHA
SUB BETA : A register <- A register - BETA
MUL GAMMA : A register <- A register * GAMMA
DIV DELTA : A register <- A register / DELTA
Comparision : COMP, TIX
COMP ALPHA : 비교되어 나온 값(크다, 작다, 같다)을 SW 레지스터의 condition code에 저장한다. 현재 A 레지스터에 들어있는 값과 ALPHA를 비교하여 CC(Condition Code)에 결과(<, =, >)를 저장한다. CC <- A register compare with ALPHA
TIX ALPHA: X에 1을 증가시킨 후, X가 가리키는 값과 ALPHA를 비교한다.
Conditional Jump : J, JLT, JEQ, JGT
CC에 따라 점프하는 명령어이다. JLT, JEQ, JGT는 조건에 따라 결정된다.
J ALPHA : CC에 관계없이 다음 명령인 PC에 ALPHA를 넣는다. PC <- ALPHA
JLT BETA : A 레지스터 값이 더 작다면(CC에 들어있는 값이 <) PC에 BETA를 저장한다. PC <- ALPHA if CC set to <
JEQ BETA : A 레지스터 값과 같다면(CC에 들어있는 값이 =) PC에 BETA를 저장한다. PC <- ALPHA if CC set to =
JGT BETA : A 레지스터 값이 더 크면(CC에 들어있는 값이 >) PC에 BETA를 저장한다. PC <- ALPHA if CC set to >
Subroutine linkage : JSUB, RSUB
JSUB READ : L 레지스터(return할 때 찾아갈 값 보관용)에 다음 할 명령이었던 PC를 저장하고 PC에 READ라는 서브루틴을 부른다. READ 명령들을 수행한 후 원래의 루틴으로 L 레지스터 값을 참조해 들어온다.
RSUB : return과 유사하다.
I/O(Input and Output)
Input과 Output은 한 번에 1바이트씩만 전송되며, A 레지스터의 마지막 1바이트를 사용한다. 모든 디바이스는 unique한 8비트의 코드가 부여된다.
TD INDEV : INDEV란 디바이스를 테스트해라. 이 결과는 CC에 저장되며, <(LT)면 device는 ready 상태, =(EQ)면 not ready 상태이다.
RD INDEV : 디바이스에서 1바이트를 읽어 A 레지스터 가장 마지막 1바이트에 저장하라.
WD INDEV : A 레지스터의 값을 내보내라.