SIC(Simplified Instructional Computer)의 구조(Architecture), 명령어 포멧(Instruction formats), 주소 형식(Addressing modes)

조영규의 블로그

2014. 3. 6. 01:39 from Engineering


SIC과 SIC/XE란?

기본적으로 시스템 프로그램(소프트웨어)들은 하드웨어와 밀접한 관련이 있다. 이러한 관련을 '기계 종속적'이라고 하며, 따라서 특정한 기기를 집어 학습하여야한다. 실제 Machine은 매우 복잡하여 학습하기 좋지 않고, 가장 기본적인 Feature들에 충실할 수 없으므로, SIC과 SIC/XE를 통해서 이해하도록 한다. 이때 SIC과 SIC/XE는 Hypothetical한(가상의) 컴퓨터로 실제 컴퓨터 명령어(Simplified Instructional Computer)를 단순화시켜 이해하기 수월하도록 만들어 놓은 것으로, 실제의 Machine에서 자주 쓰이는 특징들이 포함되어있다. 가상의 컴퓨터이나, 실제와 유사한 상황을 만들 수 있도록 기본 버전인 SIC 뿐만아니라, SIC의 확장된 형태의 SIC/XE를 동시에 사용하여 설명한다.


SIC은 가상 컴퓨터의 스탠다드 모델이며, SIC/XE는 확장된 모델인데, 이 두개의 컴퓨터는 상위호환(upward compatible)을 보장한다. SIC에서 작동되었던 프로그램들은 모두 SIC/XE에서 정상적으로 작동된다. 단 SIC/XE의 프로그램들이 SIC에서 작동된다는 것은 보장하지 않는다. 이는 이 가상의 컴퓨터들이 하위호환(backward compatibility)을 보장하지 않기 때문이다.


추가정보 : 위키피디아 SIC


SIC의 구조(Architecture) - 메모리(Memory)


<SIC Machine Architecture - Memory>


SIC은 8비트가 한 바이트로 이루어져 있다. 모든 주소는 바이트로 표현되며 저장된다. 3개의 consecutive한(이어진) Bytes를 Word라고 하며, Word를 구성하는 3바이트 중 최하위 바이트의 위치로 주소가 지정된다. SIC의 전체 메모리는 2의 15승이다.


SIC의 구조(Architecture) - 레지스터(Registers)

SIC에는 각각의 특수한 목적을 지닌 5개의 레지스터가 존재하며, 그 크기(길이)는 각각 24bit이다. 레지스터들은 숫자로 된 표현과 Character형식의 표현, 이렇게 두가지 다를 가지고 있다. 이때 Character 형태로 된 표현을 Mnemonic이라 한다.


<SIC Machine Architecture - Register>



  • A(0)는 일반적으로 사용되는 레지스터로, 기본적인 산술 연산에 활용된다. 누적기(Accumulator)이라 번역된다.

  • X(1)는 주소를 저장하고 계산하는데 사용되는 레지스터이다. 비유하자면, 'for(int i=0;i<10;i++){//code}'에서 i같은 역할을 한다.

  • L(2)은 Function call시 사용되던 스택과 같은 역할을 하는 것으로, 어떤 메모리로 점프 할지, return할 주소는 어디인지를 저장하는 역할을 한다. 링크 레지스터라고 한다.

  • PC(8)는 다음 작업(명령)이 저장되는 곳이다.

  • SW(9)는 컨디션 코드를 포함한 다양한 정보를 담고 있는 레지스터이다.

SIC은 스택을 가지고 있지 않다. 따라서 linkage 레지스터에 돌아갈(return) Address를 저장한다. 그러다보니 recursive(재귀적) 프로그램은 작성하기가 쉽지않다.


SIC의 구조(Architecture) - 데이터 포멧(Data formats)

SIC은 2가지의 데이터 포멧을 가지고 있다. Character과 Integer가 그것이다. Floating-point number는 지원하지 않는다. (확장된 버전인 SIC/XE에서는 지원한다.) 모든 Character는 8bit로 된 ASCII코드로 관리된다. Integer는 24bit의 2진수로 관리된다. 현대의 모든 컴퓨터들이 그렇듯, 음수는 2의 보수(2`s complement)로 표현한다.


SIC의 구조(Architecture) - 명령어 포멧(Instruction formats)과 주소 모드(Addressing mode)


<SIC Machine Architecture - Instruction format>


명령어 포멧은 24bit로 되어 있다. 제일 앞 8자리는 opcode로 어떤 명령을 내릴 것인가를 나타내며, X는 Index-Address mode를 나타내는 플래그로, 1이면 Index-Address mode로 동작하며, 0이면 직접(Direct) 주소를 나타낸다. 직접 주소는 그 주소를 직접 사용하는데 반해, 인덱스 주소는 해당 주소에 Index 레지스터의 값을 더한 것을 주소로 사용한다. ( 주소 + X:인데스 레지스터의 주소 ) 이러한 instruction format을 1세대 언어에서는 그대로 사용하였다.


SIC Machine 명령어 종류(Instruction Type)

1세대 언어에서는 위의 Instruction format을 그대로 사용하였지만, 우리는 Aseembly라는 2세대 언어를 사용하여 학습을 진행할 것이다. SIC의 Assembly명령어를 크게 종류(type)로 구분하면, 6가지로 구분 할 수 있다.

  • Load와 Store

  • Arithmetic & Logic

  • Comparison

  • Conditional Jumps

  • Subroutine Linkage

  • I/O


SIC 명령어 - Load와 Store

LDA, LDX, STA, STX 이렇게 4가지만 우선 살펴보자. (다른 명령어도 존재한다.)



LDA ALPHA란 데이터를 ALPHA에 가서 값을 LoaD하여 A에 집어넣어란 명령어이다. 이때, ALPHA에 가서라는 것은, 저 ALPHA의 주소로 가서 value를 읽어오라는 것을 의미한다. LDX도 조금 주체가 바뀔 뿐 동일하다.

STA GAMMA란 데이터를 A가서 값을 읽어 STore in GAMMA 하라는 의미이다. STX도 주체가 바뀌지만 역시 동일하다.




위의 내용이 이해가 되었다면 아래 LDL,STL,STSW는 무리없이 이해할 수 있다. 그러나 LDCH와 STCH는 조금 고민해야하는데, register는 24bit고, 이곳에 byte(8bit)를 저장하기 위해서는 어딘가가 잘려야 한다. 이때 잘리는 부분은 앞의 16자리로, 맨 우측, 즉 가장 뒤의 8자리만 저장되고 로드된다. 이 부분만 이해하면 똑같이 STCH와 LDCH도 이해할 수 있을 것이다.


SIC 명령어 - Arithmetic & Logic

이 명령어들은 모두 A 레지스터와 관련이 있는 것으로, A를 주어로 생각하면 해석하기 편하다. 항상 A는 생략되었다 생각하자.



SIC 명령어 - Comparison

이 타입엔 2가지 명령어가 있다. 하나는 COMP, 다른 하나는 TIX이다. COMP는 비교를 하는 것으로,


비교되어 나온 값(크다, 작다, 같다 같은.)을 SW 레지스터의 Condition code에 저장한다.

TIX는 X에 1을 증가시킨 후, X가 가리키는 값과 ALPHA를 비교 한다고 생각하면 된다.


SIC 명령어 - Conditional Jumps

CC(of SW)에 따라 점프하는 명령어이다.

J는 CC에 관계없이 다음 명령인 PC에 ALPHA를 넣는다. JLT,JGT,JEQ는 조건에 따라 결정되는데, 이전 COMP명령어에서 A 레지스터가 주체였으므로, JLT는 'A레지스터 값이 더 작다면'으로, JGT는 'A레지스터 값이 더 크다면', JEQ는 'A레지스터 값과 같다면'으로 해석될 수 있다. (위의 예의 ALPHA와 이 예의 ALPHA는 다른 ALPHA로 아무런 관계가 없다. 편의상 사용한 것.)


SIC 명령어 - Subroutine Linkage



위의 코드 JSUB READ는 일단 L(링커; 리턴 할때 찾아 갈 값 보관용) 레지스터에 다음 할 명령이었던 PC를 저장해두고, PC에 READ란 서브루틴을 부른다. 그리고 READ의 명령들을 수행한 후, 다시 원래의 루틴으로 L레지스터의 값을 참조해 돌아온다.

RSUB는 리턴과 유사한 의미라 보면된다.


SIC 명령어 - I/O

인풋과 아웃풋은 한번에 1바이트씩만 전송되며, A레지스터의 마지막 1바이트(8비트)를 사용한다. 모든 디바이스는 각각을 구별하기위해 unique한 8비트의 코드가 부여된다. 따라서 구별되는 한도 내, 최대 2의 8승개의 디바이스가 붙을 수 있다.





TD INDEV는 INDEV란 디바이스를 테스트하는 명령이다. 이 테스트의 결과는 CC에 저장되며, <(LT)라면 디바이스가 레디된 상태, =(EQ)라면 아직 준비가 되지 못한 상태를 뜻한다. RD는 디바이스에서 1byte를 읽어 A 레지스터 가장 마지막 1byte에 저장하란 뜻이고, WD는 A 레지스터의 값을 내보내는 명령이다. 1바이트씩만 처리되므로, 여러바이트는 반복으로 처리해주어야 한다.


Define Storage

4가지로 Reserve를 할 수 있다.

  • BYTE : 문자 혹은 16진수 상수를 생성한다.

  • WORD : 한 워드 정수 상수를 생성한다.

  • RESB : 지정해준 수만큼의 바이트들을 예약한다.

  • RESW : 지정해준 수만큼의 워드들을 예약한다.

예를 들어 생각해보자.

ALPHA    RESW    1    => 1 만큼의 워드를 예약.
FIVE       WORD    5    => 상수 5 생성.
CHARZ   BYTE    C'Z'    => 캐릭터 상수 Z 생성.
C1          RESB    1    => 1만큼의 바이트 예약.


comments powered by Disqus
태그, 트랙백, 검색 상자 토글