레지스터는 CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소이며, 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용됩니다. x64 아키텍처에는 범용 레지스터(General Register), 세그먼트 레지스터(Segment Register), 명령어 포인터 레지스터(Instruction Pointer Register, IP), 플래그 레지스터(Flag Register)가 존재합니다.
범용 레지스터 🧺
범용 레지스터는 주용도는 있으나, 그 외의 다양한 용도로 사용될 수 있는 레지스터입니다. x86-64에서 각각의 범용 레지스터는 8바이트를 저장할 수 있으며, 부호 없는 정수를 기준으로 까지의 수를 나타낼 수 있습니다.
자주 쓰이는 범용 레지스터들의 주용도는 다음과 같습니다. 이 외에도 x64에는 r8, r9, … , r15까지의 범용레지스터가 더 존재합니다.
이름
주용도
rax (accumulator register)
|
함수의 반환 값
|
rbx (base register)
|
x64에서는 주된 용도 없음
|
rcx (counter register)
|
반복문의 반복 횟수, 각종 연산의 시행 횟수
|
rdx (data register)
|
x64에서는 주된 용도 없음
|
rsi (source index)
|
데이터를 옮길 때 원본을 가리키는 포인터
|
rdi (destination index)
|
데이터를 옮길 때 목적지를 가리키는 포인터
|
rsp (stack pointer)
|
사용중인 스택의 위치를 가리키는 포인터
|
rbp (stack base pointer)
|
스택의 바닥을 가리키는 포인터
|
세그먼트 레지스터 🗂️
x64 아키텍처에는 cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재하며, 각 레지스터의 크기는 16비트입니다. 세그먼트 레지스터는 x64로 아키텍처가 확장되면서 용도에 큰 변화가 생긴 레지스터입니다.
과거 IA-32, IA-16에서는 세그먼트 레지스터를 이용하여 사용 가능한 물리 메모리의 크기를 키우려고 했습니다. 예를 들어 IA-16에서는, 어떤 주소를 cs:offset라고 한다면, 실제로는 cs<<4 + offset의 주소를 사용하여 16비트 범위에서 접근할 수 없는 주소에 접근할 수 있었습니다. 당시에는 범용 레지스터의 크기가 작아서 사용 가능한 메모리의 주소 폭이 좁았지만, x64에서는 사용 가능한 주소 영역이 굉장히 넓기 때문에 이런 용도로는 거의 사용되지 않습니다.
현대의 x64에서 cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용되고, 나머지 레지스터는 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작된 세그먼트 레지스터입니다.
명령어 포인터 레지스터 👇
프로그램은 일련의 기계어 코드들로 이루어져 있습니다. 이 중에서 CPU가 어느 부분의 코드를 실행할지 가리키는게 명령어 포인터 레지스터의 역할입니다. x64 아키텍처의 명령어 레지스터는 rip이며, 크기는 8바이트입니다.
플래그 레지스터 🏳️🏴
플래그 레지스터는 프로세서의 현재 상태를 저장하고 있는 레지스터입니다. x64 아키텍처에서는 RFLAGS라고 불리는 64비트 크기의 플래그 레지스터가 존재하며, 과거 16비트 플래그 레지스터가 확장된 것입니다. 깃발을 올리고, 내리는 행위 로 신호를 전달하듯, 플래그 레지스터는 자신을 구성하는 여러 비트들로 CPU의 현재 상태를 표현합니다.
- 범용 레지스터(General Register): 주 용도는 있으나, 그 외의 용도로도 자유롭게 사용할 수 있는 레지스터. x64에는 rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp, r8-r15가 있다.
- 세그먼트 레지스터(Segment Register): 과거에는 메모리 세그멘테이션이나, 가용 메모리 공간의 확장을 위해 사용됐으나, 현재는 주로 메모리 보호를 위해 사용되는 레지스터. x64에는 cs, ss, ds, es, fs, gs가 있다.
- 플래그 레지스터(Flag Register): CPU의 상태를 저장하는 레지스터
- 명령어 포인터 레지스터(Instruction Pointer Register, IP): CPU가 실행해야할 코드를 가리키는 레지스터. x64에서는 rip가 있다.
'정보보안 관련 > System' 카테고리의 다른 글
명령어 집합 구조(Instruction Set Architecture, ISA)란 (3) | 2024.10.28 |
---|---|
기억장치가 있는데 CPU안에 레지스터가 왜 필요한가요? (1) | 2024.10.27 |
컴퓨터 구조 (1) | 2024.10.26 |
스택 오버플로우와 스택 버퍼 오버플로우의 차이점 (0) | 2024.10.25 |