IA-32 (x86-32) 레지스터
1. 범용 레지스터: 주용도는 있으나, 그 외의 다양한 용도로 사용될 수 있는 레지스터
- EAX (Extended Accumulator Register)
- 곱셈, 나눗셈 명령에 사용한다.
- 함수의 리턴값을 저장한다.
- EBX (Extended Base Register)
- ESI나 EDI와 결합하여 인덱싱에 사용된다.
- ECX (Extended Counter Register)
- 반복을 사용할 때 카운터로 사용된다.
- EDX (Extended Data Register)
- EAX와 같이 사용되고 부호 확장 명령 등에 사용된다.
ESI, EDI, EBP, ESP 레지스터 또한 범용 레지스터로 사용가능하다.
2. 인덱스 레지스터
- ESI (Extended Source Index)
- 데이터 복사/조작을 수행 할 시에 소스 주소를 저장한다.
- ESI 레지스터가 가리키는 주소의 데이터를 EDI 레지스터가 가리키는 주소로 복사하는 용도로 많이 사용된다.
- EDI (Extended Destination Index)
- 데이터 복사/조작을 수행 할 시, 도착 주소를 저장한다. 주로 ESI가 가리키는 주소의 데이터가 복사된다.
3. 포인터 레지스터
- EBP (Extended Base Pointer)
- 스택 프레임의 시작주소가 저장된다.
- ESP (Extended Stack Pointer)
- 하나의 스택 프레임의 끝 지점(최신/현재) 주소가 저장된다. PUSH, POP 명령어에 따라서 ESP의 값이 4byte씩 변한다.
- EIP (Extended Instruction Pointer)
- 코드 세그먼트의 상대주소가 저장된다.
- 다음 실행될 명령어를 가리킨다.
- 자동적으로 업데이트된다.
4. 세그먼트 레지스터: 윈도우 OS는 프로세서가 메모리에 접근 할 때, 세그먼트 레지스터를 사용하여 가상 메모리를 물리 메모리로 변환한다.(세그먼트 레지스터의 크기는 16비트)
- CS: 코드 세그먼트 레지스터
- 프로그램 코드의 메모리 상의 주소를 가리킨다.
- 명령어 Fetch를 위해 저장된 값을 활용
- DS: 데이터 세그먼트 레지스터
- 프로그램의 데이터 세그먼트 시작 주소를 가리킨다.
- SS: 스택 세그먼트 레지스터
- 스택 세그먼트의 시작 주소를 가리킨다.
- ES/FS/GS: 추가 세그먼트 레지스터
5. 플래그 레지스터: 명령어의 실행 결과에 대한 정보를 저장한다.
상태 플래그
- Sign flag: 이전 연산 결과가 음수일 때 1로 세팅된다.
- Carry flag: MSB(Most Significant Bit)에서 Carry 혹은 Borrower 발생시 1로 세팅된다.
- Overflow flag: 이전 산술 연산 결과가 데이터 범위를 초과할 시 1로 세팅된다.
- Zero flag: 연산 결과가 0일 경우 1로 세팅된다.
- Auxiliary carry flag: 3번째 비트에서 carry 또는 borrower 발생시 1로 세팅된다.
- Parity flag: 이전 산술 연산 결과의 하위 1바이트 중 1비트가 짝수이면 1로 세팅된다.
컨트롤 플래그: CPU의 동작상태를 제어하는 플래그
- Direction flag: 데이터를 다른 메모리에 복사할때 방향을 결정한다. 0으로 세팅되어있으면 데이터 주소를 가리키는 레지스터가 증가하고, 1로 세팅되어있으면 데이터 주소를 가리키는 레지스터가 감소한다.
- Interrupt flag: 1로 세팅되면 외부 인터럽트 요구는 무시되고, 0으로 세팅되면 외부 인터럽트 요구를 받아들인다.
- Trap flag: 디버깅 시에 single step mode 일 경우 1로 세팅된다.
연산에 따른 flag bit
x86-64 레지스터
범용 레지스터:
RAX,RBX,RCX,RDX
포인터 레지스터:
RSP, RBP
플래그 레지스터:
CF,OF,SF,ZF,AF,PF,DF,IF,TF
- x86-64 레지스터는 IA-32의 64비트 확장 레지스터이며, 호환이 가능하다.
- R8~R16 8개의 범용 레지스터가 추가되어 레지스터 부족이 완화 되었다.
- 하나의 레지스터는 아래 그림처럼 크기에 따라 쪼개어 사용할 수 있다.
'.study > pwnable' 카테고리의 다른 글
[포너블 기초] 함수 호출 규약 (0) | 2023.09.14 |
---|---|
[포너블 기초] Docker (0) | 2023.09.13 |
[포너블 기초] 스택 프레임 (0) | 2023.09.12 |
[포너블 기초] 메모리 구조 (0) | 2023.09.11 |
[포너블 기초] 컴퓨터 구조 (0) | 2023.09.10 |