X86 레지스터
더 많은 작업
x86 레지스터(x86 registers)는 인텔 x86 계열 CPU가 명령을 실행하며 값을 담는 내부 저장 공간의 집합으로, 32비트 IA-32 기준 범용 레지스터 8개(EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP)와 명령 포인터 EIP, 플래그 레지스터 EFLAGS, 세그먼트 레지스터로 이루어진다.
80386 이후의 x86 프로세서는 32비트 범용 레지스터 8개를 가진다. 이름은 대부분 역사적인 것이어서, EAX 는 산술 연산에 많이 쓰여 누산기(accumulator), ECX 는 반복 횟수를 담아 카운터라 불렸다. 지금의 명령어 집합에서는 대부분의 레지스터가 특수 용도를 잃고 자유롭게 쓰이지만, 관례상 ESP(스택 포인터)와 EBP(베이스 포인터) 두 개는 스택 관리 용도로 남겨 둔다.[1] 32비트 이름 앞의 E 는 16비트 8086 의 AX, SP, BP 등을 확장(Extended)했다는 뜻이다. EAX, EBX, ECX, EDX 는 하위 16비트(AX 등)와 그 안의 상·하위 8비트(AH·AL 등)를 따로 부를 수 있다.[1]
| 레지스터 | 전통적 이름 | 주된 쓰임 |
|---|---|---|
| EAX | 누산기 | 산술 연산의 피연산자와 결과, 함수의 복귀 값 |
| EBX | 베이스 레지스터 | 데이터 주소를 담는 데 쓰였다. 호출된 함수가 보존해야 하는 레지스터 |
| ECX | 카운터 | 반복(loop)·문자열 명령의 횟수 |
| EDX | 데이터 레지스터 | 곱셈·나눗셈에서 EAX 와 짝을 지어 64비트 값 EDX:EAX 를 이룬다. 32비트 나눗셈의 몫은 EAX, 나머지는 EDX 에 남는다[1] |
| ESI | 출발지 인덱스 | 문자열 복사의 원본 주소 |
| EDI | 목적지 인덱스 | 문자열 복사의 대상 주소 |
| ESP | 스택 포인터 | 스택의 맨 위(가장 낮은 주소). push 는 ESP 를 4 줄인 뒤 그 자리에 값을 넣고, pop 은 꺼낸 뒤 4 늘린다[1] |
| EBP | 베이스 포인터 | 현재 스택 프레임의 기준 주소. 인자는 [EBP+8], [EBP+12] …, 지역 변수는 [EBP-4], [EBP-8] … 로 찾는다 |
- EIP(명령 포인터) - 다음에 실행할 명령의 주소. 프로그램이 직접 쓰지 못하고 jmp, call, ret 가 바꾼다. 일반적인 프로그램 카운터에 해당한다
- EFLAGS - 연산 결과의 0·부호·자리올림·넘침 같은 상태 비트와 인터럽트 허용 같은 제어 비트를 담는다. 조건 분기는 이 비트를 본다
- 세그먼트 레지스터 - CS, DS, SS, ES, FS, GS. 코드·데이터·스택 영역을 가리킨다
32비트 C 호출 규약(cdecl)에서 호출하는 쪽은 인자를 뒤에서부터 스택에 넣고 call 로 복귀 주소를 넣는다. 호출된 함수는 EBP 를 보관한 뒤 ESP 를 EBP 에 복사해 프레임을 세우고, 끝날 때 복귀 값을 EAX 에 둔 채 EBP 를 되돌리고 ret 로 돌아간다.
- 호출자 보존(caller-saved): EAX, ECX, EDX - 호출된 함수가 마음대로 바꿀 수 있으므로 필요하면 호출하는 쪽이 저장한다
- 피호출자 보존(callee-saved): EBX, ESI, EDI 그리고 ESP, EBP - 호출된 함수가 원래 값으로 돌려놓아야 한다[1]
스택 버퍼 오버플로우는 지역 버퍼를 넘치게 써서 그 위의 저장된 EBP 와 복귀 주소를 덮는다. 공격자가 버퍼에서 복귀 주소까지의 거리를 셀 때 기준이 되는 것이 EBP 이고, 함수가 ret 하는 순간 덮어쓴 복귀 주소가 EIP 로 들어가 흐름이 넘어간다. 그래서 스택 오버플로우 분석에서 핵심이 되는 레지스터는 EBP(프레임 기준), ESP(스택 꼭대기), EIP(실행 위치)이고, EAX·EDX 같은 데이터 레지스터는 스택 위치 정보를 갖지 않는다.[2]
x86-64 는 범용 레지스터를 64비트로 넓혀 RAX, RBX, RCX, RDX, RSI, RDI, RSP, RBP 로 부르고 R8~R15 여덟 개를 더했다. 명령 포인터는 RIP 이다. 리눅스 등의 64비트 호출 규약은 앞쪽 인자를 스택이 아니라 RDI, RSI, RDX, RCX, R8, R9 레지스터로 넘긴다 → 응용 프로그램 이진 인터페이스
- ↑ 1.0 1.1 1.2 1.3 1.4 David Evans 외, 「x86 Assembly Guide」, University of Virginia CS216, https://www.cs.virginia.edu/~evans/cs216/guides/x86.html, 확인일: 2026-11-04.
- ↑ Aleph One, 「Smashing The Stack For Fun And Profit」, Phrack 49호 14번 글, https://phrack.org/issues/49/smashing-the-stack-for-fun-and-profit, 확인일: 2026-11-04.