레지스터
레지스터는 목적에 따라 범용 레지스터, 세그먼트 레지스터, 플래그 레지스터, 인스턱션 포인터로 4가지로 나눌 수 있다.
범용 레지스터는 논리 연산, 수리 연산에 사용되는 피연산자, 주소를 계산하는데 사용되는 피연산자, 그리고 메모리 포인터가 저장되는 레지스터다.
세그먼트 레지스터는 Code Segment, Data Segment, Stack Segment 를 가리키는 주소가 들어있는 레지스터이다.
플래그 레지스터는 프로그램의 현재 상태나 조건 등을 검사하는데 사용되는 플래그들이 있는 레지스터이다.
인스트럭션 포인터는 다음 수행해야하는 명령이 이쓴ㄴ 메모리 상의 주소가 들어 있는 레지스터이다.
이 레지스터들을 하나씩 살펴보자.
먼저 범용 레지스터.
EAX(Extended Accumulator Register)
- 연산 결과가 저장되는 레지스터이다. 그리고 함수의 리턴값이 저장된다.
EBX(Extended Base Register)
- 데이터 세그먼트 안의 데이터를 가리키는 포인터이다. 말이 어려우니 간접 주소를 가리키고 있는 포인터이다. 라고 생각을 하자.
ECX(Extended Counter Register)
- 반복 명령어 사용시 반복 카운터에 사용된다.
EDX(Extended Data Register)
- EAX와 같이 연산에 사용되는 레지스터이다.
ESI(Extended Source Index)
- 문자열 처리에서 시작 부분을 가리키는 레지스터이다.
EDI(Extened Destination Index)
- 문자열 처리에서 목적지 부분을 가리키는 레지스터이다.
ESP(Extended Stack Pointer)
- 스택 프레임의 끝 지점 주소가 저장되며, PUSH, POP 될 때마다 ESP 값이 4Byte 씩 변한다.
EBP(Extended Base Pointer)
- 스택 프레임의 시작 지점 주소가 저장된다. 스택 프레임이 소멸 되면 이전 스택 프레임을 가리키게 된다.
두번째는 인스터럭션 포인터
EIP(Extended Instruction Pointer)
- 다음에 실행해야 할 명령어의 메모리 주소를 가리킨다.
세번째는 세그먼트 레지스터
세그먼트 레지스터는 프로세스의 특정 세그먼트를 가리키는 역할을 한다.
CS Register (Code Segment Register)
- Code Segment 를 가리키며 CS는 실행 가능한 명령어가 존재하는 세그머트의 오프셋이 저장된다.
DS Register (Data Segment Register)
- Data Segment 를 가리키며 DS는 프로그램에서 사용되는 세그먼트들의 오프셋이 저장된다.
SS Register (Stack Segment Register)
- Stack Segment 를 가리키며 SS는 스택이 존재하는 세그먼트의 오프셋이 저장된다.
ES Register (Extra segment Register)
- 프로그래머가 선택적으로 사용하며, 확장할 때 사용하는 세그먼트이다.
FS Register, GS Register
- 윈도우 9X, NT 에서 사용되었지만 지금은 대부분 사용하지 않는다고 하니... 이건 더 찾아 수정하겠습니다.
마지막은 플래그 레지스터
CF(Carry Flag)
- 부호 없는 연산 결과가 용량보다 클 때 1로 설정이 된다.
ZF(Zero Flag)
- 연산 결과가 0일 때 1로 설정된다. 반대로 0이 아닐 때 0으로 해제 된다.
OF(Overflow Flag)
- 부호 있는 연산 결과가 용량보다 클 때 1로 설정된다.
SF(Sign Flag)
- 연산 결과가 음수가 되었을 때 1로 설정된다. 반대로 양수가 되었을 때 0으로 해제 된다.
DF(Direction Flag)
- 문자열 처리에서 연속되는 문자열의 처리 방향에 따라 세트 된다.
'My Study > System' 카테고리의 다른 글
Memory : stack(스택) (0) | 2015.06.26 |
---|---|
Calling Conventions(콜링 컨벤션) (0) | 2015.05.18 |
Handray (0) | 2015.03.25 |
Stack Corruption (0) | 2015.03.18 |
리틀 엔디안(Little Endian), 빅 엔디안 (Big Endian) (1) | 2015.03.14 |