※주의 x86은 32비트 x64는 64비트이다. 헷갈리지 않게 조심하자!(사실 블로그 주인장한테 하는 경고임 내가 제일 헷갈림)
레지스터란?
레지스터는 cpu 내부에 존재하는 매우 빠른 작은 기억장치이다.


범용 레지스터
그냥 프로그램 실행 중에 막 쓰이는 레지스터이다. 주로 사용되는 곳은 있지만 사실 gdb로 디버깅 해보면 알겠지만 그냥 막쓴다. 따라서 타 블로그에 있는 레지스터의 역할을 외우는 것은 비추천한다.
eax, rax: 함수의 연산결과를 저장하는 누산기의 역할로 많이 쓰인다. 이 레지스터도 범용으로 쓰이긴 하지만 특이하게 고정된 역할이 존재한다. 함수의 연산결과를 저장하기도 하고 인터럽트를 호출할 때 테이블 번호를 저장하기도 한다. 범용 레지스터 중에서는 역할을 외워 놓으면 좋은 친구이다.
ecx, edx, ebx, rbx, rcx, rdx, rsi, rdi, r8, r9..., r15: 그냥 간단하게 이것저것 저장해야할 때 쓰임 역할을 외울 필요는 없음
포인터 레지스터
이 레지스터들은 조금 다른 배경지식이 필요하다. 본 글에서 이를 전부 설명하기에는 너무 길고 논점에서 벗어나기에 다음 글에서 조금 더 자세히 다루겠다. 일단 간략하게만 소개하자면 아래와 같다.
esp, rsp: 현재 사용중인 스택(스택 프레임)의 가장 높은 주소를 저장한다.
ebp, esp: 현재 사용중인 스택 프레임의 가장 낮은 주소를 저장한다.
플래그 레지스터
현재 상태를 저장하는 레지스터이다. 보통 제어문 같이 분기가 나뉘는 곳에서 플래그 레지스터를 통하여 상태를 보고 각 분기로 나뉘게 된다. 리버싱을 전문으로 하게 된다면 얘를 자세히 봐야한다. 포너블에서는 엄청 중요하게 다루어지지는 않았던것 같다. 간단하게 알아놓으면 좋을 것들만 아래에 소개하겠다.
CF: 연산 결과 자리올림/자리내림이 발생하였을 때 1로 set
OF: 연산 결과 용량을 초과하였을 경우 1로 set
SF: 연산 결과 음수면 1로 set
ZF: 연산 결과가 0이면 1로 set
세그먼트 레지스터
솔직히 얘는 아직도 어떻게 쓰이는지 잘 모르겠다... 일단 현재 대부분의 블로그에서 각 세그먼트의 위치를 가리킨다고 서술되어있다. 단언하겠다. 개구라다. 가상 메모리 주소에서 실제 물리 메모리 주소를 찾을 수 있게 해주는 레지스터라고만 알아두고 있다.
cs: 코드 영역의 물리 주소를 알아올 수 있다.
ss: 스택 영역의 물리 주소를 알아올 수 있다.
ds: 데이터 영역의 물리 주소를 알아올 수 있다.
es: 남는 공간 여기저기서 쓰임
fs: 남는 공간2
gs: 남는 공간3
eip, rip
항목을 하나 따로 뺏을 정도로 상당히 중요한 녀석이다. 다음 실행할 명령어의 주소를 가리키는 레지스터이다. 이 레지스터를 조작하면 실행할 명령어를 가로챌 수 있다. 실행할 명령어가 뒤바뀐다는 것은 상당히 위험하기에 이 레지스터를 사용자가 직접적으로 조작하는 명령어는 존재하지 않는다. 단 간접적으로 조작은 가능하다. 간접 조작을 통해서 해커는 다양한 공격 기법을 창조했다.