레지스터는 CPU에 있는 고속처리 연산 공간이며 각 레지스터마다 역할이 다르다. CPU제조사 중 하나인 마이크로프로세서에서 사용하는 레지스터의 명령 집합 아키텍쳐를 IA-32(Intel Architecture, 32-bit)라고 부른다. 해당 글에서는 IA-32 아키텍쳐를 기준으로 설명한다.
레지스터는 CPU의 다목적 저장 공간으로 메모리 주소를 참고하여 목적에 맞게 활용 된다.
일반 레지스터
32비트 일반 레지스터는 4개가 있다. 이들은 주소 레지스터보다는 더 일반적인 용도로 쓰이지만, 특정 명령에서는 특정한 레지스터만 쓸 수 있는 경우가 있다.
- EAX: 누산기에 해당하며 대부분의 연산들이 수행된다.
- ECX: 개수, 횟수 등을 저장하는 카운터로 주로 사용된다.
- EDX: 누산기의 확장으로 누산기와 관련된 연산에서 사용된다. EDX와 EAX를 합쳐 64비트 연산을 하는 경우가 대표적이다.
- EBX: 일반적인 데이터 레지스터로, 원래 16비트 모드에서는 포인터로 사용했다.
-포인터로 사용했다 : 메모리의 주소를 저장하는 용도로 사용을 했다.
주소 레지스터
32비트 일반 주소 레지스터는 4개가 있으며, 일반 레지스터에 속하지 않는 주소 레지스터 EIP도 있다.
- ESP (stack pointer): 스택의 꼭대기 주소를 담는다.
- EBP (base pointer): 현재 스택프레임의 주소를 담으며, 일반적인 목적으로 쓰기도 한다.
- ESI (source index): 문자열연산에서 사용되는 원본 주소를 담는다.
- EDI (destination index): 문자열 연산에서 사용되는 목적 주소를 담는다.
- EIP (instruction pointer): 다음에 실행할 명령의 주소를 담는다. 1
-스택 : 스택은 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 구조(LIFO - Last In First Out)으로 되어 있다. 자료를 넣는 것을 '밀어넣는다' 하여 푸시(push)라고 하고 반대로 넣어둔 자료를 꺼내는 것을 팝(pop)이라고 하는데, 이때 꺼내지는 자료는 가장 최근에 보관한 자료부터 나오게 된다. 이처럼 나중에 넣은 값이 먼저 나오는 것을 LIFO 구조라고 한다. 2
디버거 프로그램 ollydbg.exe에서 본 레지스터
각각의 레지스터 마다 메모리주소가 담겨있으며 16진수로 표현된다. 레지스터는 해당 메모리의 주소를 참고해 명령어에 활용한다.
00000000은 16진수로 표현되며 '0'이 총 8개이며 '00' 이 1 Byte를 나타내며 모두 4쌍이 있다. 총 4Bytes인것으로 보아 32bit 레지스터가 사용됬다. 64bit 기반의 프로그램은 '0'이 16개로 표현된다.
EIP 레지스터를 보면 다음에 CPU가 실행해야할 메모리상의 명령어의 주소가 00407551 인것으로 나타난다.