일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 수학
- Cloud Pub/Sub
- 생활코딩
- 펜윅 트리
- 삼성SW역량테스트
- 다이나믹 프로그래밍
- JavaScript
- jpa
- REACT
- Cloud Run
- r
- BFS
- Bit
- 백준 1753번
- 데이터 분석
- 컴퓨터 구조
- LCS
- CI/CD
- 접미사 배열
- 종만북
- 고속 푸리에 변환
- 우선순위 큐
- 이분탐색
- 삼성 SW 역량테스트
- 시뮬레이션
- 다익스트라
- dp
- Air Table
- 그리디
- ICPC
- Today
- Total
코딩스토리
Chapter 4. 명령어 집합의 분류와 주소 지정 방식 본문
# 본 내용은 한국항공대학교 길현영 교수님의 '컴퓨터 구조' 강의 및 컴퓨터 아키텍처(우종정, 한빛 아카데미)를 바탕으로 작성한 글입니다.
1. 피연산자의 수와 명령어 집합
명령어는 연산 부호와 피연산자로 구성된다.
연산 부호는 하나의 필드로도 충분하지만 피연산자 필드는 피연산자의 개수에 따라, 명령어의 연산 부호에 따라 달라진다.
피연산자의 수에 따라 컴퓨터 구성이 달라질 수 있다.
반대로 컴퓨터 구성이 달라지면 피연산자의 수도 달라질 수 있다.
1. 스택 컴퓨터
스택 컴퓨터는 CPU 내부에 다수의 데이터를 임시로 저장하기 위해 스택을 사용하는 컴퓨터를 말한다.
스택 컴퓨터의 특징
- 스택에 저장된 모든 데이터는 위치에 따라 접근 시간이 다르다 -> 우리가 알고있다싶이 스택은 후입 선출 구조, 즉 하위의 데이터를 가져오려면 해당 데이터보다 위에 존재하는 모든 상위 데이터들을 제거해야 하므로 접근 시간이 길다.
- 대부분의 연산 명령어의 피연산자는 명시되지 않음 -> 스택의 top 또는 top-1에 있는 데이터를 사용하고 그 연산 결과를 top에 저장하기 때문에
- Push, Pop 명령어 사용 -> Push를 통해 메모리에서 스택으로 데이터를 가져오고, Pop을 통해 데이터를 메모리로 이동시킨다.
스택 컴퓨터의 연산 과정
예제 : y = ax^2 + bx + c를 프로그래밍했을때
사실 스택이 뭔지를 알고 있다면, 스택을 사용하여 코딩 좀 해봤으면 어렵지 않게 생각해 낼 수 있다.
(아래는 내가 직접 답 안 보고 해 본 거. 틀린 부분 있어요! 아래에서 설명할게요)
push a -> M [a] <- 이 쪽이 stack의 top임
push x -> M[a] , M [x]
mul -> M [a*x]
push x -> M [a*x] , M [x]
mul -> M [a*x*x]
push b -> M [a*x*x] , M [b]
push x -> M [a*x*x] , M [b], M [x]
mul -> M [a*x*x], M [b*x]
push c -> M [a*x*x] , M [b*x] , M [c]
add -> M [a*x*x] , M[b*x + c]
add -> M[a*x*x + b*x + c]
pop -> 메모리로 데이터 이동
주의해야 될 점 : mul, add 진행 시 top과 top-1을 꺼내서 곱한 뒤 다시 push 해주는 것을 알 수 있음
음.. 다 하고 나니까 강의자료랑 책이랑 다르네..?
차이는 변수를 모두 넣어준 뒤 연산을 할 건지, 변수를 넣어주고 연산이 필요하다면 바로 할 건지의 차이인 거 같은데 결과적으로는 단계수는 똑같다.
하지만 내가 만약 교수님이고 이 문제가 시험문제로 나와 채점을 해야 한다면 난 감점을 줄 것이다.
이유는 단계수 때문이 아니다.
바로 메모리 표현법 때문이다.
나는 M [a*x*x]라고 표현했는데 사실 이건 정확한 표현은 아니다.
스택에는 메모리에서 가져온 데이터를 저장하는 것이기 때문에 정확히 표현하면 M [a]*M[x]*M[x]가 맞는 표현이다.
아래는 강의자료와 책에서 나온 표이다. (정확한 계산)
명령어 |
의미 |
|
연산 부호 |
피연산자 |
|
push |
a |
tos : M[a] |
push |
x |
tos : M [x], M [a] |
push |
x |
tos : M [x], M[x], M [a] |
mul |
tos : M [x]2,2 M [a] |
|
mul |
tos : M [a]*M [x]2*M[x]2 |
|
push |
b |
tos : M [b], M [a]*M [x]2*M[x]2 |
push |
x |
tos : M [x], M [b], M [a]*M [x]22 |
mul |
tos : M [b]*M [x], M [a]*M [x]22 |
|
push |
c |
tos : M [c], M [b]*M [x], M [a]*M [x]22 |
add |
tos : M [b]*M [x]+M [c], M [a]*M [x]22 |
|
add |
tos : M [a]*M [x]2+M [b]*M [x]+M [c]2+M[b]*M[x]+M[c] |
|
pop |
y |
M [y]tos |
이제 계산 과정을 이해했으므로 트래픽 발생량을 살펴보자.
기본 가정
명령어 형식은 위와 같다.
이제 계산해보자.
총 12개의 명령어가 실행되었다.
정리해보면 push/pop 연산은 총 7번, mul/add 연산은 총 5번 실행되었다.
1. 명령어 인출 과정
push/pop 연산은 적재/저장 명령어이다. 즉 메모리에서 데이터를 꺼내오고, 데이터를 메모리에 저장해야 한다.
이때 push a 처럼 피연산자를 하나씩 갖는다.
즉 push/pop 명령어는 피연산자 필드를 가져야 하고, 명령어 크기는 3바이트임을 알 수 있다.
반면 mul, add는 산술 명령어로 피연산자를 갖지 않는다.
따라서 mul/add 명령어의 크기는 단순히 1바이트임을 알 수 있다.
따라서 이 때 각각의 연산이 발생된 횟수를 곱해주면 (7*3 + 5*1) = 26바이트만큼의 트래픽이 발생했음을 알 수 있다.
2. 명령어 실행 과정
실행 과정이라고 말했지만 사실 이동 트래픽이라 해도 무관하다.
push/pop 명령어는 메모리로부터 cpu로 데이터를 이동시키거나 cpu로부터 메모리로 데이터를 이동시킨다.
이때 메모리가 한 칸당 크기가 4바이트이기 때문에 4바이트의 트래픽을 발생시 틴다.
반면 mul/add 명령어는 피연산자가 없기 때문에 데이터 트래픽이 없다.
여기서 그냥 아 그렇구나 하고 넘어갈 수 있지만(처음에는 나도 그랬지만) 왜 0이지?라는 생각이 분명 들 수 있다.
왜냐면 분명 mul/add 도 스택에 있는 걸 꺼내서 연산하고 다시 집어넣는 건데? 그러면 push/pop을 하는 거 아닌가?
내가 착각한 이유는 push/pop 명령어와 스택에서의 push/pop은 다르다. 완전히 다르다.
잠시 살펴보면
스택 컴퓨터에서 스택은 CPU 내부에 존재한다고 하였다.
그렇기에 스택에서의 push/pop은 CPU 내부에서 진행된다.
또한 산술 역시 CPU 내부의 ALU에서 진행되기 때문에 메모리를 건드리지 않는다.
따라서 push/pop 명령어와는 다르다.
결과적으로 발생한 트래픽과 명령어의 실행 횟수를 각각 곱해주면 (7*4 + 5*0) = 28바이트의 데이터 트래픽이 발생한다.
따라서 총 데이터 트래픽은 명령어 인출 과정과 실행 과정에서의 합인 (26 + 28) = 54바이트의 트래픽이 발생한다.
2. 누산기 컴퓨터
M-M 컴퓨터에서는 CPU 내부에 저장하는 기억장치가 없기 때문에 레지스터라는 장치를 추가한 컴퓨터를 누산기 컴퓨터라고 하고, 이 레지스터를 누산기라고 한다.
누산기 컴퓨터의 특징
- 누산기를 묵시적 피연산자 필드로 사용한다.
- 단순한 구조로 개발 비용이 저렴하다.
- M-M 컴퓨터보다 cpu-M 트래픽 감소 효가가 발생한다.
누산기를 묵시적 피연산자 필드로 사용한다는 말은 사실 x = x + y 같이 결과 값이 ACC(누산기)에 저장된다고 생각하면 편하다.
누산기 컴퓨터에서 트래픽 감소 효과가 있다는 것은 아래 예제를 통해 살펴보자.
ex) y = ax^2 + bx + c
Ida(Load), mul, sta(store), add 명령어를 통해 구해보자.
명령어 |
의미 |
|
연산 부호 |
피연산자 |
|
lda |
a |
acc ← M [a] |
mul |
x |
acc ← M[a] * M[x] |
mul |
x |
acc ← M[a] * M[x]2 |
sta |
y |
M[y] ← acc |
lda |
b |
acc ← M[b] |
mul |
x |
acc ← M[b] * M[x] |
add |
c |
acc ← M[b] * M[x] + M[c] |
add |
y |
acc ← M[a] * M[x]2 + M[b] * M[x] + M[c] |
sta |
y |
M[y] ← acc |
ACC를 사용하기 때문에 잠시 계산 결과를 저장해 둘 수 있다는 점이 눈에 띈다.
과연 잠시 저장해두는 것만으로 얼마나 데이터 트래픽이 감소하는지 살펴보자.
lda/sta 명령어 4회, add/mul 명령어 5회 사용.
1. 명령어 인출 과정
lda/sta 명령어는 연산 부호와 피연산자가 1개 필요하다. 따라서 데이터 트래픽이 3바이트가 발생한다.
mul/add 명령어 역시 연산부호와 피연산자가 1개 필요하므로 트래픽이 3바이트 발생한다.
따라서 인출 과정에서의 총 데이터 트래픽은 3*4 + 3*5 = 27바이트가 발생한다.
2. 명령어 수행 과정
lda/sta 명령어와 mul/add 명령어 둘 모두 메모리에 접근해서 데이터를 가져와야 한다.
즉 메모리 한 칸의 크기인 4바이트만큼의 트래픽이 발생한다.
따라서 실행 과정에서의 총 데이터 트래픽은 4*4 + 5*4 = 36바이트가 발생한다.
따라서 누산기 컴퓨터에서의 데이터 트래픽은 총 63바이트가 발생한다.
M-M 컴퓨터에서 똑같은 예제로 했을 때보다 56.8% 트래픽이 감소했다는데 이건 다시 해보고 수정할게요..
3. 범용 레지스터 컴퓨터
범용 레지스터 컴퓨터는 CPU 내부에 다수의 데이터를 임시로 저장하기 위해 범용 레지스터를 사용하는 컴퓨터를 말한다.
범용 레지스터 컴퓨터의 특징
- 범용 레지스터는 스택과 다르게 모든 레지스터로의 접근 시간이 동일하며 순서 상관없이 접근 가능
- 누산기나 스택과 달리 레지스터가 명시적 피연산자로 사용 (변수처럼 사용 가능하단 말이다!)
바로 예제로 넘어가 보자.
위와 같은 예제를 사용한다.
명령어 |
의미 |
||
연산 부호 |
피연산자 |
||
load |
r1 |
x |
r1 ← M[x] |
load |
r2 |
a |
r2 ← M[a] |
load |
r3 |
b |
r3 ← M[b] |
load |
r4 |
c |
r4 ← M[c] |
mul |
r2 |
r1 |
r2 ← M[a] * M[x] |
mul |
r2 |
r1 |
r2 ← M[a] * M[x]2 |
mul |
r3 |
r1 |
r3 ← M[b] * M[x] |
add |
r3 |
r2 |
r3 ← M[a] * M[x]2 + M[b] * M[x] |
add |
r4 |
r3 |
r4 ← M[a]*M[x]2 + M[b]*M[x] + M[c] |
store |
r4 |
y |
M[y] ← r4의 내용 |
우리가 가장 익숙한 방식이다.
먼저 각각의 레지스터에 a, b, c, x를 메모리로부터 가져와 적재시킨다.
이후 CPU 내에서 계산한 후 결과값을 메모리에 저장한다. (결과값 역시 레지스터에 저장했다가 메모리로 옮김)
아직 데이터 트래픽을 계산해보지 않았는데도 가장 적을 것 같은 느낌이 든다.
가정 : 2-주소 명령어 사용, 16개의 레지스터 사용
load/store 명령어는 5번, mul/add 명령어는 5번 사용되었다.
1. 명령어 인출 과정
load/store 명령어는 연산 부호와 레지스터 주소와 메모리 주소, 이 두 피연산자가 필요하다.
이때 메모리 주소는 가정에 의해 1바이트 일 것이고, 레지스터 주소는 4bit이다.
(왜냐하면 16개의 레지스터를 사용한다는 것은 16번째 레지스터까지를 표현할 수 있으면 된다는 뜻이다.
즉 4bit만 있다면 16까지의 수를 표현할 수 있으므로 레지스터 주소는 4bit임을 알 수 있다.)
그렇다면 피연산자 필드는 3바이트 + 4비트(0.5바이트) = 3.5바이트인데, 컴퓨터의 최소 단위 정보는 바이트 이므로
피연산자 필드는 4바이트임을 알 수 있다.
mul/add 명령어는 연산 부호와 레지스터 주소 두 개가 필요하다. (2-주소 형식이기 때문)
따라서 위와 동일하게 구해보면 2바이트 임을 알 수 있다.
따라서 인출 과정에서의 총 데이터 트래픽은 4*5 + 2*5 = 30바이트이다.
2. 명령어 실행 과정
load/store 명령어는 메모리로부터 데이터를 가져와 레지스터에 적재하거나 데이터를 메모리로 보내 저장하므로
메모리 한 칸의 크기인 4바이트만큼의 데이터 트래픽이 발생한다.
mul/add 명령어는 메모리에 접근하지 않고 레지스터끼리, 즉 CPU 내에서만 왔다 갔다 하므로 데이터 트래픽이 발생하지 않는다.
따라서 실행 과정에서의 총 데이터 트래픽은 4*5 + 0*5 = 20바이트이다.
따라서 전체 데이터 트래픽은 50바이트이다.
지금까지 세 종류의 컴퓨터에 대해 cpu - M 데이터 트래픽을 분석해봤는데 범용 레지스터 컴퓨터가 가장 트래픽이 적음을 확인할 수 있다.
차이가 예제에서는 엄청 크지 않지만 복잡하고 많은 작업을 처리한다면 데이터 트래픽의 차이는 더욱 커질 것이다.
그렇다고 무조건 레지스터 컴퓨터가 좋은 것을 아니다.
당연 비쌀 수밖에 없고, 범용 레지스터가 많아지면 명령어의 길이가 늘어난다.
2. 주소 지정 방식
컴퓨터에서 연산을 수행하려면 필요한 데이터의 위치를 알아야 한다.
즉 메모리나 레지스터의 주소를 알아야 명령어를 수행할 수 있다.
이때 명령어의 피연산자 필드를 통해, 데이터의 유효 주소를 결정하는 방식을 주소 지정 방식이라 한다.
우리가 살펴볼 종류는 총 3가지의 방식이다.
- 0 - 단계 주소 지정 방식 : 유효주소를 확정하기 위해 연산과정을 0번 수행
- 1 - 단계 주소 지정 방식 : 유효주소를 확정하기 위해 연산과정을 1번 수행
- 2 - 단계 주소 지정 방식 : 유효주소를 확정하기 위해 연산과정을 2번 수행
쉽게 말해 몇 번의 과정을 거쳐서 데이터를 가져올 수 있는가에 따라 분류한 것이다.
1. 0 - 단계 주소 지정 방식
0 - 단계 주소 지정 방식은 데이터가 있는 위치를 파악하기 위해 특별한 과정이 필요 없다.
0 - 단계 주소 지정 방식은 크게 두 가지 방식으로 나뉜다.
1) 즉시 주소 지정 방식
명령어의 피연산자 필드에 실제 데이터가 포함되어 있다.
즉 명령어를 CPU로 인출만 하면 데이 커가 바로 보이기 때문에 즉시 이용 가능하다.
장점 : 레지스터 액세스조차 없이 수행한다
단점 : 제한된 bit 수로 표현할 수 있는 정수나 상수로 제한적 사용
2) 묵시 주소 지정 방식
명령어 실행에 필요한 데이터의 위치가 묵시적으로 지정 (이때 묵시적이란 암묵적으로 이미 정해져 있다는 뜻)
누산기나 스택에 저장한다.
장점 : 명령어의 길이가 짧고, CPU 내에서 연산을 수행한다.
단점 : 컴퓨터 구조나 명령어에 따라 제한적 사용
이렇게 두 가지 방식이 있는데 딱 봐도 빠르지만 많은 데이터들을 처리하기에는 효율적이지 않을 것 같다는 느낌이 든다..
2. 1 - 단계 주소 지정 방식
1 - 단계 주소 지정 방식은 데이터의 위치, 즉 유효 주소를 확정하기 위해 주소 계산이나 읽기 연산 과정을 한 번 수행하는 방식이다.
이 단계부터 명령어의 피연산자 필드를 주소를 담는 영역으로 사용한다.
1) 레지스터 직접 주소 지정 방식
데이터는 한 레지스터에 저장되어 있고, 명령어 피연산자는 해당 레지스터의 주소를 포함
장점 : 데이터 접근 위한 메모리 액세스가 없고, 피연산자 필드의 bit 수가 적어도 무방 (레지스터 주소가 짧기 때문)
단점 : 데이터 저장공간이 CPU 내 레지스터로 제한
주소 지정에 사용될 수 있는 레지스터들의 수 = 2^k 개 (단, k는 R 필드의 비트 수)
-> 여기서 R 필드란 명령어의 피연산자 필드를 말한다. 위의 그림에서 확인할 수 있다.
EA = R (EA = Effective Address = 유효 주소, R = 명령어 피연산자 필드가 명시하는 레지스터 주소)
사실 데이터 트래픽이 발생하지 않는다는 것만으로도 큰 장점이지만 이런 경우 항상 레지스터의 개수같이 HW적 제한을 받는 것을 볼 수 있다.
2) 직접 주소 지정 방식
데이터는 메모리에 저장되어 있고, 명령어 피연산자는 해당 메모리 주소를 포함한다.
장점 : 데이터 접근을 위해 한 번의 메모리 액세스 발생 (이후 단계의 주소 지정 방식들과 비교했을 때 효율적)
더 많은 메모리 활용 가능 (이전과 비교했을 때 효과적임)
단점 : 연산 코드를 제외하고 남은 bit로 메모리 주소 bit로 사용 가능
직접 지정할 수 있는 기억 장소의 수 제한
EA = A (EA = Effective Address = 유효 주소, A = 명령어 피연산자 필드가 명시하는 메모리 주소)
그림을 보면 쉽게 이해가 되는데
실제 데이터가 들어있는 메모리의 유효 주소와 피연산자가 명시하는 메모리 주소가 같다.
즉 피연산자 필드에 있는 주소(A)를 통해 한번만에 실제 데이터에 접근할 수 있다는 것이다.
3. 2 - 단계 주소 지정 방식
2 - 단계 주소 지정 방식 역시 두 가지(메모리, 레지스터) 방식으로 나뉜다.
1) 레지스터 간접 주소 지정 방식
명령어 피연산자 필드가 가리키는 레지스터의 내용을 유효 주소로 사용
(1단계) 피연산자 필드에 명시된 레지스터를 읽음
(2단계) 해당 레지스터의 내용이 가리키는 주소를 사용하여 메모리에 접근
EA = Reg [x] (Reg [x] => Reg [x]의 내용)
2) 메모리 간접 주소 지정 방식
명령어 피연산자 필드가 가리키는 메모리의 내용을 유효 주소로 사용
(1단계) 피연산자 필드에 명시된 메모리 주소를 읽음
(2단계) 해당 메모리의 내용이 가리키는 주소를 사용하여 메모리에 접근
장점 : 지정할 수 있는 메모리 주소 공간의 제약을 해결했다. (직접 주소 지정 방식의 단점 해결)
단점 : 2번의 메모리 접근 필요
EA = Mem [x] (Mem [x] = 메모리 x의 내용)
3) 변위 주소 지정 방식
명령어 내 2개의 피연산자 필드를 사용하거나 1개의 레지스터를 추가 사용하여 유효 주소를 확정하는 방식으로
색인 주소 지정 방식과 베이스 주소 지정 방식 두 가지가 있다.
EA = Reg [x] + a (이때 A는 피연산자 필드가 명시하는 Mem 주소다.)
4) PC 상대 주소 지정 방식
PC 레지스터에 메모리 주소(베이스 주소)를 포함 (묵시적)
유일한 피연산자 필드는 오프셋값으로 사용할 메모리 주소 포함
EA = PC + A
3. 복잡도에 따른 명령어 집합
HW가 이해할 수 있는 어휘를 의미하는 명령어 집합은 복잡도에 따라 크게 CISC 구조와 RISC 구조로 나뉜다.
1. CISC 구조
초기의 컴퓨터는 두 가지 문제를 해결하기 위해 명령어의 수가 더 많고 복잡한 방향으로 발전해 갔다.
- 메모리가 매우 고가이고 속도가 느렸다. -> cpu와의 데이터 트래픽 발생
- 프로그래밍 기술이 발전되지 않아서 소프트웨어 개발에 어려움이 있었다.
당시에는 메모리 용량을 작게 차지하는 프로그램을 구성할 수 있어야 좋은 아키텍처였다고 한다.
높은 코드 밀도와 강력한 명령어를 추구하려면 가변 명령어 형식을 사용
- 가변 명령어 형식은 연산 부호를 해독할 때까지 명령어의 길이부터 알 수 없음
- 많은 종류의 피연산자 개수, 주소 지정 방식 등이 추가
강력하고 복잡한 명령어는 사용 빈도가 매우 낮으며, 일부는 거의 사용하지 않음
-> 명령어 형식의 복잡화는 컴퓨터 구조 설계를 어렵게 함
-> 명령어의 인출을 비효율화, 파이프라인 등 병렬화 작업 복잡도 증가
사실 위의 내용은 앞에서 명령어 형식에 대해 공부할 때 나왔던 부분들이다.
쉽게 풀어쓰면 좋은 컴퓨터를 만들기 위해 강력한 명령어 집합 구조를 만들었는데 생각보다 비효율적이다!
이제 과학자들은 이런 비효율적? 인 구조를 가만 놔둘 리 없다.
계속해서 연구가 진행된 끝에 CISC 구조의 단점을 보완한 새로운 구조를 탄생시킨다.
다양한 고급언어들의 등장이 그 이유 중 하나인데 잠시 살펴보면
for(int i=0; i <100; i++){}
위의 코드는 말하지 않아도 정말 정말 많이 써봤을 것이다.
이때 i 값은 for문을 돌 때마다 바뀐다.
자, 이제 우리가 배운 고급언어만 하더라도 c, c++, Java, Python....
이런 각각의 고급 언어에 대한 for문에 대처할 수 있는 CISC 프로세서를 구현하는 것은 무의미하다.
결과적으로 컴파일러는 일부 고급언어에 대해서는 for문을 for명령어로 컴파일할 수 있지만, 대부분의 고급언어에 대해서는 단순 명령어의 조합을 사용할 수밖에 없다.
위의 설명을 읽어보면 나도 뭔 소린지 잘 모르겠다..
쉽게 말하면
단순한 명령어가 좋아요! 그래서 컴퓨터 설계자들이 잘 사용되지 않는 어렵고 복잡한 명령어들을 제공하기보단
컴파일러가 기본 명령어들(단순한)의 최적의 조합을 이용하도록 만들어 보자!
이렇게 해서 탄생한 구조가 아래의 RISC구조이다.
2. RISC 구조
강력하고 복합적인 명령어가 아닌 단순하지만 더 빨리 실행되는 소수의 명령어를 사용하는 아키텍처를 말한다.
특징
- 단순 명령어 : 주로 1개 cycle 내에서 실행된다.
- 짧은 사이클 시간 : 단순 명령어를 실행하는 데이터 경로가 간단하므로 명령어 실행에 필요한 사이클 시간이 짧다.
- 적재 저장 구조 : 적재 및 저장 명령어를 통해서만 메모리의 접근을 허용하고, 나머지는 레지스터에서
- 고정 길이 명령어 : 명령어 길이가 고정되어 있기 때문에 명령어 해독 전에 다음 명령어의 주소를 알 수 있다.
- ex) PC = PC + 명령어의 길이
- 단순 명령어 형식 : 명령어의 형식이 단순하기 때문에 빠르게 해독 가능
- 제한된 종류의 주소 지정 방식 : 데이터의 유효 주소를 계산할 필요가 없거나 속도 향상
즉, 내용과 형식 모두 단순화시켰기 때문에 HW 설계에 유리하다는 것이다.
특징들을 보면 다 앞에서 공부한 내용들이다.
이제 조각이 맞춰지는 느낌이다.
구분 |
RISC |
CISC |
명령어 형식 |
고정 |
가변 |
명령어 종류 |
적음 |
많음 |
명령어 길이 |
고정 |
가변 |
적재·저장 구조 |
사용 |
미사용 |
주소 지정 방식 |
단순하고 소수 |
복잡하고 다수 |
회로 구성 |
단순 |
복잡 |
장점 |
구현용이, 파이프라이닝에 효율적 적용 |
호환성 양호, 코드 밀도 양호 |
예 |
MIPS, ARM, PowerPC |
Intel x86, DEC VAX 11/780 |
'컴퓨터구조' 카테고리의 다른 글
Chapter 6. 연산장치 (0) | 2020.12.05 |
---|---|
Chapter 5. 데이터 표현 (0) | 2020.12.03 |
Chapter 3. 명령어 집합 (0) | 2020.11.27 |
Chapter 2. 컴퓨터의 발전과 성능 (0) | 2020.11.26 |
Chapter 1. 컴퓨터 시스템의 개요 (0) | 2020.11.25 |