레지스터란
CPU가 요청을 처리하는데 필요한 데이터를 일시적으로 저장하는 기억장치이다.
컴퓨터에서 데이터를 영구적으로 저장하기 위해서는 하드디스크를 이용해야하고, 임시적으로 저장하는 장소를 메모리(RAM)이라고 한다. 여기서, 메모리로 연산의 결과를 보내고 영구적으로 저장할 데이터를 하드디스크에 저장해야하는 등 명령을 처리하기 위해서는 이들에 대한 주소와 명령의 종류를 저장할 수 있는 기억 공간이 하나 더 필요한데 이 공간은 무리 없이 명령을 수행하기 위해 메모리보다 빨라야한다. 바로 이 역할을 하는 것이 cpu 옆에 붙어 있는 레지스터다. 레지스터는 공간은 작지만 CPU와 연결되어 있으므로 연산 속도가 메모리보다 실제 수십배에서 수백배까지 빠르다.
x86 시스템의 레지스터 종류
x86 아키텍쳐는 8개의 범용 레지스터(GPR; General-Purpose Register), 6개의 세그먼트 레지스터, 1개의 플래그 레지스터, 마지막으로 명령어 포인터를 갖는다.
범용 레지스터
8개의 레지스터로 구성되며, 산술/논리 연산, 오퍼랜드(피연산자)를 저장하거나 포인터 역할을 한다(메모리 주소 저장)
세그먼트 레지스터
윈도우 OS는 프로세서가 메모리에 접근할 때, 세그먼트 레지스터를 사용해 가상 메모리를 물리 메모리로 변환한다.
- CS : 코드 세그먼트 레지스터, 기계 명령 포함
- DS : 데이터 세그먼트 레지스터, 데이터/상수/작업 영역 포함
- SS : 스택 세그먼트 레지스터, 데이터나 연산 결과를 임시 저장 및 삭제
- ES, FS, GS : 엑스트라 세그먼트 레지스터
** 세그먼트 레지스터는 16비트이다.
플래그 레지스터
CPU의 현재 상태나 동작을 제어하는 비트들로 구성되어 있다. 제어 플레그, 상태 플레그 두가지로 구분, 프로세서의 현재 상태를 저장하고 있는 레지스터이다.
- EFLAGSS : 연산 결과 및 시스템 상태와 관련된 여러 가지 플래그 값 저장
** S - 상태플래그 / C - 제어플래그 / X - 시스템플래그
CF - 산술 연산 결과로 자리 올림 / ZF - 산술 연살 결과가 0 / OF - 오버플로우 발생
명령어 포인터
CPU가 어느 부분을 실행할 지 가르키는 레지스터
- EBP : 베이스 포인터, SS 레지스터와 함께 사용되어 스택 내 변수 값을 읽음
- ESP : 스택 포인터, SS 레지스터와 함께 사용되어 스택 내 끝(하위) 주소를 읽음
- EIP : 명령 포인터, 명령어 오프셋 저장
64비트(명령을 한 번에 처리할 수 있는 레지스터의 비트 수, 쉽게 말해 레지스터가 저장 가능한 공간의 크키가 64비트) x86에는 더 많은 레지스터가 있다.
x64 레지스터의 종류
범용 레지스터
- RAX (Accumulator) : 더하기, 빼기 등 산술/논리 연산을 수행하며 함수의 return값이 저장된다.
- 시스템콜 함수를 사용하려면 RAX에 함수의 syscall 번호를 넣어준다.
- RBX (Base) : 메모리 주소를 저장하기 위한 용도로 사용된다.
- RCX (Count) : 반복문에서 카운터로 사용되는 레지스터. 고급언어 for문의 i 와 같은 역할이지만, 다만 ECX는 미리 반복 값을 정해두고 명령어를 사용할 때마다 값이 하나씩 줄어든다는 점이 다르다.
- syscall을 호출했던 사용자프로그램의 return 주소를 가진다.
- RDX (Data) : 다른 레지스터를 서포트하는 여분의 레지스터. 큰 수의 곱셈이나 나눗셈 연산에서 EAX와 함께 사용된다.
인덱스 레지스터
- RSI (Source Index) : 데이터를 복사할 때 src데이터, 즉 복사할 데이터의 주소가 저장된다.
- RDI (Destination Index) : 데이터를 복사할 때 복사된 dest데이터의 주소가 저장된다.
포인터 레지스터
- RSP (Stack Point) : 스택프레임에서 스택의 끝 지점 주소(현재 스택 주소)가 저장된다.
- 즉, 데이터가 계속 쌓일 때 스택의 가장 높은 곳을 가리킨다.
- push, pop 명령을 통해 RSP 값이 위아래로 8바이트씩 이동하면서 스택프레임의 크기를 변경하게 된다.
- RBP (Base Point) : 함수가 호출되면 스택프레임이 형성 되는데 이 스택스레임의 시작 지점 주소(스택 복귀 주소)가 저장된다.
플래그 레지스터
- RFLAGS register : 시스템 제어 용도 혹은 어셈블리에서는 비교/조건문 처리 용도로 사용되는 상태 레지스터이다. 연산 결과에 따라 64비트 레지스터의 각 비트에 0(clear, reset) 혹은 1(set)로 표시해 처리 결과를 저장한다.
- CF (Carry Flag) : 부호 없는 수 끼리 연산 결과가 자리올림/자리내림이 발생할 때 1, unsigned int 값을 벗어날 때 1
- OF (Overflow Flag) : 부호 있는 수 끼리연산 결과가 용량을 초과하였을 경우 1
- SF (Sign Flag) : 연산 결과 최상위 비트가 1인 경우 1
- ZF (Zero Flag) : 연산 결과가 0이면 1
- AF (Auximiliary-carry Flag) : 16비트 연산시 자리올림/자리내림이 발생할 때 1
- PF (Parity Flag) : 연산 결과가 짝수면 1, 홀수면 0
- DF( Direction Flag)
- IF (Interrupt Fla )
- TF (Trap Flag)
- https://mu1ti.tistory.com/16
이 외에도, 64비트에서는 R8 ~ R15까지 8개의 레지스터가 추가로 사용되며, 하나의 레지스터는 아래 그림처럼 크기에 따라 적절히 쪼개 사용할 수 있다.
RAX(64 bits) - EAX(32 bits, Extended AX) - AX(16 bits) - AL(8 bits) - AH(8 bits)
'System & Reversing 필기' 카테고리의 다른 글
DreamHack Stage2( 리눅스 메모리 구조) (0) | 2023.05.01 |
---|---|
BoF (0) | 2023.03.18 |
어셈블리어 명령어 정리 (0) | 2023.03.12 |
gcc 컴파일러( + .so, .a, .o, .c) (0) | 2023.03.12 |
DLL (0) | 2023.03.12 |