CS/Computer Architecture

[컴퓨터구조] 5-1. Instruction Codes

F12:) 2023. 9. 25. 22:38

이번 글에서는 Intruction Codes에 대해서 알아봅니다.

 

컴퓨터는 구조는 크게 세 가지로 이루어져있습니다. 5장을 다루면서 계속 언급할 것이기에 꼭 알아둡시다.

  • 내부 Registers
  • Control Unit
  • Instruction Set

이 세 가지를 나누어 설명합니다. 앞서 언급했듯이, 이번에는 Intruction set에 대해서 알아볼 것입니다.

 


Instruction Codes

Instuction code는 operation code(Opcode)와 address part로 나뉩니다.

Operation code 이하 opcode로 칭하는 이것은 operation을 지정하는 것입니다. 컴퓨터에는 각 operation마다 opcode가 존재합니다.

 

address part는 operation에 사용될 operand가 있는 주소를 의미합니다. 즉, 어떠한 대상을 ADD한다고 할 때, ADD의 대상이 존재해야하므로, 그러한 대상의 주소를 address part에 넣습니다.

 

Addressing modes

방금 address part에 대해 다뤘습니다. 이 address part에서는 진짜 operand가 존재하지 않을 때도 있습니다. address part가 가리키는 주소에 가면 거기에 있는 주소가 진짜 operand의 주소일 수 있다는 뜻입니다.

 

따라서 Address mode가 존재합니다. direct addressing mode와 indeirect addressing mode입니다.

 

direct addressing mode는 직접 주소를 address part에 나타납니다. 즉, address part에 명시되어 있는 address가 진짜 operand인 것입니다.

indirect addressing mode는 address part가 가리키는 주소에 가면 direct address가 존재하는 것입니다.

 

실제로는 이 두개의 주소 모드보다 더 많은 모드가 존재합니다. 가령, indirect indirect address mode와 같이 말이죠.(오타 아닙니다...ㅎ)

 

그렇지만 이 책에서는 16비트의 컴퓨터를 설계하는 것인만큼 주소모드를 나타내는 비트가 1비트만을 차지하므로 2개의 address모드로 구성했습니다.


앞서 설명한 Instruction Code가 진행되는 과정을 살펴봅시다.

 

insturction은 위와 같은 포맷으로 이루어져 있습니다.

 

16비트 컴퓨터에서 주소를 최대 16비트로 나타낼 수 있습니다. 그 중 가장 마지막 비트인 16번째 비트는 0과 1로 이루어져있어서, direct와 indirect를 명시할 수 있습니다.

 

0이라면 direct, 1이라면 indirect가 되는 것입니다.

 

더보기

약간 딴 이야기로 새본다.

 

Operation에 대해서 어느정도 앞선 글들을 읽어봤다면, 의문점이 들 수 있다. 

 

만약 operand가 필요하지 않은 CLR, INC같은 연산에서는 Address 부분을 어떻게 사용할까?

 

아주 좋은 지적이자 궁금증이다.

 

이러한 경우에는 Address를 다른 목적으로 쓴다. Operand가 필요없는 연산의 종류는 다양하다. 16비트에서 Address를 제외한 부분은 4비트이고, 4비트보다 더 세세하게 operand로 나누어쓸 수 있도록 Address 비트를 활용한다. 

-> 설명이 조금 후진데,,,, 다음 글에서 꼭 자세하게 설명하겠다.

그렇다면, 각 주소 모드마다 operation을 작동하는 방식을 알아봅시다.

 

direct 모드와 indirect 모드에서의 방식을 도식화해보았습니다.

 

여기서 AC(Accumulator)가 등장합니다. 누산기라는 뜻으로, 예전 컴퓨터 구조에서는 누산기를 통해서 값을 임시저장하는 Temper Register와 비슷한 역할을 하지만, 여기서는 누산기가 Operand와 operation하는 대상의 수를 의미합니다.

 

예를 들어, 4+2를 수행한다고 해봅시다.

Opcode는 ADD이고, Address가 가리키는 주소는 2라고 한다면, AC에 저장되어 있는 값이 4가 됩니다.

 

이러한 누산기는 예전 컴퓨터 구조에 굉장히 많이 쓰였지만, 현대 컴퓨터에서는 누산기의 역할을 대체할 수 있는 수많은 레지스터들이 존재하여 사용되지 않습니다.

 

 

 

Indirect 모드를 사용하는 이유

그렇다면, 우리는 굳이 두번이나 메모리를 거쳐가면서 원하는 값을 얻을 수 있는 Indirect Address 모드를 왜 사용할까요?? 이유는 주소의 범위 때문입니다.

 

자, 우리는 지금까지 16비트 컴퓨터를 설계하는 것이기때문에, 언제나 16비트 기준으로 설명한다는 것을 알아두고 시작해보겠습니다.

 

16비트의 주소 0x005A가 있다고 해봅시다. 우리가 위에서 배운 Instruction의 구조에서 direct mode와 opcode가 4비트를 차지하고 나머지 12비트로 주소를 표현한다고 해봅시다.

 

어라? 이렇게 되면, 12비트로는 0x0fff까지밖에 표현할 수 없는 것이 되는거죠. 그렇다면 우리는 0x1000부터 0xffff를 표현할 수 없게 되니, 문제가 생기겠죠?? 이러한 경우에 Indirect를 쓰는 것입니다. direct로 표현할 수 있는 수의 범위는 메모리의 기본 레지스터보다 작기 때문에, 12비트 이상으로 표현해야하는 수들은 Indirect 모드를 써야합니다.

 

Direct Address Mode의 한계점.