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비트로 된 플래그 레지스터가 준비되어 있다. 연산의 결과 및 시스템 제어를 위한 정보가 각각 배정되어 있다. | |||||||||||||||||||||||||||||||||||
상태 플래그
| |||||||||||||||||||||||||||||||||||
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 |
스트링 목적지 주소 | |||||||||||||||||||||||||||||||||
'Windows Programming > 디버깅' 카테고리의 다른 글
[디버깅을 위한 기초지식 #3] CallStack - 프로시저 호출에 따른 스택의 구성 (0) | 2011.07.18 |
---|---|
[디버깅을 위한 기초지식 #2] 8086 명령어 (0) | 2011.07.18 |
[디버깅을 위한 기초지식 #0] (0) | 2011.07.17 |
[windbg] ba(break on access) 메모리 엑세스 시점 잡기 (0) | 2011.07.11 |
Windbg case by case (0) | 2011.07.08 |