본문 바로가기

Reverse Engineering/Reversing 이론 설명

[CPU] 8086의 레지스터들

8086 내부에는 데이터의 일시 저장, 여러 가지의 연산 처리와 번지 지정 등을 쉽고 빠르게 하기위해 많은 레지스터가 준비되어 있다. 이들 레지스터는 몇 개의 그룹으로 나뉘어 프로그램의 실행을 위한 역할을 담당한다. 즉, 각 레지스터들은 각자의 역할이 정해져 있다.

8086에서 이들 레지스터는 기본적으로 16비트로 구성되어 있고, 이들 레지스터 중 데이터 레지스터는 분할해서 8비트씩의 레지스터로 취급할 수도 있다.

1. 범용 레지스터(General Register) : 범용 레지스터는 연산 결과를 받을 수도 있으며, 연산에 사용되어질 수도 있는 레지스터이다. 과거 8비트 컴퓨터에서는 연산 결과를 저장하기 위하여 특정 레지스터를 사용할 수 밖에 없었으나 8086에서는 범용 레지스터를 사용하여 모든 연산을 수행할 수 있다.
- AX(AH, AL) : 어큐뮬레이터(Accumulator). 산술, 논리 연산의 중심이 되는 레지스터이며, Input/Output 포트의 입출력 명령 또한 주로 이 레지스터를 사용 한다.
- BX(BH, BL) : 간접 번지 지정 시 번지 레지스터, 베이스 레지스터로 주로 사용된다.
- CX(CH, CL) : 루프와 같이 어떤 명령을 반복적으로 수행하고자 할 때 반복 횟수를 지정하는 데 주로 사용된다.
- DX(DH, DL) : 간접 번지 지정에 의한 입출력 명령을 실행할 때 번지 지정에 사용된다. 곱셋, 나눗셈을 할 때에는 보조 어큐뮬레이터로 사용되어지기도 한다.

2. 포인터 레지스터(Pointer Register)
- SP(Stack Pointer) : 현재까지 사용되어진 스택의 위치를 지정하기 위하여 사용되는 레지스터로 세그먼트 레지스터 SS와 함께 사용된다.
- BP(Base Pointer) : 스택의 데이터를 액세스하기 위해 사용한다.

3. 인덱스 레지스터(Index Register)
- SI(Source Index), DI(Destination Index) : 다른 범용 레지스터와 마찬가지로 연산과 간접 번지 지정에 사용된다. 그 밖에 문자열의 전송이나 비교 등을 하는 스트링 명령에서 SI는 sourece가 되는 문자열을 나타내고, DI는 destination이 되는 문자열의 번지를 표시하는데 쓰인다.

4. 명령 레지스터(Instruction Register)
- 이 레지스터는 언제나 다음에 실행할 명령이 들어 있는 메모리의 번지를 가리킨다. CS 세그먼트 레지스터와 한 쌍이 되어 실행 번지가 만들어진다.

5. 플래그 레지스터(Flag Register)
- 8086에는 16비트로 된 플래그 레지스터가 준비되어 있다. 연산의 결과 및 시스템 제어를 위한 정보가 각각 배정되어 있다.

CF(Carry Flag) 연산 명령 실행 후 최상위 비트(MSB)에 덧셈에 따른 자리올림(carry) 또는 뺄셈에 의한 빌림(borrow)이 생길 때 세트된다.
PF(Parity Flag) 연산의 결과 하위 8비트 중에서 1로 되어 있는 비트의 개수가 짝수 개일 때 세트(1)되고, 홀수 개일 때 리셋(0)된다.
AF(Auxiliary Flag) 연산의 결과 하위 4비트에 자리올림 또는 빌림이 생겼을 경우에 세트된다. 10진 연산 처리를 할 경우에 이용된다.
ZF(Zero Flag) 연산 결과가 0이 될 때 세트된다. 비교 명령 등도 레지스터의 내용은 변경시키지 않지만 뺄셈이 이루어지므로 그 결과에 따라서 세트된다.
SF(Sign Flag) 연산 결과 최상위 비트가 1일 때 세트되고, 0일 때 리셋된다. 부호가 있는 수치의 경우에는 최상위 비트(MSB)가1이면 음수를 표시한다.
OF(Overflow Flag) 부호 연산 처리의 결과 부호부 2진 표시로 오버플로가 생겼을 때 세트된다. 바이트 연산에서는 -128 ~ +128, 워드 연산에서는 -32768 ~ +32767의 범위를 초과했다는 것을 표시한다.
DF(Direction Flag) 스트링 처리에서 연속하여 처리되는 문자열에 대해서 그 처리 방향을 표시한다. 스트링 명령의 실행에 앞서서 이 플래그를 Set 또는 Clear하여 처리 방향을 정해둔다. 즉, DF 플래그가 0일 때에는 하위 번지로부터 상위 번지 쪽으로 처리되며, DF가 1일 때에는 상위 번지로부터 하위 번지 쪽으로 처리된다.
IF(Interrupt Flag) 8086의 인터럽트 중에는 하드웨어로부터의 인터럽트에 관해서 제어를 한다. IF플래그가 1일 때에는 인터럽트를 받아들이고, 0일 때엔는 받아들이지 않는다.
TF(Trap Flag) 명령 실행 후 이 플래그가 세트되어 있으면 단일 스텝 인터럽트가 발생한다. 이 기능을 사용하면 하드웨어의 도움을 받을 필요 없이 프로그램을 한 명령씩 실행시켜 동작을 확인할 수 있다.