반응형

CPU 레지스터(8086)의 종류와 용도

Windows 구조와 원리(정덕영 저)

어셈 코드를 디버깅할 때, asm명령과 레지스터 몇가지만 알고 있어도 많은 도움이 됩니다.
이번 포스트에서는 x86 CPU레지스터에 대해 정리합니다.

범용 레지스터( General Register )

범용 레지스터는 연산 결과를 받을 수도 있으며, 연산에 사용되어질 수도 있는 레지스터로 과거 8bit컴퓨터에서는 연산 결과를 저장하기 위하여 특정 레지스터를 사용할 수 밖에 없었으나 8086에서는 범용 레지스터를 사용하여 모든 연산을 수행 할 수 있다

AX( AH, AL )

Accumulator Register

산술, 놀리 연산의 중심이 되는 레지스터이며, Input/Output 포트의 입출력 명령 또한 주로 이 레지스터를 사용한다.

BX( BH, BL )

Base Register

간접 번지 지정 시 번지 레지스터. 베이스 레지스터로 주로 사용된다

CX( CH, CL )

Count Register

루프와 같이 어떤 명령을 반복적으로 수행하고자 할 때 반복 횟수를 지정하는데 주로 사용된다

DX( DH, DL )

Data Register

간접 번지 지정에 의한 입출력 명령을 실행 할 때 번지 지정에 사용된다. 곱셈, 나눗셈을 할 때는 보조 어큐뮬레이터로 사용되이 지기도 한다.

포인터 레지스터

SP

Stack Pointer

현재까지 사용되어진 스택의 위치를 저장하기 위하여 사용되는 레지스터로 세그먼트 레지스터 SS와 함께 사용된다.

BP

Base Pointer

스택의 데이터를 액세스 하기 위해 사용된다.

인덱스 레지스터

SI, DI

Source Index

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

IP( 명령 포인터 )

IP

Instruction Pointer

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

플래그 레지스터

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

상태 플래그

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

O

D

I

T

S

Z

A

P

C

Flags

Status Flags

CF

Carry Flag

연산 명령 실행 후 최상위 비트(MSB)에 덧셈에 따른 자리올림(carry) 또는 뺄셈에 의한 빌림(borrow)이 생길 때 설정된다.

PF

Parity Flag

연산의 결과 하위 8비트 중에서 1로 되어 있는 비트의 개수가 짝수 개일 때 셋(1)되고, 홀수 개일 때는 리셋(0)된다.

AF

Auxiliary Flag

연산의 결과 하위 4비트에 자리올림 또는 빌림이 TODRURT을 경우 설정된다. 10진 연산 처리를 할 경우에 이용된다.

ZF

Zero Flag

연산 결과가 0이 될 때 설정된다. 비교 명령 등도 레지스터의 내용은 변경시키지 않지만 뺄셈이 이루어지므로 그 결과에 따라서 설정된다.

SF

Sing Flag

연산 결과 최상위 비트가 1일 때 설정되고, 0일 때 리셋된다. 부호가 있는 수치의 경우에는 최상위 비트(MSB) 1이면 음수를 표시한다.

OF

Overflow Flag

부호 연산 처리의 결과 부호부 2진 표시로 오버플로우가 생겼을 때 설정된다. 바이트 연산에서는 -128~+128, 워드 연산에서는 -32768~+32767의 범위를 초과했다는 것을 표시한다.

컨트롤 플래그

Flags

Status Flags

DF

Direction Flag

스트링 처리에서 연속하여 처리되는 문자열에 대해서 그 처리 방향을 표시한다. 스트링 명열의 실행에 앞서서 이 플래그를 설정도는 리셋하여 처리 방향을 정해 둔다. , DF 플래그가 0일 때에는 하위 번지로부터 상위 번지 쪽으로 처리되며, DF 플래그가 1일 때에는 상위 번지로부터 하위 번지 쪽으로 처리된다.

IF

Interrupt Flag

8086의 인터럽트 중에서 하드웨어로부터의 인터럽트에 관하여 제어를 한다. IF 플래그가 1일 때에는 인터럽트를 받아들이고, 0일 때에는 인터럽트를 받아들이지 않는다.

TF

Trap Flag

명령 실행 후 이 플래그가 세트되어 있으면 단일 스텝 인터럽트가 발생한다. 이 기능을 사용하면 하드웨어의 도움을 받을 필요 없이 프로그램을 한 명령씩 실행 시켜 동작을 확인할 수 있다.

세그먼트 레지스터

프로그램이 수행되기 위해서는 여러 가지 메모리 주소가 필요하다. 우선 현재 수행되고 있는 명령어의 위치를 나타내는 값, 프로그램이 사용하는 데이터가 있는 메모리 값, 그리고 함수 호출등을 휘한 스택의 위치를 나타내는 값 emddlekk.

8086은 어드레스 버스가 20비트로 구성되어 있어서 1MByte까지 메모리 번지를 나타낼 수 있으나 8086에 있는 레지스터는 16비트 밖에 되지 않아서 어떤 명령이 수행되어 메모리를 참조할 때에는 항상 다음과 같이 암시적 또는 명시적으로 세그먼트 레지스터가 개입된다.

세그먼트

오프셋

목적

CS( Code Segment )

IP

수행되어질 명령어의 위치

DS( Data Segment )

AX, BX, CX, DX와 같은 범용레지스터와 BX, DI,SI

데이터 주소 참조

SS( Stack Segment )

SP 또는 BP

스택 주소 참조

ES( E Segment )

스트링 명령어를 위한 DI

스트링 목적지 주소

 

반응형

+ Recent posts