본문으로 바로가기

레지스터에 대해 알아보자

category Study/reversing 2017. 8. 21. 21:29

레지스터란?


CPU 안에있는 고속 메모리로 프로세서가 바로 사용할 수 있는 데이터를 담고있는 영역이 레지스터이다






레지스터의 종류


올리디버거에서 볼수 있는 아래와 같은 레지스터들이 각각 어떤 역할을 하는지 알아보자

 



위의 레지스터들은 다양한 레지스터 종류중 범용레지스터인덱스레지스터 그리고 포인터레지스터라고 불린다




현재 32bit의 환경이기 때문에 레지스터명의 첫글자가 E(Extended : 확장된)로 시작하는것을 볼 수 있다.

64트의 경우 R(Register)로 시작하여 32비트의 레지스터를 포함한다


각각 수행하는 역할이 다른데 자세히 알아보자



AX(Accumulator) : 연산에 사용된다


BX(Base) : 메모리 주소 지정시 사용


CX(Counter) : 반복과 같은 상황에 쓰임


DX(Data) : EAX와 함께 연산, 부호확장


SI(Source) : 메모리를 이동 및 비교시 해당 주소


DI(Destination) : 메모리 이동 및 비교시 목적지 주소


IP(Instruction) : 다음에 실행할 명령어의 주소를 가리킴


SP(Stack): 현재 스택의 위치(스택 최상부 오프셋 가리킴)


BP(Base): 스택 데이터에 접근하기 위해 사용








레지스터 수정을 하게되면 위와같은 화면을 볼 수 있다.





범용레지스터인 EAX를 수정하려고 했는데 AX와 AH, AL은 무엇일까??



 EAX(32bit)

 

 AX(16bit)

 

 AH(8bit)

 AL(8bit)



위와같이 이해할 수 있다. 


EAX를 반으로 나누면 32비트 컴퓨터 이전에 쓰이던 확장되지 않은 AX가 포함되어있고


이러한 AX는 상위 하위로 나뉘어 AH(High)와 AL(Low)로 구성되어있다


마찬가지로 64비트 환경의 경우 EAX가 포함된 64비트의 레지스터가 RAX가 된다







이번에는 플래그 레지스터에 대해서 알아보자


내가 알던 플래그가 화면에 보이지 않았지만 알파벳 하나로 이루어진 레지스터를 더블클릭해보니


옆의 숫자가 1로 바뀌고 EFL의 값이 바뀌는것을 보아 플래그와 관련이 있음을 추측할 수 있었다


EFL의 도움말을 살펴보자





EFLAGS(Extended FLAGS)의 줄임말이었다


플래그를 1로 설정하는것은 SET(세트)라고 하며 0으로 설정하는것은 CLEAR 또는 RESET이라고 한다


EFLAGS 레지스터는 목적에 따라 상태플래그, 제어플래그, 시스템프래그로 나눌 수 있다




1. 상태플래그


CF(Carry, 0bit) : 연산시 올림수나 빌림수를 저장한다


PF(Parity, 2bit) : 하위 1byte 에서 1bit가 짝수면 set 아니면 clear


AF(Auxiliary, 4bit) : 3번bit에 올림수나 빌림수가 발생할 때 set


ZF(Zero, 6bit) : 연산 결과가 0이면 set 아니면 clear


SF(Sign, 7bit) : 음수일때 set 양수면 clear


OF(Overflow, 11bit) : 연산결과가 오버플로우이면 set



2. 제어플래그


DF(Direction, 10bit) : 문자열을 처리할 때 set 이면 감소하면서(높은주소에서 낮은주소순으로) 처리 clear면 증가하면서 처리



3. 시스템플래그


TF(Trap, 8bit) : 디버깅시 single step mode 활성시 set


IF(Interrupt, 9bit) : set이면 인터럽트(입출력 또는 예외상황 알림) 처리, clear면 인터럽트 무시








이번에는 세그먼트 레지스터에 대해 알아보자



CS(Code) : 코드 세그먼트(명령코드가 작성되는 부분)의 시작주소를 포함한다


DS(Data) : 데이터 세그먼트(데이터가 놓여진 부분)의 시작주소를 포함한다


SS(Stack) : 스택 세그먼트(스택에서 데이터를 처리하는 부분)의 시작주소를 포함한다


ES(Extra) : 데이터 수신측의 시작부분을 포함한다. 또한 스트링 명령에 보조적으로 사용된다


FS, GS : ES과 비슷한 역할로 여분의 세그먼트 레지스터이다