레지스터란?
CPU 내부에 존재하는 작은 고속의 메모리이다.
레지스터의 종류
위 레지스터들은 범용레지스터, 인덱스레지스터, 포인터레지스터라고 한다.
32비트 환경에서는 첫 글자가 E(Extended)로 시작한다.
64비트 환경에서는 첫 글자가 R(Register)로 시작하고 32비트의 레지스터를 포함한다.
범용 레지스터
AX(Accumulator) : 연산에 사용
BX(Base) : 메모리 주소 지정 시 사용
CX(Counter) : 반복과 같은 상황에 사용
DX(Data) : EAX와 함께 연산, 부호확장
인덱스 레지스터
SI(Source) : 메모리를 이동 및 비교 시 해당 주소
DI(Destination) : 메모리 이동 및 비교 시 목적지 주소
포인터 레지스터
IP(Instruction) : 다음에 실행 할 명령어의 주소를 가리킴
SP(Stack) : 현재 스택의 위치(스택 최상부 offset을 가리킴)
BP(Base) : 스택 데이터에 접근하기 위해 사용
EAX는 AX, AH, AL로 구성되어 있다.
EAX를 반으로 나누면 32비트 컴퓨터 이전에 쓰이던 확장되지 않은 AX가 포함되어 있고 AX는 AH(High)와 AL(Low)로 구성되어 있다.
마찬가지로 64비트 환경의 경우 EAX가 포함된 64비트의 레지스터 RAX가 된다.
플래그 레지스터
알파벳 하나로 이루어진 레지스터를 더블클릭하면 옆의 숫자가 바뀌고 EFL의 값도 바뀐다.
EFL은 EFLAGS(Extended FLAGS)의 줄임말이다.
플래그를 1로 설정하는 것은 SET(세트)라고 하며 0으로 설정하는 것은 CLEAR 또는 RESET이라고 한다.
EFLAGS 레지스터는 목적에 따라 상태플래그, 제어플래그, 시스템플래그로 나눌 수 있다.
상태 플래그
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
제어 플래그
DF(Direction, 10bit) : 문자열을 처리할 때 set이면 감소하면서(높은주소에서 낮은주소순으로) 처리 clear면 증가하면서 처리
시스템 플래그
TF(Trap, 8bit) : 디버깅 시 single step mode 활성 시 set
IF(Interrupt, 9bit) : set이면 인터럽트(입출력 또는 예외상황 알림)처리, clear면 인터럽트 무시
세그먼트 레지스터
CS(Code) : 코드 세그먼트(명령코드가 작성되는 부분)의 시작주소를 포함한다.
DS(Data) : 데이터 세그먼트(데이터가 놓여진 부분)의 시작주소를 포함한다.
SS(Stack) : 스택 세그먼트(스택에서 데이터를 처리하는 부분)의 시작주소를 포함한다.
ES(Extra) : 데이터 수신 측의 시작부분을 포함한다. 또한 스트링 명령에 보조적으로 사용된다.
FS, GS : ES과 비슷한 역할로 여분의 세그먼트 레지스터이다.
'Study > Reversing' 카테고리의 다른 글
[리버싱] Break Point에 대해 알아보자 (0) | 2017.08.24 |
---|---|
[리버싱] 리틀 엔디언&빅 엔디언 (0) | 2017.08.23 |
[리버싱] 어셈블리어 명령어 (0) | 2017.08.22 |
[리버싱] 어셈블리어에 대해 알아보자 (0) | 2017.08.21 |
[리버싱] 디버거 조사(OllyDbg) (0) | 2017.08.21 |
댓글