1. 명령어 세트(Instruction Set) -> CPU 기능을 위해서 정의된 명령어들의 집합
- CPU의 기능은 이들에 의해 결정된다.
- 이들의 수와 종류는 CPU에 따라 많이 다르다.(아키텍처가 다르기 때문 ex. x86, amd64)
2. 명령어 세트 정의를 위해 결정되어야 할 항목
operand :
컴퓨터에서, 연산에 필요하거나 연산으로 나타나는 수치를 통틀어 이르는 말(출처 : 네이버 백과사전)
A. 오퍼랜드(operand)
① 오퍼랜드의 크기와 형태
② 정의 방법
B. 오퍼랜드의 CPU 기억장소
① 스택(Stack)
② 범용 레지스터(GPR)
③ 누산기(Accumulator)
C. 연산 명령어
: CPU 명령어가 수행할 연산들의 수와 종류
D. 오퍼랜드/명령어
: 일반적인 명령어가 처리 가능한 오퍼랜드의 수
E. 오퍼랜드의 위치
① CPU의 외부 혹은 내부
② Reg-to-Reg, Mem-to-Reg, Mem-to-Mem(-> 데이터를 주고 받는 경로를 의미함)
2-1. 부연 설명
여기서, operand의 CPU 기억장소와 명령어의 종류 및 형식, 명령어의 주소지정 방식에 대해서는 좀 더 설명할 것이 있다.
A. operand의 CPU 기억장소
1) stack architecture(CPU 초기 버전에 쓰임)
간단한 명령어로 직관적으로 짤 수 있다는 장점이 있으나, 그러기엔 많은 코드를 써야는 단점이 존재한다.
2) accumulator architecture
위와 마찬가지로 간단한 명령어로 직관적으로 짤 수 있고 내부 구조를 최소화 할 수 있는 장점이 있으나, 메모리 사용량이 높아지는 단점이 있다.
3) General-Purpose Register architecture(GPR)
가장 보편적인 모델이라는 장점이 있지만, 명렁어의 길이가 길어지는 단점이 있다.
B. 명령어의 종류
1) 데이터 전송명령
: Reg-Reg, Reg-Mem, Mem-Mem 간에 데이터를 이동시키는 명령
2) 산술 연산명령
: 2의 보수 및 부동소수점 수에 관한 덧셈, 뺄셈, 곱셈 및 나눗셈과 같은 기본적인 산술 연산 명령
3) 논리 연산명령
: 데이터의 각 비트들 간에 대한 논리 연산 명령
4) I/O(입출력) 명렁
: CPU와 External I/O 장치들 간의 데이터를 이동시키는 명령
5) 프로그램 제어명령
: 각 명령어의 실행 순서를 변경하는 Branch 명령과 Subroutine call 및 return 명령
C. 명령어의 형식
① 명령어는 CPU가 한 번에 처리할 수 있는 비트 수의 크기(word / cpu마다 다름)로 정의된다.
② 명령어를 구성하는 비트는 용도에 따라 몇개의 Field로 나누어진다.
③ 기본적으로는 op-code field와 operand field로 구성된다.
④ operand field는 컴퓨터의 처리 능력에 따라 여러 개의 operand field로 구성된다.
오퍼레이션 코드(op-code) : CPU에서 실행될 연산(load, store, add 등)을 지정
/
오퍼랜드(operand) : 연산을 실행하는 데 필요한 데이터 혹은 주소 값을 포함한다.
1) op-code field의 비트 수
① CPU에서 수행될 연산 종류의 수에 따라 비트의 수가 결정된다. ex) 연산의 종류가 8가지 -> 8=2^3 이므로 3비트 필요
② 비트 수가 증가할수록 많은 연산의 정의가 가능하나, operand field 비트 수가 감소(-> 32bit cpu보다 64bit cpu가 더 좋은 이유)
2) operand field의 비트 수
① operand의 종류에 따라 결정됨
② immediate value : 표현 가능한 수의 범위 결정
③ memory address : CPU가 직접 주소를 지정할 경우 기억장치 영역의 범위가 결정됨(ex. 10bit면 0~1023)
④ register no. : GPR의 수를 결정한다.
3) 명령어 형식의 예
A) 1-address instruction
B) 2-address instruction(operand가 모두 레지스터인 경우)
@는 address, #은 immediate value를 의미함
B-2) 2-address instruction(오퍼랜드 한 개만 레지스터인 경우)
※교수님께 여쭤보니 명령어의 경우 아키텍처별로 상이하기 때문에 LOAD R1, #100 같은 경우 상황에 따라 R1 <- M[R+100]도 맞고, R1 <- 100 도 맞다다고 하심. 그렇지만 대다수의 엔지니어들은 뒤의 표현이 맞다고 함※
C) 3-address instruction(모든 operand가 레지스터인 경우)
C-1) 3-address instruction(operand 두 개는 레지스터인 경우)
D. 명령어의 형식에 따른 실행 예제
1) 1-address instruction
2) 2-address instruction
3) 3-address instruction
E. 명령어 addressing mode 방식
* 사용목적
A) 정해진 명령어의 비트들은 그 수에 있어 매우 제한적
B) 그 안에 오퍼랜드들만으로 메모리를 지정하는 것 또한 매우 제한적
C) 더 큰 용량의 메모리에 접근하기 위해서는 직접/간접으로 다양한 방법이 요구됨
D) 이러한 방법은 아키텍쳐마다 다름
Instruction-addressing mode-address-data -> 간접
Instruction-addressing mode-data -> 직접
1) 즉치(immediate addressing mode)
operand에 immediate 값이 들어있으므로 인출할 필요가 없다.
2) 묵시적(implied addressing mode)
오퍼랜드가 없는 명령어나, 오퍼랜드가 1개인 명령어에 이용된다.
3) 직접(direct addressing mode)
'데이터에 할당된 메모리가 커지면 제한적'이라는 단점을 가지고 있다. 이를 보완한 것이 뒤에 나올 간접 지정모드이다.
4) 간접(indirect addressing mode)
5) 레지스터(register addressing mode)
제일 좋아보이는데 안 쓰는 이유? 레지스터가 비싸기 때문...
6) 레지스터 간접(register indirect addressing mode)
7) 변위(displacement addressing mode)
A) relative addressing
레지스터에는 PC가, 다음 명령어의 주소는 주소 필드에(위의 imm), 유효 주소(위 memory의 data)에는 (다음 명령어 주소-PC)값이 저장됨. 주소 비트를 절약할 수 있는 장점이 있다. 주로 branch 명령어에 사용됨(ex. jump)
B) indexed addressing
유효주소 data는 인덱스 레지스터의 내용 + 변위 값을, 레지스터는 인덱스 레지스터를, 주소 필드는 배열의 첫번째 값의 번지를 갖는다.
배열을 쓸 때 유용하다.
C) base-register addressing
베이스 레지스터의 내용과 변위를 더하여 유효 주소를 결정하는 방식(어디에 쓰이나 찾아보려고 했으나 찾기 어렵다)
'컴퓨터구조 > CPU' 카테고리의 다른 글
제어 유닛(Control Unit) (0) | 2016.11.05 |
---|---|
레지스터 (0) | 2016.11.05 |
내부구조(구성) (0) | 2016.11.05 |