[컴퓨터구조] Instruction: Langauge of Computer(1)

2021. 7. 5. 22:54Study/Computer Architecture

컴퓨터 하드웨어에게 일을 시키려면 하드웨어가 알아들을 수 있는 언어로 말을 해야한다. 우리가 코드를 작성하여 프로그램을 실행 시키는 것도 컴퓨터에게 프로그래밍 언어로 말을 하고, 그 대답을 화면으로 보는것 과 같다. 

 

일반적인 프로그래밍 언어 C,Java 와 같은 고급 언어는 Compiler를 통해 기계어나 Assembly 언어로 바뀌게 되어 하드웨어 위에서 동작하게 된다. 참고로 기계어는 CPU 제조사 마다 모두다른 구조를 가지고 있다.  자세한 설명은 다음에 하기로 하자.

 

Assembly 언어는 기계어와 1대1 대응 되는 언어 이다. 따라서 제한된 종류의 CPU만 이해할 수 있다. 이번 포스팅에선 MIPS라는 Assembly 언어를 이용하여 컴퓨터 구조에 대해 공부해 보려 한다. 앞으로 나오는 Instruction, 명령어, 이런 단위는 모두 Assembly 언어 기준이다.


Instruction 

Machine Language 의 단어 이다. 

Processor 일처리의 단위라고 볼 수 있다. 

opcode + operand specitics 로 구성되어있다. 풀어서 설명하자면, 어떤일을 할지 와 그 일을 위한 data로 이루어져 있다. 

 

Insturction Set

위 Instruction 을 하나의 word로 보자면 word의 집합, 즉 컴퓨터 언어의 어휘 이다. 

앞으로 살펴볼 MIPS 도 Instruction Set이다. 

 

MIPS로 몇가지 하드웨어 설계 원칙을 살펴보자.

 

설계원칙 1 : Simplicity favors Regulity

간단하기 위해선 규칙적인게 좋다.

MIPS 산술 명령어는 반듯이 한 종류의 연산만 지정하며 항상 변수 3개를 같는다. 

MIPS           C

add a,b,c -> a = b+c; 모두 같은 뜻이다. 

C 에선 a = b+c+d+f; 처럼 여러개의 합도 한줄에 표현할 수 있지만

MIPS 언어에선 add t b c, add t1 c d, add a t t1 3줄로 표현해야 한다. 

이유는 피연산자의 수를 고정하여 하드웨어가 복잡해 지는걸 막기 위해서이다. 

 

설계원칙 2 : Smaller is faster 

작은 것이 더 빠르다. 

MIPS에선 항상 32개의 register를 이용하여 연산한다.(링크에 가면 각 register의 번호, 역활을 알 수 있다)

또한 각 register는 32bit로 이루어져 있다.  

즉 MIPS 에선 피연산자가 항상 32개의 register가 된다. register가 많아지면 전기 신호를 더 멀리까지 보내야 하여 Clock Cycle 시간이 길어지기 때문이다. 

 

일반적인 High-level언어에선 변수의 수가 제한이 없다. 

따라서 배열과 같은 많은 변수를 다루려면 32개의 register론 부족한 경우가 일반적일 것이다. 이럴때를 대비하여 MIPS 에서는 이와 같은 자료구조를 Memory 에서 다룬다. 

 

이런 컴퓨터 구조에서 Memory 에서 register 로 data를 가져오기 위한 load 명령어, 다시 Memory에 저장하기 위한 Store명령어를 

Data Transfer Instructions 라 부른다 

각각 lw, sw 이다. 보통 주소는 register에 data는 memory 에 넣어두고 offset을 이용하여 접근한다.

이 명령어 들의 Memory 주소 다루는 법은 아래에 다루겠다. 

**참고: 이렇게 자주 자용하는 값 (주소) 를 register에 넣어두고 가끔 사용되는값 배열에 저장된 data 는 memory에 넣어두는 방식을 Register splilling이라 한다. CPU입장에서 register vs memory 하면 register가 훨씬 접근시간이 빠르다고 한다. 

 

설계원칙 3 : Make the common case fast 

자주 생기는 일을 빠르게. 

생각보다 Computer Language에서 상수가 많이 쓰인다고 한다. 상수는 프로그램이 실행될때 메모리에 넣어진다. 

이렇게 넣어진 상수를, 많이 사용하게 되면 프로그램상 a = b + 2 1줄짜리 code는 

1.lw $t0 상수위치 2. add $s1 $s3 $t0 와 같은 2번의 과정을 거처야 한다. 이렇게 되면 속도가 많이 줄어들 것이다. 

따라서 더 빠른 버전 addi 라는 명령어를 제공하여

위 2 단계를 addi add $s1 $s3 2 를 이용하여 1단계로 줄일 수 있다. 

 

설계원칙 4 : Good design demands good compromises

좋은 설계는 적절한 타협이 필요하다. 

 

MIPS 에선 명령어 역시 32bit로 다루어 진다. 설계원칙 2에 따라 모든 MIPS의 명령어는 32 bit이다. 

MIPS는 아래와 같은 형식을 가지는 32bit의 Machine code로 변환되어 다루어 진다. 

대표적인 산술 명령어  add 로 보자면

add $t0 $s1 $s2는 ($t0= 8 $s1=17 $s2=18번 register) 아래 그림과 같이 32bit의 Machine code가 된다. 

각각의 field는 아래와 같은 역활을 한다. 왼쪽부터 1번에 대응된다. 

1. opcode : 실행할 연산의 종류

2.  rs (register source) : 1번째 피연산자 retgister 번호 

3.  rt (rs 인데 s의 알파벳상 다음 t) : 2번째 피연산자 register 번호 

4.  rd (register destination) : 연산결과가 저장될 목적지(destination) register 번호 

5. shamt(shift amount) : shift량

6. func (function) : 구체적인 연산 , opcode라는 연산 종류 중 구체적인 연산

 

하지만 lw, sw 같은 명령어 에선 위 와같은 field로는 offset(상수)를 표현하기에 제약이 있다.  

따라서 아래와 같이 field구분을 다르게 하여 lw $t0 32($s3) 32가아닌 더 큰 offset도 표현할 수 있게된다. 

설계원칙 3에서 설명한 addi 도 같은 형식을 가진다. 

6개 field를 가지는 명령어 들을 r-type(register type) 명령어라 하고, 4개의 field를 가지는 명령어 들은 l-tyep(immediate type) 명령어라 한다. 

강력한 기준 32bit를 가지고 적당한 타협(type구분) 을 통해 하드웨어의 복잡도를 낮추는 결과를 이루어 낸다. 

+두 type의 명령어 구분은 opcode 영역을 보고 구분한다 한다. 항상 6bit를 opcode라 생각하고 읽은후 

남은 26bit의 field들이 결정된다. 

 

 

이번엔 설계원칙 4가지와 MIPS에 대해 간단히 알아 보았다. 다음 포스팅에선 분기문과 함께 addressing 방식을 다루어 보겠다. 

'Study > Computer Architecture' 카테고리의 다른 글

[컴퓨터구조] Hardware/Software Interface  (0) 2021.07.05
[컴퓨터구조] Introduction(1)  (0) 2021.07.01