본문 바로가기

리버싱 개인 공부

레지스터 이해

레지스터란?

레지스터는 CPU가 요청을 처리하는데 필요한 데이터를 "일시적으로" 저장하는 공간이다.

CPU 처리를 위해 데이터를 레지스터라는 기억 공간에 저장해두었다가 CPU에서 처리를 하고 해당 결과값 역시 레지스터에 저장하게 된다.

 

레지스터의 종류

 1. 범용 레지스터 

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

8개의 레지스터로 구성되며, 산술/논리 연산, 오퍼랜드(피연산자)를 저장하거나 포인터 역할함(메모리 주소 저장)

 EAX(Accumulator) : 곱셈과 나눗셈 명령에서 자동으로 사용, 함수의 리턴 값이 저장(누적 연산기). 

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

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

EBX(Base) : 특정 주소를 지정, ESI나 EDI와 결합하여 인덱스에 사용됨.

메모리 주소를 저장하기 위한 용도로 사용된다.

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

 ECX(Counter) : 반복 명령에서 반복 카운터로 사용, 반복할 횟수를 지정 후 수행됨.

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

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

 EDX(Data) : EAX와 같이 쓰이며, 입출력 연산에서 간접주소 지정에 쓰임.

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

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

2. 인덱스 레지스터

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

 

SI 레지스터 (Source)

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

복사/비교할 때 목적지의 주소가 저장됨(쓰기).

DI 레지스터 (Destination)

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

복사/비교할 때 데이터의 주소를 저장됨(읽기).

 3. 포인터 레지스터

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)

EFLAGS 레지스터의 구조

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

1) 상태플래그

CF (Carry)

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

산술 연산에서 빌림수 발생시 1로 설정.

PF (Parity)

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

연산의 결과가 짝수면 1, 홀수면 0으로 설정/ 패리티를 체크.

OF (Overflow)

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

부호 "있는" 산술 연산의 결과가 오버플로가 발생했을 때 플래그를 1로 설정.

AF (Auxiliary)

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

 16(8)bit 연산에서 빌림수 발생 시 1로 설정.

ZF (Zero)

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

산수 논리 연산의 결과가 0일 때 플래그를 1로 설정

SF (Sign)

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

산술 논리 연산의 결과가 음수일 때 플래그를 1로 설정.

2) 제어플래그

DF (Direction)

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

 문자열을 처리할 때, 플래그가 0이면 데이터 이동 주소 증가, 1이면 자동 감소.

3) 시스템플래그

TF (Trap)

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

플래그가 0일 때 기존의 명령 실행, 1일 때는 내부 인터럽트 발생.

IF (Interrupt)

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

 문자열을 처리할 때, 플래그가 0이면 데이터 이동 주소 증가, 1이면 자동 감소.