대학교에서 '시스템소프트웨어' 과목을 수강 후 복습하며 작성한 글입니다.
오탈자 및 오류의 가능성이 있습니다. 댓글로 알려주세요.
시스템 소프트웨어
소프트웨어는 소프트웨어는 Machine Dependency(머신 의존성)에 따라 컴퓨팅 머신을 도구로 하여 주어진 문제를 해결하는 응용프로그램과 컴퓨터 자원 운용을 지원하는 시스템 소프트웨어로 나뉜다.
소프트웨어의 구분
응용 소프트웨어(Application Software) : 사용자가 컴퓨터를 사용하여 어떠한 일을 하려고 할 때 사용되는 모든 프로그램
시스템 소프트웨어(System Software) : 소프트웨어를 위한 소프트웨어. 시스템소프트웨어의 기능 구조와 동작 원리는 컴퓨터 아키텍처와 세부 설계내용을 기초로 하여 구현될 수 있다. 따라서 하드웨어 구조 등에 따라 다르게 작성되어야 한다.
SIC (Simplified Instructional Computer)
SIC는 컴퓨터의 핵심 기능만을 담아 단순화시킨 가상의 교육용 컴퓨터이다. 이를 활용하여 머신 언어를 이용하여 문제를 해결하는 프로그램을 작성하고 컴퓨팅 머신이 어떻게 이를 활용하는지 이해할 수 있다.
*SIC/XE : SIC의 확장(eXtra Equipment) 모델로, SIC의 상위호환으로 설계되었다.
프로그램의 작동 단계
C언어, Python, Java 등 개발자가 주로 다루게 되는 언어는 모두 고급 언어(High-level Language)로, 전처리기와 컴파일러, 어셈블러 등의 시스템프로그램을 거쳐 컴퓨터가 이해하는 저급 언어(Low-level Language)인 머신 언어로 변환된다.
마이크로 명령어
마이크로 명령어(Micro-Instruction)란, 컴퓨터의 중앙처리장치(CPU)가 한 번에 실행할 수 있는 단위의 명령어이다. 고급 언어로 작성된 하나의 명령어는 여러 개의 마이크로 명령어로 변환될 수 있다.
머신 언어
정수형과 문자형 변수를 각각 두 개씩 선언 후 대입하는 가장 기초적인 C 프로그램을 머신 언어로 변환한 결과이다.
머신 언어의 구조 이해하기
SIC 머신언어의 구조는 START로 시작하며 END로 종료된다. 소스코드의 가장 첫 줄의 시작 부분에는 프로그램의 이름이 작성되며, 마찬가지로 프로그램을 마치는 가장 마지막 부분에도 프로그램의 이름이 작성된다. SIC 머신 언어 소스코드는 모두 영문자 대문자로 작성하는 것이 원칙이며, 한 줄이 하나의 마이크로 명령어에 대응한다.
마이크로 명령어의 개수는 25개이며, 여기서 LDA, STA, LDCH ..등이 그 중 일부이다. 모든 마이크로 명령어에 대한 자세한 설명은 다음 글에서 확인할 수 있다. 아직 레지스터 개념을 설명하지 않았으므로, 머신 언어는 모두 '마이크로 명령어'로 이루어져 있음을 이해하고 있으면 좋다.
오브젝트 코드
현재까지 간단한 C 코드가 전처리기와 컴파일러를 거쳐 '머신 언어'로 변환되었음을 확인하였다. 이어서, 프로그램의 작동 단계를 보면 머신 언어는 곧 어셈블러(Assembler)를 거쳐 '오브젝트 코드'가 된다. 오브젝트 코드는 2진수로 이루어진 CPU가 처리할 수 있는 목적 코드이다.
SIC 머신에서는 모든 마이크로 명령어가 3바이트 크기를 갖는다. 1바이트는 8비트로, 하나의 마이크로 명령어는 24비트의 크기를 갖는다.
마이크로 명령어는 opcode, x bit, address로 구성되어 있다.
Opcode
8비트 크기의 opcode는 LDA, STX 등에 해당하는 마이크로 명령어가 표현되는 부분이다. 각각의 마이크로 명령어는 모두 1바이트의 2진 코드로 정해져 있다. (LDA는 0000 0000, STA는 0000 1100 등)
X(Flag bit)
1비트 크기의 x는 인덱스(indeX) 모드와 직접 모드를 알려주는 플래그 비트 역할을 한다. 다음에 더 자세히 설명하겠지만, 인덱스 모드와 직접 모드는 메모리의 주소 전체를 address 부분에 작성할 것인지, 또는 주소의 차이만 적어 더 빠르게 접근할 것인지에 대한 내용이다.
Address(Operand)
마지막으로, 남은 15비트에는 메모리의 주소가 들어가게 된다. 따라서, SIC 머신의 메모리 주소는 0부터 2^15-1까지 사용할 수 있다.
한 줄의 오브젝트 코드를 해석해보면, '메모리의 000F에 직접 접근하여 LDA(A 레지스터에 Load) 명령을 수행하라' 라는 의미가 된다.
오브젝트 코드는 16진수로 나타낼 수 있다. 4개의 2진 코드를 하나의 16진수로 묶어 6자리로 표현하기도 한다. 따라서 2진수와 16진수 간의 오브젝트를 육안으로 이해하고 변환하기 위해서는 컴퓨터의 자료 표현에 대해 알고 있어야 한다.
명령어가 어떤 역할을 하는지, 명령어에는 어떤 종류가 있는지, 직접 주소와 인덱스 모드 사이 어떤 차이가 있는지 등에 대한 글은 다음 글에 작성할 예정이다.