Computer

Register - 간단 개념 정리

NONE_31D 2019. 9. 23. 23:54

운영체제 개발이든, 리버싱이든 여러 작업을 하다 보면 제일 많이 접하게 되는 부분이 레지스터이다. 

 

레지스터는 CPU에서 요청을 처리하는데 필요한 데이터를 임시로 저장하는 기억장치이다. RAM과는 달리, 명령을 처리하기 위한 주소들과 명령의 종류를 저장하는 추가적인 기억장치가 레지스터인데, 바로바로 사용되어야 한다는 부분에서 레지스터는 RAM보다 읽어오는, 그리고 메모리를 쓰는 속도가 빠르다. 이는 레지스터 자체 능력도 있지만, CPU와 직접 연결이 되어있기 때문에 메모리보다 훨씬 빠른 속도를 낼 수 있다. 

 

레지스터에는 여러 종류가 있는데, 우선 비트 단위에 따라 구분할 수 있다.

 

RAX (64비트)
  EAX (32비트)
          AX (16비트)
            AH (8비트) AL

32비트 레지스터와 64비트 레지스터는 크기에 차이가 있을 뿐, 전체적인 사용에는 큰 차이가 없다. 32비트와 16비트는 보호모드와 리얼모드에서 사용되는 차이가 존재한다.

보통 8비트는 1바이트, 2바이트는 워드. 32비트, 즉 4바이트는 더블 워드로 불린다. 

 

보호모드에서의 레지스터를 알아보자면, 다음과 같이 구분할 수 있다.

용도 레지스터 설명
범용 레지스터 EAX 산술논리연산, 처리 결과의 리턴값 저장
EBX 간접 주소 연산
ECX 카운터, 반복 참조 값 (for문, while문 구현시 사용)
EDX 산술, 논리 연산 보조 레지스터
인덱스 레지스터 ESI 문자열의 출발지 주소
EDI 문자열의 도착지 주소
포인터 레지스터 ESP 현재 사용중인 스택 주소
EBP 스택의 복귀 주소 (상위 프로시저의 스택)
EIP 명령이 실행되고 있는 주소

세그먼트 레지스터

CS Code Segment, 코드 영역의 시작 주소
DS Data Segment, 데이터 영역의 시작 주소
SS Stack Segment, 스택 영역의 시작 주소
ES Data Segment, 데이터 영역 시작 주소
FS
GS
상태 레지스터 EFLAGS CPU 동작 제어, 연산 결과를 1이나 0으로 반영 (ex,jnz 등)
FPU 수치 연산 레지스터 ST0~7 부동 소수점 처리

 

EFLAGS 레지스터는 시스템 제어 또는 어셈블리의 처리 조건 용도 등 여러 상태 저장에 사용되는 레지스터인데, 다음 그림은 32비트 EFLAGS 레지스터의 각 비트에 해당하는 플래그이다.

 

출처 : http://www.c-jump.com/CIS77/asm_images/EFLAGS.png

구분 플래그 설명
연산 결과 CF(Carry Flag) 덧셈에서 빌림수 발생 시 1로 설정
PF(Parity Flag) 연산 결과가 짝수일 때 1, 홀수일 때 0
AF(Auxiliary-carry Flag) 16또는 8비트 연산 중 빌림수 발생 시 1
ZF(Zero Flag) 연산결과가 0이면 1
SF(Sign Flag) 연산 결과의 최상위비트가 1이면 1
OF(Overflow Flag) 연산 결과가 용량을 초과한 경우 1
시스템 제어 TF(Trap Flag) 프로그램 Trace 시 1로 설정. 명령을 한 행씩 실행
IF(Interrupt enable Flag) 외부 인터럽트 요구를 받아들일 시 1
AC(Alignment Check) CR0레지스터의 AM비트와 함께 1로 설정시 메모리 정렬 체크 활성화
IOPL(I/O Privilege Level) 현재 특권 수준이 IOPL보다 높을 경우, I/O 주소 접근
NT(Nested Task) 연결 작업 제어
RF(Resume Flag) 디버깅 시 프로세서에 일시 중지 예외 발생 제어
VM(Virtual-8086 Mode) 해당 모드 활성화 시 1로 설정
VIF(Virtual Interrupt Flag) 가상 이미지의 인터럽트 요구를 받을 때 1
VIP(Virtual Interrupt Pending) 가상 인터럽트 지연시 1
ID(ID Flag) CPUID 명령어 지원 여부. 1로 설정 시 지원
문자열 제어 DF(Direction Flag) 1로 설정 시, 문자열 복사할 때 주소 값 감소

 

세그먼트 레지스터 : 메모리 주소를 표현하기 위한 SDT(세그먼트 디스크립터 테이블)의 위치를 나타낸다. 보통 운영체제에서 각 프로세스가 사용할 수 있는 메모리를 가상으로 제공하는 보호모드로 동작하는데, 이 때 참조하는 것이 SDT이다.

 

'Computer' 카테고리의 다른 글

운영체제 12주차  (0) 2019.11.22
[asm] INT 21H  (0) 2019.10.01
GDB 실습하면서 정리하는 명령어  (0) 2019.09.25
메모리 구조  (0) 2019.09.24
함수 프롤로그/에필로그  (0) 2019.09.19