CPU 레지스터
CPU 내부에 존재하는 다목적 저장 공간
레지스터는 CPU와 한 몸이기 때문에 고속으로 데이터 처리 가능
IA-32 Register
Intel Architecure에서 제공하는 레지스터
basic program execution registers, control registers, memory management registers, debug register가 있음
아래 사진은 basic program execution register이고 4개의 그룹으로 나뉨
- General-Purpose Register (32비트 8개)
- Segment Register (16비트 - 6개)
- Program Status and Control Register (32비트 1개)
- Instruction Pointer (32비트 1개)
General-Purpose Register
범용적으로 사용되는 레지스터
상수/주소 등을 저장할 때 주로 사용
- EAX : 연산 및 결과 데이터를 위한 누산기
- EBX : DS 세그먼트 내 데이터 포인터
- ECX : 문자열 및 루프 카운터
- EDX : 입출력 포인터
- EBP : 베이스 포인터
- ESI : 소스 인덱스
- EDI : 목적지 인덱스
- ESP : 스택 포인터
EAX, EBX, ECX, EDX는 주로 산술연산 명령어에서 값의 저장 용도로 많이 사용
ECX는 반복문에서 반복 카운드로 사용됨
EAX는 일반적으로 함수 리턴 값에 사용됨
EBP는 함수가 호출되었을 때 그 순간의 ESP를 저장하고 있다가, 함수가 리턴하기 직전에 다시 ESP에 값을 돌려줌
세그먼트 레지스터
세그먼트는 메모리를 조각내어 각 조각마다 시작 주소, 범위, 접근 권한 등을 부여해서 메모리를 보호하는 기법
세그먼트는 페이징 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할 때 사용됨
각 세그먼트 레지스터가 가리키는 세그먼트 디스크립터와 가상 메모리가 조합되어 선형주소가 됨
페이징 기법에 의해서 선형 주소가 최종적으로 물리주소로 변환됨
- CS : 코드 세그먼트
- SS : 스택 세그먼트
- DS : 데이터 세그먼트
- ES : 추가 데이터 세그먼트
- FS : 추가 데이터 세그먼트
- GS : 추가 데이터 세그먼트
프로그램 상태와 컨트롤 레지스터
EFLAGS 레지스터는 각각의 비트마다 의미를 가지고 있음
각 비트는 1 또는 0의 값을 가지는데, 이는 On/Off 혹은 True/False를 의미
일부 비트는 시스템에서 직접 세팅하고, 일부는 프로그램에서 사용된 명령의 수행 결과에 따라 세팅됨
- Zero Flag(ZF) : 연산 명령 후에 결과 값이 0이 되면 ZF가 1(True)로 세팅
- Overflow Flag(OF) : 부호 있는 수의 오버플로우가 발생했을 때 1로 세팅, MSB(Most Significant Bit)가 변경되었을 떄 1로 세팅
- Carry Flag(CF) : 부호 없는 수의 오버플로우가 발생했을 때 1로 세팅
Instruction Pointer
CPU가 처리할 명령어의 주소를 타나내는 레지스터
EIP의 저장된 메모리 주소의 명령어를 하나 처리하고 난 후 자동으로 그 명령어 길이만큼 EIP를 증가시킴
EIP는 값을 직접적으로 변경할 수 없도록 되어 있어서 다른 명령어를 통해 간접적으로 변경해야 함
참고 사항
각 레지스터들은 16비트 하위 호환을 위하여 몇 개의 구획으로 나뉘어짐
EAX : 32비트
AX : EAX의 하위 16비트
AH : AX의 상위 8비트
AL : AX의 하위 8비트
'문제 풀이 > 하면서 공부했던 내용' 카테고리의 다른 글
리틀 엔디언 표기법 (0) | 2024.08.06 |
---|---|
file descriptor (0) | 2021.10.16 |