지난 포스팅에서 CPU Machine 의 타입으로
Stack Machine, Single Register Machine, Multiple Register
이렇게 3가지가 있다고 정리하였다.
이번에는 각 타입마다 (A+B) * (C+D) 의 연산을 어떤 과정으로 수행하는지 자세히 보면서
각 머신의 특징을 정리하고자한다.
1. Stack Machine
스택 머신은 말 그대로, 레지스터 대신 스택을 사용하여 연산을 수행한다.
스택에는 Push, Pop 2가지 연산이 있다.
스택 머신은 어떤 데이터가 필요한지 명시할 필요가 없다는 특징이 있다.
add 를 한다고 하면, 그냥 스택에서 pop을 두 번 수행해서 나온 값들을 더하면 된다.
스택 머신에서 (A+B) * (C+D) 연산을 수행하는 과정은 다음과 같다.
1. push A : 메모리의 A 위치에서 값을 가져와 스택에 넣는다.
2. push B : 메모리의 B 위치에서 값을 가져와 스택에 넣는다.
3. add : 스택에서 POP을 두번 수행하여 add 연산을 수행한 뒤 결과를 스택에 넣는다.
4. push C : 메모리의 C 위치에서 값을 가져와 스택에 넣는다.
5. push D : 메모리의 D 위치에서 값을 가져와 스택에 넣는다.
6. add : 스택에서 POP을 두번 수행하여 add 연산을 수행한 뒤 결과를 스택에 넣는다.
7. mul : 스택에서 POP을 두번 수행하여 mul 연산을 수행한 뒤 결과를 스택에 넣는다.
8. pop X : 스택에서 POP을 수행하여 나온 값을 메모리의 X 위치에 저장한다.
2. Single-Register Machine
Single-Register Machine 은 말 그대로 연산시 1개의 레지스터를 사용한다.
이 Single-Register 가 Accumulator 의 역할을 하기 때문에 Accumulator Machine 이라고도 한다.
Accumulator는 가산기로서, 자신에 값에 피연산자를 추가로 연산하여 자신의 공간에 그대로 저장한다.
+=, -=, *=, /= 이런 연산을 생각하면 편하다.
그래서 피연산자 2개중 한개는 가산기에 존재하고, 나머지 하나는 메모리에 존재한다.
현재 연산하는 데이터만 저장할 수 있기 때문에, 중간 값을 저장할 때는 메모리를 이용한다(..)
그래서 굉장히 느리다고 한다.
단일 레지스터 머신에서 (A+B) * (C+D) 연산을 수행하는 과정은 다음과 같다.
1. load A : 메모리의 A 위치에서 값을 가져와 ACC에 넣는다.
2. add B : 메모리의 B 위치에서 값을 가져와 ACC에 더한다.
3. store T : ACC의 값을 메모리의 T 위치에 저장한다.
4. load C : 메모리의 C 위치에서 값을 가져와 ACC에 넣는다.
5. add D : 메모리의 D 위치에서 값을 가져와 ACC에 더한다.
6. mul T : 메모리의 T 위치에서 값을 가져와 ACC에 곱한다.
7. store X : ACC의 값을 메모리의 X 위치에 저장한다.
3. Multiple-Register Machine
이름 그대로 여러개의 레지스터를 활용하는 CPU Machine 이다.
연산시 레지스터의 ID를 가리키는 과정이 필요하다.
다중 레지스터 머신에서 (A+B) * (C+D) 연산을 수행하는 과정은 다음과 같다.
1. load A, R1 : 메모리의 A 위치에서 값을 가져와 R1 레지스터에 넣는다.
2. load B, R2 : 메모리의 B 위치에서 값을 가져와 R2 레지스터에 넣는다.
3. add R1, R2, R3 : R1, R2 값을 더하고, 결과값을 R3 에 저장한다.
4. load C, R1 : 메모리의 C 위치에서 값을 가져와 R1 레지스터에 넣는다.
5. load D, R2 : 메모리의 D 위치에서 값을 가져와 R2 레지스터에 넣는다.
6. add R1, R2, R4 : R1, R2 값을 더하고, 결과값을 R4 에 저장한다.
7. mul R3, R4, R5 : R3, R4 값을 곱하고, 결과값을 R5 에 저장한다.
8. store R5, X : R5 의 값을 메모리의 X 위치에 저장한다.
정리하면 각 CPU 타입마다 load, store, add, mul 연산 구조에 차이가 있었다.
스택 머신은 레지스터 위치를 명시할 필요가 없어
load, store 시에는 메모리 위치만 명시하면 되고,
add, mul 연산은 위치 명시가 필요하지 않았다.
source 위치와 target 위치가 필요하지 않기 때문이다.
단일 레지스터 머신도 비슷하게 레지스터가 1개이므로 메모리 위치만 알면 되기에
load, store 시에는 메모리 위치만 명시하면 되고,
add, mul 연산은 기존 acc에 데이터를 추가하는 방식이라 메모리 주소를 하나만 알면 되었다.
다중 레지스터 머신은 레지스터가 여러개이기 때문에 레지스터 위치와 메모리 위치가 모두 필요했다.
그래서 load, store 시에는 메모리 위치, 레지스터 위치가 필요하고,
add, mul 연산은 source 레지스터 위치 2개와 target 레지스터 위치 1개가 필요했다.
다음 포스팅에서는 파이프라인이라는 기술을 이용하여
명령어를 더 빠르게 효율적으로 처리하는 방식에 대해 정리하고자 한다.
'CS > 어셈블리' 카테고리의 다른 글
[SPARC] 6. Pipelining Hazard (2) | 2023.09.21 |
---|---|
[SPARC] 5. Pipelining Analogy & SPARC Pipeline Stage Example (1) | 2023.09.19 |
[SPARC] 3. Computer System Organization (CPU Machine Type) (0) | 2023.09.13 |
[SPARC] 2. Computer System Organization (2) | 2023.09.08 |
[SPARC] 1. Introduction & Computer System Organization (2) | 2023.09.07 |