1. 범용 레지스터
 - 범용 레지스터(general-purpose registers)에는 32비트 E(extened)AX, EBX, ECX, EDX 등이 있다. 이러한 레지스터들의 오른쪽 16비트 부분을 각각 AX, BX, CX, DX라 부른다. 예를 들어 AX는 EAX의 오른쪽 16비트 부분이다. AX 그 자체도 두 부분으로 구성된다. 왼쪽 8비트를 '상위(high)' 부분을 AH라 하고, 오른쪽 8비트 '하위(low)' 부분을 AL이라 한다. 이러한 특징은 이중워드, 워드, 또는 바이트 단위로 처리하기 위해서 이름을 해당부분 - EAX, AX, AH, 또는 AL -을 참조할 수 있게 한다.

AX 레지스터. 주 누산기(primary accumulator)인 AX는 입출력과 대부분의 산술 연산에서 사용된다. 예를 들면, 곱셈, 나눗셈, 변환(translate) 명령어들은 AX의 사용을 가정한다. 또한 어떤 명령어는 다른 레지스터보다 AX 레지스터를 사용하면 더 효율적인 기계 코드를 생성한다. 8비트 AH와 AL은 각각 16비트 AX의 왼쪽 부분과 오른쪽 부분을 구성하고, AX는 32비트 EAX의 오른쪽 16비트 부분을 구성한다.

BX 레지스터. BX는 주소지정을 확장하기 위해 인덱스(index)로서 사용될 수 있는 유일한 범용 레지스터이기 때문에, 베이스 레지스터로 알려져 있다. BX의 다른 일반적인 용도는 계산이다. 또한 BX는 특정 주소지정을 위해서 베이스 레지스터로서 DI나 SI와 결합될 수 있다. 8비트 BH와 BL은 각각 16비트 BX의 왼쪽과 오른쪽 부분을 구성하고, BX는 32비트 EBX의 오른쪽 16비트 부분을 구성한다.

CX레지스터. CX는 카운터 레지스터(count register)로 알려져 있다. 이 레지스터는 루프(loop)가 반복되는 횟수를 제어하는 값 또는 왼쪽이나 오른쪽으로 이동되는 비트 수 등을 포함할 수 있다. 또한 많은 계산에 CX를 사용할 수 있다. 8비트 CH와 CL은 각각 16비트 CX의 왼쪽과 오른쪽 부분을 구성하고, CX는 32비트 ECX의 오른쪽 16비트 부분을 구성한다.

DX레지스터. DX는 데이터 레지스터(data register)로 알려져 있다. 어떤 입출력 연산에는 반드시 이 레지스터의 사용을 요구하고, 큰 수의 곱셈과 나눗셈 연산은 DX와 AX의 사용을 가정한다. 8비트 DH와 DL은 각각 16비트 DX의 왼쪽과 오른쪽 부분을 구성하고, DX는 32비트 EDX의 오른쪽 16비트 부분을 구성한다.

범용 레지스터들은 8비트, 16비트, 또는 32비트의 값들에 대한 덧셈과 뺄셈에 대해서 사용 가능하다.

ex)
mov    eax, 225 ; 225를 eax(이중워드)로 이동시킨다.
add     ax, cx   ; cx를 ax(워드)에 더한다.
sub     bl, al     ; bl(바이트)로부터 al을 뺀다.

2. 세그먼트 레지스터
 - 세그먼트 레지스터(segment register)는 현재 세그먼트라고 하는 메모리의 한 영역에 대한 주소지정을 제공한다. PC 계열에서 사용되고 있는 인텔 프로세서들은 자신의 주소지정 능력을 제공한다.

[여기부터 스킵]
 8086/8088 주소지정. 이러한 프로세서들의 세그먼트 레지스터는 16비트 길이이며, 실제 모드에서 동작한다. 세그먼트 주소가 페러그래프 경계(16 또는 hex 10으로 나누어지는) 상에 위치하므로, 그 주소의 오른족 네 개의 비트는 0이다. 앞서 설명하였듯이, 세그먼트 주소는 세그먼트 레지스터에 저장되고, 프로세서는 오른족 네 개의 0비트를 이동시켜 제거한다. 따라서 nnnn0은 nnnn이 된다. 예를 들어, hex주소 038E0은 세그먼트 레지스터에 038E로 저장된다. 프로세서는 제거된 오른쪽 네 개의 비트를 가정한다. 따라서 세그먼트 레지스터는 실제적으로 20비트 길이이다. 
 FFFF[0]H의 최대값은 1,048,560바이트까지의 주소지정을 허용한다. 이러한 사실이 확실하게 느껴지지 않으면, 각 hex F를 1111로 변환하고, 오른쪽에 네 개의 0비트를 추가한 다음에, 1비트의 값들을 더해 보라.

 80286 주소지정. 80286 프로세서는 실제 모드에서 8086과 동일한 방식으로 주소지정을 한다. 보호 모드에서, 80286 프로세서는 24비트 주소지정 방법을 제공하여, 최대 FFFFF[0]까지, 즉 16MB까지의 주소를 지정할 수 있다. 세그먼트 레지스터는 메모리의 24비트 세그먼트 주소에 액세스하기 위한 선택자(selector)로서 수행한다. 보호 모드는 프로세서가 멀티태스킹을 수행하는 것을 가능하게 한다. 멀티태스킹 환경에서 프로세서는 한 태스크(또는 프로그램)에서 다른 태스크로 실행 전환이 가능하다. 시스템은 메모리 상의 각 테스크를 다른 태스크들로부터 보호할 수 있어야 한다.

 80386/486/Pentium 주소지정. 이러한 프로세서들도 실제 모드에서는 8086과 거의 동일한 방식으로 주소지정을 한다. 보호 모드에서는 48비트를 사용한 주소지정을 하여, 세그먼트를 4GB까지 주소지정하는 것이 가능하다. 16비트 세그먼트 레지스터는 메모리의 32비트 세그먼트 주소에 엑세스하기 위한 선택자로서 수행된다.
[여기까지 스킵해도 상관 없음]
 CS, DS, SS, ES, FS, GS의 6개의 세그먼트 레지스터가 제공된다.

CS 레지스터. CS레지스터는 프로그램의 코드 세그먼트의 시작 주소를 포함한다. 이 세그먼트 주소에 명령어 포인터(instruction pointer, IP) 레지스터의 오프셋 값을 더하면, 실행하기 위해 메모리로부터 가져와야 할 명령어의 주소가 된다. 일반적인 프로그래밍에서는 이 레지스터를 직접 참조할 필요가 없다.

DS 레지스터. DS 레지스터는 프로그램의 데이터 세그먼트의 시작 주소를 포함함다. 명령어는 이 주소를 사용하여 테이터의 위치를 알아낸다. 이 주소에 명령어의 오프셋 값을 더하면 데이터 세그먼트에 속한 특정 바이트 위치에 대한 참조가 생성된다.

SS 레지스터. SS 레지스터는 메모리 상에 스택의 구현을 가능하게 한다. 프로그램은 주소와 데이터의 임시 저장 목적으로 스택을 사용한다. 시스템은 프로그램의 스택 세그먼트의 시작 주소를 SS 레지스터에 저장한다. 이 세그먼트 주소에 스택 포인터(stack pointer, SP) 레지스터의 오프셋 값을 더하면, 참조되고 있는 스택의 현재 워드를 가리킨다. 일반적인 프로그래밍에서는 이 레지스터를 직접 참조할 필요가 없다.

ES 레지스터. ES 레지스터는 메모리 주소지정을 다루는 스트링(문자 데이터) 연산에서 사용된다. 이 경우 ES 레지스터는 DI(인덱스) 레지스터와 연관된다. 프로그램이 ES 레지스터를 사용할 경우에, 이 레지스터를 적절한 세그먼트 주소로 초기화해야 한다. 

FS와 GS레지스터. 이 레지스터는 기억장소 요구사항을 다루기 위해서 80386에서 추가로 도입된 여분의 세그먼트 레지스터이다. 

3. 포인터 레지스터
 - 포인터 레지스터에는 32비트 EIP, ESP, EBP가 있고, 오른쪽의 16비트 부분은 각각 IP, SP, BP이다. 

명령어 포인터(IP) 레지스터. 16비트 IP레지스터는 다음에 실행될 명령어의 오프셋 주소를 포함한다. IP가 현재 실행중인 코드 세그먼트에 속한 현재 명령어를 가리킨다는 점에서, 이 레지스터는 (CS:IP처럼) CS레지스터와 연관된다. 여러분은 보통 프로그램에서 IP 레지스터를 참조하지 않으나, DEBUG 프로그램을 사용하여 프로그램을 테스트 할 때와 같이 IP의 값을 변경할 수 있다. 80386프로세서는 확장된 32비트 IP인 EIP를 도입하였다.
 다음 예제에서, CS는 39B4[0]H를 포함하고 IP는 514H를 포함한다. 프로세서는 다음에 실행할 명령어를 찾기 위해서 CS의세그먼트 주소와 IP의 오프셋을 더한다.
CS의 세그먼트 주소 :               39B40H
IP의 오프셋 주소를 더한다. :   +    514H
다음에 실행할 명령의 주소 :      3A054H
실행되는 각 명령어에 대해서, 프로세서는 IP의 오프셋 값을 변경하여 IP가 실제로 실행의 각 단계를 주도하도록 한다.
 SP(stack pointer)와 BP(base pointer) 레지스터는 SS 레지스터와 연관되며, 시스템이스택 세그먼트에 속한 데이터에 액세스하는 것을 허용한다. 프로세서는 자동으로 이러한 레지스터들을 다룬다.

스택 포인터(SP) 레지스터. 16비트 SP 레지스터는 SS 레지스터와 연관될 때(SS:SP), 스택에 속한 처리중인 현재 워드를 참조하는 오프셋 값을 제공한다. 80386 프로세서는 확장된 32비트 스택 포인터인 ESP레지스터를 도입하였다. 
 다음 예제에서, SS 레지스터는 세그먼트 주소 4BB3[0]H를 포함하고, SP는 오프셋412H를 포함한다. 프로세서가 스택에 속한 처리중인 현재 워드를 찾기 위해서, SS의 세그먼트 주소와 SP의 오프셋을 다음과 같이 결합한다.
SS의 세그먼트 주소 :               4BB42H
SP의 오프셋 주소를 더한다. :  +    412H
다음에 실행할 명령의 주소 :      4BF42H

베이스 포인터(BP) 레지스터. 이 16비트 BP는 매개변수 참조 기능을 제공한다. 매개변수는 프로그램이 스택을 경유해서 전달하는 데이터와 주소들이다. 프로세서는 SS의 주소를 BP의 오프셋과 결합한다. 또한 BP는 특정 주소지정을 위해서 베이스 레지스터(base register)로서 DI나 SI와 결합될 수 있다. 80386 프로세서는 확장된 32비트 BP인 EBP 레지스터를 도입하였다.

4. 인덱스 레지스터
 - 인덱스 레지스터(index register)에는 32비트 ESI와 EDI가 있다. 이러한 레지스터의 오른쪽 16비트 부분을 각각 SI, DI라 한다. 이러한 레지스터는 인덱스 주소지정(indexed addressing)과 덧셈, 뺄셈에서 사용 가능하다.

SI 레지스터. 16비트 원시 인덱스 레지스터(source index register)는 스트링(문자) 조작 연산에서 필요하다. 이 경우 SI는 DS 레지스터와 연관된다. 80386은 32비트 확장 레지스터 ESI를 도입하였다.

DI 레지스터. 16비트 목적지 인덱스 레지스터(destination index register)도 스트링 연산에서 필요하다. 이경우 DI는 ES 레지스터와 연관된다. 80386은 32비트 확장 레지스터  EDI를 도입하였다.

5. 플래그 레지스터
 - 32비트 EFlag는 다양한 컴퓨터 행동들의 상태를 나타내는 비트들을 포함한다. Eflag의 오른쪽 16비트 부분이 플래그 레지스터(flag register)이다. 이 16비트 중에서 9개가 컴퓨터의 현재 상태와 처리 결과를 나타낸다. 비교와 산술 연산을 포함하는 많은 명령어 들이 플래그의 상태를 변화시키며, 그 다음 행동을 결정하기 위해서 어떤 명령어들이 플래그 상태를 점검할 수 있다.
 다음은 플래그들의 간략한 설명이다.

OF(overflow)는 산술 연산 후 상위(가장 왼쪽) 비트의 오버플로를 나타낸다.]

DF(direction)는 스트링(문자) 데이터를 이동시키거나 비교할 때 왼쪽 또는 오른쪽의 방향을 결정한다.

IF(interrupt)는 키보드 입력과 같은 외부 인터럽트가 처리되어야 하는지 또는 무시되어야 하는지를 나타낸다.

TF(trap)는 단일 단계 모드(single-step mode)의 프로세서 연산을 허용한다. DEBUG와 같은 디버거 프로그램은 TF 플래그를 설정해서, 한번에 하나씩 명령어를 실행시키고, 레지스터와 메모리 상에서 그영향을 조사할 수 있게 한다.

SF(sign)는 산술 연산의 결과 값에 대한 부호를 포함한다.(0 = 양수, 1 = 음수)

ZF(zero)는 산술이나 비교 연산의 결과를 나타낸다.(0 = 결과값이 0이 아님, 1 = 결과 값이 0)

AF(auxiliary carry)는 특수화된 산술에서 사용되며, 그 산술 연산에서 비트 3에서 비트 4로의 캐리를 포함한다.

PF(parity)는 연산 결과 1비트들의 개수를 나타낸다. 그 개수가 짝수인 경우 짝수 패리티(even parity)라 부르며, 홀수인 경우 홀수 패리티(odd parity)라 한다.

CF(carry)는 산술 연산 후 상위(가장 왼쪽) 비트의 캐리를 포함한다. 또한 비트 자리이동(shift) 또는 비트 회전(rotate)연산 후 가장 마지막의 비트 내용을 포함한다.

다음은 플래그 레지스터를 그림으로 나타낸 것이다.

이 그림을 외울 필요는 전혀 없다.

+ Recent posts