Intel 8086

Wygląd przypnij ukryj Procesor 8086 firmy Intel Procesor 8086-2 firmy Intel Procesor 80C86A-2 firmy OKI

8086 – 16-bitowy mikroprocesor wprowadzony na rynek 8 czerwca 1978 roku. Miał także oznaczenia: 8086-1, 8086-2, 8086-4, iAPX 86/10, a dla wykonywanych w technologii CMOS: 80C86, 80C86-2, 80C86A.

Mikroprocesor został zaprojektowany przez firmę Intel w technologii 3 μm HMOS (ang. High performance MOS, później także HMOS-II, HMOS-III i CHMOS) jako rozszerzenie 8-bitowego 8080/8085. Wykonywany głównie w obudowach 40-pin DIP, także jako 44-pin PLCC i 56-pin QFP (ang. Quad Flat Package). Wciąż jeszcze produkowany przez różnych dostawców.

Jego zastosowanie (w szczególności jego późniejszej odmiany z 8-bitowym interfejsem – 8088) w pierwszych ogólnodostępnych komputerach osobistych (IBM PC), doprowadziło do jego wielkiej popularyzacji i dalszego rozwoju tej rodziny procesorów (architektura x86). W związku z historycznym znaczeniem procesora 8086 firmie Intel przydzielono identyfikator 0x8086 na liście identyfikatorów (PCI ID) dostawców urządzeń dla magistrali PCI.

Geneza

Prace projektowe nad 8086 w firmie Intel rozpoczęto w maju 1976 roku, kiedy projekt przygotowujący 32-bitowy mikroprocesor 8800 napotkał duże trudności. Uruchomienie prac nad nową konstrukcją były ważne dla firmy, gdyż w lipcu 1976 roku ZiLOG utworzony przez byłych pracowników Intela dostarczył Z80, który przewyższał dotychczasowy popularny model Intel 8080.

Charakterystyka

Podstawowe parametry mikroprocesora 8086:

Przy projektowaniu mikroprocesora 8086, konstruktorzy firmy Intel zastosowali wiele nowych, nie występujących w mikroprocesorach 8-bitowych, rozwiązań:

w mikroprocesorach 8-bitowych, zazwyczaj stosowano cztery tryby adresowania: rejestrowy, natychmiastowy, pośredni i bezpośredni. W mikroprocesorze 8086 dodano rejestry indeksowe (2 rejestry), wskaźnikowe (2 rejestry) i bazowy (1 rejestr), wprowadzając tryby adresowania: indeksowy, bazowy i indeksowo-bazowy. celem rozdzielenia obszarów przeznaczonych dla programu, danych i stosu wprowadzono mechanizm segmentacji. Mikroprocesor zawiera cztery rejestry segmentowe, w których przechowywane część segmentowa adresu. Zawartości tych rejestrów wraz z adresem efektywnym, obliczanym przez mikroprocesor w zależności od trybu adresowania, stanowi adres fizyczny pamięci. Taki sposób adresowania ułatwia relokację programów i danych oraz umożliwia stworzenie prostego mechanizmu zarządzania pamięcią. wykonywanie rozkazu przez mikroprocesor można podzielić na kilka etapów. Część z nich wymaga współpracy mikroprocesora z pamięcią (pobieranie kodu operacji, odczyt i zapis argumentu operacji) pozostałe mikroprocesor wykonuje niezależnie (dekodowanie kodu operacji, wykonywanie operacji). W związku z tym projektanci firmy Intel stworzyli dwie osobne jednostki: wykonawczą oraz interfejsową. Pierwsza z nich odpowiedzialna jest za dekodowanie i wykonanie operacji, druga za współpracę z pamięcią. Dzięki takiej architekturze 8086 jest w stanie w jednocześnie wykonywać operację jednego rozkazu oraz pobierać kod operacji następnego mikroprocesor 8086 może pracować w dwóch różnych trybach. W trybie minimalnym steruje on całym systemem mikrokomputerowym pełniąc rolę kontrolera magistrali. Zwykle system taki składa się z jednego obwodu drukowanego i kilku urządzeń peryferyjnych. W trybie maksymalnym magistrala jest współdzielona pomiędzy mikroprocesor a procesory wspomagające. Funkcje sterownika magistrali przejmuje wtedy osobny element systemu mikrokomputerowego zwany kontrolerem magistrali. Tryb ten stosowany jest w przypadku systemów wieloprocesorowych (np. system w którego skład wchodzi mikroprocesor wraz z koprocesorem matematycznym)

Topologia, opis i przeznaczenie końcówek

Wyprowadzenia mikroprocesora 8086 firmy Intel

Wyprowadzenia, których funkcja pozostaje taka sama bez względu na tryb pracy mikroprocesora:

S4 S3 segment
0
0
1
1
0
1
0
1
dodatkowy (ES)
stosu (SS)
programu (CS)
danych (DS)

Wyprowadzenia, których funkcja zmienia się w zależności od wyboru trybu pracy mikroprocesora:

Znaczenie końcówek dla trybu minimalnego

W czasie stanu zawieszenia wyjście to wchodzi w stan wysokiej impedancji.

Znaczenie końcówek dla trybu maksymalnego

~S0 ~S1 ~S2 cykl interfejsowy
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
potwierdzenie przerwania
odczyt z WE/WY
zapis do WE/WY
zatrzymanie (HALT)
pobranie rozkazu
odczyt z pamięci
zapis do pamięci
stan pasywny, brak cyklu interfejsowego
QS1 QS2 stan kolejki
0
0
1
1
0
1
0
1
bez operacji
pobranie do wykonania pierwszego bajta rozkazu
kolejka pusta
pobranie kolejnego bajta

Architektura procesora

Mikroprocesor 8086 składa się z dwóch współpracujących zespołów, działających jednocześnie:

Schemat blokowy mikroprocesora Intel 8086. Jednostka wykonawcza: 1) Blok rejestrów ogólnego przeznaczenia (rejestry arytmetyczne, indeksowe i wskaźnikowe). 2) Jednostka arytmetyczno-logiczna wraz z rejestrem flag. Jednostka interfejsowa: 3) Blok rejestrów segmentowych wraz z licznikiem rozkazów. 4) Generator adresu fizycznego (20-bitowy sumator). 5) Kolejka rozkazów, 6 komórek pamięci (każda o rozmiarze bajta) zorganizowanych w słowa. 6) Kontroler interfejsu. 7) Układ kontrolny.

Jednostka wykonawcza

W jej skład wchodzi 16-bitowa jednostka arytmetyczno-logiczna ALU wraz z rejestrem znaczników oraz blok rejestrów ogólnego przeznaczenia. ALU dołączona jest do magistrali wewnętrznej mikroprocesora. Z magistrali tej pobierane są argumenty operacji, a także wysyłany jest na nią wynik operacji.

Rejestr znaczników

Bezpośrednio do jednostki arytmetyczno-logicznej dołączony jest 16-bitowy rejestr znaczników (rejestr flag). Znajdujące się w nim flagi zostały podzielone na dwie grupy, tj. kontrolną i arytmetyczną. Flagi arytmetyczne dostarczają dodatkowych informacji na temat wyniku ostatniej operacji wykonanej przez jednostkę arytmetyczno-logiczną. Flagi kontrolne wpływają na sposób pracy mikroprocesora.

Rejestr znaczników w mikroprocesorze 8086.

Mniej znaczący bajt rejestru znaczników odpowiada rejestrowi znaczników mikroprocesora 8080/8085. Cztery najbardziej znaczące bity pozostają nieużywane.

Znaczenie poszczególnych znaczników jest następujące:

Rejestry ogólnego przeznaczenia

W skład bloku rejestrów ogólnego przeznaczenia wchodzą rejestry: arytmetyczne, wskaźnikowe oraz indeksowe.

Rejestry arytmetyczne
Są to cztery 16-bitowe rejestry ogólnego przeznaczenia: AX, BX, CX, DX.
Każdy z tych rejestrów może również działać jako dwa niezależne rejestry 8-bitowe:

Niektóre z instrukcji mikroprocesora używają rejestrów arytmetycznych do ściśle określonych celów. Zgodnie z przeznaczeniem każdy z rejestrów arytmetycznych ma swoją nazwę:

Niektóre operacje, których argumenty znajdują się w akumulatorze, wykonywane są szybciej niż ich odpowiedniki wykorzystujące inne rejestry. Takie rozkazy jak: mnożenie, dzielenie i operacje wejścia/wyjścia wymagają użycia akumulatora do przechowywania argumentu bądź też zapisu wyniku.

Rejestry wskaźnikowe i indeksowe
Są to 16-bitowe rejestry adresowe: SP, BP, SI, DI. Ich głównym zadaniem jest wskazywanie miejsca w pamięci, w którym znajdują się argumenty rozkazu. Wykorzystywane są w adresowaniu indeksowym, bazowym oraz indeksowo-bazowym. Można ich również używać do przechowywania argumentu bądź wyniku operacji. Podobnie jak w przypadku rejestrów arytmetycznych, rejestry adresowe mają nazwy zależne od funkcji jaką pełnią:

Jednostka arytmetyczno-logiczna (ALU)

Zajmuje się wykonaniem podstawowych operacji arytmetycznych (dodawanie i odejmowanie) oraz logicznych (np. suma, iloczyn lub negacja logiczna). Mikroprocesor 8086 ma 16-bitową jednostkę arytmetyczno-logiczną, co umożliwia mu szybkie wykonywanie zarówno operacji 8- jak i 16-bitowych.

Jednostka interfejsowa

Odpowiada ona za współpracę z magistralą systemową. Do jej zadań należy odczyt i zapis danych do pamięci oraz urządzeń peryferyjnych. Ponadto jest odpowiedzialna za pobieranie kolejnych rozkazów w pamięci mikroprocesora i umieszczanie ich w kolejce rozkazów.

Rejestry segmentowe

Są to 16-bitowe rejestry, dostępne dla programisty, których zawartość służy do obliczania adresu fizycznego komórki pamięci. Rejestry te zawierają adres początkowy danego segmentu pamięci. Mikroprocesor w zależności od rodzaju segmentu pamięci, do którego chce się odwołać, wykorzystuje odpowiedni z rejestrów. Programista ma możliwość zmiany automatycznie wykorzystywanego rejestru poprzez umieszczenie odpowiedniego prefiksu przed rozkazem, dla którego zmiana ma zostać zastosowana.

Wartość ta wykorzystywana jest do obliczania adresu fizycznego kolejnego rozkazu do pobrania z pamięci.

Licznik rozkazów (Instruction Pointer – IP)

Jest to 16-bitowy rejestr, którego zawartość służy do obliczania adresu fizycznego następnego słowa rozkazu do pobrania z pamięci. Stanowi on rejestr indeksowy dla rejestru CS wyznaczającego segment z kodem programu. Jego zawartość jest automatycznie inkrementowana po pobraniu każdego bajtu rozkazu (w przypadku pobrania słowa jego wartość wzrasta o 2). Programista ma możliwość zmiany zawartości licznika rozkazów poprzez zastosowanie rozkazu skoku.

Generator adresu fizycznego

Jest to 20-bitowy sumator służący do obliczania adresu fizycznego komórki pamięci.

Kolejka rozkazów

Jest to 6 bajtowa pamięć zorganizowana w słowa (trzy 2-bajtowe komórki) wykorzystywane przez mikroprocesor do przechowywania pobranych wcześniej rozkazów.

Organizacja pamięci i generacja adresu fizycznego

Segmentacja pamięci w mikroprocesorze 8086 Intel

Mikroprocesor 8086 ma 20-bitową magistralę adresową. Pozwala ona na zaadresowanie do 1 MB pamięci operacyjnej. Przestrzeń adresowa została podzielona na segmenty o długości 64 kB, rozpoczynające się co 16 bajtów (kolejne segmenty pamięci mogą nakładać się na siebie). Adres fizyczny komórek pamięci obliczany jest na podstawie dwóch 16-bitowych składników tj. adresu segmentu oraz adresu efektywnego (przesunięcia). Taki sposób adresowania nazywa się adresowaniem segmentowym. Na rysunku z prawej pokazano przykładową organizacje pamięci operacyjnej dla mikroprocesora 8086.

Do otrzymania adresu fizycznego stosuje się tzw. generator adresu fizycznego, znajdujący się w jednostce interfejsowej. Adres segmentu mnożony jest przez 16, co powoduje że zostaje on przesunięty o 4 bity w lewo (zwolnione z prawej strony bity przyjmują wartość 0), a następnie dodaje się do niego adres efektywny obliczony z zastosowaniem wszystkich modyfikatorów (w przypadku danych) lub zawartość licznika rozkazów (w przypadku rozkazów).

Przykład generacji adresu fizycznego
Adres logiczny: 0010h:000Fh (adres początku segmentu:wartość przesunięcia (tzw. adres efektywny))
0010h * 0010h (16 dziesiętne) = 00100h (dwudziestobitowy adres początku segmentu)
00100h + 000Fh = 0010Fh (adres fizyczny komórki pamięci)

Niejednoznaczność adresowania segmentowego
Adresowanie segmentowe jest niejednoznaczne (jest to spowodowane nachodzeniem na siebie segmentów), jedna komórka pamięci może mieć kilka adresów logicznych. Zależnie od wyboru segmentu, względem początku którego komórka pamięci będzie adresowana, jej adres logiczny będzie inny. W celu rozwiązania tego problemu stosuje się normalizację adresu logicznego.

Tryby adresowania

Trybem adresowania nazywamy sposób wyznaczania adresu operandu, którego to mianem określamy argumenty i wyniki operacji. W mikroprocesorze 8086 każdy z rejestrów ogólnego przeznaczenia może służyć do przechowywania adresu lub jego składnika. Adres operandu obliczany jest zgodnie z równaniem

E A = B R + I R + p , {\displaystyle EA=BR+IR+p,}

gdzie:

E A {\displaystyle EA} – adres efektywny, B R {\displaystyle BR} – rejestr bazowy, I R {\displaystyle IR} – rejestr indeksowy, p {\displaystyle p} – przemieszczenie.

Adres efektywny EA jest adresem logicznym „widzianym” przez program. Na podstawie EA układy segmentacji obliczają adres rzeczywisty w pamięci operacyjnej. Rejestrem bazowym może być rejestr BP lub BX, a rejestrem indeksowym może być rejestr SI lub DI. Przemieszczenie jest zawarte w rozkazie i może mieć długość ośmiu lub szesnastu bitów.

Mikroprocesor 8086 realizuje następujące tryby adresowania:

Adresowanie natychmiastowe

W adresowaniu natychmiastowym argument pobierany jest bezpośrednio z rozkazu. W tym trybie wskazywany jest wyłącznie operand źródłowy. Np. MOV AX, 20 – w rejestrze AX zostanie zapisana liczba 20.

Adresowanie rejestrowe

W adresowaniu rejestrowym operandy znajdują się w rejestrach wewnętrznych mikroprocesora. Jeżeli operand znajduje się w pamięci, to zespół wykonawczy EU oblicza jego 16-bitowy adres (przesunięcie) wewnątrz segmentu. Zespół BIU oblicza adres rzeczywisty na podstawie otrzymanego przesunięcia (adresu efektywnego EA) i zawartości wybranego rejestru segmentowego. Np. MOV AX, BX – w rejestrze AX zostanie zapisana zawartość rejestru BX.

Adresowanie bezpośrednie

W adresowaniu bezpośrednim adres operandu znajduje się bezpośrednio w rozkazie. Np. MOV AX, – w rejestrze AX zostanie zapisana zawartość komórki pamięci (segment danych) o adresie 40.

Standardowy adres operandu jest przesunięciem w segmencie danych (DS), można to nadpisać poprzez wskazanie innego segmentu. Np. MOV AX, CS: – w rejestrze AX zostanie zapisana zawartość z komórki pamięci (segment PROGRAMU(kodu)) o offsecie 40.

Adresowanie pośrednie

W trybie adresowania pośredniego odwołujemy się do jednego z rejestrów roboczych procesora (np. BX) lub do komórki pamięci (np. 19). W rejestrze (BX) zapisany jest numer komórki pamięci, do której trzeba sięgnąć aby odczytać tam zawarty adres i przenieść do drugiego rejestru (AX). Dla adresowania pośredniego z pamięci odczytujemy numer komórki pamięci z dwóch komórek (komórki 19 i komórki 20) w taki sposób, że zawartość tej pierwszej (19) stanowi ważniejszą część tego numeru, zaś zawartość drugiej komórki (20) mniej ważną część tego numeru. Dalej postępujemy podobnie jak przy adresowaniu pośrednim z rejestru – przenosimy zawartość do rejestru AX. Np. MOV AX, – w rejestrze AX zostanie zapisana zawartość komórki pamięci o adresie, który znajduje się w rejestrze CX.

Wszystkie rejestry wskazują offset w segmencie danych (DS), poza rejestrem BP, który jest przesunięciem w segmencie stosu (SS). Można to zmienić określając segment w rozkazie. Np. MOV AX, SS: – w rejestrze AX zostanie zapisana zawartość komórki pamięci z segmentu stosu o adresie, który znajduje się w rejestrze CX.

Adresowanie bazowe

Adresowanie bazowe jest to rodzaj adresowania pośredniego, gdzie rozkaz wskazuje na jeden z rejestrów bazowych BX lub BP i może zawierać 8- lub 16-bitową wartość stanowiącą lokalne przemieszczenie. Adresem efektywnym jest suma zawartości rejestru bazowego i lokalnego przemieszczenia. Np. MOV AX, .

Adresowanie indeksowe

Adresowanie indeksowe jest rodzajem adresowania pośredniego, gdzie adres efektywny jest sumą zawartości rejestru indeksowego SI lub DI i lokalnego przemieszczenia. Np. MOV AX, .

Adresowanie bazowo-indeksowe

W adresowaniu bazowo-indeksowym, adres efektywny jest sumą zawartości jednego z rejestrów bazowych, jednego z rejestrów indeksowych i lokalnego przemieszczenia. Np. MOV AX, .

Rozkazy operujące na ciągach słów

Rozkazy operujące na ciągach słów posługują się rejestrami indeksowymi. Rejestry SI i DI zawierają adresy efektywne pierwszego słowa odpowiednio w ciągu źródłowym i wynikowym. Po każdej transmisji rejestry indeksowe są automatycznie inkrementowane lub dekrementowane w zależności od ustawienia bitu DF w rejestrze znaczników.

Rozkazy operujące na rejestrach WE/WY

Rozkazy operujące na rejestrach WE/WY zawierają adres WE/WY (adres natychmiastowy) lub posługują się zawartością rejestru DX (adresowanie pośrednie).

Budowa rozkazu

Rozkazy mikroprocesora 8086 można podzielić na następujące grupy:

Rozkazy mikroprocesora 8086 są wielobajtowe. Liczba bajtów każdego rozkazu zależy od jego rodzaju i może wynosić od jednego do sześciu.

7 6 5 4 3 2 1 0
kod operacji D W
MOD REG R/M

Pierwszy bajt zawiera sześciobitowy kod operacji oraz dwa bity (kierunku i szerokości). Bit D określa kierunek transmisji (0 – wynik operacji jest przesyłany z rejestru do pamięci, 1 – z pamięci do rejestru). W zależności od wartości tego bitu w rozkazie rozróżniane są operandy źródłowe i operandy przeznaczenia. Bit W określa szerokość operandu danego rozkazu (0 – operacje bajtowe, 1 – operacje na słowie 16-bitowym).

Jeżeli rozkaz jest wielobajtowy, to drugi bajt rozkazu określa sposób adresowania argumentów. Zawiera on trzy grupy bitów

Jeżeli operandy znajdują się w rejestrach mikroprocesora (MOD = 11), to pola REG i R/M stanowią ich numery (odpowiednio pierwszego i drugiego operandu)

REG

R/M

W = 0 W = 1
000
001
010
011
100
101
110
111
AL
CL
DL
BL
AH
CH
DH
BH
AX
CX
DX
BX
SP
BP
SI
DI

Jeżeli jeden z operandów znajduje się w pamięci, to pola MOD i R/M określają jego adres

R/M MOD = 00 MOD = 01 MOD = 10
000
001
010
011
100
101
110
111
BX+SI
BX+DI
BP+SI
BP+DI
SI
DI
p16
BX
BX+SI+p8
BX+DI+p8
BP+SI+p8
BP+DI+p8
SI+p8
DI+p8
BP+p8
BX+p8
BX+SI+p16
BX+DI+p16
BP+SI+p16
BP+DI+p16
SI+p16
DI+p16
BP+p16
BX+p16

Znaczenie bitów R/M zależy od wartości bitów w polu MOD. Jeżeli MOD != 11, to grupa R/M określa rejestry adresujące. Jeżeli natomiast MOD == 11, to R/M określa rejestr (podobnie jak REG) drugiego operandu. Jeżeli rozkaz tego wymaga, to po drugim bajcie rozkazu może występować jeden lub dwa bajty przemieszczenia. Jeden bajt przemieszczenia występuje w sytuacji, gdy MOD == 01, natomiast przemieszczenie dwubajtowe występuje, gdy MOD == 10.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
MOD REG R/M kod operacji D W
przemieszczenie
dana

Rysunek przedstawia format rozkazu sześciobajtowego, gdzie dwa ostatnie bajty to argument natychmiastowy dla tego rozkazu.

Obok omówionego formatu występują także rozkazy jednobajtowe, czego przykładem może być rozkaz wymiany zawartości akumulatora z zawartością wybranego rejestru. W kodzie tego rozkazu pięć bitów stanowi kod operacji, a pozostałe trzy bity wskazują numer rejestru którego ten rozkaz dotyczy.

Współpraca mikroprocesora z pamięcią

Rysunek przedstawia zasadę współpracy mikroprocesora z dwoma blokami pamięci o pojemności 512kB każdy, przy czym jeden z nich zawiera bajty parzyste i dołączony jest do szyny D0 – D7, a drugi zawiera bajty nieparzyste (D8 – D15). Bity A0 i ~BHE określają sposób wykorzystania pamięci. Jeżeli A0 == 1 i ~BHE == 0, to korzysta się z bloku A pamięci, który współpracuje z bardziej znaczącym bajtem szyny danych. Jeżeli A0 == 0 i ~BHE == 1, to korzysta się z bloku B pamięci, który współpracuje z mniej znaczącym bajtem szyny danych. Jeżeli natomiast A0 == 0 i ~BHE == 0, to mikroprocesor współpracuje z obydwoma blokami pamięci, przesyłając po szynie słowo szesnastobitowe.

Zobacz też

Przypisy

  1. 1978. Microprocessor Quick Reference Guide . Intel. . (ang.).
  2. 8086. cpu-info.com. . . (ang.).
  3. iAPX 86, 88 User’s Manual. Intel, 1981-08. . (ang.).brak strony w książce
  4. a b M80C86/M80C86-2 Data Sheet. Wyd. 005. Intel, 1989-11. . (ang.).brak strony w książce
  5. Gennadiy Shvets: Intel 8086 microprocessor family. CPU-World.com. . (ang.).
  6. Intel486™ Processors and Earlier. Microprocessor Quick Reference Guide . Intel. . (ang.).
  7. 8086 Data Sheet. Wyd. 005. Intel, 1990-09. . (ang.).brak strony w książce
  8. The 8086 Family User’s Manual. Intel, 1979-10. . (ang.).brak strony w książce
  9. a b 80C86 - CMOS 16-Bit Microprocessor. Intersil. . (ang.).
  10. 80C86 Data Sheet. Intersil, 1997-03. . (ang.).brak strony w książce
  11. Intel Corp.. Vendor Details . PCIDatabase.com. . . (ang.).
  12. Vendor 8086. The PCI ID Repository . . (ang.).
  13. Edwards Benj: Birth of a Standard: The Intel 8086 Microprocessor. PC World, 2008-06-16. . (ang.).
Procesory Intel
Wycofane z produkcji
przed x86 (4 i 8-bitowe)
x86-16 (16-bitowe)
x86-32/IA-32 (32-bitowe)
x86-64/EM64T (64-bitowe)
Pozostałe
Obecnie produkowane
Planowane
Kategorie
Mikroarchitektury
i nazwy kodowe
P5
P6
NetBurst
Core
Atom
Nehalem
Sandy Bridge
Haswell
Skylake
Alder Lake
Anulowane

Kontrola autorytatywna (mikroprocesor firmy Intel):