Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Architektura systemów komputerowych jesień 2013 Wykład 7 Mikroprocesor Intel 8086 oraz koprocesor matematyczny 8087 dr inż. Wojciech Bieniecki Instytut.

Podobne prezentacje


Prezentacja na temat: "Architektura systemów komputerowych jesień 2013 Wykład 7 Mikroprocesor Intel 8086 oraz koprocesor matematyczny 8087 dr inż. Wojciech Bieniecki Instytut."— Zapis prezentacji:

1 Architektura systemów komputerowych jesień 2013 Wykład 7 Mikroprocesor Intel 8086 oraz koprocesor matematyczny 8087 dr inż. Wojciech Bieniecki Instytut Nauk Ekonomicznych i Informatyki

2 Geneza procesora jest 16-bitowym mikroprocesorem wprowadzonym na rynek w 1978 roku. Mikroprocesor został zaprojektowany przez firmę Intel jako następca 8-bitowego 8080/8085. Jego zastosowanie (w szczególności jego odmiany z 8-bitowym interfejsem ) w pierwszych ogólnodostępnych komputerach osobistych (IBM PC), doprowadziło do jego wielkiej popularyzacji i dalszego rozwoju.

3 Parametry procesora 3 architektura CISC; przestrzeń adresowa pamięci - 1MB w trybie rzeczywistym; 16-bitowa magistrala danych; 20-bitowa magistrala adresowa; częstotliwość sygnału zegarowego do 10MHz; 91 podstawowych typów rozkazów; przestrzeń adresowa urządzeń wejścia/wyjścia - 64kB; możliwość wykonywania operacji bitowych, bajtowych, o długości słowa i łańcuchowych; 7 trybów adresowania argumentów w pamięci; dwa tryby pracy – minimalny i maksymalny; 16-bitowa jednostka arytmetyczno logiczna (ALU); 16-bitowe rejestry ogólnego przeznaczenia; 6-bajtowa kolejka rozkazów.

4 Nowe rozwiązania względem procesorów 8-bitowych 4 Rozszerzenie możliwości adresowanie operandów W mikroprocesorach 8-bitowych stosowano 4 tryby adresowania: rejestrowy, natychmiastowy, pośredni i bezpośredni. Segmentacja obszaru pamięci Mechanizm wprowadzono dla rozdzielenia obszarów przeznaczonych dla programu, danych i stosu. W mikroprocesorze 8086 dodano nowe rejestry pozwalające wprowadzić tryby adresowania: indeksowy, bazowy i indeksowo-bazowy Mikroprocesor zawiera cztery rejestry segmentowe, w których przechowywane są adresy początków segmentów. Taki sposób adresowania ułatwia relokację programów i danych oraz umożliwia łatwe stworzenie prostego mechanizmu ochrony pamięci.

5 Nowe rozwiązania względem procesorów 8-bitowych 5 Mechanizmy przyspieszenia pracy Dwie jednostki procesora: wykonawcza (dekodowanie i wykonanie operacji) i interfejsowa (współpraca z pamięcią) Mechanizmy dla pracy wieloprocesorowej Dwa tryby pracy. W trybie minimalnym steruje on całym systemem mikrokomputerowym pełniąc rolę kontrolera magistrali. Dzięki takiej architekturze 8086 jest w stanie w jednocześnie wykonywać operację jednego rozkazu oraz pobierać kod operacji następnego (przetwarzanie potokowe). 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)

6 Budowa procesora 6 Jednostka wykonawcza (Execution Unit) Jednostka interfejsowa Bus Interface Unit 1 1. Blok rejestrów ogólnego przeznaczenia 2 2. ALU z rejestrem flag 3. Blok rejestrów segmentowych wraz z licznikiem rozkazów. 4. Generator 20- bit. adresu fiz. 5. Kolejka rozkazów 6. Kontroler interfejsu 7. Układ kontrolny

7 Jednostka wykonawcza 7 W jej skład wchodzi : 16-bitowa jednostka arytmetyczno-logiczna ALU Układ sterowania wraz z rejestrem rozkazów Cztery 16 bitowe rejestry ogólnego przeznaczenia (możliwe korzystanie z rejestrów 8-bitowych) Czery 16-bitowe rejestry adresowe 16 bitowy rejestr flag ALU dołączona jest do magistrali wewnętrznej mikroprocesora. Układ wykonawczy nie ma bezpośredniego połączenia z magistralą zewnętrzną Z magistrali tej pobierane są argumenty operacji, a także wysyłany jest na nią wynik operacji.

8 Rejestr znaczników (flag) 8 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.

9 Rejestr flag 9 SF (sign flag) - znacznik znaku - równy najbardziej znaczącemu bitowi wyniku 0 - wynik operacji dodatni 1 - wynik operacji ujemny ZF (zero flag) - znacznik zera 0 - wynik operacji różny od zera 1 - wynik operacji równy zeru PF (parity flag) - znacznik parzystości - ustawiany w zależności od liczby jedynek w najmniej znaczących 8 bitach wyniku 0 liczba jedynek w wyniku operacji nieparzysta 1 liczba jedynek w wyniku operacji parzysta AF (auxiliary carry flag) - znacznik przeniesienia połówkowego (pomocniczego) 0 - brak przeniesienia pomiędzy trzecim i czwartym bitem bajta (BCD) 1 - występuje przeniesienie CF (carry flag) - znacznik przeniesienia 0 - wynik operacji arytmetycznej nie powoduje powstania przeniesienia z najbardziej znaczącego bitu 1 - wynik takie przeniesienie powoduje

10 Rejestr flag 10 OF (overflow flag) - znacznik nadmiaru 0 - suma modulo 2 przeniesień z najbardziej znaczącej pozycji i pozycji przedostatniej jest równa suma modulo 2 przeniesień z najbardziej znaczącej pozycji i pozycji przedostatniej jest równa 1 (przekroczenie zakresu w kodzie U2) IF (interrupt flag) - znacznik przerwań 0 - brak zezwolenia na przyjmowanie przerwań z wejścia INT 1 - zezwolenie na przyjmowanie przerwań DF (direction flag) - znacznik kierunku, wskazuje, czy zawartości rejestrów SI i DI mają być zwiększane lub zmniejszane o jeden w czasie wykonywania operacji łańcuchowych 0 - rejestry są zwiększane 1 - rejestry są zmniejszane TF (trap flag) - znacznik pułapki umożliwiającej pracę krokową 0 - praca krokowa wyłączona 1 - praca krokowa włączona, mikroprocesor po wykonaniu każdego rozkazu wykona skok do odpowiedniego podprogramu obsługi przerwania

11 Rejestry arytmetyczne 11 Są to cztery 16-bitowe rejestry ogólnego przeznaczenia 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 AX – Akumulator współpracuje z ALU. 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. BX – Baza Rejestr ten może być używany do adresowania argumentu, znajdującego się w pamięci, stanowiąc bazę do obliczania adresu. CX – Licznik (Counter) jest używany w operacjach łańcuchowych oraz pętlach. Po każdej iteracji jego zawartość jest automatycznie dekrementowana. W rozkazach przesunięć rejestr CL wykorzystywany jest jako licznik bitów. DX – Dane wykorzystywany w niektórych operacjach arytmetycznych do przechowywania części argumentu lub wyniku operacji (mnożenie i dzielenie 16- bitowe). Zawiera on także adres urządzenia w operacjach wejścia/wyjścia.

12 Rejestry wskaźnikowe i indeksowe 12 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. SP – wskaźnik stosu (Stack Pointer) Wskazuje adres ostatnio zapisanego słowa na stosie. Jego zawartość jest automatycznie inkrementowana lub dekrementowana w zależności od wykonywanej operacji (POP, PUSH). BP – wskaźnik bazy (Base Pointer) Pełni on funkcję wskaźnika ogólnego przeznaczenia. Wykorzystywany jest do adresowania bazowego danych w segmencie stosu. SI – rejestr indeksowy źródła (Source Index) Uniwersalny rejestr indeksowy. Jest wykorzystywany w czasie dwuargumentowych operacji łańcuchowych do przetrzymywania adresu źródła danych. Po każdej kolejnej iteracji jego zawartość jest inkrementowana lub dekrementowana, zależnie od ustawienia flagi kierunku. DI – rejestr indeksowy przeznaczenia (Destination Index) Uniwersalny rejestr indeksowy. Jest wykorzystywany w czasie dwuargumentowych operacji łańcuchowych do przetrzymywania adresu przeznaczenia danych.Po każdej kolejnej iteracji jego zawartość jest inkrementowana lub dekrementowana, zależnie od ustawienia flagi kierunku.

13 Rejestry segmentowe 13 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. CS – rejestr segmentowy programu (Code Segment register): początek aktualnie używanego segmentu programu. Wartość ta wykorzystywana jest do obliczania adresu fizycznego kolejnego rozkazu do pobrania z pamięci. DS – rejestr segmentowy danych (Data Segment register): początek aktualnie używanego segmentu danych. Wartość ta wykorzystywana jest do obliczania adresu fizycznego argumentu lub wyniku aktualnie wykonywanego rozkazu. Wyjątek stanowią rozkazy łańcuchowe, w których zawartość tego rejestru służy jedynie do obliczania adresu źródła danych. SS – rejestr segmentowy stosu (Stack Segment register): początek aktualnie używanego segmentu stosu. Wartość ta wykorzystywana jest do obliczania adresu fizycznego komórki pamięci, na którą wskazuje wskaźnik stosu (rejestr SP). ES – rejestr segmentowy dodatkowy (Extra Segment register): początek aktualnie używanego dodatkowego segmentu danych. Wartość ta wykorzystywana jest do obliczania adresu fizycznego przeznaczenia dla operacji łańcuchowych (np. rozkazu przenoszenia bloku danych).

14 Rejestry procesora

15 Rodzaje rozkazów wykonywanych przez procesor 15 przesłania typu rejestr-rejestr, stos-rejestr, rejestr-stos, rejestr-we/wy, we/wy- rejestr operacje arytmetyczne: dodawanie, odejmowanie, porównanie, mnożenie i dzielenie dwójkowych liczb całkowitych bez znaku (w kodzie NB) lub ze znakiem (w kodzie U2), jak również liczb dziesiętnych (w kodzie BCD) operacje logiczne AND, OR, XOR i NOT, oraz różne rodzaje przesunięć logicznych operacje tekstowe (gdy słowa traktowane są jak łańcuchy znakowe): przepisywanie ciągu słów z jednego obszaru do drugiego, wyszukiwanie i porównywanie słów sterowanie stanem mikroprocesora różne rodzaje skoków

16 Pamięć danych, programu, stos 16 Pamięć danych i programu jest 8-bitowa; możliwe jest adresowanie słów wielobajtowych. Stos jest 16-bitowy. Trzy rodzaje pamięci są adresowane za pomocą wspólnej magistrali adresowej. Stos jest to obszar pamięci, do którego wpisujemy dane, bądź są ładowane adresy w wyniku wykorzystania podprogramów lub przerwań. Ze stosu można pobrać najpierw ostatnio wpisaną daną, czyli odwrotnie do kolejności wpisywania.

17 Organizacja pamięci i tworzenie adresu fizycznego bitowa magistrala adresową. (adresowanie do 1MB pamięci operacyjnej) Przestrzeń adresowa podzielona na segmenty o długości 64kB, rozpoczynające się co 16 bajtów (kolejne segmenty pamięci mogą nakładać się na siebie). Adres fizyczny obliczany jest na podstawie dwóch 16-bitowych składników adresu segmentu oraz adresu efektywnego (przesunięcia). Taki sposób adresowania nazywa się adresowaniem segmentowym. 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).

18 Generowanie adresu fizycznego 18 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.

19 Ogólna postać rozkazów asemblera pole_etykiety pole_operacji pole_argumentów pole_komentarza START: MOV AX, DATA ; początek prog. ;wielkość liter nie ma znaczenia

20 Rozkazy przesłania danych 20 MOV reg,reg ;np. MOV AX,BX MOV mem,reg ;np. MOV [1234],AL MOV reg,mem MOV reg,stala ;np. MOV AH,#12h MOV reg,seg ;np. MOV AX,DS MOV mem,seg ;np. MOV [1234],DS MOV seg,reg ;np. MOV DS,AX MOV seg,mem

21 Specjalne rozkazy przesłania 21 Przesłanie bajtu z DS:SI do ES:DI MOVSB Przesłanie słowa z DS:SI do ES:DI MOVSW Umieszczenie zawartości rejestru, wartości stałej lub komórki pamięci na stosie PUSH AX PUSH 09h PUSH [0387h] przesłanie flag na stos PUSHF ładowanie z DS:SI do AL LODSB ładowanie z DS:SI do AX LODSW

22 Specjalne rozkazy przesłania 22 pobranie ze stosu do rejestru lub komórki pamięci pobranie ze stosu znaczników prześlij bajt z AL do ES:DI prześlij słowo z AX do ES:DI pobranie danej z portu do OUT 20h,AL OUT DX,AX POP reg POP mem POPF STOSB STOSW IN acc,stala IN AX,DX wyprowadzenie danej na port

23 Specjalne rozkazy przesłania 23 LEA DX, tablica XLAT ładowanie adresu efektywnego pobranie do AH rejestru znaczników LAHF przesłanie AH do rejestru znaczników SAHF zamiana danych miejscami XCHG reg,reg XCHG reg,mem XCHG mem,reg pobranie elementu z tablicy o adresie DS:BX do AL pobranie adresu z jednoczesnym załadowaniem rejestru DS (ES) i podanego rejestru LDS reg,mem LES reg,mem

24 Rozkazy arytmetyczne 24 dodanie arytmetyczne zawartości dwóch rejestrów lub komórek pamięci 8 lub 16 bitowo ADD reg1,reg2 ADD reg, [mem] ADD [mem], reg ADD reg, stała ADD [mem], stała reg1 = reg1 + reg2 reg = reg + [mem] [mem] = [mem] + reg reg = reg + stala [mem] = [mem] + stala

25 Rozkazy arytmetyczne 25 dodanie arytmetyczne zawartości dwóch rejestrów i znacznika przeniesienia (8 lub 16 bitowo) ADC reg,reg ADC reg,mem ADC mem,reg ADC reg,stała ADC mem,stała odejmowanie arytmetyczne zawartości dwóch rejestrów (8 lub 16 bitowo) lub kombinacji rejestrów i pamięci SUB reg,regSUB reg,mem SUB mem,reg SUB reg,stałaSUB mem,stała

26 Rozkazy arytmetyczne 26 odejmowanie arytmetyczne zawartości dwóch rejestrów lub komórek pamięci z pożyczką (bit Carry) 8 lub 16 bitowo SBB reg,reg SBB reg,mem SBB mem,reg SBB reg,stała SBB mem,stała Inkrementacja lub dekrementacja rejestru lub komórki pamięci INC reg INC mem NEG regNEG mem DEC reg DEC mem zmiana znaku liczby w rejestrze lub komórce pamięci

27 Operacje arytmetyczne 27 korekta wyniku po dodaniu dwóch liczb w spakowanym lub rozpakowanym kodzie BCD (16-bitowych lub 8 bitowych). MOV BX,0207H MOV AX,0405H ADD AX,BX AAA ; poprawka dziesiętna po dodawaniu w rozpakowanym kodzie BCD MOV AX,0405H ADD AX,BX DAA ; poprawka dziesiętna po dodawaniu w spakowanym kodzie BCD

28 Operacje arytmetyczne 28 korekta wyniku po odjęciu dwóch liczb w spakowanym lub rozpakowanym kodzie BCD (16-bitowych lub 8 bitowych). MOV AX,0505H MOV BX,0207H SUB AX,BX AAS MOV AX,0505H SUB AX,BX DAS

29 Operacje arytmetyczne 29 MUL - mnożenie liczb bez znaku. MUL BX ;DX:AX=AX*BX MUL mem ;DX:AX=AX*[mem] IMUL CL ;AX = AL*CL Operacja 8-bitowa pobiera pierwszy argument z AL, wynik przekazywany jest do AX. Operacja 16-bitowa pobiera argument z AX, wynik przekazywany jest do pary rejestrów AX i DX. Mnożenie ze znakiem realizowane jest przez IMUL

30 Operacje arytmetyczne 30 DIV dzielenie liczb bez znaku. DIV reg ; dzielenie przez daną z rejestru DIV mem ; dzielenie przez daną z komórki pamięci IDIV reg ; dzielenie liczb ze znakiem przez rejestr IDIV mem ; dzielenie przez zawartość komórki pamięci Operacja dzielenia przez dzielnik 8-bitowy pobiera pierwszy argument z AX. Operacja dzielenia przez dzielnik 16-bitowy pobiera argument z pary rejestrów AX i DX (DX jest starszym słowem wyniku). Dzielenie ze znakiem realizowane jest przez IDIV

31 Operacje arytmetyczne 31 Konwersje AAD - instrukcja konwersji liczby w rozpakowanym kodzie BCD, znajdującej się w rejestrach AH i AL., na liczbę binarną. AAM instrukcja konwersji liczby binarnej z rejestru AX na rozpakowany kod BCD, do rejestrów AH i AL. MOV AX,52H ; AAM CBW przekształcenie bajtu w AL na słowo w AX z uwzględnieniem znaku liczby MOV AL,80H ; DZIESIĘTNIE JEST TO -128 CBW ; AX=FF80H CWD przekształcenie słowa w AX na podwójne słowo (zapisane w parze rejestrów AX i DX). MOV AX,8000H ; DZIESIĘTNIE JEST TO CWD ; AX=8000H, DX=FFFFH,

32 Operacje logiczne i bitowe 32 OR - suma logiczna lub bitowa argumentów: rejestry, pamięć, stała OR reg,reg OR reg,memOR mem,reg OR reg,stałaOR mem,stała Wynik operacji umieszczany jest w pierwszym argumencie XOR różnica symetryczna argumentów. Składnia jak dla instrukcji OR. Przykład: XOR reg, reg Szybki sposób na wyzerowanie zawartości rejestru (intrukcja XOR jest znacznie szybsza niż MOV)

33 Operacje logiczne i bitowe 33 AND - iloczyn bitowy argumentów: rejestry, pamięć, stała AND reg,regAND reg,memAND mem,reg AND reg,stalaAND mem,stała TEST – iloczyn bitowy argumentów. Instrukcja ta wykonuje logicznąoperację AND na swoich argumentach. Wynik nie jest nigdzie zapamiętywany, ale na jego podstawie ustawiane są flagi. Wynik jest zapamiętywany w pierwszym argumencie TEST reg,regTEST reg,memTEST mem,reg TEST reg,stalaTEST mem,stała NOT - negacja każdego bitu liczby (w rejestrze lub pamięci)

34 Przesunięcia bitowe 34 SHL - przesunięcie logiczne w lewo, najstarszy bit przechodzi do CF, a najmłodszy bit jest uzupełniany zerem SHL mem, 1 ; przesunięcie logiczne komórki pamięci o 1 w lewo SHL reg, 1 ; SHL mem, cl ; od SHL reg, cl ; przesunięcie logiczne komórki rejestru o zawartość CL w lewo SHR - przesunięcie logiczne w prawo, najmłodszy bit przechodzi do CF, a najstarszy bit jest uzupełniany zerem. Składnia i argumenty jak dla SHL. SAL - przesunięcie arytmetyczne w lewo = SHL. Operacja równoważna z mnożeniem przez 2. SAR - przesunięcie arytmetyczne w prawo. Operacja równoważna z dzieleniem przez 2. Najbardziej znaczący bit posiada taka wartość jak przed przesunięciem – znak liczby SAL mem,1 SAL reg,1 SAL mem,CL ; SAL reg,CL SAR mem,1 SAR reg,1 SAR mem,Cl ; od SAR reg,cl

35 Przesunięcia bitowe 35 ROL - obrót w lewo. Składnia jak dla rozkazów SHL, SHR, SAL, SHR, przy czym bit najbardziej znaczący jest przesuwany zarówno do CF jak i do bitu najmłodszego ROR - obrót w prawo. Składnia jak dla rozkazów SHL, SHR, SAL, SHR, przy czym bit najmłodszy jest przesuwany zarówno do CF jak i do bitu najstarszego RCL - obrót w lewo z uwzględnieniem bitu Carry (CF). Najbardziej znaczący bit jest przesuwany do CF, a CF do bitu najmłodszego Składnia jak dla rozkazów SHL, SHR, SAL, SHR. RCR - obrót w prawo z uwzględnieniem bitu Carry. Najmniej znaczący bit jest przesuwany do CF, a CF do bitu najstarszego. Składnia jak dla rozkazów SHL, SHR, SAL, SHR.

36 Rozkazy skoków 36 JE/JZ - skok, gdy równy/równy zero JL/JNGE - skok, gdy mniejszy/nie równy lub nie większy JLE/JNG - skok, gdy mniejszy lub równy/nie większy JB/JNAE - skok, gdy mniejszy/nie większy lub nie równy JBE/JNA - skok, gdy mniejszy lub równy/nie większy JP/JPE - skok, gdy parzysta/nieparzysta JO - skok, gdy nadmiar (przepełnienie) JS - skok, gdy znak ujemny JNE/JNZ - skok, gdy nie równy/nie zero JNL/JGE - skok, gdy nie mniejszy/większy lub równy JNLE/JG - skok, gdy nie mniejszy lub równy/większy JNB/JAE - skok, gdy nie mniejszy/większy lub równy JNBE/JA - skok, gdy nie mniejszy lub równy/większy JNP/JPO - skok, gdy nieparzystość/parzystość nieparzysta JNO - skok, gdy nie ma nadmiaru JNS - skok, gdy znak dodatni JC - skok, gdy CF=1 JNC - skok, gdy CF=0

37 Skoki do podprogramów i pętle 37 CALL nazwa_podprogramu ; skok do podprogramu (wywołanie procedury) JMP - skok bezwarunkowy RET ; powrót z podprogramu (procedury) LOOP - zmniejsza CX o 1 i wykonuje skok, gdy CX > 0. LOOP nazwa_etykiety ; skok do etykiety, gdy CX > 0 LOOPZ/ LOOPE - jak LOOP, tylko może wykonać dodatkowo skok, gdy bit zera (ZF) jest ustawiony. LOOPNZ/LOOPNE - jak LOOP, tylko może wykonać dodatkowo skok, gdy bit zera nie jest ustawiony. JCXZ - rozkaz skoku warunkowego, który jest wykonywany, gdy CX jest równy zero Należy uważać z modyfikacją rejestru CX, gdyż jest on licznikiem pętli. Zasięg skoków jest ograniczony do bajtów. Etykieta, do której wykonywany jest skok powinna się znajdować; na ogół powyżej instrukcji kontroli iteracji.

38 Typowa pętla 38 Należy uważać z modyfikacją rejestru CX, gdyż jest on licznikiem pętli. MOV CX,10 Tu: ; ciąg instrukcji w pętli LOOP Tu Powyższa pętla zostanie wykonana 10 razy. Zasięg skoków jest ograniczony do bajtów. Etykieta, do której wykonywany jest skok powinna się znajdować na ogół powyżej instrukcji kontroli iteracji.

39 Rozkazy łańcuchowe 39 Rozkazy łańcuchowe operują na ciągach danych bajtowych lub słowowych. Ciągi te mogą mieć długość do 128 KB. Po wykonaniu rozkazu łańcuchowego rejestry SI i DI są automatycznie zmieniane, aby przygotować je do zaadresowania następnego elementu łańcuchowego. Gdy flaga DF (direct flag) = 1, zawartość tych rejestrów jest zwiększana, gdy zero jest zmniejszana. Gdy elementy łańcucha są bajtami wartość SI i DI jest zmniejszana o 1, a gdy słowami - o 2. Po zrealizowaniu rozkazu łańcuchowego wartość CX jest zmniejszana o 1. Przed rozkazem łańcuchowym należy wpisać odpowiednią liczbę do CX określającą liczbę powtórzeń rozkazu łańcuchowego. Powtórzenia wykonuje się za pomocą rozkazów REP. Gdy CX=0 to zostaje przerwane powtarzanie rozkazów łańcuchowych i program przechodzi do wykonania kolejnego rozkazu.

40 Rozkazy łańcuchowe 40 REP – powtórz REPE – powtórz dopóki równe REPZ – powtórz dopóki zero REPNZ – powtórz dopóki nie zero REPNE – powtórz dopóki nie równe Przykład: MOV CX,10 ; REP STOSW ; 10 razy z AX do ES:DI MOVSB ; przesłanie bajtu z DS:SI do ES:DI MOVSW ; przesłanie słowa LODSB ; ładowanie z DS:SI do AL LODSW ; ładowanie z DS:SI do AX

41 Rozkazy łańcchowe 41 STOSB ; prześlij bajt z AL do ES:DI STOSW ; prześlij słowo z AX do ES:DI CMPS [seg:]argument, argument; porównanie bajtów CMPSB ; porównanie bajtów z DS:SI i ES:DI CMPSW ; słów SCAS [seg:]argument ; porównanie bajtu lub słowa wskazywanego przez ES:DI z daną, która znajduje się w akumulatorze (AL lub AX) – po odejmowaniu ustawiane są znaczniki SCASB ; porównanie bajtów SCASW ; porównanie słów

42 Rozkazy sterowania procesem 42 CLC ; zerowanie znacznika CF CMC ; zmiana stanu CF na przeciwny STC ; ustawienie znacznika CF CLD ; zerowanie znacznika DF (direct flag) STD ; ustawienie znacznika DF CLI ; zerowanie znacznika IF (interrupt flag) STI ; ustawienie znacznika IF WAIT ; wprowadzenie procesora w stan oczekiwania NOP ; nic nie rób LOCK ; blokada dostępu do magistrali

43 Rodzaje adresowania Natychmiastowe MOV AX,1234H Bezpośrednie MOV AX,BX MOV AH,[1234] Pośrednie – przez rejestr bazowy MOV CX,1234H MOV BX,8 MOV BP,2 MOV [BP],CX ; SS:BP MOV AX,[BX] ; DS:BX

44 Rodzaje adresowania Pośrednie przez rejestr bazowy i przemieszczenie MOV CX,1234H MOV BX,8 MOV BP,2 MOV [BP+1],CX ; SS:BP+1 MOV AX,[BX+2] ; DS:BX+2 Pośrednie przez rejestr indeksowy MOV DI,3 MOV SI,7 MOV AX,[SI] ; DS:SI MOV [DI],BX ; ES:DI

45 Rodzaje adresowania Pośrednie przez rejestr indeksowy i przemieszczenie MOV DI,3 MOV SI,7 MOV AX,[SI+5] ; DS:SI+5 MOV [DI+3],BX ; ES:DI+3 Pośrednie przez rejestr bazowy, indeksowy i przemieszczenie MOV SI,3 MOV BX,2 MOV BP,1 MOV DI,4 MOV DX,45 MOV [BP+DI+4],DX ; SS:BP+DI+4 MOV AX,[BX+SI+1] ; DS:BX+SI+1 MOV CX,[DI+BP+1] ; SS:DI+BP+1

46 Rodzaje adresowania Adresowanie łańcuchowe MOV AX,0H MOV DS,AX MOV SI,0H MOV AX,9000H MOV ES,AX MOV DI,0H MOV CX,1024D CLD ; jeśli DF = 0 to inkrementacja PETLA: MOVSB ; przesłanie z DS:SI do ES:DI LOOP PETLA ;

47 Adresowanie układów wejścia i wyjścia 47 IN acc, stala ; pobranie danej z portu do akumulatora, np. IN AX, 3f8h IN acc, DX OUT port, acc ; wyprowadzenie danej na port np. OUT 20h, AL OUT DX, AX

48 Makroinstrukcje a podprogramy 48 Podprogram to sekwencja rozkazów, która raz umieszczona w pamięci może być wykonywana wielokrotnie w różnych miejscach programu głównego. Dla skrócenia zapisów programów w języku asembler wprowadzono makroinstrukcje, czyli symboliczne oznaczenia odpowiadające nie pojedynczym rozkazom, lecz sekwencjom rozkazów. Podczas tłumaczenia programu, makroinstrukcje są tłumaczone na odpowiadające im ciągi rozkazów. WYSWIETL_ZNAK MACRO MOV AH,02H INT 21H ENDM

49 Makra 49 GOTO_XY MACRO x,y MOV AH,2 MOV DL,X MOV BH,0 MOV DH,Y INT 10H ENDM START: MOV AX,DATA MOV DS,AX GOTO_XY 2,3 MOV DL,0 WYSWIETL_ZNAK KONIEC: MOV AH,4CH INT 10H END START

50 Przykład programu 50.MODEL SMALL.DATA pusta_linia DB 13,10,$ iloraz DB ? reszta DB ? dzielnik DB 10.CODE START: MOV MOV DS,AX XOR AX,AX ; zerowanie AX XOR DX,DX XOR CX,CX MOV BX,12d ; ilość liczb do zsumowania

51 Przykład 51 Petla: INC CX ADD AX,CX PUSH AX DIV dzielnik ; AX / dzielnik-> AL, reszta ->AH MOV [iloraz],AL MOV [reszta],AH CALL ILORAZY CALL RESZTY CALL LINIA POP AX CMP CX,BX JNE Petla JMP Koniec Koniec: MOV AH,4CH INT 21H END START

52 Przykład 52 ;********************PROCEDCURY************** ILORAZY PROC NEAR MOV AH,2 MOV DL,[Iloraz] ADD DL,48 INT 21H RET ILORAZY ENDP ;*********************************** RESZTY PROC NEAR MOV AH,2 MOV DL,[reszta] ADD DL,48 INT 21H RET RESZTY ENDP ;************************** LINIA PROC NEAR MOV AH,09 MOV DX,OFFSET pusta_linia INT 21H RET LINIA ENDP ;**************************

53 Koprocesor matematyczny Intel

54 Budowa koprocesora 54 Procesor 8086 wykonuje działania tylko na liczbach całkowitych Koprocesor (FPU = Floating Point Unit, NPX = Numerical Processor eXtension) służy do wykonywania działań matematycznych na liczbach zmiennoprzecinkowych Do procesorów 8086, 80286, koprocesory były dołączane jako osobne układy: 8087, 80287, Od wersji Intel 486DX koprocesor był już na jednym chipie z procesorem. Tak jest do dzisiaj. Współczesne procesory posiadają bardzo szybki koprocesor, szybszy w obliczeniach od samego procesora. Przykładowo obliczenie 5, * 3, zajmie mniej czasu na koprocesorze niż obliczenie 5 * 3 za pomocą procesora.

55 55 Architektura koprocesora

56 Podstawowe rejestry koprocesora 56 Stos rejestrów (ang. register stack) – zbiór 80-bitowych rejestrów roboczych R7-R0, w którym jest zorganizowany stos ST. Z każdym rejestrem Rx jest związane dwubitowe pole (ang. tag) wskazujące na rodzaj danych: liczba znormalizowana, zero, wartość specjalna (NaN, nieokreślona, Inf, liczba zdenormalizowana), rejestr pusty. Rejestr stanu (znaczników) (ang. status register) – określa aktualny stan FPU i zawiera: znaczniki wystąpienia wyjątku (ang. exception flags), flagę zajętości (ang. busy), numer rejestru R7-0 skojarzony z wierzchołkiem stosu ST(0) (ang. TOP), flagi C3-0 o znaczeniu zależnym od instrukcji, np. jako flagi CF (przeniesienia), ZF (zera), PF (parzystości). Jednostka zmiennoprzecinkowa FPU x87 posiada osiem 80-bitowych rejestrów R7-R0. Rozkazy FPU traktują te rejestry jak stos, gdzie operacja odnosi się zawsze do jego wierzchołka, oznaczanego ST(0).

57 Przykład obliczenia 57

58 Odwrotna notacja polska 58 Reverse Polish Notation, RPN W zapisie tym argumenty działania zapisuje przed symbolem tego działania. Zapis tradycyjnyZapis ONP a+ba b + a+b+ca b + c + c+b+ac b + a + (a+b)*ca b + c * c*(a+b)c a b + * (a+b)*c+da b + c * d + (a+b)*c+d*aa b + c * d a * + (a+b)*c+d*(a+c)a b + c * d a c + * + (a+b)*c+(a+c)*da b + c * a c + d * + (2+5)/7+3/ / 3 5 / +

59 ONP a koprocesor 59 ONP mówi o kolejności działań, jakie należy wykonać na koprocesorze. (a+b)*c+(a+c)*d -> a b + c * a c + d * + fld [a] fld [b] faddp fld [c] fmulp fld [a] fld [c] faddp fld [d] fmulp faddp ;Teraz st0 jest równe wartości całego wyrażenia.

60 ONP - ćwiczenia 60 Zamień na ONP: a/c/d + b/c/d a/(c*d) + b/(c*d) (a+b)/c/d (a+b)/(c*d) Zamień z ONP na zapis tradycyjny : ab*cd*e/- a5/c7/ed-9/*+ a3+b/de+6^- dc-7b*2^/

61 Instrukcje koprocesora 61 Instrukcje przemieszczenia danych: FLD/FILD [mem] - załaduj liczbę rzeczywistą/całkowitą z pamięci. Dla liczby rzeczywistej jest to 32, 64 lub 80 bitów. Dla całkowitej - 16, 32 lub 64 bity. FST [mem32/64/80] - do pamięci idzie liczba ze st(0). FSTP [mem32/64/80] - zapisz st(0) w pamięci i zdejmij je ze stosu. Znaczy to tyle, że st(1) o ile istnieje, staje się st(0) itd. każdy rejestr cofa się o 1. FIST [mem16/32] - ewentualnie obciętą do całkowitej liczbę z st(0) zapisz do pamięci. FISTP [mem16/32/64] - jak wyżej, tylko ze zdjęciem ze stosu. FXCH st(i) - zamień st(0) z st(i).

62 Instrukcje koprocesora 62 Instrukcje ładowania stałych: FLDZ - załaduj zero. st(0) = 0.0 FLD1 - załaduj 1. st(0) = 1.0 FLDPI - załaduj pi. FLDL2T - załaduj log2(10) FLDL2E - załaduj log2(e) FLDLG2 - załaduj log(2)=log10(2) FLDLN2 - załaduj ln(2)

63 Instrukcje koprocesora 63 Działania matematyczne: dodawanie: FADD, składnia identyczna jak w odejmowaniu prostym odejmowanie: FSUB [mem32/64] st := st-[mem] FSUB st(0),st(i) st := st-st(i) FSUB st(i),st(0) st(i) := st(i)-st(0) FSUBP st(i), st(0) st(i) := st(i)-st(0) i zdejmij FSUBP (bez argumentów) = FSUBP st(1),st(0) FISUB [mem16/32int] st := st-[mem] odejmowanie odwrotne FSUBR [mem32/64] st := [mem]-st(0) FSUBR st(0),st(i) st := st(i)-st(0) FSUBR st(i),st(0) st(i) := st(0)-st(i) FSUBRP st(i),st(0) st(i) := st(0)-st(i) i zdejmij FSUBRP (bez argumentów) = FSUBRP st(1),st(0) FISUBR [mem16/32int] st := [mem]-st

64 Instrukcje koprocesora 64 Działania matematyczne: mnożenie: FMUL, składnia identyczna jak w odejmowaniu prostym. dzielenie: FDIV, składnia identyczna jak w odejmowaniu prostym. dzielenie odwrotne: FDIVR, składnia identyczna jak w odejmowaniu odwrotnym. wartość bezwzględna: FABS (bez argumentów) zastępuje st(0) jego wartością bezwzględną. zmiana znaku: FCHS: st(0) := -st(0). pierwiastek kwadratowy: FSQRT: st(0) := SQRT[ st(0) ] reszty z dzielenia: FPREM, FPREM1 st(0) := st(0) mod st(1). zaokrąglanie do liczby całkowitej: FRNDINT: st(0) := (int)st(0).

65 Instrukcje koprocesora 65 Komendy porównania: FPU oprócz rejestrów danych zawiera także rejestr kontrolny (16 bitów) i rejestr stanu (16 bitów). W rejestrze stanu są 4 bity nazwane C0, C1, C2 i C3. To one wskazują wynik ostatniego porównania, a układ ich jest taki sam, jak flag procesora, co pozwala na ich szybkie przeniesienie do flag procesora. Aby odczytać wynik porównania, należy: fcom fstsw ax sahf ; AH -> flagi i używać normalnych komend JE, JB itp

66 Instrukcje koprocesora 66 Komendy porównania: FCOM st(n)/[mem] - porównaj st(0) z st(n) (lub zmienną w pamięci) bez zdejmowania st(0) ze stosu FPU FCOMP st(n)/[mem] - porównaj st(0) z st(n) (lub zmienną w pamięci) i zdejmij st(0) FCOMPP - porównaj st(0) z st(1) i zdejmij oba ze stosu FICOM [mem] - porównaj st(0) ze zmienną całkowitą 16- lub 32-bitową w pamięci FICOMP [mem] - porównaj st(0) ze zmienną całkowitą 16- lub 32-bitową w pamięci, zdejmij st(0) FCOMI st(0), st(n) - porównaj st(0) z st(n) i ustaw flagi procesora, nie tylko FPU FCOMIP st(0), st(n) - porównaj st(0) z st(n) i ustaw flagi procesora, nie tylko FPU, zdejmij st(0)

67 Instrukcje koprocesora 67 Specjalne funkcje matematyczne Instrukcje trygonometryczne: FSIN - st(0) := sinus [st(0)] FCOS - st(0) := kosinus [st(0)] FSINCOS - st(0) := kosinus [st(0)], st(1) := sinus [st(0)] FPTAN - partial tangent = tangens st(0) := tg [st(0)] FPATAN - arcus tangens st(0) := arctg [st(0)] Logarytmiczne, wykładnicze: FYL2X st(1) := st(1)*log2[st(0)] i zdejmij FYL2XPI st(1) := st(1)*log2[ st(0) ] i zdejmij F2XM1 st(0) := 2^[st(0)] - 1

68 Przykłady FPU 68 program wyświetlający częstotliwość zegara dzielna DQ 1234DDh ; a6 e dzielnik DQ 10000h iloraz DT ? mov mov ds, ax mov es, ax ; inicjujemy segmenty finit ; uruchamiamy koprocesor fild qword ptr [dzielna] ; ładujemy dzielną. st(0) = 1234DD fild qword ptr [dzielnik] ; ład. dzielnik. st(0) = 10000h, ; st(1) = 1234DD fdivp ; dzielimy. st(1) := st(1)/st(0) i ; zdejmij. st(0) ~= 18.2 fstp tbyte ptr [iloraz] ; zapisujemy st(0) do pamięci i ; zdejmujemy ze stosu

69 Przykłady FPU 69 czy sinus liczby PI rzeczywiście jest równy 0 (w procesorze)? finit fldpi ; wczytujemy PI fsin ; obliczamy sin(PI) ftst ; porównujemy st(0) z zerem. fstsw ax ; zapisujemy rejestr stanu bezpośrednio w AX. mov ah,9 ; AH=9, flagi niezmienione je jest_zero ; st(0) = 0? Jeśli tak, to wypisz, że jest Niestety nie jest to zero.

70 Przykłady FPU 70 czy pierwiastek z 256 rzeczywiście jest równy 16? finit mov ax,cs mov ds,ax dwa_pie_sze dw 256 szesnascie dw 16 fild word ptr [dwa_pie_sze] ; st(0) = 256 fsqrt ; st(0) = sqrt(256) fild word ptr [szesnascie] ; st(0) = 16, st(1) = sqrt(256) fcompp ; porównaj st(0) i st(1), zdejmij oba ; st: [pusty] fstsw ax sahf mov ah,9 je etykieta ;TUTAJ SKOCZ, JEŚLI WARUNEK JEST SPELNIONY

71 Przykłady FPU 71 czy 400 jest kwadratem liczby całkowitej finit mov ax,cs mov ds,ax czterysta dw 400 fild word ptr [czterysta] ; st: 400 fsqrt ; st: sqrt(400) fld st(0) ; do st(0) wczytaj st(0). ; st: sqrt(400), sqrt(400) frndint ; zaokrąglij do liczby całkowitej. ; st: (int)sqrt(400), sqrt(400) fcompp ; porównaj i zdejmij oba. fstsw ax sahf mov ah,9 je tak400 ; skocz do petli jeżeli tak


Pobierz ppt "Architektura systemów komputerowych jesień 2013 Wykład 7 Mikroprocesor Intel 8086 oraz koprocesor matematyczny 8087 dr inż. Wojciech Bieniecki Instytut."

Podobne prezentacje


Reklamy Google