Register (IA -32)
General Purpose Registers (범용 레지스터)
: 흔히 쓰이는 레지스터
EAX
EBX
ECX
EDX
ESP - 스택의 꼭대기와 맨 아래를 가리킴
EBP
EDI - 요놈 두 개는 주로 메모리 복사용도
ESI
이렇게 8개가 있는데, 외우기 쉽게 종류별로 묶어 놓음
위에 4개는 ABCD순, 아래는 스택 포인터순, 그리고 맨 아래는 목적지와 출발지 요렇게..
이름 앞에 E가 붙은 건 확장을 뜻하는 'Extended'라는 접두어가 붙었기 때문이다
원래 16비트 였는데 32비트로 확장되어서 그렇다
그리고 한 술 더 떠서 64비트용 레지스터도 있는데, 이는 접두어 'E' 대신 'R'이 붙음 (ex: rsp, rbp) 이렇게
Segment Register (세그먼트 레지스터)
: 메모리를 조각내어 각 조각마다 시작 주소, 범위, 접근 권한 등을 지정하여 메모리를 보호하는 용도
: 페이징 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할 때 사용 ----------> (아직 무슨 말인지 모르겠다)
CS (Code Segment)
SS (Stack Segment)
DS (Data Segment)
ES (Extra Segment) /* 이 3개부턴 추가적인 데이터 세그먼트이다. */
FS (Data Segment)
GS (Data Segment)
Flag Register (플래그 레지스터)
: EFLAGS로 칭하며 32비트 크기이다. (접두사 E를 보기 바람)
: 각각의 비트마다 1 or 0의 값을 같는다 (Boolean)
: 리버싱 입문에선, 3가지 정도만 이해하고 넘어가면 된다고함 (ZF, OF, CF)
ZF (Zero Flag)
: 연산 명령 후에 결과 값이 0이 되면 ZF가 1로 세팅된다.
OF (Overflow Flag)
: 부호 있는 수(signed integer)의 오버플로우가 발생했을 때, 1로 세팅된다. 부호를 나타내는 비트, 즉 MSB도 변경되었을 때도 1.
CF (Carry Flag)
: 부호 없는 수(unsigned)의 오버플로우가 발생했을 때 1로 세팅된다.
Insturction Pointer
: CPU가 처리할 명령어의 주소를 나타내는 레지스터이다. (크기 32비트)
: 다른 레지스터와는 다르게, 직접 값을 변경할 수 없다.
EIP
: gdb로 디버깅할 때 많이 본 거. 다음 실행할 명령의 주소를 가리키고 있음.