80x86 Intel CPU의 레지스터
1. 범용 레지스터 (General Purpose Register)
- EAX, EBX, ECX, EDX
위의 레지스터 넷은 일반적인 값이나 주소를 저장할 수 있는 레지스터로, 모두 32비트 크기이며 ABC 순으로 이름이 정해져있다.
각 레지스터의 앞글자인 E는 Extended의 약자로, 80386 이후로 32비트 레지스터로 바뀌면서 앞에 E를 붙여주게 되었다.
이 범용 레지스터들은 위의 그림과 같이 32비트 크기의 EAX와 16비트의 AX, 8비트 크기의 AH, AL로 각각 접근 할 수 있다.
이 때문에 과거 80x86시리즈의 CPU와 호환이 되는 것이다.
2. 인덱스 레지스터
- ESI, EDI
SI와 DI는 각각 Source Index, Destination Index의 줄임말로, 문자열을 복사할 때 사용되는 레지스터다.
둘 다 목적지와 출발지의 주소를 저장하는 역할을 하므로 메모리 주소를 담기 위해 32비트 크기를 갖는다.
3. 스택 관련 레지스터
- ESP, EBP
ESP는 Stack Pointer 레지스터로 스택에서 데이터의 푸시와 팝이 이루어질 때 사용된다. 한 예로 함수 호출시 실행중이던 명령어의 주소를 보관하는 역할을 한다.
EBP는 Base Pointer 레지스터로 현재 스택의 가장 바닥(base)를 가리키는 레지스터다. 인수가 포함된 함수 호출 시 쓰인다.
4. 명령어 레지스터 (Instruction Register)
- EIP
EIP는 Instruction Pointer 레지스터로, 어셈블리어로 직접 사용할 수 없는 레지스터이다.
EIP는 실행할 명령어를 메모리로부터 CPU로 fetch 시킬때, 다음에 fetch해 올 명령어의 주소를 저장한다.
5. 플래그 레지스터 (상태 레지스터)
- EFLAGS
EFLAGS 레지스터는 명령어가 실행될 때의 결과를 각 비트의 플래그로 명령어의 실행 상태를 표시하는 레지스터이다.
각 비트의 역할은 아래 그림과 같다.
이 중 자주 쓰이는 비트가 몇가지 있는데, 그 중 11번째 비트는 OF(Overflow Flag)로 연산시 오버플로우가 발생했을 때 1로 세트된다.
0번째 비트인 CF(Carry Flag)는 연산시 캐리가 발생했을 때 1로 세트된다.
7번째 비트 SF(Sign Flag)는 연산의 결과가 음수가 나왔을 때 1로 세트된다.
6번째 비트 ZF(Zero Flag)는 연산결과가 0이 되었을 때 1로 세트된다.
1번째 비트 PF(Parity Flag)는 짝 홀수 패러티를 나타낼때 쓰인다. 1이면 홀수, 0은 짝수를 나타낸다.