본문 바로가기

리버싱

[리버싱] 레지스터란





레지스터



CPU의 내부에 존재하는 고속 메모리로 요청을 처리하는 데 필요한 데이터를 일시적으로 저장하는 공간이다. CPU 처리를 위해 데이터를 레지스터라는 기억 공간에 저장해두었다가 CPU에서 처리를 하고 해당 결과값 역시 레지스터에 저장하게 된다. 레지스터는 공간은 작지만 CPU와 직접 연결되어 연산 속도가 메모리보다 훨씬 빠르다. 




레지스터의 종류



레지스터의 종류는 범용 레지스터, 인덱스 레지스터, 포인터 레지스터, 세그먼트 레지스터, 플래그 레지스터로 구분할 수 있다. 32bit의 환경에서는 레지스터명의 첫글자가 E(Extended)로 시작하고 64bit의 경우 R(Register)로 시작하여 32비트의 레지스터를 포함한다.




1. 범용 레지스터 (General Purpose Register)


범용 레지스터는 작은 데이터의 임시 저장 공간이며 연산 처리 및 번지 지정을 도와주고 컴퓨터의 장치들을 제어한다.


- AX 레지스터 (Accumulator)


32비트인 EAX의 오른쪽 16비트 부분이다. AX 도 두 영역으로 구분되는데 왼쪽 8비트 상위(High) 부분을 AH라고 하고, 오른쪽 8비트 '하위(Low)' 부분을 AL 이라고 한다. 


AX는 입출력과 대부분의 산술, 논리 연산에 사용되며, 함수의 반환값이 이 레지스터에 저장된다.


EAX

 

AX

 

 

AH

AL



- BX 레지스터 (Base)


32비트인 EBX의 오른쪽 16비트 부분이다. BX는 두 영역으로 구분되는데 왼쪽 8비트 부분을 BH라고 하고 오른쪽 8비트 부분으로 BL 이라고 한다.


BX 레지스터는 메모리 주소를 저장하기 위한 용도로 사용된다.


 EBX

 

BX

 

 

BH

BL



- CX 레지스터 (Counter)


32비트인 ECX의 오른쪽 16비트 부분이다. CX는 두 영역으로 구분되는데 왼쪽 8비트 부분을 CH라고 하고 오른쪽 8비트 부분으로 CL 이라고 한다.


반복 명령어(for, while 등) 사용시 반복 횟수로 사용되는 레지스터이다.


ECX

 

CX

 

 

CH

CL



- DX 레지스터 (Data)


32비트인 EDX의 오른쪽 16비트 부분이다. DX는 두 영역으로 구분되는데 왼쪽 8비트 부분을 DH라고 하고 오른쪽 8비트 부분으로 DL 이라고 한다.


DX 레지스터는 AX 레지스터와 같이 쓰이고 부호 확장 명령 등에 쓰이며 산술/논리 연산 보조 역할을 한다.


EDX

 

DX 

 

 

DH 

DL 




2. 인덱스 레지스터 (Index Register)


인덱스 레지스터는 SI와 DI가 있고 인덱스 주소지정과 덧셈, 뺄셈에서 사용 가능하다.



- SI 레지스터 (Source)


32비트인 ESI의 오른쪽 16비트 부분이다. 데이터를 조작하거나 복사할 때 데이터의 주소가 저장된다. SI는 DS 레지스터와 연관된다. 



- DI 레지스터 (Destination)


32비트인 EDI의 오른쪽 16비트 부분이다. 데이터를 복사할 때 목적지의 주소가 저장된다. DI는 ES 레지스터와 연관된다.




3. 포인터 레지스터 (Pointer Register)


포인터 레지스터에는 SP, BP, IP가 있다.


- SP 레지스터 (Stack)


32비트인 ESP의 오른쪽 16비트 부분이다. SS 레지스터와 연관(SS:SP)될 때 하나의 스택 프레임의 끝 지점 주소가 저장된다. PUSH, POP 명령어에 따라 ESP의 값이 4byte씩 변하므로 유동적이다.



- BP 레지스터 (Base)


32비트인 EBP의 오른쪽 16비트 부분이다. 하나의 스택 프레임의 시작 지점 주소가 저장된다. 현재 사용되는 스택 프레임이 소멸되지 않는 동안 EBP의 값은 변하지 않으므로 기준점이 된다.



- IP 레지스터 (Instruction)


32비트인 EIP의 오른쪽 16비트 부분이다. 명령어 포인터 레지스터로, 16비트 IP 레지스터는 다음에 실행될 명령어의 오프셋 주소를 포함한다. 현재 실행중인 코드 세그먼트에 속한 현재 명령어를 가리킨다는 점에서 이 레지스터는 CS 레지스터 (CS:IP)와 연관된다.




4. 세그먼트 레지스터 (Segment Register)



총 6개(CS, SS, DS, ES, FS, GS)이고 각 크기는 16비트이다. 세그먼트는 프로그램에 정의된 특정 영역으로, 코드, 데이터, 스택을 포함한다.



- CS (Code Segment)


코드 세그먼트를 가리키는 레지스터로, 프로그램의 코드 세그먼트의 시작 주소를 포함한다. 이 세그먼트 주소에 명령어 포인터(IP) 레지스터의 오프셋 값을 더하면, 실행하기 위해 메모리로부터 가져와야 할 명령어의 주소가 된다.



- SS (Stack Segment)


메모리 상에 스택의 구현을 가능하게 한다. 프로그램은 주소와 데이터의 임시 저장 목적으로 스택을 사용한다. 


- DS (Data Segment)


프로그램에서 정의된 데이터, 상수, 작업 영역을 포함한다. 데이터 세그먼트의 주소를 포함한다.


- ES (Extra Segment)


보조 세그먼트 레지스터로, 데이터 수신측의 시작 부분을 포함한다. 또한 스트링 명령에 보조적으로 사용된다.


- FS, GS


ES처럼 데이터를 가리키는 역할을 하며, 보조적으로 쓰인다.




5. EFLAGS 레지스터 (Extended Flags Register)



다양한 산술 연산 결과의 상태를 알려주는 플래그 비트들이 모인 레지스터이다. 플래그를 1로 설정하는 것은 SET(세트) 라고 하며 0으로 설정하는 것은 CLEAR 또는 RESET 이라고 한다. EFLAGS 레지스터는 목적에 따라 상태플래그, 제어플래그, 시스템플래그로 나눌 수 있다.



1) 상태플래그



- CF (Carry)


연산할 때 올림수나 빌림수가 있는 경우 저장하고 set, 아니면 clear



- PF (Parity)


연산 결과에서 1인 비트의 수가 짝수면 set, 아니면 clear



- OF (Overflow)


부호 있는 연산 결과가 용량보다 크면 (오버플로우) set, 아니면 clear



- AF (Auxiliary)


3번 bit에 올림수나 빌림수가 발생할 때 set, 아니면 clear 



- ZF (Zero)


산술 및 논리 연산의 결과가 0이 될 때 set, 아니면 clear



- SF (Sign)


산술 및 논리 연산의 결과가 음수가 될 때 set, 아니면 clear



2) 제어플래그



- DF (Direction)


set 면 문자열은 주소값이 감소하면서 (정방향) 처리되고, clear 면 증가하면서 (역방향) 처리 




3) 시스템플래그



- TF (Trap)


set 면 각 명령을 실행하고 나서 특정한 프로시저를 호출하고, clear 면 평소대로 작동



- IF (Interrupt)


set 일 때 인터럽트 (입출력 또는 예외사항 알림) 처리, clear 면 인터럽트 무시






'리버싱' 카테고리의 다른 글

[리버싱] 인터럽트란  (0) 2017.08.26
[리버싱] API 란  (0) 2017.08.25
과제  (0) 2017.08.23
[리버싱] 리틀엔디안 빅엔디안  (0) 2017.08.22
[리버싱] 어셈블리어 명령어  (0) 2017.08.21