2장. 80386 프로세서 (2/3) 

2.4. 레지스터

 1장에서 말했듯이 레지스터란 중앙처리장치 내부에 있는 고속의 저장장치로서 메모리보다 빠른 엑세스를 위해 설계되었다. 80386의 레지스터는 8개의 범용 레지스터, 6개의 세그먼트 레지스터(8086에서난 4개의 세그먼트레지스터가 있다.), 그리고 상태 플래그와 명령어 포인터를 가지고 있다. 이 레지스터들은 이전 CPU(8086, 80286등..)들의 레지스터들을 다 포함 한다.(하위 호환성 유지)

 

[그림 2-4-1] 범용 레지스터, 세그먼트 레지스터, 명령어 포인터, 상태 플래그 레지스터

 

 

범용 레지스터

 범용 레지스터는 계산과 데이터 이동에 주로 사용된다. 이 레지스터들은 [그림 2-4-2]에서 보는 것처럼 하나의 32비트 값 혹은 16비트, 8비트 값으로 처리 될 수 있다.

예를들어 범용 레지스터인 EAX는 32비트 레지스터 이고, AX는 16비트, AH(상위비트),AL(하위비트) 은 8비트 레지스터이다.

 

[그림 2-4-2] 32비트, 16비트, 8비트 범용레지스터, 32비트 명령어 레지스터, 16비트 명령어 레지스터

 

[표 2-4-1] 32,16,8비트로 사용할 수있는 레지스터

32비트

16비트

8비트(상위)

8비트(하위)

EAX AX AH AL
EBX BX BH BL
ECX CX CH CL
EDX DX DH DL
EAX : 곱셈과 나누셈 명령에서 자동으로 사용된다. 확장된 누산기(EAX, extended accumulator)레지스터 라고 부른다.
ECX : 루프 카운터로 사용된다.
 

[표 2-4-2] 32비트, 16비트 인덱스,포인터 레지스터

32비트

16비트

ESI SI
EDI DI
EBP BP
ESP SP
ESI(Extended Source Index) : 고속 메모리 전송 명령에 사용된다.
EDI(Extended Destination Index) : 고속 메모리 전송 명령에 사용된다.
EBP(Extended Base Pointer) : 고급언어에서 스택 상에 있는 지역 변수와 함수 매개변수를 참조하기 위해 사용된다. 일반적인 계산이나 데이터 이동을 위해 사용해서는 안된다.
ESP(Extended Stack Pointer) : 스택에 있는 데이터를 가리킨다. 이 레지스터는 일반 적인 계산이나 데이터 이동을 위해 절대로 사용 될 수 없다.
[표 2-4-2]에서의 16비트 레지스터들은 80386의 실제모드(real mode)에서 수행되는 프로그램 작성시에만 사용된다.
 
 
명령어 레지스터(IP, Instruction Point)
명령어 포인터(IP)의 32비트 레지스터 이름은 EIP이다. 명령어 포인터는 바로 다음에 실행할 명령어 주소의 오프셋이 들어 있다. 이 오프셋(EIP)은 항상 코드 세그먼트(CS)와 결합된다. EIP의 하위 16비트는 IP이다. 이 16비트 레지스터는 실제 모드에서 사용된다.
 
[표 2-4-3] 32비트, 16비트 명령어 포인터 레지스터

32비트

16비트

EIP IP
 
 
세그먼트 레지스터
 80386의 세그먼트 레지스터는 실제모드에서 8086과 동일한 기능을 한다. 하지만 보호모드에서는 새로운 주소 지정방식이 사용된다. 세그먼트 레지스터가 여전히 유지 되지만, 각 세그먼트의 크기는 1바이트에서 4GB까지의 크기를 가질 수 있다. 이 때 세그먼트 레지스터에 저장된 주소는 [그림 2-4-3]처럼 디스크립터 테이블(descriptor table)을 가리키는 포인터로 해석된다. 자세한건 보호모드에서 알아 보도록 하자.
 
[그림 2-4-3] 디스크립터 레지스터를 선택하고 있는 세그먼트 레지스터
 
플래그 레지스터
 플래그 레지스터도 80386으로 넘어오면서 32비트로 확장 되었다. 8086의 상태 및 제어 플래그가 그대로 유지 되었지만, [그림 2-4-4]에서 보는 것 처럼 4개의 플래그가 새롭게 추가 되었다.
VM(Virtual 8086 Mode) : 가상모드. 이 플래그는 프로세서를 가상 8086모드로 전환하는데 사용되는 보호 모드 제어 플래그이다.
RF(Resume Flag) : 재개 프래그. 디버그 레지스터와 함께 사용 된다. set되면 디버그 고장은 무시되고 다음 명령어가 정상적으로 사용된다.
NT(Nested Task Flag) : 내포 태스크. 보호 모드에서 현재 태스크가 다른 태스크에 의해 호출되었음을 나타내는 데 사용된다. 이는 내포된 태스크가 끝났을 때 실행될 반환(return) 명령어의 형태에 영향을 미친다.
IOPL(Input/Output Privilege Level) : 입출력 특권 수준. 이 두 개의 보호모드 제어 비트는 I/O명령어를 실행하는 데 필요한 현재 특권수준(0-3)을 나타낸다. 이에 따라 운영체제는 태스크의 I/O특권을 제어한다.
 
[그림 2-4-4] 플래그 레지스터
 
 
제어 레지스터
 이 레지스터들은 보호 모드에서 프로세서 제어와 검사를 위한 목적을 가지고 있으므로 정상적으로는 응용 프로그래머는 사용하지 않는다.
 
CR0 : 페이징 메커니즘의 활성화, 태스크 전환의 감시, 보조프로세서 에뮬레이션의 인에이블, 보호 모드와 실제 모드 동작의 선택에 사용된다.
CR2 : Page fault를 일으킨 마지막 명령어의 주소를 가지고 있다. Page fault란 메모리에 있지 않은 페이지나 세그먼트에 대한 참조를 말한다. page fault가 일어나면 해당 페이지를 디스크에서 가져와 메모리에 적재 하여야한다.
CR3 : 페이징을 통한 가상 메모리가 인에이블 되었을 때 사용된다. 이 레지스터는 페이지 디렉토리의 시작 주소를 가지고 있다. 이 항목은 페이지 변환 표라고 하는 표에 들어있는 항목의 위치를 찾는 데 사용된다. 페이지 변환 표란 4KB 크기의 페이지 프레임의 물리적 시작 주소와 그 프레임에 대한 엑세스 정보를 가지고 있는 표이다.
 
[그림 2-4-5] CR0 레지스터

 

[그림 2-4-6] CR2, CR3 레지스터

 

시스템 주소 레지스터

 보호 모드에서 사용되는 디스크립터 테이블에 대한 정보를 저장하기 위해 제공되는 레지스터이다. (GDTR, ITDR, TR, LDTR -> 4개가 제공된다.) 자세한건 보호모드에서 알아 보도록 하자.

 

[그림 2-4-7] 시스템 주소 레지스터


'80x86 프로세서' 카테고리의 다른 글

3장. 일반적인 개념들  (0) 2010.04.12
2장. 80386 프로세서 (3/3)  (0) 2010.04.12
2장. 80386 프로세서 (1/3)  (0) 2010.04.12
1장. 8086/8088 프로세서 (2/2)  (2) 2010.04.12
1장. 8086/8088 프로세서 (1/2)  (3) 2010.04.12

+ Recent posts