Intel 8086 - Intel 8086

Intel 8086
Intel C8086.jpg
Rzadki procesor Intel C8086 w fioletowym ceramicznym opakowaniu DIP z bocznymi pinami lutowanymi
Informacje ogólne
Wystrzelony 1978
Wycofane 1998
Wspólni producenci
Wydajność
Maks. Częstotliwość taktowania procesora 5 MHz do 10 MHz
Szerokość danych 16 bitów
Szerokość adresu 20 bitów
Architektura i klasyfikacja
Min. rozmiar funkcji 3 µm
Zestaw instrukcji x86-16
Specyfikacje fizyczne
Tranzystory
Współprocesor Intel 8087 , Intel 8089
Pakiet(y)
Gniazdo(a)
Produkty, modele, warianty
Warianty
Historia
Poprzednik Intel 8085
Następca 80186 i 80286 (oba zostały wprowadzone na początku 1982)

8086 (zwany także iAPX 86 ) jest 16-bitowy mikroprocesor układ zaprojektowany przez firmę Intel od początku 1976 do 8 czerwca 1978 roku, kiedy to został zwolniony. Intel 8088 , wydany 01 lipca 1979, jest nieco zmodyfikowany układ z zewnętrzną 8-bitowej magistrali danych (pozwalającej na korzystanie z tańszych i mniej wspierających układy scalone ) i jest godny uwagi jako procesora zastosowanego w oryginalnym IBM PC projektu.

8086 dał początek architekturze x86 , która ostatecznie stała się najbardziej udaną linią procesorów Intela. 5 czerwca 2018 r. Intel wypuścił limitowaną edycję procesora z okazji 40. rocznicy Intel 8086, o nazwie Intel Core i7-8086K .

Historia

Tło

W 1972 roku Intel wypuścił 8008 , pierwszy 8-bitowy mikroprocesor. Zaimplementował zestaw instrukcji zaprojektowany przez korporację Datapoint z myślą o programowalnych terminalach CRT , które również okazały się dość uniwersalne. Urządzenie potrzebowało kilku dodatkowych układów scalonych do wyprodukowania funkcjonalnego komputera, częściowo ze względu na to, że było zapakowane w mały 18-pinowy „pakiet pamięci”, co wykluczało użycie oddzielnej szyny adresowej ( w tym czasie Intel był przede wszystkim producentem DRAM ).

Dwa lata później Intel wypuścił 8080 , wykorzystując nowe 40-pinowe pakiety DIL pierwotnie opracowane dla układów scalonych kalkulatorów, aby umożliwić oddzielną magistralę adresową. Posiada rozszerzony zestaw instrukcji, który jest kompatybilny ze źródłami (nie kompatybilny z binarnymi ) z 8008, a także zawiera pewne 16-bitowe instrukcje ułatwiające programowanie. Urządzenie 8080 ostatecznie zastąpiony przez wyczerpywanie obciążenia -na 8085 (1977), starczyło z jednego źródła zasilania +5 V, zamiast trzech różnych napięć roboczych wcześniejszych żetonów. Inne dobrze znane 8-bitowe mikroprocesory, które pojawiły się w tych latach to Motorola 6800 (1974), General Instrument PIC16X (1975), MOS Technology 6502 (1975), Zilog Z80 (1976) i Motorola 6809 (1978).

Pierwszy projekt x86

Obraz matrycy procesora Intel 8086

Projekt 8086 rozpoczął się w maju 1976 roku i pierwotnie miał być tymczasowym substytutem ambitnego i opóźnionego projektu iAPX 432 . Była to próba zwrócenia uwagi na mniej opóźnione 16- i 32-bitowe procesory innych producentów (takich jak Motorola , Zilog , National Semiconductor ) i jednocześnie przeciwdziałania zagrożeniu ze strony Ziloga Z80 (zaprojektowanego przez byłego pracowników Intela), które odniosły duży sukces. Zarówno architektura, jak i fizyczny układ scalony zostały zatem opracowane dość szybko przez niewielką grupę ludzi i przy użyciu tych samych podstawowych elementów mikroarchitektury i fizycznych technik implementacji, które zastosowano w nieco starszym 8085 (dla którego 8086 również działałby jako kontynuacja) .

Sprzedawany jako zgodny ze źródłami , 8086 został zaprojektowany, aby umożliwić asembler dla 8008, 8080 lub 8085 na automatyczną konwersję do równoważnego (suboptymalnego) kodu źródłowego 8086, z niewielką lub żadną edycją ręczną. Model programowania i zestaw instrukcji są (luźno) oparte na 8080, aby było to możliwe. Jednak projekt 8086 został rozszerzony o obsługę pełnego przetwarzania 16-bitowego.

Dodano również nowe rodzaje instrukcji; pełne wsparcie dla podpisanych liczb całkowitych, podstawa + przesunięcie adresowania, a operacje na własny powtarzając były zbliżone do Z80 projektu, ale zostały wykonane nieco bardziej ogólnie w 8086. Instrukcje bezpośrednio wspierających zagnieżdżone Algol -family języków takich jak Pascal i PL / M były również dodany. Według głównego architekta Stephena P. Morse'a było to wynikiem bardziej skoncentrowanego na oprogramowaniu podejścia niż w projektowaniu wcześniejszych procesorów Intela (projektanci mieli doświadczenie w pracy z implementacjami kompilatorów). Inne ulepszenia obejmowały mikrokodowane instrukcje mnożenia i dzielenia oraz strukturę magistrali lepiej przystosowaną do przyszłych koprocesorów (takich jak 8087 i 8089 ) oraz systemów wieloprocesorowych.

Pierwsza wersja zestawu instrukcji i architektury wysokiego poziomu była gotowa po około trzech miesiącach, a ponieważ prawie nie użyto żadnych narzędzi CAD, nad chipem pracowało jednocześnie czterech inżynierów i 12 osób zajmujących się układem. 8086 zajęło nieco ponad dwa lata od pomysłu do działającego produktu, który został uznany za dość szybki jak na złożony projekt w latach 1976-1978.

8086 został zsekwencjonowany przy użyciu mieszanki losowej logiki i mikrokodu i został zaimplementowany przy użyciu obwodów nMOS z obciążeniem zubożającym z około 20 000 aktywnych tranzystorów (29 000 licząc wszystkie miejsca ROM i PLA ). Wkrótce został przeniesiony do nowego, udoskonalonego procesu produkcyjnego nMOS zwanego HMOS (od High Performance MOS), który Intel pierwotnie opracował do produkcji szybkich, statycznych produktów RAM . Następnie pojawiły się wersje HMOS-II, HMOS-III i ostatecznie w pełni statyczna wersja CMOS dla urządzeń zasilanych bateryjnie, wyprodukowana przy użyciu procesów CHMOS firmy Intel . Oryginalny chip mierzył 33 mm², a minimalny rozmiar elementu wynosił 3,2 μm.

Architektura została zdefiniowana przez Stephena P. Morse'a z pewną pomocą Bruce'a Ravenela (architekta lat 8087) w dopracowaniu ostatecznych poprawek. Projektant logiki Jim McKevitt i John Bayliss byli głównymi inżynierami zespołu programistów na poziomie sprzętu, a Bill Pohlman kierownikiem projektu. Dziedzictwo 8086 trwa w podstawowym zestawie instrukcji dzisiejszych komputerów osobistych i serwerów; 8086 użyczył również swoich ostatnich dwóch cyfr późniejszym rozszerzonym wersjom projektu, takim jak Intel 286 i Intel 386 , z których wszystkie ostatecznie stały się znane jako rodzina x86 . (Innym odniesieniem jest to, że identyfikator dostawcy PCI dla urządzeń Intel to 8086 h .)

Detale

Przypisania pinów 8086 w trybie min i max

Autobusy i eksploatacja

Wszystkie rejestry wewnętrzne, a także wewnętrzne i zewnętrzne szyny danych mają szerokość 16 bitów, co mocno ugruntowało tożsamość „16-bitowego mikroprocesora” 8086. Zewnętrzna szyna adresowa 20-bitowa zapewnia 1  MB fizycznej przestrzeni adresowej (2 20 = 1 048 576). Ta przestrzeń adresowa jest adresowana za pomocą wewnętrznej „segmentacji” pamięci. Magistrala danych jest multipleksowana z magistralą adresową w celu dopasowania wszystkich linii sterujących do standardowego 40-stykowego pakietu dual-in-line . Zapewnia 16-bitową magistralę adresową we/wy, obsługującą 64  KB oddzielnej przestrzeni we/wy. Maksymalna liniowa przestrzeń adresowa jest ograniczona do 64 KB, po prostu dlatego, że wewnętrzne rejestry adresów/indeksów mają tylko 16 bitów szerokości. Programowanie powyżej 64 KB granic pamięci polega na dostosowaniu rejestrów segmentowych (patrz poniżej); Ta trudność istniała, dopóki architektura 80386 nie wprowadziła szerszych (32-bitowych) rejestrów (sprzęt do zarządzania pamięcią w 80286 nie pomógł w tym względzie, ponieważ jego rejestry mają wciąż tylko 16 bitów szerokości).

Tryby sprzętowe

Niektóre z pinów sterujących, które przenoszą istotne sygnały dla wszystkich operacji zewnętrznych, mają więcej niż jedną funkcję w zależności od tego, czy urządzenie pracuje w trybie min, czy max . Pierwszy tryb przeznaczony jest dla małych systemów jednoprocesorowych, a drugi dla średnich lub dużych systemów wykorzystujących więcej niż jeden procesor (rodzaj trybu wieloprocesorowego). Tryb maksymalny jest wymagany w przypadku korzystania z koprocesora 8087 lub 8089. Napięcie na pinie 33 (MN/ MX ) określa tryb. Zmiana stanu pinu 33 zmienia funkcję niektórych innych pinów, z których większość dotyczy sposobu, w jaki procesor obsługuje (lokalną) magistralę. Tryb jest zwykle połączony z obwodem i dlatego nie może zostać zmieniony przez oprogramowanie. Działanie tych trybów jest opisane w postaci diagramów czasowych w arkuszach danych i instrukcjach Intela. W trybie minimalnym wszystkie sygnały sterujące są generowane przez sam 8086.

Rejestry i instrukcje

Rejestry Intel 8086
1 9 1 8 1 7 1 6 1 5 1 4 1 3 1 2 1 1 1 0 0 9 0 8 0 7 0 6 0 5 0 4 0 3 0 2 0 1 0 0 (pozycja bitowa)
Główne rejestry
  AH glin AX (akumulator pierwotny)
  BH BL BX (podstawa, akumulator)
  CH CL CX (licznik, akumulator)
  DH DL DX (akumulator, rozszerzony acc)
Rejestry indeksowe
0 0 0 0 SI S ródło I ndex
0 0 0 0 DI D CEL I ndex
0 0 0 0 BP B ase P ointer
0 0 0 0 SP S lepkość P ointer
Licznik programu
0 0 0 0 IP I nstruction P ointer
Rejestry segmentowe
CS 0 0 0 0 C odą S egment
DS 0 0 0 0 D ATA S egment
ES 0 0 0 0 E Xtra S egment
SS 0 0 0 0 S przyczepność S egment
Rejestr statusu
  - - - - O D i T S Z - A - P - C Flagi

8086 ma osiem mniej lub bardziej ogólnych rejestrów 16-bitowych (włącznie ze wskaźnikiem stosu, ale z wyłączeniem wskaźnika instrukcji, rejestru flagowego i rejestrów segmentowych). Do czterech z nich, AX, BX, CX, DX, można również uzyskać dostęp dwa razy więcej rejestrów 8-bitowych (patrz rysunek), podczas gdy pozostałe cztery, SI, DI, BP, SP, są tylko 16-bitowe.

Ze względu na kompaktowe kodowanie inspirowane procesorami 8-bitowymi większość instrukcji to operacje jednoadresowe lub dwuadresowe, co oznacza, że ​​wynik jest przechowywany w jednym z operandów. Co najwyżej jeden z operandów może znajdować się w pamięci, ale ten operand pamięci może być również miejscem docelowym , podczas gdy drugi operand, source , może być albo register lub direct . Pojedyncza lokalizacja pamięci może być również często wykorzystywana zarówno jako źródło, jak i miejsce docelowe, co, między innymi, dodatkowo przyczynia się do gęstości kodu porównywalnej (i często lepszej niż) z większością ośmiobitowych maszyn w tym czasie.

Stopień ogólności większości rejestrów jest znacznie większy niż w 8080 lub 8085. Jednak rejestry 8086 były bardziej wyspecjalizowane niż w większości współczesnych minikomputerów i są również używane niejawnie przez niektóre instrukcje. Chociaż jest to całkowicie rozsądne dla programisty asemblera, sprawia to, że alokacja rejestrów dla kompilatorów jest bardziej skomplikowana w porównaniu do bardziej ortogonalnych 16-bitowych i 32-bitowych procesorów w tamtych czasach, takich jak PDP-11 , VAX , 68000 , 32016 itd. Z drugiej strony , będąc bardziej regularnym niż raczej minimalistyczne, ale wszechobecne 8-bitowe mikroprocesory, takie jak 6502 , 6800 , 6809 , 8085 , MCS-48 , 8051 , i inne współczesne maszyny oparte na akumulatorach, znacznie łatwiej jest skonstruować wydajny generator kodu dla architektura 8086.

Innym czynnikiem wpływającym na to jest to, że 8086 wprowadził również kilka nowych instrukcji (nieobecnych w 8080 i 8085), aby lepiej obsługiwać oparte na stosie języki programowania wysokiego poziomu, takie jak Pascal i PL/M ; niektóre z bardziej użytecznych instrukcji to , i ret size , bezpośrednio obsługujące " konwencję wywoływania Pascala ". (Kilka innych, takich jak i , zostało dodanych w kolejnych procesorach 80186, 80286 i 80386). push mem-op push immedenter

Stos 64 KB (jeden segment) rosnący w kierunku niższych adresów jest obsługiwany sprzętowo ; 16-bitowe słowa są odkładane na stos, a wierzchołek stosu jest wskazywany przez SS:SP. Istnieje 256  przerwań , które mogą być wywołane zarówno przez sprzęt, jak i oprogramowanie. Przerwania mogą być kaskadowe, używając stosu do przechowywania adresów zwrotnych .

8086 ma 64 kB 8-bitowego (lub alternatywnie 32 kB 16-bitowego słowa) miejsca na porty we/wy .

Flagi

8086 ma 16-bitowy rejestr flag . Dziewięć z tych flag kodu stanu jest aktywnych i wskazuje aktualny stan procesora: flaga przenoszenia (CF), flaga parzystości (PF), flaga przeniesienia pomocniczego (AF), flaga zero (ZF), flaga znaku (SF), pułapka flaga (TF), flaga przerwania (IF), flaga kierunku (DF) i flaga przepełnienia (OF). Nazywany również słowem statusowym, układ rejestru flag jest następujący:

Fragment 15-12 11 10 9 8 7 6 5 4 3 2 1 0
Flaga   Z DF JEŚLI TF SF ZF   AF   PF   CF

Segmentacja

Istnieją również cztery 16-bitowe rejestry segmentowe (patrz rysunek), które umożliwiają procesorowi 8086 dostęp do jednego megabajta pamięci w nietypowy sposób. Zamiast łączyć rejestr segmentowy z rejestrem adresowym, jak w większości procesorów, których przestrzeń adresowa przekracza rozmiar rejestru, 8086 przesuwa 16-bitowy segment tylko o cztery bity przed dodaniem go do 16-bitowego offsetu (16×segment + offset ), tworząc w ten sposób 20-bitowy zewnętrzny (lub efektywny lub fizyczny) adres z pary 32-bitowy segment:przesunięcie. W rezultacie do każdego adresu zewnętrznego można się odnieść przez 2 12 = 4096 różnych par segment:przesunięcie.

  0110 1000 1000 0111  0000 Segment , 16 bitów, przesunięte o 4 bity w lewo (lub pomnożone przez 0x10)
+      0011 0100 1010 1001 Przesunięcie , 16 bitów
                          
  0110 1011 1101 0001 1001 Adres , 20 bitów

Chociaż przez wielu programistów uważany za skomplikowany i kłopotliwy, ten schemat ma również zalety; mały program (mniej niż 64 KB) można załadować, zaczynając od stałego przesunięcia (takiego jak 0000) we własnym segmencie, unikając konieczności relokacji , z maksymalnie 15 bajtami marnotrawstwa wyrównania.

Kompilatory dla rodziny 8086 zwykle obsługują dwa typy wskaźników , bliski i daleki . Bliskie wskaźniki to 16-bitowe przesunięcia niejawnie związane z kodem programu lub segmentem danych i dlatego mogą być używane tylko w częściach programu wystarczająco małych, aby zmieściły się w jednym segmencie. Dalekie wskaźniki to 32-bitowe pary segment:przesunięcie odpowiadające 20-bitowym adresom zewnętrznym. Niektóre kompilatory obsługują również duże wskaźniki, które są jak dalekie wskaźniki, z wyjątkiem tego, że arytmetyka wskaźnika na dużym wskaźniku traktuje go jako liniowy wskaźnik 20-bitowy, podczas gdy arytmetyka wskaźnika na dalekim wskaźniku zawija się w 16-bitowym przesunięciu bez dotykania części segmentu adresu.

Aby uniknąć konieczności określania blisko i daleko na wielu wskaźnikach, strukturach danych i funkcjach, kompilatory obsługują również „modele pamięci”, które określają domyślne rozmiary wskaźników. Tego malutkiego (max 64k), małe (max 128k), kompaktowe (dane> 64K), średni (code> 64K), duże (kod, dane> 64K) i ogromne (indywidualne tablice> 64K) modele obejmują praktyczne kombinacje pobliżu , daleko i ogromne wskaźniki do kodu i danych. Te maleńkie modelu oznacza, że kod i dane są udostępniane w jednym segmencie, podobnie jak w większości opartych na procesorach 8-bitowych i mogą być wykorzystane do budowy .com plików na przykład. Prekompilowane biblioteki często występują w kilku wersjach skompilowanych dla różnych modeli pamięci.

Według Morse i in. projektanci faktycznie rozważali użycie 8-bitowego przesunięcia (zamiast 4-bitowego), aby stworzyć 16 MB fizycznej przestrzeni adresowej. Ponieważ jednak zmusiłoby to do rozpoczęcia segmentów w granicach 256 bajtów, a 1 MB był uważany za bardzo duży dla mikroprocesora około 1976 r., pomysł został odrzucony. Ponadto w niedrogim 40-stykowym pakiecie nie było wystarczającej liczby pinów na dodatkowe cztery piny magistrali adresowej.

W zasadzie przestrzeń adresowa serii x86 mogła zostać rozszerzona w późniejszych procesorach poprzez zwiększenie wartości przesunięcia, o ile aplikacje uzyskiwały swoje segmenty z systemu operacyjnego i nie przyjmowały założeń dotyczących równoważności różnych par segment:przesunięcie. W praktyce użycie „ogromnych” wskaźników i podobnych mechanizmów było szeroko rozpowszechnione, a płaskie 32-bitowe adresowanie stało się możliwe dzięki 32-bitowym rejestrom przesunięcia w 80386 ostatecznie rozszerzyło ograniczony zakres adresowania w bardziej ogólny sposób (patrz poniżej).

Intel mógł zdecydować się na zaimplementowanie pamięci w słowach 16-bitowych (co wyeliminowałoby sygnał BHE (Bus High Enable) wraz z wieloma opisanymi już zawiłościami magistrali adresowej). Oznaczałoby to, że wszystkie kody obiektów instrukcji i dane musiałyby być dostępne w jednostkach 16-bitowych. Użytkownicy 8080 już dawno zdali sobie sprawę, z perspektywy czasu, że procesor bardzo efektywnie wykorzystuje swoją pamięć. Posiadając dużą liczbę 8-bitowych kodów obiektowych, 8080 generuje kod obiektowy tak zwarty, jak niektóre z najpotężniejszych minikomputerów na rynku w tamtym czasie.

Jeśli 8086 ma zachować 8-bitowe kody obiektowe, a tym samym wydajne wykorzystanie pamięci 8080, to nie może zagwarantować, że (16-bitowe) kody operacyjne i dane będą znajdować się na granicy adresu parzysty-nieparzysty. Pierwszy 8-bitowy kod operacyjny przesunie następną 8-bitową instrukcję do bajtu nieparzystego lub 16-bitową do granicy bajtów nieparzystych-parzystych. Poprzez implementację sygnału BHE i dodatkową logikę, 8086 pozwala na istnienie instrukcji jako 1-bajtowych, 3-bajtowych lub dowolnych innych nieparzystych kodów obiektowych.

Mówiąc najprościej: jest to kompromis. Jeśli adresowanie pamięci jest uproszczone tak, że dostęp do pamięci jest możliwy tylko w jednostkach 16-bitowych, pamięć będzie wykorzystywana mniej wydajnie. Intel zdecydował się na bardziej skomplikowaną logikę, ale bardziej efektywne wykorzystanie pamięci. Było to w czasach, gdy rozmiar pamięci był znacznie mniejszy i droższy niż ten, do którego użytkownicy są przyzwyczajeni dzisiaj.

Przenoszenie starszego oprogramowania

Małe programy mogą ignorować segmentację i po prostu używać zwykłego 16-bitowego adresowania. Pozwala to na dość łatwe przeniesienie oprogramowania 8-bitowego na 8086. Autorzy większości implementacji DOS skorzystali z tego, zapewniając interfejs programowania aplikacji bardzo podobny do CP/M, a także zawierając prosty format pliku wykonywalnego .com , identyczny do CP/M. Było to ważne, gdy 8086 i MS-DOS były nowe, ponieważ pozwalało na szybkie udostępnienie wielu istniejących aplikacji CP/M (i innych), co znacznie ułatwiało akceptację nowej platformy.

Przykładowy kod

Poniższy kod źródłowy asemblera 8086/8088 dotyczy podprogramu o nazwie, _memcpyktóry kopiuje blok bajtów danych o określonym rozmiarze z jednego miejsca do drugiego. Blok danych jest kopiowany po jednym bajcie na raz, a logika przenoszenia i zapętlania danych wykorzystuje operacje 16-bitowe.

 
 
 
 
 
 
 
 
 
 
 
0000:1000
 
0000:1000
0000:1000 55
0000:1001 89 E5
0000:1003 06
0000:1004 8B 4E 06
0000:1007 E3 11
0000:1009 8B 76 04
0000:100C 8B 7E 02
0000:100F 1E
0000:1010 07
 
0000:1011 8A 04
0000:1013 88 05
0000:1015 46
0000:1016 47
0000:1017 49
0000:1018 75 F7
 
0000:101A 07
0000:101B 5D
0000:101C 29 C0
0000:101E C3
0000:101F
; _memcpy(dst, src, len)
; Copy a block of memory from one location to another.
;
; Entry stack parameters
;      [BP+6] = len, Number of bytes to copy
;      [BP+4] = src, Address of source data block
;      [BP+2] = dst, Address of target data block
;
; Return registers
;      AX = Zero

            org     1000h       ; Start at 0000:1000h

_memcpy     proc
            push    bp          ; Set up the call frame
            mov     bp,sp
            push    es          ; Save ES
            mov     cx,[bp+6]   ; Set CX = len
            jcxz    done        ; If len = 0, return
            mov     si,[bp+4]   ; Set SI = src
            mov     di,[bp+2]   ; Set DI = dst
            push    ds          ; Set ES = DS
            pop     es

loop        mov     al,[si]     ; Load AL from [src]
            mov     [di],al     ; Store AL to [dst]
            inc     si          ; Increment src
            inc     di          ; Increment dst
            dec     cx          ; Decrement len
            jnz     loop        ; Repeat the loop

done        pop     es          ; Restore ES
            pop     bp          ; Restore previous call frame
            sub     ax,ax       ; Set AX = 0
            ret                 ; Return
            end proc

Powyższy kod wykorzystuje rejestr BP (wskaźnik bazowy) do ustanowienia ramki wywołania , obszaru na stosie, który zawiera wszystkie parametry i zmienne lokalne do wykonania podprogramu. Ten rodzaj konwencji wywoływania obsługuje kod reentrant i rekurencyjny i jest używany przez większość języków podobnych do ALGOL od późnych lat pięćdziesiątych.

Powyższa procedura jest dość niewygodnym sposobem kopiowania bloków danych. 8086 zapewnia dedykowane instrukcje do kopiowania ciągów bajtów. Te instrukcje zakładają, że dane źródłowe są przechowywane w DS:SI, dane docelowe są przechowywane w ES:DI, a liczba elementów do skopiowania jest przechowywana w CX. Powyższa procedura wymaga, aby blok źródłowy i docelowy znajdowały się w tym samym segmencie, dlatego DS jest kopiowany do ES. Sekcja pętli powyższego może być zastąpiona przez:

0000:1011 FC
0000:1012 F3
0000:1013 A4
            cld                  ; Copy towards higher addresses
loop        rep                  ; Repeat until CX = 0
            movsb                ; Move the data block

To kopiuje blok danych po jednym bajcie na raz. REPInstrukcja powoduje następujące MOVSBpowtarzać aż CX jest zero, automatycznie zwiększając SI i DI oraz zmniejszanie CX jak to powtarza. Alternatywnie MOVSWinstrukcja może być użyta do jednoczesnego kopiowania 16-bitowych słów (podwójnych bajtów) (w takim przypadku CX zlicza liczbę skopiowanych słów zamiast liczby bajtów). Większość asemblerów będzie poprawnie rozpoznawać REPinstrukcję, jeśli jest używana jako przedrostek w linii MOVSB, tak jak w REP MOVSB.

Ta procedura będzie działać poprawnie, jeśli zostanie przerwana, ponieważ licznik programu będzie nadal wskazywał REPinstrukcję, aż do zakończenia kopiowania bloku. Kopiowanie będzie zatem kontynuowane od miejsca, w którym zostało przerwane, gdy procedura obsługi przerwań zwróci kontrolę.

Wydajność

Uproszczony schemat blokowy na Intel 8088 (wariant 8086); 1=rejestry główne i indeksowe; 2=rejestry segmentowe i IP; 3=adresowanie; 4=wewnętrzna magistrala adresowa; 5=kolejka instrukcji; 6=jednostka sterująca (bardzo uproszczona!); 7=interfejs magistrali; 8=wewnętrzna magistrala danych; 9=ALU; 10/11/12=adres zewnętrzny/dane/szyna sterująca.

Chociaż częściowo przesłonięte przez inne opcje projektowe w tym konkretnym układzie, multipleksowane magistrale adresowe i danych nieco ograniczają wydajność; transfery 16-bitowych lub 8-bitowych ilości są wykonywane w czterotaktowym cyklu dostępu do pamięci, który jest szybszy na 16-bitowych, chociaż wolniejszy na 8-bitowych ilościach, w porównaniu z wieloma współczesnymi 8-bitowymi procesorami. Ponieważ instrukcje różnią się od jednego do sześciu bajtów, pobieranie i wykonywanie są współbieżne i rozdzielane na oddzielne jednostki (podobnie jak we współczesnych procesorach x86): Jednostka interfejsu magistrali dostarcza strumień instrukcji do jednostki wykonawczej przez 6-bajtową kolejkę wstępnego pobierania ( forma luźno powiązanego potokowania ), przyspieszając operacje na rejestrach i natychmiastowych , podczas gdy operacje na pamięci stały się wolniejsze (cztery lata później ten problem z wydajnością został rozwiązany w 80186 i 80286 ). Jednak pełna (zamiast częściowej) 16-bitowa architektura z pełną szerokością ALU oznaczała, że ​​16-bitowe instrukcje arytmetyczne mogą być teraz wykonywane w jednym cyklu ALU (zamiast dwóch, przez wewnętrzne przeniesienie, jak w 8080 i 8085). , znacznie przyspieszając takie instrukcje. W połączeniu z ortogonalizacją operacji w porównaniu z typami argumentów i trybami adresowania , a także innymi ulepszeniami, spowodowało to znaczny wzrost wydajności w porównaniu z 8080 lub 8085, pomimo przypadków, w których starsze układy mogą być szybsze (patrz poniżej).

Czasy wykonania typowych instrukcji (w cyklach zegara)
instrukcja zarejestruj się-zarejestruj zarejestruj się natychmiast rejestr-pamięć rejestr pamięci pamięć-natychmiastowa
ruch 2 4 8+EA 9+EA 10+EA
ALU 3 4 9+EA, 16+EA, 17+EA
skok rejestr ≥ 11 ; etykieta ≥ 15 ; stan, etykieta ≥ 16
mnożenie liczb całkowitych 70~160 (w zależności od danych operandu oraz rozmiaru), w tym dowolny EA
dzielenie liczb całkowitych 80~190 (w zależności od danych operandu i rozmiaru), w tym dowolny EA
  • EA = czas na obliczenie efektywnego adresu, w zakresie od 5 do 12 cykli.
  • Najlepszym przypadkiem są czasy, w zależności od stanu wstępnego pobierania, wyrównania instrukcji i innych czynników.

Jak widać z tych tabel, operacje na rejestrach i natychmiastowych były szybkie (od 2 do 4 cykli), podczas gdy instrukcje operandów pamięciowych i skoki były dość wolne; skoki zajmowały więcej cykli niż na prostych 8080 i 8085 , a 8088 (używany w IBM PC) był dodatkowo utrudniony przez węższą magistralę. Powody, dla których większość instrukcji związanych z pamięcią była powolna, były trzy:

  • Luźno sprzężone jednostki pobierania i wykonywania są wydajne przy pobieraniu instrukcji z wyprzedzeniem, ale nie przy skokach i losowym dostępie do danych (bez specjalnych środków).
  • Nie zapewniono dedykowanego sumatora obliczania adresów; procedury mikrokodu musiały do ​​tego używać głównej jednostki ALU (chociaż istniał dedykowany segment + sumator przesunięcia ).
  • Magistrale adresowe i danych były multipleksowane , wymuszając nieco dłuższy (33~50%) cykl magistrali niż w typowych współczesnych procesorach 8-bitowych.

Jednak wydajność dostępu do pamięci została drastycznie zwiększona dzięki następnej generacji procesorów Intel z rodziny 8086. Zarówno 80186, jak i 80286 miały dedykowany sprzęt do obliczania adresów, oszczędzając wiele cykli, a 80286 miał również oddzielne (nie multipleksowane) magistrale adresowe i danych.

zmiennoprzecinkowy

8086/8088 może być podłączony do koprocesora matematycznego, aby dodać wydajność zmiennoprzecinkową opartą na sprzęcie/mikrokodzie . Intel 8087 był standard koprocesor matematyczny w 8086 i 8088, działająca na liczbach 80-bitowych. Producenci tacy jak Cyrix (zgodny z 8087) i Weitek ( niezgodny z 8087) w końcu wymyślili wysokowydajne koprocesory zmiennoprzecinkowe, które konkurowały z 8087.

Wersje chipowe

Częstotliwość zegara była pierwotnie ograniczona do 5 MHz, ale ostatnie wersje w HMOS były określone dla 10 MHz. Wersje HMOS-III i CMOS były produkowane przez długi czas (przynajmniej w latach 90.) dla systemów wbudowanych , chociaż jego następca, 80186 / 80188 (który zawiera niektóre urządzenia peryferyjne na chipie), był bardziej popularny do zastosowań wbudowanych .

80C86, wersja CMOS 8086, była używana w GRiDPad , Toshiba T1200 , HP 110 , a wreszcie w Lunar Prospector z lat 1998-1999 .

Jeśli chodzi o opakowanie, Intel 8086 był dostępny zarówno w ceramicznych, jak i plastikowych opakowaniach DIP.

Ceramiczny wariant D8086
Plastikowy wariant P8086

Lista Intel 8086

Numer modelu Częstotliwość Technologia Zakres temperatury Data wydania Cena (USD)
8086 5 MHz HMOS 0 °C do 70 °C 8 czerwca 1978 86,65$
8086-1 10 MHz HMOS II Handlowy
8086-2 8 MHz HMOS II Handlowy styczeń/luty 1980 200 zł
8086-4 4 MHz HMOS Handlowy 72,50 zł
I8086 5 MHz HMOS Przemysłowe -40 °C do +85 °C maj/czerwiec 1980 173,25$
M8086 5 MHz HMOS Klasa wojskowa -55°C do +125 °C
80C86 CMOS

Pochodne i klony

Kompatybilne i w wielu przypadkach ulepszone wersje zostały wyprodukowane przez Fujitsu , Harris / Intersil , OKI , Siemens , Texas Instruments , NEC , Mitsubishi i AMD . Na przykład para NEC V20 i NEC V30 była kompatybilna sprzętowo z 8088 i 8086, mimo że NEC stworzył oryginalne klony Intel odpowiednio μPD8088D i μPD8086D, ale zawierał zestaw instrukcji 80186 wraz z niektórymi (ale nie wszystkimi) 80186 Ulepszenia szybkości, zapewniające możliwość aktualizacji zarówno zestawu instrukcji, jak i szybkości przetwarzania, bez konieczności modyfikowania przez producentów swoich projektów. Takie stosunkowo proste i energooszczędne procesory kompatybilne z 8086 w CMOS są nadal używane w systemach wbudowanych.

Przemysł elektroniczny Związku Radzieckiego był w stanie odtworzyć 8086 zarówno poprzez szpiegostwo przemysłowe, jak i inżynierię odwrotną . Powstały układ, K1810VM86 , był binarny i zgodny z pinami z 8086.

i8086 i i8088 były odpowiednio rdzeniami sowieckich komputerów stacjonarnych EC1831 i EC1832 kompatybilnych z komputerami PC . (EC1831 to oznaczenie WE IZOT 1036C, a EC1832 to oznaczenie WE IZOT 1037C, opracowane i wyprodukowane w Bułgarii. WE oznacza Единая Система.) Jednak komputer EC1831 (IZOT 1036C) miał znaczące różnice sprzętowe od prototypu IBM PC . EC1831 był pierwszym komputerem kompatybilnym z PC z dynamicznym wymiarowaniem magistrali (patent USA nr 4,831,514). Później niektóre z zasad EC1831 zostały przyjęte w PS/2 (patent USA nr 5548786) i niektórych innych maszynach (zgłoszenie patentowe Wielkiej Brytanii, publikacja nr GB-A-2211325, opublikowana 28 czerwca 1989).

Radziecki klon K1810VM86
OKI M80C86A QFP-56
NEC μPD8086D-2 (8 MHz) z roku 1984, tydzień 19 JAPAN (klon Intel D8086-2)

Obsługa chipów

  • Intel 8237 : kontroler bezpośredniego dostępu do pamięci (DMA)
  • Intel 8251 : uniwersalny synchroniczny/asynchroniczny odbiornik/nadajnik przy 19,2 kbit/s
  • Intel 8253 : programowalny zegar interwałowy, 3x 16-bit, maks. 10 MHz
  • Intel 8255 : programowalny interfejs peryferyjny, 3x 8-bitowe piny I/O używane do podłączenia drukarki itp.
  • Intel 8259 : programowalny kontroler przerwań
  • Intel 8279 : kontroler klawiatury/wyświetlacza, skanuje matrycę klawiatury i matrycę wyświetlacza jak 7-seg
  • Intel 8282 / 8283 : 8-bitowy zatrzask
  • Intel 8284 : generator zegara
  • Intel 8286 / 8287 : dwukierunkowy 8-bitowy sterownik. W 1980 roku obie wersje Intel I8286/I8287 (klasa przemysłowa) były dostępne za 16,25 USD w ilościach po 100 sztuk.
  • Intel 8288 : kontroler magistrali
  • Intel 8289 : arbiter magistrali
  • NEC µPD765 lub Intel 8272A : kontroler stacji dyskietek

Mikrokomputery korzystające z 8086

  • Intel Multibus -Kompatybilny jednopłytowe komputer ISBC 86/12 została ogłoszona w 1978 roku.
  • Xerox notatnik był jednym z pierwszych przenośnych komputerów projekty w 1978 i 8086 wykorzystano trzy żetony (jak CPU, procesora graficznego i procesora I / O), ale nigdy nie wszedł do produkcji komercyjnej.
  • Firma Seattle Computer Products wysłała systemy 8086 oparte na magistrali S-100 (SCP200B) już w listopadzie 1979 roku.
  • Norweski Mycron 2000, wprowadzony w 1980 roku.
  • Jeden z najbardziej wpływowych mikrokomputerów, IBM PC , wykorzystywał Intel 8088 , wersję 8086 z 8-bitową magistralą danych (jak wspomniano powyżej).
  • Pierwszy Compaq Deskpro wykorzystywał 8086 działający z częstotliwością 7,16 MHz, ale był kompatybilny z dodatkowymi kartami zaprojektowanymi dla 4,77 MHz IBM PC XT i mógł przełączać procesor na niższą prędkość (co również przełączało się w buforze magistrali pamięci, aby symulować wolniejszy dostęp 8088), aby uniknąć problemów z czasem oprogramowania.
  • 8 MHz 8086-2 był używany w AT&T 6300 PC (zbudowanym przez Olivetti i znanym na całym świecie pod kilkoma markami i numerami modeli), komputerem stacjonarnym kompatybilnym z IBM PC. M24 / PC 6300 ma 8-bitowe gniazda rozszerzeń zgodne z IBM PC/XT, ale niektóre z nich mają zastrzeżone rozszerzenie zapewniające pełną 16-bitową magistralę danych procesora 8086 (podobną koncepcję do 16-bitowych gniazd IBM PC AT , ale różniący się szczegółami konstrukcyjnymi i fizycznie niekompatybilnymi) oraz wszystkie urządzenia peryferyjne systemu, w tym pokładowy system wideo, również korzystają z 16-bitowych transferów danych. Późniejszy Olivetti M24SP zawierał 8086-2 działający z pełnym maksymalnym 10 MHz.
  • Modele IBM PS/2 25 i 30 zostały zbudowane z 8 MHz 8086.
  • Amstrad PC1512 , PC1640 , PC2086, PC3086 i PC5086 używały procesorów 8086 przy 8 MHz.
  • NEC PC-9801 .
  • W Tandy 1000 SL serii RL i maszyn używanych 9,47 MHz 8086 procesorów.
  • IBM Displaywriter obrabiarka słowo i Wang Profesjonalne komputerowe wyprodukowane przez Wang Laboratories , stosowany również 8086.
  • NASA używała oryginalnych procesorów 8086 w sprzęcie do naziemnej konserwacji promu kosmicznego Discovery do końca programu promu kosmicznego w 2011 roku. Ta decyzja została podjęta, aby zapobiec regresji oprogramowania, która może wynikać z aktualizacji lub przejścia na niedoskonałe klony.
  • Monitory procesu i promieniowania obszaru KAMAN

Zobacz też

Uwagi

Bibliografia

Zewnętrzne linki