지난번에 말씀드린 대로 오늘은 범용 레지스터(General Purpose Register)에 대해 포스팅 할 예정입니다.

범용 레지스터는 말 그대로 범용적으로 사용되는 '막 쓰는 레지스터' 라고 생각하시면 편합니다. IA-32에서 범용 레지스터의 크기는 32비트(4바이트)로 보통 상수/주소 등을 저장할 때 사용되기도 하고 특정 어셈블리 명령어에서는 특정 레지스터를 조작하는데 사용되기도 합니다.

아래 그림을 보면 범용 레지스터들을 표현한 것을 볼 수 있습니다.


그림 1.1 범용 레지스터

31

16

15

8

7

0

16-bit

32-bit

 

AH

AL

AX

EAX

 

BH

BL

BX

EBX

 

CH

CL

CX

ECX

 

DH

DL

DX

EDX

 

BP

 

EBP

 

SI

 

ESI

 

DI

 

EDI

 

SP

 

ESP

그림 1.1에서 볼 수 있듯이 각 레지스터들은 16비트 하위호환을 위해 몇개의 구역으롤 나뉘어 있습니다. 32bit EAX를 기준으로 간단히 설명하겠습니다.

EAX : (0~31) 32bit

AX : (0~15) EAX이 하위 16bit

AH: (8~15) AX의 상위 8bit

AL: (0~7) AX의 하위 8bit

위에서 볼 수 있는 것처럼 하나의 32비트 레지스터는 상황에 맞게 8비트, 16비트, 32비트로 알뜰살뜰 사용 할 수 있으니 구획 개념을 확실히 잡고가면 앞으로 디버깅 할 어셈블리 코드를 보다 쉽게 볼 수 있습니다.


각 레지스터의 이름은 아래와 같습니다.

EAX(Extended Accumulator Register) : Accumulator for operands and results data (연산과 결과 Data를 위한 누산기)

EBX(Extended Base Register) : Pointer to data in the DS segment (DS 세그먼트의 데이터 주소)

ECX(Extended Counter Register) : Counter for string and loop operations (문자열과 반복 명령을 카운트하기 위한 레지스터)

EDX(Extended Data Register) : I/O pointer (보통은 EAX와 함께 쓰이며 부호 확장 명령등에 사용)


보통 위의 4개의 레지스터는 산술 연산(ADD, SUB, XOR, OR등)명령어에서 상수/변수 값의 저장 용도로 많이 사용된다. 특정 명령어는 특정 레지스터를 직접 조작하기도 하니, 알아두면 좋다.(여기서는 언급하지 않도록 하겠다.)

그리고 ECX와 EAX는 조금 특수한 용도로도 사용되는데, ECX는 반복 명령어(LOOP)가 나오면 반복 카운트로 사용된다.(한번 반복될 때 마다 ECX 값이 1 감소한다.) 

EAX는 함수 리턴 값에 사용되는데 모든 Win32 API 함수는 리턴값을 EAX에 저장한 후 리턴 한다.


나머지 범용 레지스터들은 아래와 같다.

EBP(Extended Basse Pointer) : Pointer to data on the stack(in the SS segment) (스텍 프레임의 시작 지점 주소 - 스택의 처음을 가르킴)

ESI(Extended Source Index) : Source pointer for string operations (문자열 명령어 조작을 위한 Source Data의 주소가 저장)

EDI(Extended Destination Index) : Destination pointer for string operation (문자열 명령어 조작을 위한 목적지 주소가 저장)

ESP(Extended Stack Pointer) : Stack pointer(in the SS segment) (스텍 프레임의 끝 주소가 저장)


앞에서 설명한 4개의 범용 레지스터가 주로 산술연산에 사용 된다면, 방금 언급한 4개의 범용 레지스터는 주로 메모리 주소를 저장하는 포인터로 사용된다.

먼저 ESP는 스텍 메모리 주소를 가리키는데 특정 명령어들(PUSH, POP, CALL, RET)은 ESP를 직접 조작하기도 한다. 한가지 주의할 점이 있다. 스택 메모리 관리는 프로그램에서 굉장히 중요한 역할을 하기 때문에 ESP를 다른 용도로 사용해서는 안될 것이다.

EBP는 함수가 호출될 때 그 순간의 ESP를 저장하고 있다가 함수가 리턴하기 직전에 다시 ESP값을 돌려줌으로써 스택이 깨지지 않도록 돕는 역할을 합니다. 이를 스텍프레임(Stack Frame)이라고 합니다.

ESI와 EDI는 특정 명령어들과 함께 메모리 복사에 사용되므로, 해당 명령어들과 함께 공부하면 도움이 될 것입니다.


범용 레지스터는 '막 사용하는' 레지스터 라고 말씀드리긴 했습니다만.. 그렇다고 무턱대고 '막' 쓰면... 안되는거 아시지요 ? ㅎㅎㅎ 특정 레지스터는 그 레지스터만의 역할이 따로 있기에.. 잘 확인 하고 사용해 주셔야 합니다.


다음 포스팅에는 세그먼트 레지스터(Segment Register)에 대해서 알아보도록 하겠습니다.

Posted by Latte_
,