1. 레지스터란?
CPU 내부에 위치한 일시적인 메모리 공간이다.
외부 저장소도 있는데 굳이 CPU 내부에 왜 필요할까?
CPU가 명령을 수행할 때 외부 저장소까지 접근하려면
시스템 버스와 접속하기 위해 너무 오랜 시간이 걸리기 때문에,
빠른 접근을 위해 CPU 내에 레지스터라는 기억장치를 사용한다.
하지만, CPU는 작기 때문에
내부에 포함할 수 있는 레지스터들의 수가 제한될 수 밖에 없다.
2. CPU의 내부 레지스터의 종류
- PC (Program Counter)
- 다음에 인출할 명령어의 주소를 가지고 있는 레지스터
- 명령어 인출 후에는 자동으로 주소를 증가시킴
- 분기 명령어가 실행되면 목적지 주소로 갱신
- AC (Accumulator)
- 데이터를 일시적으로 저장하는 레지스터
- CPU가 한 번에 처리할 수 있는 데이터 비트수와 동일
- IR (Instruction Register)
- 가장 최근에 인출된 명령어 코드가 저장되어 있는 레지스터
- MAR (Memory Address Register)
- PC에 저장된 명령어 주소가 시스템 주소 버스로 출력되기 전에 일시적으로 저장되는 주소 레지스터
- MBR (Memory Buffer Register)
- 기억장치에 쓰여질 혹은 기억장치로부터 읽혀진 데이터를 일시적으로 저장하는 버퍼 레지스터
3. 명령어 집합 구조 (Instruction Set Architecture, ISA)
ISA란 CPU가 해석하는 명령어의 집합 구조를 의미한다.
프로그래머와 프로세서는 ISA를 통해 직접 소통할 수 있게 된다.
ISA의 종류에는 이런 것들이 있다.
- x86, x86-64(x64)
- ARM
- MIPS
- AVR
- IA-32
그러면 왜 ISA의 종류가 많아지게 된 것일까?
쉽게 얘기 하자면, 기계마다 요구하는 연산 능력이 다르기 때문이다.
단순히 앞으로 움직이다가 멈추는 장난감에 높은 연산을 할 수 있는 ISA가 필요할까?
만약 그렇게 사용한다면, 장난감의 발열이 심해지고 불필요한 전력이 사용될 것이다.
장난감의 제기능을 위해서는 그에 맞는 단순한 ISA가 필요하다는 것이다.
또한 높은 연산을 가능하게 하는 ISA는 데스크톱이나 랩톱에 사용되는 것이 맞을 것이다.
그래서 보통 데스크톱이나 랩톱의 CPU에는 x86-64가 사용되고,
크기가 작은 임베디드 장비들은 전력 소모와 발열이 적은
ARM 이나 MIPS, AVR 등을 사용하고 있다.
4. x86-64 아키텍처 레지스터
1999년 AMD는 인텔의 32비트 CPU 아키텍처인 IA-32를
64비트로 확장한 AMD64 아키텍처를 개발하였다.
기존의 IA-32 같은 CPU 아키텍처들은 x86 아키텍처라고 불렸는데,
AMD64는 기존의 x86과도 호환되는 64비트 아키텍처이기 때문에 x86-64라는 명칭이 생겼다.
CPU가 한번에 처리할 수 있는 데이터의 크기를 WORD라고 하는데,
WORD가 커지면 CPU가 사용할 수 있는 가상 메모리의 수도 늘어나기 때문에
현대의 대부분의 PC들은 64비트 아키텍처(64WORD)를 사용한다.
>> 실제로 계산해보자
32비트 아키텍처에서는 2^32(=4GB)Byte 밖에 사용하지 못하지만,
64비트 아키텍처에서는 2^64(=16,777,216TB)Byte를 사용할 수 있다.
x64(x86-64) 아키텍처에는
1. 범용 레지스터 (General Register): 주 용도는 있으나, 그 외의 용도로도 자유롭게 사용할 수 있는 레지스터. x64에는 rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp, r8~r15가 있다.
- rax: 누산기(accumulator)로 사용되며, 함수의 반환값이 여기에 저장될 수 있습니다.
- rbx: 데이터의 베이스 주소를 저장하는 데 사용됩니다.
- rcx: 반복 횟수를 제어하는 데 사용되며, 함수의 인자를 전달하는 데에도 활용될 수 있습니다.
- rdx: 입출력 연산을 위한 데이터 포인터로 사용됩니다.
- rsi: 소스 인덱스(Source Index)로, 데이터 이동 명령에서 소스를 가리키는 데 사용됩니다.
- rdi: 대상 인덱스(Destination Index)로, 데이터 이동 명령에서 대상을 가리키는 데 사용됩니다.
- rbp: 스택 프레임의 베이스 주소를 가리키는 데 사용됩니다.
- rsp: 스택의 꼭대기(Top)를 가리키는 데 사용됩니다.
- r8부터 r15: 추가적인 범용 레지스터로, 확장된 레지스터 세트입니다
2. 세그먼트 레지스터 (Segment Register): 과거에는 메모리 세그멘테이션이나, 가용 메모리 확장을 위해 사용했으나, 현재는 주로 메모리 보호를 위해 사용되는 레지스터. x64에는 cs, ss, ds, es, fs, gs가 있다.
3. 명령어 포인터 레지스터 (Instruction Pointer Register, IP): CPU가 실행해야하는 코드를 가리키는 레지스터. x64에는 rip가 있다.
4. 플래그 레지스터 (Flag Register): CPU의 상태를 저장하는 레지스터
를 사용한다.