티스토리 뷰

정보처리기사 필기 2과목 전자계산기 구조의 개념 중 지난 포스팅에서는 중앙처리장치를 구성하는 요소들과 기능에 대해 알아보았습니다. 제어장치, 연산장치, 레지스터로 구성된 컴퓨터의 중앙처리장치는 명령어를 기억하고 해독하여 컴퓨터의 각 장치들을 제어하는 장치라고 생각하면 쉽습니다. 

 

이때 중요한 것이 '명령어'입니다. 명령어를 통해 컴퓨터의 모든 기능이 수행되므로 명령어가 무엇이고 어떻게 설계되고 구성되는지를 아는 것이 컴퓨터의 원리를 이해하는 핵심적인 단계입니다.

명령어의 구성 요소에 대해 알아보겠습니다.

명령어는 크게 연산자부(Operation Code), 모드부(Mode), 그리고 자료부(Operand)로 이루어져있습니다. 연산자부는 말 그대로 컴퓨터가 수행할 연산에 맞는 연산자를 표시하는 부분입니다. 연산자부의 크기는 메모리의 크기를 나타낼 때와 마찬가지로 Bit로 표현하고 이때 n Bit의 크기라면 최대한 표현할 수 있는 명령어의 수는 2의 n제곱이 됩니다. 원리는 연산자부를 구성하는 각 Bit 마다 0 또는 1의 선택을 할 수 있고, 이때 모든 가능한 명령어의 개수는 수학적으로 2의 n승을 하면 된다는 매우 간단한 것입니다.

다음으로 모드부(Mode)는 주소부의 유효한 주소가 결정되는 방법을 지정하는 기능을 수행하는 요소입니다. 모드부의 원리 또한 매우 간단히 설명할 수 있습니다. 유효한 주소가 결정되는 방법이 직접이면 모드 비트를 0으로 표시하고, 간접이면 1로 표시하게 됩니다.

 

명령어에서 실제 데이터에 대한 정보를 표시하는 부분은 자료부(Operand)입니다. 데이터를 표시하는 방법은 데이터를 저장하는 기억 장소의 주소와 데이터가 거쳐가는 레지스터의 번호, 그리고 직접적으로 사용할 데이터를 표시하는 것입니다.

데이터가 저장된 장소의 주소와 거치는 통로와 실제 사용되는 데이터가 무엇인지를 명령어를 통해 지정해준다면 컴퓨터 장치가 해독하고 이에 맞는 데이터를 정확히 사용하는데 충분합니다. 데이터의 저장 주소를 표시하는 주소부의 크기는 메모리의 용량과 연관되어있습니다. 자료부의 크기가 n Bit라면 최대로 지정할 수 있는 주소의 개수는 2의 n제곱입니다.

위와 같이 구성되어있는 명령어를 설계할 때 고려해야할 사항에 대해 알아보겠습니다.

 

명령어를 설계하려면 어떤 것들을 고려해야할까요? 먼저 고려해야 할 사항은 연산자의 수와 종류입니다. 다양한 컴퓨터 시스템에서 처리하는 다양한 기능에 맞게 연산자의 수와 종류를 결정해야만 명령어의 연산자부를 제대로 구성할 수 있습니다. 그리고 해당 컴퓨터 시스템의 데이터 구조에 맞게 명령어를 설계해야합니다. 이때 데이터의 구조라는 것은 데이터의 크기를 표현하는 단위인 워드의 크기라고 이해하시면 됩니다. 

워드의 크기를 알아야만 명령어의 자료부를 제대로 구현할 수 있습니다. 또한 명령어의 자료부에 속하는 자료의 위치를 표현하기위한 주소 지정 방식을 결정해야합니다. 주소 지정 방식을 결정하고 명령어를 구현한다면 명령어의 자료부를 지정할 때 효율적으로 설계할 수 있습니다. 마지막으로 명령 세트의 효율성을 높이기 위해서 기억 공간, 사용 빈도, 주소 지정 방식, 주기억장치 밴드폭 등을 고려하면 보다 효율적으로 명령어를 구현할 수 있습니다.

명령어를 구성하는 연산자(Operation Code)에 대해 자세히 알아보도록 하겠습니다.

 

명령어의 연산자는 연산자가 수행하는 기능에 따라 크게 네 가지로 분류할 수 있습니다. 먼저 함수 연산 기능을 수행하는 연산자가 있습니다. 함수연산은 산술 연산과 논리 연산으로 구분할 수 있고, 산술 연산에 속하는 연산자의 종류로는 ADD, SUB, MUL, DIV, SHIFT 등이 있습니다. 논리 연산에 속하는 연산자의 종류로는 NOT, AND, OR, XOR, SHIFT, ROTATE, CLEAR 등이 있습니다. 

산술적·논리적 연산 기능을 수행하는 연산자 다음으로는 자료전달기능을 수행하는 연산자들이 있습니다. 여기에서 자료 전달의 의미는 CPU와 기억장치 사이에서 정보를 교환하는 것을 의미합니다. 즉 CPU가 기억장치에서 정보를 꺼내오거나, 반대로 기억을 시키는 등 CPU와 기억장치 사이의 정보 전달을 수행하는 작업들을 담당하는 연산자들로는 Load, Store, Move, Push, Pop 등이 있습니다.

Load는 CPU가 기억장치의 정보를 꺼내올 때 사용하는 명령어이고, Store는 CPU에 있는 정보를 기억장치에 기억시키는 명령어입니다. Move는 CPU와 기억장치 간의 정보 전달이 아니라 동등한 레지스터 간에 자료를 전달할 때 사용하는 명령어입니다.

 

Push는 자료를 스택에 저장하는 명령이고, 반대로 Pop는 스택에서 자료를 꺼내오는 명령입니다. 자료전달기능은 반대 기능을 하는 명령어를 짝을 지어 기억하면 편합니다. 예를 들어 Load는 Store와 반대되는 기능을 하므로 짝을 지어 기억하고, Push와 Pop을 함께 기억하면 쉽습니다.

제어기능을 담당하는 연산자로는 무조건 분기 명령(Unconditional Branch Instruction)에 해당하는 GOTO, Jump(JMP)와 조건 분기 명령(Conditional Branch Instruction)에 해당하는 IF 조건, SPA, SNA, SZA 등이 있습니다. 위의 두 개념은 대비되는 개념으로, 무조건 분기 명령은 말 그대로 이전까지의 조건과 무관하게 해당 제어를 다른 부분으로 옮기는 작업을 수행합니다.

GOTO는 이전까지의 조건에 상관없이 지정된 행으로 이동하여 명령을 수행합니다. 반대로 조건 분기 명령은 다양한 결과에 따라 기억 장치의 한 부분으로 분기하는 작업을 수행하게 하는 명령어라고 생각하시면 됩니다.

마지막으로 입·출력기능을 담당하는 연산자로는 INPUT과 OUTPUT이 있습니다. INPUT은 말 그대로 입·출력장치의 자료를 주기억장치로 입력하는 기능을 수행하는 연산자이고, OUTPUT은 주기억장치의 데이터를 입·출력장치로 출력하는 연산자입니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday