레지스터는 CPU 내부에 존재하는 다목적 메모리(저장 공간)입니다. CPU와 함께 있는 메모리 이므로 고속으로 데이터를 처리할 수 있습니다. 간단히 레지스터는 CPU가 사용하는 변수로 생각면 좋습니다.
IA-32(Intel Architecture, 32bit) 레지스터의 구성은 아래 그림과 같습니다.
범용 레지스터(General-Purpose Registers)
EAX (Extended Accumulator Register)
산술연산 명령에서 상수/변수 값을 저장하거나 함수의 리턴 값이 저장되는 용도로도 사용됩니다.
EDX(Extended Data Register)
EAX와 함께 복잡한 연산을 위한 추가적인 데이터를 저장할 때 사용됩니다. 리턴 값 용도록는 사용되지 않습니다. EDX는 EAX의 확장 개념으로 사용됩니다.
ECX(Extended Counter Register)
반복적으로 수행되는 연산에서 카운터로 사용됩니다. 이 공간에 반복할 회수를 지정해 놓고 반복 작업을 수행합니다.
EBX(Extended Base Register)
특정한 목적으로 설계된 레지스터가 아니다. 따라서 추가적인 저장소로 이 레지스터를 사용합니다. EAX, EDX, ECX가 부족할 때 사용하기도 합니다.
ESI(Extended Source Index), EDI(Extended Destination Index)
ESI는 Source Index를 EDI는 Destination Index를 나태냅니다. 데이터 연산을 읽기 위해서 ESI 레지스터가 사용되고, 데이터 연산을 쓰기 위해 EDI 레지스터가 사용됩니다.
EBP(Extended Base Pointer), ESP(Extended Stack Pointer)
EBP는 스택의 시작 지점 주소를 ESP은 스택의 끝 지점 주소를 저장합니다. 이 레지스터들은 함수 호출과 스택 연산에 사용됩니다. 함수가 호출될 때 먼저 함수에 전달되는 파라미터가 스택에 PUSH되고 그 다음에는 리턴 주소가 스택에 PUSH됩니다. ESP 레지스터는 스택의 가장 높은 위치를 가리킵니다. 따라서 함수 호출시 ESP 레지스터는 리턴 주소를 가리킵니다. EBP 레지스터는 호출 스택의 가장 낮은 위치를 가리키는 데 사용됩니다.
CPU 아키텍처는 전통적으로 16비트로부터 이어진 레지스터리 공간 이름이 있었습니다. 16비트에서는 범용 레지스터의 사이즈 크기가 16비트입니다. EAX는(32비트) AX가(16비트) 확장된 것입니다. AX는 다시 AH(High, 상위), AL(Low, 하위)로 나누어 집니다. 즉, 다음 그림과 같습니다.
동일한 규칙으로 EBX/BX/BH/BL, ECX/BX/BH/BL, EDX/DX/DH/DL로 레지스트 공간의 주소를 가르킬 수 있습니다.
명령 포인터 레지스터
EIP(Extended Instruction Pointer)
CPU가 실행 할 명령의 주소를 가리킵니다. 현재 명령어 실행을 완료한 후 EIP 레지스터에 저장되어 있는 주소의 명령어를 실행합니다. 범용 레지스터가 아니기 때문에 마음대로 바꿀 수 없는 저장소 이며 RAM으로 부터 다음에 실행할 명령어를 가지고 오기 위한 주소를 저장하는 특수한 공간입니다.
세그먼트 레지스터
세그먼트는 메모리 관리 모델의 용어입니다. 메모리를 조각내어 각 조각마다 시작주소, 범위, 접근 권한 등을 부여해서 메모리를 보호하는 기법입니다.
CS(Code Segment)
CS 레지스터는 프로그램의 코드 세그먼트의 시작 주소를 포함합니다. 이 세그먼트 주소로 실행하기 위한 명령어 주소를 얻을 수 있습니다.
DS(Data Segment)
DS 레지스터는 프로그램의 데이터 세그먼트의 시작 주소를 포함합니다. 명령어는 이 주소를 사용하여 테이터의 위치를 알아 낼 수 있습니다.
SS(Stack Segment)
SS 레지스터는 스택 조작에서 데이터 처리를 하며 이곳의 시작 주소를 포함합니다. 프로그램은 주소와 데이터의 임시 저장 목적으로 스택을 사용합니다. 시스템은 프로그램의 스택 세그먼트의 시작 주소를 SS 레지스터에 저장합니다.
ES(Extra Segment), FS, GS
이 3개의 레지스터는 Extra Segment로 여분의 데이터 세그먼트입니다.
ES는 주로 문자열과 관련된 명령어를 위해 사용됩니다.
FS/GS는 ES처럼 데이터를 가리키는 역할을 하지만 보조적으로 쓰이는 역할로도 사용됩니다.
FS는 주로 안티 디버깅에 의해 참조될 수 있이며 디버깅 여부를 확인할 수가 있습니다.
GS는 주로 스택 스매싱이 일어났는지 확인할 때 사용할 수 있습니다.
'프로그래밍 일반 > 프로그래밍 기타' 카테고리의 다른 글
[어셈블리] OllyDbg 소개 (0) | 2020.09.13 |
---|---|
Visual Studio 인라인 어셈블리 x86 예제 (0) | 2020.09.13 |
Visual Studio 2019에서 어셈블리 64bit 프로젝트 생성 (0) | 2020.09.13 |