제3장 8086 프로세서의 내부구조
학습내용 8086 프로세서 기억장치 레지스터 데이터표현 프로세서구조, 명령어, Memory model, 데이터기록 data,pointer,index,flag,segment 데이터표현 데이터부호, 데이터해석
8086 프로세서 (3-1) 프로세서 구조 명령어의 형태와 구성 예 기억장치 구성과 액세스
8086 프로세서 구조 (EU) (BIU) 명 령 어 실 행 버스 제어 로직 명령큐 버퍼 AH . DH AL . DL Adder SP,BP,SI,DI CS DS SS ES IP 명 령 어 실 행 버스 제어 로직 임시 레지스터 EU 제어 시스템 내부 커뮤 니케이션 레지스터 ALU 명령큐 버퍼 플래그레지스터
} 명령어의 형태 명령어 코드 오퍼랜드 주소지정방식 레지스터 3) 명령어의 형태와 구성 명령어는 크게 명령어 코드부와 오퍼랜드부로 구분된다. 명령어 코드부는 프로세서로 하여금 실행할 동작을 명시하는 것으로 크기가 4비트일 경우 16개의 명령어, 8비트일 경우 256개의 명령어를 구사할 수 있는데 8비트 명령어코드를 많이 사용하고 있다. 오퍼랜드의 경우에는 레지스터 번호, 메모리주소 등을 포함하게 되는데 오퍼랜드의 수가 없는 경우 0번지 명령어, 오퍼랜드가 1개인 경우 1번지 명령어, 2개인 경우 2번지 명령어, 3개인 경우 3번지 명령어라 부른다. 일반적으로 마이크로컴퓨터를 중심으로 하는 소형컴퓨터의 경우 오퍼랜드의 수가 적고 범용컴퓨터의 경우 오퍼랜드의 수가 많다. 또한 이러한 명령어의 형태는 프로세서마다 다를 수 있는데 오퍼랜드부에 주소지정방식 등을 포함하는 경우도 있다.
주소지정 방식의 종류,명령어의 종류에 따라 결정 명령어의 구성 예 7 1 명령어 코드(25=32) 4가지의 주소지정 방식 2개의 레지스터 명령어의 길이는 레지스터의 개수, 주소지정 방식의 종류,명령어의 종류에 따라 결정
} 명령어의 구성 예 7 1 명령어 코드(25=32) 4주소지정방식 00 = 직접 01 = 베이스 10 = 인덱스 1 명령어 코드(25=32) 4주소지정방식 00 = 직접 01 = 베이스 10 = 인덱스 11 = 베이스+인덱스 }
} } 명령어의 구성 예 7 1 명령어 코드(25=32) 4주소지정방식 00 = 직접 01 = 베이스 10 = 인덱스 1 명령어 코드(25=32) 4주소지정방식 00 = 직접 01 = 베이스 10 = 인덱스 11 = 베이스+인덱스 } } 1 = 레지스터 A 0 = 레지스터 B
I8086계열 주요프로세서 들의 특성
8086 명령어의 형태 14개의 기본레지스터 범용레지스터 : 8개 세그먼트 레지스터 : 4개 명령어 포인트 : 1개 플래그 레지스터 : 1개 필요한 레지스터를 명시하기 위하여 3비트 필요 8086에는 14개의 기본 레지스터가 있다. 이중 8개는 범용 레지스터, 4개는 세그먼트 레지스터, 1개는 명령어 포인트(IP) 그리고 1개는 플래그 레지스터이다. 명령어에 따라서 연산항으로 범용 레지스터를 사용하는 것이 있고 이러한 명령어는 3비트만 있으면 필요한 레지스터를 명시할 수 있다. 레지스터의 크기는 16 혹은 8비트이고 데이타 버스는 16비트이다. 따라서 어느 레지스터에 있는 값을 기록하고자 할 때에는 1사이클의 시간이 소요된다. 예를 들면 16비트 레지스터의 경우 데이타 버스가 16비트이므로 1사이클이 필요하고 8비트 레지스터의 경우에도 1사이클이 필요하다.왜냐하면 데이타를 단어 단위로 전송하기 때문에 1바이트 데이타를 전송할 때에도 1사이클의 시간이 필요하다. 따라서 데이타 크기에 따라 연산 방법과 기억 장치의 저장 방법이 달라져야 한다. 8086에서는 2가지 데이타 크기가 있으며(386이상에서는 바이트, 단어, 긴 단어를 사용한다.) 이것을 명령어에 명시해줄 필요가 있다. 이것을 명시하기 위해 1비트가 필요하다(예 , 0 : 바이트 표시, 1 : 워드 단위 표시). 또한 명령어의 주소 지정 방식을 명시해야 하는데 이것도 주소 지정 방식의 종류에 따라 결정된다. 8086에서는 주소 지정을 위하여 5비트가 이용된다 8086계열 어셈블리어에서는 명령어가 기본적으로 1단어(2바이트)로 구성되어 있다. 좀더 긴 명령은 2단어(4바이트) 이상까지 확장되며, 최대 3단어(6바이트)까지 확장된다. 프로세서가 명령어의 첫 단어를 읽어온 후에 이 명령어가 여기에서 끝나는지 다음 단어까지 확장되어 있는지 알아야 하는데 이 정보는 첫 단어에 들어 있다.
8086 명령어의 형태 레지스터와 데이터버스 : 16비트 명령어의 일반적 크기 : 1단어 레지스터 기록 : 1 사이클 명령어의 일반적 크기 : 1단어 데이터의 크기를 나타내기 위하여 1 비트 필요 주소 지정 방식을 나타내기 위해 5비트 이용 주소버스의 크기 : 20비트 8086에는 14개의 기본 레지스터가 있다. 이중 8개는 범용 레지스터, 4개는 세그먼트 레지스터, 1개는 명령어 포인트(IP) 그리고 1개는 플래그 레지스터이다. 명령어에 따라서 연산항으로 범용 레지스터를 사용하는 것이 있고 이러한 명령어는 3비트만 있으면 필요한 레지스터를 명시할 수 있다. 레지스터의 크기는 16 혹은 8비트이고 데이타 버스는 16비트이다. 따라서 어느 레지스터에 있는 값을 기록하고자 할 때에는 1사이클의 시간이 소요된다. 예를 들면 16비트 레지스터의 경우 데이타 버스가 16비트이므로 1사이클이 필요하고 8비트 레지스터의 경우에도 1사이클이 필요하다.왜냐하면 데이타를 단어 단위로 전송하기 때문에 1바이트 데이타를 전송할 때에도 1사이클의 시간이 필요하다. 따라서 데이타 크기에 따라 연산 방법과 기억 장치의 저장 방법이 달라져야 한다. 8086에서는 2가지 데이타 크기가 있으며(386이상에서는 바이트, 단어, 긴 단어를 사용한다.) 이것을 명령어에 명시해줄 필요가 있다. 이것을 명시하기 위해 1비트가 필요하다(예 , 0 : 바이트 표시, 1 : 워드 단위 표시). 또한 명령어의 주소 지정 방식을 명시해야 하는데 이것도 주소 지정 방식의 종류에 따라 결정된다. 8086에서는 주소 지정을 위하여 5비트가 이용된다 8086계열 어셈블리어에서는 명령어가 기본적으로 1단어(2바이트)로 구성되어 있다. 좀더 긴 명령은 2단어(4바이트) 이상까지 확장되며, 최대 3단어(6바이트)까지 확장된다. 프로세서가 명령어의 첫 단어를 읽어온 후에 이 명령어가 여기에서 끝나는지 다음 단어까지 확장되어 있는지 알아야 하는데 이 정보는 첫 단어에 들어 있다.
기억장치의 모델 8086 프로세서의 예 바이트주소 단어주소 1 3 N+1 N+3 FFFFF 7 0 15 8 1 . N-1 N 1 . N-1 N FFFFF 바이트 우 측 바 이 트 홀 수 좌 측 바 이 트 짝 수 2 . N N+2 FFFFE 바이트 1 3 N+1 N+3 FFFFF ( ( 8086 프로세서와 함께 동작되는 기억 장치에는 주소가 물리 주소로 붙여 졌다고 가정한다. 앞 3.1절에서 8086은 20비트의 주소 버스를 사용하고 따라서 1M 바이트의 주소를 갖을 수 있다고 하였다. 이때 마지막 주소를 2진수로 표현하면 다음과 같다. 1111 1111 1111 1111 1111 이것을 다시 16진수로 나타내면 FFFFFh가 된다. 이 책에서 h표시는 16진수 숫자라는 표시로 쓰인다. 기억 장치에 주소가 붙여진 모양을 그림 3.1와 같은 모델로 나타낼 수 있다. 비록 8086은 16비트 마이크로 프로세서로 간주되지만(16비트 데이타 버스를 가지고 있기 때문에) 메모리는 바이트(8비트)단위를 사용하고 있다. 이것은 프로세서가 단어는 물론 바이트로도 일할 수있게 해준다. 특히 프린터, 단말기. 모뎀등의 I/O장치들이 부호화 된 ASCII(7 또는 8비트)를 가지고 통신하도록 설계되어 있기 때문이다. 또한 대부분의 8086(8088)의 연산 코드가 한 바이트로 구성되고 2í¡6바이트로된 명령어에 있어서 이들을 개별적으로 엑세스할 수 있으므로 기억 장치를 바이트 단위로 사용한다. 그림 3.1는 기억 장치 모델을 나타내는데 이는 8086/88이 20비트 주소 버스를 사용하므로 220 즉 1,048,576개의 서로 다른 기억 장치주소를 나타낼 수 있다. ( ( 7 0 15 8 7 0
기억장치의 실제구성 1048575 1048574 5 4 3 2 1 홀수 뱅크 짝수 뱅크 . . 16비트 데이터 그럼 16비트 프로세서가 어떻게 8비트 폭의 메모리를 취할 수 있는가를 보자. 8086프로세서에서는 그림 3.2처럼 메모리가 짝수 주소뱅크와 홀수 주소뱅크로 구성되어진다. 즉, 모든 짝수번지로 된 바이트를 한 뱅크로, 모든 홀수번지로 된 바이트를 한 뱅크로 하여 설계하였다. 이러한 방법에서 프로세서는 기억 장치로부터 홀수 주소 바이트와 짝수 주소 바이트를 동시에 읽어 16비트를 엑세스한다. 그러나 이 책에서는 3.1의 기억 장치 처럼 선형으로 생각하면서 기억 장치를 사용한다. 왜냐하면 이렇게 생각하여 사용하는것이 가능한 이유는 버스 인터페이스 유니트(BIU: Bus Interface Unit)에서 자동으로 처리하여 주므로 사용자는 이를 구분하여 생각하지 않아도 된다. 16비트 데이터 8086 프로세서
주소지정에 의한 액세스 효율 41 68 64 C1 B4 41 번지 기억장치 0000 짝수,홀수번지의 조합(1번액세스) 0001 0002 64 . C1 8086은 짝수 주소 뱅크와 홀수 주소 뱅크를 읽으므로 메모리로부터 동시에 두 바이트를 읽어들인다. 만약 16비트 단어가 홀수 주소에서 시작되면 8086 (8088도 동일)은 두개의 메모리 읽기 혹은 쓰기 사이클을 필요로 한다. 00011 홀수,짝수번지의 조합(2번액세스) 00012 B4 41 00013
데이터 기록시 일반적인 규칙 기억장소주소는 바이트 단위 바이트주소는 1씩 증가 단어주소는 2씩 증가 N번지의 단어에 접근 → N,N+1 바이트에 접근 N번지의 긴 단어에 접근 → N,N+1,N+2,N+3에 접근
기억장치에서 단어 배열 레지스터 51 2A 기억장치 단어의 하위 바이트 단어의 상위 바이트 2A 51 15 7 . N N+1 기억장치 . N 단어의 하위 바이트 단어의 상위 바이트 2A N+1 레지스터에서 기억장치로 데이타를 쓰거나 읽어 올 때는 그 단어의 하위바이트를 먼저 기록하고 난 후에 상위바이트를 기록하게 된다. 다음 그림 3.3은 n번지에 하나의 단어 512AH가 들어 있을때의 기억 장치의 내용과 이 단어가 레지스터에 표현될 때의 형태를 나타낸다. 51 N+2 .
요약 8086 프로세서구조 이해, 명령어길이 명령어의 길이와 구성형태를 이해 기억장치 모델과 구성형태를 이해
레지스터 (3-2) 레지스터의 종류와 형태 세그먼트레지스터와 물리주소 논리주소와 물리주소 명령어 포인터의 동작 데이터의 표현
레지스터의 종류 데이터 레지스터 * 일시적인 결과 기록 포인터 레지스터 * 스텍 포인터와 베이스 포인터 인덱스 레지스터 * 데이터의 주소저장 플래그 레지스터 * 연산결과의 정보저장 세그먼트 레지스터 * 세그먼트의 시작 주소저장 프로세서가 일을 하는데 필요한 데이타는 보통 기억장치(RAM)에 기억하여 사용한다. 그러나 이 방법은 앞에서 소개된 판독 사이클과 기록 사이클을 사용하는데, 이 작업들이 여러 단계를 거쳐야 하기 때문에 비교적 많은 시간을 필요로한다. 레지스터는 데이타를 빨리 기록하고 읽을 수있는 기억장소로서 프로세서내에 존재한다는 것이 특징이다. 8086에는 그림 3.7과 같이 16비트 레지스터 14개가 있다: 즉, 4개의 데이타 레지스터, 2개의 인덱스 레지스터, 3개의 포인터 레지스터, 4개의 세그먼트 레지스터, 1개의 플래그 레지스터로 구성되어 있다. 이중에서 데이타 레지스터는 2개로 분할해서 8비트로도 사용할 수 있고 포이터, 인덱스, 세그먼트 레지스터는 16비트로만 사용 가능하다.
데이터 레지스터 32비트 16비트 8비트 8비트 EAX AH AL AX EBX BH BL BX ECX CH CL CX EDX 각종 데이타 처리를 할때 일시적인 결과를 기록하기 위해 사용하는 16비트 레지스터 및 8비트 레지스터로 프로그래머가 명령 중에 자유롭게 지정 가능한 범용 레지스터이다. 이들 레지스터들은 상위(AH, BH, CH, DH) 8비트 혹은 하위(AL, BL, CL, DL) 8비트를 엑세스 할 수 있다. a) AX(AL, AH) : 어큐뮬레이터(Accumulator), 산술, 논리 연산의 중심이 되는 레지스터로 곱셈, 나눗셈 명령 등에 있어서 하위 바이트용 레지스터 I/O 포트와의 출력 명령은 이 레지스터로서 사용된다. b) BX(BL, BH) : 간접 주소 지정시에 베이스 주소를 가르키는 레지스터로 사용된다. c) CX(CL, CH) : 스트링이나 루프에서 반복수를 카운터하는 카운트 레지스터로 쉬프트, 로테이트 명령의 로테이트수를 놓는다. d) DX(DL, DH) : 간접 주소에 의한 입출력 주소 지정에 사용되며 곱셈, 나눗셈에서의 상위 워드용 데이타 레지스터로 보조 어큐뮬레이터이다. ECX CH CL CX EDX DH DL DX
포인터와 인덱스 레지스터 ESP Stack Pointer SP EBP Base Pointer BP ESI 32비트 16비트 ESP Stack Pointer SP EBP Base Pointer BP (1) 포인터 레지스터(Pointer Register) a) 스택 포인터(SP:Stack Pointer) : 스택 조작을 위해서 사용하는 레지스터로서 프로그램 실행 중에 데이타의 저장 주소를 기억하고 있는 레지스터이다. 스택은 기억 장치내의 어떠한 영역을 지칭한다. 이 스택을 이용하여 데이타를 저장하고 인출 할 때는 가장 나중에 저장한 데이타를 먼저 인출하게 된다. 이와 같은 순서로 입출력을 하는 방법을 LIFO(Last-In-First-Out)이라 한다. 반면에 입력된 순서대로 출력되는 방법은 FIFO(First-In-First-Out)이라 한다. FIFO의 대표적인 예는 먼저 도착한 손님을 먼저 서비스해주는 일반적인 대기행렬(queue)이 있다. b) 베이스 포인터(BP:base pointer) : 기본적으로 스택 영역 내의 주소를 지시하지만 스택 세그먼트 SS영역내에 배치한 데이타에 대한 베이스 주소를 저장해 두기 위해 사용된다. (2) 인덱스 레지스터(Index Register) 데이타의 주소를 나타내기 위해 사용하며 두가지 레지스터 SI, DI가 있다. 특히 스트링 명령에서 선두 데이타로 되는 스트링의 선두 주소를 SI 레지스터에, 출력 대상이 되는 선두 주소를 DI 레지스터에 설정해서 명령을 실행하도록 결정하고 있다. a) SI(Source Index Register) : 연산항 소스, 소스 데이타 지정에 사용된다. b) DI(Destination Index Register) : 연산항의 처리 대상, 또는 목적항 데이타를 나타내는데 사용된다. ESI Source Index SI EDI Destination Index DI
세그먼트 레지스터 Code Segment : CS Data Segment : DS Stack Segment : SS 8086/88은 1M바이트의 메모리 내에 4개의 64K 바이트 메모리 블럭을 정의한다. 이들은 각각 데이타(data), 코드(code), 스택(stack) 및 엑스트라(extra) 세그먼트로 구성되어지며, 이들은 각각 최대 64 KB 크기의 영역을 가질 수 있다. 4개의 세그먼트 전용 레지스터 DS, CS, SS 및 ES는 각 세그먼트의 처음위치(처음주소)를 지시한다. a) 코드 세그먼트(Code Segment)는 프로그램 명령 코드를 포함하고, CS 레지스터는 이 세그먼트의 선두번지를 갖게 된다. b) 데이타 세그먼트(Data Segment)는 프로그램을 위한 데이타를 저장하고 있으며, DS 레지스터는 이 세그먼트의 선두 주소를 가지고 있다. c) 엑스트라 세그먼트(Extra Segment)는 여분의 데이타 세스먼트이며, 주로 스트링(string)명령을 수행할 때 사용된다. ES 레지스터는 이 세그먼트의 선두 주소를 가지고 있다. d) 스택 세그먼트(Stack Segment)는 인터럽트와 서브루틴의 반환 주소를 저장하는데 사용된다. SS 레지스터는 이 세그먼트의 선두 주소를 가지고 있다 Extra Segment : ES
플래그 레지스터의 구성 × × × × O D I T S Z × A × P × C 상위 하위 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 × × × × O D I T S Z × A × P × C 오 버 플 로 우 디 렉 션 인 터 럽 트 에 이 블 트 랩 사 인 제 로 보 조 캐 리 패 리 티 캐 리 프로그램을 실행할 때 앞의 연산 결과가 음수인가 양수인가, 컴퓨터 사용자가 일반 사용자인지 관리자(supervisor)인지 알 필요가 있다. 이러한 정보들은 16비트 크기의 상태 레지스터에 기록되고, 이것에 기록되는 각 비트들을 플래그(flag)라고 부른다. 그림 3-8와 같이 8086에서는 9종류의 플래그가 있고, CF, PF, AF, ZF, SF, OF는 수치 연산과 논리 연산의 결과에 의한 CPU의 상태를 나타내는 상태(Status) 플래그이고, TF, IF, DF는 CPU동작을 변화하기 위한 제어 플래그이다.
세그먼트레지스터와 물리주소 16비트 4비트 세그먼트 레지스터값 오프셋(offset)값 CPU로부터 출력되는 실제주소값 8086의 주소버스는 20비트로 되어 있어서 1,048,576(220)바이트의 번지를 지정할 수 있다. 그런데 8086/8088프로세서의 레지스터는 16비트이므로 한개의 레지스터로 기록할 수 있는 주소는 65,536(216)바이트 까지만 가능하다. 따라서 8086/8088에서는 두개의 레지스터를 사용하여 20비트 주소를 만들어낸다. 그림 3.9처럼 세그먼트 레지스터를 4비트만큼 왼쪽으로 자리 이동하여 덧셈을 하고, 결과로서 20 비트의 번지를 얻게된다. 이때 오프셋 값은 하나의 세그먼트에서의 변위(displacement)를 나타낸다. CPU로부터 출력되는 실제주소값
메모리 공간에서 세그먼트 영역 ×16 ×16 ×16 ×16 DS E000 CS B3FF SS 6D26 ES 52B9 FFFFFH ×16 EFFFFH E000 데이터 세그먼트 E0000H CS C3FEFH ×16 코드 세그먼트 B3FF B3FF0H SS 7D260H ×16 스텍 세그먼트 6D26 6D260H 이들 세그먼트는 서로 겹침없이 독립된 4 개의 세그먼트로서 64K x 4 = 256K 바이트의 기억 공간의 번지를 지정할 수 있다. 6288FH ES 엑스트라 세그먼트 ×16 52B90H 52B9 00000H
논리주소와 물리주소의 관계 + + 세그먼트값 1F00 02A5 02A5 1F2A5 물리주소 세그먼트 레지스터값×16 베이스주소 1F000 1F00 세그먼트 레지스터값×16 =세그먼트 물리번지 02A5 + 02A5 그림 3.11을 보면, CS에 저장된 값은 1F00H이지만, 실제로 기억장치에서는 4 비트를 자리이동한 1F000H를 가르키고 있다. 따라서, 세그먼트 레지스터와 각 오프셋으로 부터 실제 주소를 만들어 주는 일은 BIU(버스 인터페이스 장치)에서 해주므로 사용자는 16비트 레지스터로 256K바이트의 기억 공간을 사용할 수 있다. 실제주소(physical address)의 지정은 세그먼트 주소와 오프셋을 조합하여 얻어지므로, 동일한 실제 주소에 대하여 여러개의 세그먼트, 오프셋 조합이 존재할 수 있다. 세그먼트 영역이 중첩된 경우는 데이타와 명령등이 서로 중첩을 되는 것을 피해야하므로 충분한 관리가 필요하다. 1 F + 2 A 5 1 F 2 A 5
명령어 포인터의 동작 8086 CPU 기억장치 코드 세그먼트 ×16 . BIU F0000 F0001 CS F0202 F000 EU : F0201 주소의 명령 실행 F0000 ×16 F0001 CS F0202 F0203 F0204 F0205 F000 . 명 령 큐 F0204 F0205 명령어 포인터는 프로그램의 실행 순서를 조절하기 위해 명령어의 주소를 기억하는 레지스터로 CS와 쌍이 되어 실제 주소를 만들수 있으며 8086에서는 2바이트씩 명령어를 패치한다. 16비트 IP 레지스터는 8086이나 M68000 프로세서의 PC(프로그램 카운터)와 같고, 프로그램 명령 코드의 베이스 주소를 가지고 있는 CS(Code Segment Register)와 짝을 이루어 기억 장치안의 실제 주소를 만들어 낸다. 보통 M68000에서는 현재 실행중인 명령어의 다음 주소가 PC에 저장되어 있으나, 8086에서는 보통 EU(명령 실행부)에서 현재 실행 되고 있는 명령어의 주소보다 몇바이트가 앞선 주소가 IP에 저장되어 있다. 다음 그림 3.12는 8086에서 IP의 동작을 보인다. 현재 EU에서 실행중인 명령어는 F0201번지 것으로 BIU에 있는 명령 큐에는 F0202에서 F0205번지까지의 명령코드가 이미 페치되어 있으므로, IP는 다음에 페치할 예정의 F0206번지를 지시하고 있다. IP F0206 F0206 F0207 BIU
레지스터의 특성 직접 엑세스 가능한 레지스터 직접 수정이 가능한 레지스터 AX, BX, CX, DX AH, BH, CH, DH AL, BL, CL, DL SI, DI DS, ES, SS BP, SP 직접 수정이 가능한 레지스터 CF, DF, IF
데이터의 표현 1 부호있는 숫자의 표현 0 ~ 32,767 15 -32,768 ~ -1 15 부호없는 숫자의 표현 15 -32,768 ~ -1 1 부호없는 숫자의 표현 15 0 ~ 65,535
제3장 요약 8086 프로세서구조 이해, 명령어길이 명령어의 길이와 구성형태를 이해 기억장치 모델과 구성형태를 이해 주소지정과 데이터 기록을 이해 데이터, 포인터, 인덱스, 세그먼트, 플래그레지스터 이해 논리주소는 물리주소로 변환됨 데이터 표현시 부호비트 사용 유무