반응형

범용 레지스터 32bit 8개

 

 

범용 레지스터는 이름 그대로 범용적으로 사용되는 레지스터이다.

 

그냥 아무렇게나 막 쓰는 레지스터이다.

 

IA-32(Intel Architecture 32 bit)에서 각각의 범용 레지스터들의 크기는 32bit(4byte)이다.

 

보통 상수/주소 등을 저장할 때 주로 사용되며, 

 

특정 어셈블리 명령어에서는 특정 레지스터를 조작하기도 한다.

 

또한 어떤 레지스터들은 특수한 용도로 사용되기도 한다.

 

-

 

EAX, EBX, ECX, EDX 이 4개의 레지스터들은 주로 산술연산(add, sub, xor, or 등) 명령어에서

 

상수/변수 값의 저장 용도로 많이 사용됩니다.

 

또한, 어떤 어셈블리 명령어(MUL, DIV, LODS 등)들은 특정 레지스터를 직접 조작하기도 한다.

 

그리고 EAX와 ECX는 반복문 명령어(LOOP 등)에서 반복 카운트(loop count)로 사용된다.

 

또한 EAX는 일반적으로 함수 리턴 값에 사용된다.

 

모든 Win32 API 함수들은 리턴 값을 EAX에 저장한 후 리턴한다.

 

-

 

※ 참고로 ※

 

Win32 API 함수들은 내부에서 ECX와 EDX를 사용하는데,

 

이런 API가 호출되면 ECX와 EDX의 값은 변경된다.

 

따라서 ECX와 EDX에 중요한 값이 저장되어 있다면 API가 호출되기 전

 

다른 레지스터나 스택에 백업을 해야한다.

 

-

 

EBP, ESP, ESI, EDI 이 4개의 레지스터들은 주로 메모리 주소를 저장하는 포인터로 사용된다.

 

ESP는 스택 메모리 주소를 가리킨다.

 

어떤 명령어(push, pop, call, ret 등)들은 ESP를 직접 조작하기도 한다.

 

스택 메모리 관리는 프로그램에서 매우 매우 중요하기 때문에 

 

ESP 레지스터를 다른 용도로 사용하지 말아야 한다.

 

EBP는 함수가 호출되었을 때 그 순간의 ESP 값을 저장하고 있다가,

 

함수가 리턴하기 직전에 다시 ESP에 값을 되돌려줘서 스택이 깨지지 않도록 해주는데,

 

이를 stack frame 기법이라고 한다.

 

또한, stack frame 기법은 리버싱에서 중요한 개념이다.

 

ESI와 EDI는 특정 명령어(LODS, STOS, REP MOVS 등)들과 함께 주로 메모리 복사에 사용된다.

 

-

 

※ 참고 ※

 

각 레지스터들은 16비트 하위 호환을 위하여 몇 개의 구획으로 나뉜다.

 

EAX를 기준으로

 

EAX : 32bit(0~31)

 

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

 

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

 

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

 

즉 4byte(32bit)를 다 사용하고 싶으면 EAX를 사용하고,

 

2byte(16bit)만 사용하고 싶으면 EAX의 하위 16bit인 AX를 사용한다.

 

AX는 다시 상위 1byte(8bit)인 AH와 하위 1byte(8bit)인 AL로 나뉜다.

 

이런식으로 하나의 32비트 레지스터를 상황에 맞게 8bit, 16bit, 32bit로 알뜰하게 쓸 수 있다.

반응형

+ Recent posts