5. Mikroprocesory 8086 i 8088

Podobne dokumenty
Załącznik do ćwiczenia w środowisku MASM32 wersji 10 Sterowanie przebiegiem wykonania programu

Architektura Systemów Komputerowych, Wydział Informatyki, ZUT

Architektura komputerów. Asembler procesorów rodziny x86

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika

Sterowanie pracą programu

organizacja procesora 8086

Programowanie niskopoziomowe

Sprzęt i architektura komputerów

Programowanie komputera

Architektura systemów komputerowych Laboratorium 14 Symulator SMS32 Implementacja algorytmów

Sprzęt i architektura komputerów

Architektura komputerów

J. Duntemann Zrozumieć Assembler Leo J. Scanlon Assembler 8086/8088/80286 S. Kruk Programowanie w Języku Assembler

UTK Można stwierdzić, że wszystkie działania i operacje zachodzące w systemie są sterowane bądź inicjowane przez mikroprocesor.

Organizacja typowego mikroprocesora

Procesor Intel 8086 model programisty. Arkadiusz Chrobot

Zadanie Zaobserwuj zachowanie procesora i stosu podczas wykonywania następujących programów

Informacje wstępne. Historia Maszyna Turinga

Technika mikroprocesorowa I Studia niestacjonarne rok II Wykład 2

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

Procesor Intel 8086 model programisty. Arkadiusz Chrobot

MOŻLIWOŚCI PROGRAMOWE MIKROPROCESORÓW

Architektura komputerów

Architektura komputerów

Technika mikroprocesorowa I Wykład 2

Podstawy techniki cyfrowej Mikroprocesory. Mgr inż. Bogdan Pietrzak ZSR CKP Świdwin

Struktura i działanie jednostki centralnej

Architektura komputerów. Komputer Procesor Mikroprocesor koncepcja Johna von Neumanna

CPU ROM, RAM. Rejestry procesora. We/Wy. Cezary Bolek Uniwersytet Łódzki Wydział Zarządzania Katedra Informatyki

INSTRUKCJE Instrukcje przeniesienia: Instrukcje konwersji: Arytmetyczne instrukcje:

CPU. Architektura FLAGS Bit: dr Paweł Kowalczyk; DPTNS, KFCS UŁ. SI 16 bit. 16 bit. 16 bit.

Architektura Systemów Komputerowych

Wprowadzenie do Architektury komputerów. Asembler procesorów rodziny x86

Programowanie w asemblerze Architektura procesora

Procesory rodziny x86. Dariusz Chaberski

end start ; ustawienie punktu startu programu i koniec instrukcji w assemblerze.

1. Operacje logiczne A B A OR B

Jerzy Nawrocki, Wprowadzenie do informatyki

Lista instrukcji mikroprocesora Programowanie w assemblerze

Programowanie Niskopoziomowe

Lista instrukcji procesora 8051 część 2 Skoki i wywołania podprogramów, operacje na stosie, operacje bitowe

Logiczny model komputera i działanie procesora. Część 1.

Mikroprocesor Intel 8088 (8086)

Układ wykonawczy, instrukcje i adresowanie. Dariusz Chaberski

Wprowadzenie do architektury komputerów systemy liczbowe, operacje arytmetyczne i logiczne

Adam Kotynia, Łukasz Kowalczyk

Architektura systemów komputerowych Laboratorium 8 Symulator SMS32 Instrukcje skoku i pętle

Wprowadzenie do Architektury komputerów. Asembler procesorów rodziny x86

ARCHITEKTURA PROCESORA,

PROGRAMY REZYDENTNE Terminate and State Resident, TSR

Programowanie Niskopoziomowe

Architektura systemów komputerowych Laboratorium 13 Symulator SMS32 Operacje na bitach

Architektura Systemów Komputerowych. Jednostka ALU Przestrzeń adresowa Tryby adresowania

Lista rozkazów mikrokontrolera 8051

Architektura typu Single-Cycle

PODSTAWOWE ELEMENTY ASEMBLERA TRYBY ADRESOWANIA. OPERATORY ASEMBLERA

Ćwiczenie 3. Konwersja liczb binarnych

Programowanie mikrokontrolera 8051

Przedmiot : Programowanie w języku wewnętrznym. Ćwiczenie nr 4

Mikroprocesor Operacje wejścia / wyjścia

Programowanie Niskopoziomowe

Procesor ma architekturę rejestrową L/S. Wskaż rozkazy spoza listy tego procesora. bgt Rx, Ry, offset nand Rx, Ry, A add Rx, #1, Rz store Rx, [Rz]

Kod hex Instrukcja Opis 37 AAA Koryguj AL po dodawaniu BCD

Podstawowe operacje arytmetyczne i logiczne dla liczb binarnych

LEKCJA TEMAT: Współczesne procesory.

Architektura komputera. Dane i rozkazy przechowywane są w tej samej pamięci umożliwiającej zapis i odczyt

Architektura systemów komputerowych Laboratorium 7 Symulator SMS32 Stos, Tablice, Procedury

BUDOWA I DZIAŁANIE MIKROPROCESORA

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

Lista rozkazów mikrokontrolera 8051 część pierwsza: instrukcje przesyłania danych, arytmetyczne i logiczne

Wprowadzenie do architektury komputerów. Model programowy procesora i jego struktura Procesory CISC i RISC

Układ sterowania, magistrale i organizacja pamięci. Dariusz Chaberski

Architektura Systemów Komputerowych

Dodatek B. Zasady komunikacji z otoczeniem w typowych systemach komputerowych

Ćwiczenie nr 4. Zasady kodowania podprogramów

UTK jednostki wykonawczej EU (Ex ecution Unit), jednostki steruj c ej CU,

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

1. Asembler i wstawki asemblerowe w C

LABORATORIUM PROCESORY SYGNAŁOWE W AUTOMATYCE PRZEMYSŁOWEJ. Zasady arytmetyki stałoprzecinkowej oraz operacji arytmetycznych w formatach Q

Metody Realizacji Języków Programowania

Przykładowe pytania DSP 1

2 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.02 Rok akad. 2011/ / 24

CYKL ROZKAZOWY = 1 lub 2(4) cykle maszynowe

1. Pobrać plik masm.zip (Macro Assembler 6.15 & Segmented Executable Linker 5.60) (

Kod znak-moduł. Wartość liczby wynosi. Reprezentacja liczb w kodzie ZM w 8-bitowym formacie:

Mikrokontroler ATmega32. Język symboliczny

ARYTMETYKA BINARNA. Dziesiątkowy system pozycyjny nie jest jedynym sposobem kodowania liczb z jakim mamy na co dzień do czynienia.

1259 (10) = 1 * * * * 100 = 1 * * * *1

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Podstawy programowania w języku C i C++

Architektura komputera. Cezary Bolek. Uniwersytet Łódzki. Wydział Zarządzania. Katedra Informatyki. System komputerowy

Adresowanie obiektów. Adresowanie bitów. Adresowanie bajtów i słów. Adresowanie bajtów i słów. Adresowanie timerów i liczników. Adresowanie timerów

Luty 2001 Algorytmy (7) 2000/2001

Architektura komputerów

Magistrala systemowa (System Bus)

Podstawy Informatyki

Wstęp do informatyki. System komputerowy. Magistrala systemowa. Architektura komputera. Cezary Bolek

Wprowadzenie do informatyki i użytkowania komputerów. Kodowanie informacji System komputerowy

PAMIĘCI. Część 1. Przygotował: Ryszard Kijanka

Systemy wbudowane. Przykłady kodu Assembler

Transkrypt:

Mikroprocesory 8086 i 8088 5. Mikroprocesory 8086 i 8088 Mikroprocesory 8086 i 8088 (ich twórca - firma Intel - stosuje oznaczenia iapx86 i iapx88 odpowiednio) są układami wielkiej skali integracji (LSI) o długości słowa równej 6 bitom, co oznacza, że są zdolne do wykonywania równolegle operacji na szesnastobitowych ciągach zerojedynkowych. Omawiane mikroprocesory różnią się od siebie tym, że szerokość szyny danych magistrali mikroprocesora 8086 wynosi 6 b, zaś szerokość szyny danych magistrali 8088 wynosi tylko 8 b. Różnica ta powoduje mniejszą szybkość działania mikroprocesora 8088 i znaczne zwiększenie liczby dostępów do pamięci względem 8086 przy wykonywaniu tego samego programu. Oba mikroprocesory dostępne są w czterdziestokońcówkowych plastikowych obudowach dwurzędowych (dual-in-line DIL). Dalej omawiany będzie mikroprocesor 8086, należy pamiętać, że niniejszy tekst stosuje się również do 8088 z uwzględnieniem wymienionej wyżej różnicy. Generator impulsów synchronizujących 8086 jest zrealizowany jako tzw. zegar - generator fali prostokątnej o współczynniku wypełnienia /2 i częstotliwości, w zależności od wykonania od 4.77 MHz do 8 MHz. Znany IBM PC/XT wersja "turbo" wykorzystuje mikroprocesor 8088-2 z zegarem 8 MHz. Uwaga: Komputery IBM PC/AT zawierają mikroprocesor 80286. 5.. Przestrzeń adresowa Przestrzeń adresowa pamięci mikroprocesora 8086 obejmuje MB (tzn. 220 adresów komórek jednobajtowych). Przestrzeń adresowa wejścia/wyjścia obejmuje 64 KB rejestrów. Obie przestrzenie są rozłączne. Wszelkie rejestry mikroprocesora 8086 są ośmio- lub szesnastobitowe, dotyczy to również wykorzystywanych konstrukcji logicznych, natomiast zaadresowanie komórki pamięci w przestrzeni adresowej MB wymaga dwudziestobitowego adresu. W związku z tym przyjęto regułę tworzenia adresów fizycznych pamięci ("adresów do pamięci") zawsze z dwóch szesnastobitowych wartości, z których jedna (oznaczana dalej jako SEGMENT) określa adres początkowy pewnego segmentu, zaś druga (oznaczana dalej jako OFFSET) jest adresem względnym względem początku tego segmentu. Segmentem nazywa się dowolny spójny obszar pamięci rozpoczynający się od adresu podzielnego bez reszty przez 6 (0H). Wspomniana wcześniej szesnastobitowa wartość określająca adres początkowy segmentu stanowi po prostu szesnaście najbardziej znaczących bitów dwudziestobitowego adresu segmentu. Należy zauważyć, że w przestrzeni adresowej MB można wyróżnić 64 K różnych (lecz nie rozłącznych) segmentów. W zapisie heksadecymalnym wartość określająca adres początku segmentu stanowi cztery najbardziej znaczące cyfry pięciocyfrowego adresu fizycznego początku segmentu. Adres względny nazywany bywa również przesunięciem lub wskaźnikiem (występuje tu przypadkowa zbieżność z nazwą jednobitowego rejestru). W 39

Wstęp do systemów komputerowych mikroprocesorze 8086 zasadę tworzenia adresu fizycznego można przedstawić wzorem: adres fizyczny = SEGMENT * 6 + OFFSET lub w postaci binarnej: SEGMENT 5 4 3 2 0 9 8 7 6 5 4 3 2 0 0 0 0 0 + OFFSET 5 4 3 2 0 9 8 7 6 5 4 3 2 0 Adres fizyczny 9 8 7 6 5 4 3 2 0 9 8 7 6 5 4 3 2 0 Przyjęto zasadę zapisu adresów fizycznych w następującej konwencji: SEGMENT:OFFSET np. zapis 20H:0H oznacza adres fizyczny 20H (zaś 0FEDBH:BH wyznacza adres 0FEDCBH). Przeniesienie jest ignorowane (0FEDBH:H = 0FECH). Należy też zwrócić uwagę, że istnieje wiele sposobów zapisu tego samego adresu fizycznego, np. adres 0400H można zapisać jako 40H:0, 0H:300H, 20H:200H, 30H:00, 0:400H, FH:20H itd. Podczas działania procesora w rozkazach określa się tylko przesunięcia (adresy względne), zaś SEGMENT pobierany jest z jednego z tzw. rejestrów segmentów (segment registers). Konstruktorzy mikroprocesora 8086 założyli, że programista będzie wykorzystywał strukturę danych nazywaną stosem, co więcej - stos będzie intensywnie wykorzystywany do przekazywania sterowania na potrzeby systemu przerwań i wywołań programowych. Abstrahując od konkretnego rozwiązania w 8086 stos (stack) można określić jako taką bezadresową strukturę danych, na której można wykonać dwie operacje: odłożenia słowa na stos i zdjęcia słowa ze stosu. Odłożenie na stos słowa powoduje, że znajduje się ono na tzw. wierzchołku stosu i może być jako pierwsze zdjęte ze stosu. Odłożenie kolejnego słowa na stos uniemożliwia dostęp do poprzednio odłożonych słów - mogą one być zdejmowane tylko w porządku odwrotnym do odkładania. Stąd stos nazywany jest też kolejką LIFO (last in, first out - "ostatni wchodzący - pierwszym wychodzącym"). Nota bene stos w mikroprocesorze 8086 organizowany jest w obszarze pamięci operacyjnej, zatem istnieje możliwość dostępu do jego zawartości w innym porządku niż tu opisany. 5.2. Rejestry procesora Mikroprocesor 8086 zawiera 4 szesnastobitowych rejestrów widocznych dla programisty: 40

Mikroprocesory 8086 i 8088 5 4 3 2 0 98 7654320 Rejestry ogólnego przeznaczenia Akumulator AX AH AL Rejestr bazowy BX BH BL Rejestr zliczający (licznik) CX CH CL Rejestr danych DX DH DL Rejestry adresowe Wskaźnik rozkazu IP Wskaźnik wierzchołka stosu Wskaźnik bazy Indeks źródła Indeks celu Rejestry segmentowe Rejestr segmentu kodu Rejestr segmentu stosu Rejestr segmentu danych Rejestr segmentu dodatkowego Rejestr stanu Rejestr znaczników SP BP SI DI CS SS DS. ES F. Rejestry ogólnego przeznaczenia, służące głównie do przechowywania wyników pośrednich, ich zawartości mogą być argumentami większości rozkazów: AX - akumulator; niektóre rozkazy dotyczące tego rejestru wykonują się szybciej niż na innych rejestrach ogólnych lub są o bajt krótsze. BX - rejestr bazowy (base register); dodatkowo może być wykorzystany do tzw. adresowania bazowego - zawiera wówczas przesunięcie (OFFSET) argumentu. CX - rejestr zliczający lub licznikowy (count register); dodatkowo może być wykorzystany w wielu rozkazach jako licznik wykonań - jest wówczas zmniejszany o za każdym wykonaniem i jego zawartość podlega badaniu, czy nie uległa wyzerowaniu. DX - rejestr danych (data register), jako jedyny może być wykorzystywany do adresowania obiektów w przestrzeni adresowej wejścia/wyjścia (portów) w 4

Wstęp do systemów komputerowych rozkazach wejścia/wyjścia, a także w rozkazach o argumentach lub wynikach długości większej niż jedno słowo (np. rozkazy mnożenia lub dzielenia). Szesnastobitowe rejestry ogólnego przeznaczenia mogą być interpretowane jako pary ośmiobitowych rejestrów stanowiących mniej i bardziej znaczącą część rejestru szesnastobitowego. Identyfikator rejestru stanowiącego mniej znaczącą część rejestru ogólnego kończy się na L, zaś identyfikator rejestru stanowiącego bardziej znaczącą część rejestru ogólnego kończy się na H (por. rysunek na następnej stronie). Argumentami rozkazów mogą być zarówno rejestry ogólne jako całości, jak i ich ośmiobitowe części. 2. Rejestry adresowe, służące głównie do przechowywania adresów względnych (OFFSET), chociaż mogą być też wykorzystywane jako rejestry robocze - możliwości użycia ich zawartości jako argumentów rozkazów są tylko w niewielkim stopniu ograniczane w porównaniu z rejestrami ogólnego przeznaczenia: IP - wskaźnik rozkazu (instruction pointer), zawiera zawsze adres względny (względem początku segmentu określanego przez zawartość rejestru CS) aktualnie pobieranego do wykonania rozkazu; uwaga: rejestr ten stanowi z punktu widzenia programisty (wraz z rejestrem CS) część licznika rozkazów; rejestr IP nie może być jawnie zmieniany przez program. SI - rejestr indeksu źródła (miejsca, z którego pobierane są dane w operacjach przesyłania danych - source index); zwykle zawiera adres danych względem początku segmentu określonego zawartością rejestru DS; rejestr SI wykorzystywany jest do tzw. adresowania indeksowego oraz w rozkazach łańcuchowych (na ciągach), może też być wykorzystywany do innych celów. DI - rejestr indeksu celu (destination index); zwykle zawiera adres danych względem początku segmentu określonego zawartością rejestru DS; rejestr DI wykorzystywany jest do tzw. adresowania indeksowego oraz w rozkazach łańcuchowych - w tym przypadku jednak zawiera adres względem początku segmentu określonego zawartością rejestru ES; może też być wykorzystywany do innych celów. 3. Rejestry segmentowe służą do przechowywania wartości (SEGMENT) określających adresy początkowe segmentów przy odwołaniach do pamięci: CS - rejestr segmentu kodu programu (code segment) określa adres początku segmentu używany w przypadku wszystkich dostępów do pamięci z adresowaniem względnym za pomocą rejestru IP, tzn. pobierania rozkazów (instructions fetch). Z punktu widzenia programisty rejestr CS wraz z rejestrem IP tworzy licznik rozkazów mikroprocesora 8086 (CS:IP). SS - rejestr segmentu stosu (stack segment) określa adres początku segmentu używany w przypadku wszystkich dostępów do pamięci z adresowaniem względnym za pomocą rejestru SP lub BP (o ile nie zadano inaczej za pomocą specjalnego rozkazu) oraz jeśli zadano wykorzystanie tego rejestru specjalnym rozkazem. 42

Mikroprocesory 8086 i 8088 DS - rejestr segmentu danych (data segment) określa adres początku segmentu używany w przypadku wszystkich dostępów do pamięci do danych (np. za pomocą rejestrów BX, SI, DI lub za pomocą adresu podanego bezpośrednio w rozkazie - o ile nie zadano inaczej za pomocą specjalnego rozkazu) oraz jeśli zadano wykorzystanie tego rejestru specjalnym rozkazem. ES - rejestr segmentu dodatkowego (extra segment) określa adres początku segmentu używany w przypadku dostępów do pamięci do danych w rozkazach łańcuchowych - działania na ciągach adresowanych za pomocą rejestru DI, a ponadto jeśli zadano wykorzystanie tego rejestru specjalnym rozkazem. Rejestry segmentowe mogą być argumentami wyłącznie rozkazów przesyłania MOV, PUSH i POP. 4. Rejestr znaczników F (flag register) jest konstrukcją składającą się z szeregu jednobitowych rejestrów (wskaźników) określających stan procesora. Rejestr znaczników zawiera tzw. słowo stanu (status word). Słowo stanu SW ma następującą postać: 5 4 3 2 0 9 8 7 6 5 4 3 2 0 X X X X OF DF IF TF SF ZF X AF X PF X CF Nadmiar (overflow) ------------ I I I I I I I I Kierunek (direction) ------------------- I I I I I I I Maska przerwań (interrupt enable) ---------- I I I I I I Przerwanie po każdym rozkazie (trap enable) ------ I I I I I Wskaźnik ujemnego wyniku (sign) --------------------------- I I I I Wskaźnik zera wyniku (zero) ------------------------------------------- I I I Przeniesienie pomocnicze (auxillary carry) ------------------------------------------- I I Wskaźnik parzystości (parity) ---------------------------------------------------------------------------- I Przeniesienie globalne (carry) --------------------------------------------------------------------------------------------- X oznacza nieistotną wartość. Poszczególne bity rejestru wskaźników dzielą się na dwie grupy: a. Wskaźników określających sposób działania procesora: TF - bit 8 SW, powoduje (stan ) przerwanie nr 3, z jednoczesnym zgaszeniem TF, po wykonaniu jednego rozkazu - wykorzystywany przez specjalistyczne oprogramowanie uruchomieniowe; IF - bit 9 SW, zezwala (stan ) na przyjmowanie przerwań zewnętrznych; wyzerowanie tego bitu powoduje zablokowanie przyjmowania przerwań zewnętrznych, poza tzw. przerwaniem niemaskowalnym (NMI); DF - bit 0 SW, określa czy zawartości rejestrów SI i DI w trakcie wykonywania rozkazów łańcuchowych mają być zwiększane (DF=0), czy zmniejszane (DF=). b. Wskaźników ustawianych w wyniku wykonywania różnych rozkazów: CF - wskaźnik przeniesienia globalnego, zmieniany rozkazami arytmetycznymi i przesunięć, zerowany rozkazami logicznymi; OF - wskaźnik nadmiaru, zmieniany rozkazami arytmetycznymi i zerowany rozkazami logicznymi; OF jest zmieniany również w rozkazach przesunięć, których drugi argument jest równy ; 43

Wstęp do systemów komputerowych SF - wskaźnik znaku (ujemnego wyniku), zmieniany rozkazami arytmetycznymi i logicznymi; ZF - wskaźnik zera wyniku, zmieniany rozkazami arytmetycznymi i logicznymi; PF - wskaźnik parzystej liczby jedynek w zapisie binarnym najmniej znaczącego bajtu wyniku, zmieniany rozkazami arytmetycznymi i logicznymi; AF - wskaźnik przeniesienia pomocniczego (z bitu 3 na 4) ustawiany na potrzeby rozkazów arytmetyki dziesiętnej. 5.3. Lista rozkazów Na potrzeby opisu języka wewnętrznego mikroprocesora 8086 stosuje się zapis zbliżony do zapisu stosowanego w assemblerze (MASM firmy Microsoft lub ASM86 firmy Intel), w którym rozkazy zapisywane są w następującej postaci: mnemo {id_argumentu_{,id_argumentu_2}} gdzie: mnemo - oznacza mnemoniczny skrót angielskiej nazwy funkcji rozkazu; id_argumentu_ - oznacza identyfikator argumentu ; id_argumentu_2 - oznacza identyfikator argumentu 2; nawiasami klamrowymi oznaczono elementy zapisu nie zawsze występujące. W uproszczeniu - skrót mnemoniczny (nazywany też czasem mnemonikiem), po analizie pozostałej części zapisu rozkazu, przekładany jest przez kompilator assemblera w kod operacji rozkazu, zaś identyfikatory, w miarę potrzeb, w adresy rozkazu. Zapis assemblerowy jest o tyle uzasadniony, że jest on znacznie łatwiejszy w użyciu od kodowania w zapisie szesnastkowym, zaś wszystkie narzędzia wykorzystywane do uruchamiania, czy analizy programów (tzw. debugger'y i disassembler'y) stosują tę samą, lub bardzo zbliżoną, konwencję zapisu. Identyfikatory argumentów mogą być w różnych postaciach, nazywanych trybami adresowania (chociaż poprawniejsza byłaby chyba nazwa "tryby identyfikowania argumentów"). Wyróżnia się następujące tryby adresowania:. Natychmiastowy, gdy identyfikatorem jest zadana wartość argumentu (stała), np. w rozkazie MOV AX,23 gdzie stałą podkreślono. 2. Rejestrowy, gdy identyfikatorem jest nazwa rejestru, którego zawartość ma być argumentem rozkazu np. w rozkazie MOV AX,23 gdzie podkreślono nazwę rejestru. 3. Bezpośredni, gdy identyfikatorem jest adres (OFFSET) jednostki informacji przechowywanej w pamięci, np. w rozkazie MOV AX,[23] gdzie podkreślono zapis adresu (dostęp nastąpi pod adres DS:23). 4. Bazowy, gdy identyfikatorem jest adres (OFFSET) zawarty przynajmniej częściowo w rejestrze bazowym BX lub BP, np.: MOV DX,[BX+0E2H] gdzie podkreślono zapis adresu (dostęp nastąpi pod adres DS:(bx+0E2H), gdzie bx oznacza zawartość rejestru BX). 44

Mikroprocesory 8086 i 8088 5. Indeksowy, gdy identyfikatorem jest adres (OFFSET) zawarty przynajmniej częściowo w rejestrze indeksowym SI lub DI, np.: MOV DX,[SI+0E2H] gdzie podkreślono zapis adresu (dostęp nastąpi pod adres DS:(si+0E2H), gdzie si oznacza zawartość rejestru SI). 6. Bazowo-indeksowy, gdy identyfikatorem jest adres (OFFSET) zawarty przynajmniej częściowo w jednym z rejestrów bazowych BX lub BP oraz w jednym z rejestrów indeksowych SI lub DI, np. rozkaz: MOV DX,[BX+SI+0E2H] gdzie podkreślono zapis adresu (dostęp nastąpi pod adres DS:(bx+si+0E2H), bx i si oznaczają odpowiednio zawartości rejestrów BX i SI). 7. Rozkazy o tych samych mnemonikach lecz wykorzystujące różne tryby adresacji będą miały różną postać wynikową, w szczególności mogą mieć różną długość. Należy zwrócić uwagę na kilka reguł, których należy przestrzegać pisząc rozkazy w zapisie assemblerowym : identyfikator argumentu zmienianego rozkazu, o ile taki argument występuje, musi być na miejscu bezpośrednio za mnemonikiem (jedynym rozkazem o dwóch argumentach zmienianych jest XCHG, kolejność identyfikatorów jest w tym przypadku obojętna); w pojedynczym rozkazie może wystąpić co najwyżej jedno odwołanie do danych w pamięci operacyjnej; oba argumenty w rozkazach dwuargumentowych muszą być tej samej długości (bajt lub słowo); nie może wystąpić sytuacja, w której żaden z argumentów nie ma jednoznacznie określonej długości (słowo lub bajt); w takim przypadku assemblerze identyfikator jednego z argumentów powinien być opisany za pomocą operatora PTR, np.: MOV BYTE PTR [BX],0 lub MOV WORD PTR [BX],0; w niektórych debuggerach kod operacji powinien w omawianym przypadku być rozszerzony o literę B w przypadku rozkazów bajtowych, np.: MOVB [BX],0 lub o literę W w przypadku rozkazów działających na słowach MOVW [BX],0; błędny jest zapis MOV [BX],0. Dla wspomnianego powyżej operatora PTR obowiązuje konwencja zapisu: typ PTR identyfikator_argumentu gdzie: typ {BYTE,WORD,DWORD,QWORD,TWORD,NEAR,FAR}. Argumentem zmienianym nazwano ten z argumentów, który skutkiem wykonania rozkazu ulegnie zmianie, gdyż w jego miejscu zostanie umieszczony wynik rozkazu. Pierwszy bajt pobierany z pamięci w cyklu rozkazowym przez sterowanie mikroprocesora 8086 traktowany jest jako kod operacji rozkazu. Część zbioru możliwych wartości takiego bajtu stanowi zbiór tzw. kodów niezdefiniowanych powodujących przerwanie o numerze 6. Niezdefiniowane kody operacji są fragmentami tzw. rozkazów nielegalnych, których stosowanie nie jest zalecane przez producenta. 45

Wstęp do systemów komputerowych Rozkazy mikroprocesora 8086 można podzielić na kilka grup, obejmujących rozkazy tego samego typu: rozkazy przenoszenia, arytmetyczne stałoprzecinkowe, arytmetyczne dziesiętne, logiczne, łańcuchowe (działające na ciągach), przenoszące niesekwencyjnie sterowanie i inne. 5.3.. Rozkazy prefiksujące Jednobajtowe rozkazy, które zmieniają sposób wykonania następnego (w pamięci) rozkazu mikroprocesora 8086 nazwano rozkazami prefiksującymi lub prefiksami. Do grupy tej należą rozkazy SEG, LOCK i REP. Rozkazy prefiksujące nie zmieniają wartości znaczników (flag w słowie stanu). Rozkaz SEG poleca w następnym rozkazie podczas odwołania do pamięci użyć jako wartości określającej początkowy adres segmentu (SEGMENT) zawartości tego rejestru segmentowego, którego nazwa stanowi identyfikator argumentu rozkazu SEG. Format rozkazu SEG jest następujący: SEG nazwa_rejestru_segmentowego gdzie nazwa_rejestru_segmentowego {CS,DS,ES,SS}. Np. w rozkazie MOV AX,[BX] nastąpi odczytanie słowa spod adresu DS:BX do rejestru AX, natomiast w przypadku poprzedzenia tego rozkazu prefiksem SEG: SEG CS MOV AX,[BX] nastąpi odczytanie słowa spod adresu CS:BX do rejestru AX. W assemblerze nie wykorzystuje się jawnie tego rozkazu - w przypadku, gdy żądane jest użycie innego niż wynikający z domniemania rejestru segmentowego podczas odwołania do pamięci, identyfikator argumentu powinien być poprzedzony nazwą żądanego rejestru segmentowego oddzieloną odeń dwukropkiem. Odpowiednik poprzedniego przykładu to: MOV AX,CS:[BX] (omawianą konstrukcję wytłuszczono). Rozkaz LOCK poleca zająć magistralę na czas wykonywania następnego rozkazu; stosowany jest do realizacji semaforów w systemach wieloprocesorowych, typowa konstrukcja: LOCK XCHG AX,semafor zapewnia, że żaden inny użytkownik nie dostanie się do pamięci między odwołaniami rozkazu XCHG. Rozkaz REP (REPZ, REPE) poleca powtarzać następujący po nim rozkaz łańcuchowy i zmniejszać CX o do wyzerowania CX. Dla rozkazów CMPS i SCAS powtarzanie kończy się ponadto gdy ZF=0; dla tychże rozkazów powtarzanie kończyć się będzie gdy ZF=, jeśli użyty zostanie rozkaz REPNZ (lub REPNE - odmiana REP). Dla pozostałych rozkazów łańcuchowych MOVS, LODS lub STOS wykonania rozkazów REPNZ, REPNE, REPZ, REPE i REP nie różnią się. 5.3.2. Rozkazy przesyłania Rozkazy przesyłania (przenoszenia danych) to rozkazy, które powodują przeniesienie jednostek informacji (bajtów lub słów) w komputerze. Do rozkazów 46

Mikroprocesory 8086 i 8088 przesyłania zalicza się rozkazy MOV, XCHG, XLAT, PUSH, POP, IN i OUT. Rozkazy przesyłania nie zmieniają wartości wskaźników. Rejestry segmentowe mogą być argumentami tylko rozkazów MOV, PUSH i POP. Dwuargumentowy rozkaz MOV poleca przenieść wartość stałej do rejestru lub pamięci, zawartość rejestru do rejestru lub pamięci lub zawartość komórki pamięci do rejestru. Np.: MOV AX,5 ; wartość 0005H do AX MOV AL,5 ; wartość 05H do AL MOV AL,[5] ; bajt spod adresu DS:5 do AL MOV BX,[23] ; słowo spod adresu DS:23 do BX MOV [BX],AX ; słowo z AX pod adres DS:BX MOV BH,AL ; bajt z AL do BH w przypadku przesyłania stałej do pamięci powinna być określona długość argumentów: MOV BYTE PTR [SI],5 ; bajt 05H pod adres DS:SI MOV WORD PTR [DI],5 ; słowo 0005H pod adres DS:DI. Dwuargumentowy rozkaz XCHG poleca zamienić miejscami argumenty. Jest to jedyny rozkaz, którego oba argumenty są zmieniane - kolejność argumentów jest obojętna; żaden z argumentów nie może być stałą. Np.: XCHG AX,BX ; AX <---> BX XCHG BH,AL ; BH <---> AL XCHG AX,[23] ; AX <---> słowo spod adresu DS:23 Bezargumentowy rozkaz XLAT nazywany jest rozkazem translacji - powoduje zapisanie do AL bajtu z pamięci spod adresu DS:[BX+AL]. Zwykle w BX znajduje się adres tablicy przekodowania, początkowa wartość AL stanowi wskaźnik tej tablicy, wynikiem jest wskazywana wartość. W assemblerze można użyć argumentu (nazwy tablicy), ale nie będzie on miał znaczenia dla wykonania rozkazu - zawartość BX musi być wcześniej poprawnie ustawiona. Jednoargumentowy rozkaz PUSH powoduje odłożenie na stosie argumentu, tzn. wykonanie dwu działań: SP:=SP-2 tzn. zmniejszenie wskaźnika stosu o 2 (długość słowa); zapisanie argumentu pod adres SS:SP. Argumentem rozkazu PUSH może być rejestr lub komórka pamięci, zawsze o długości słowa, np.: PUSH AX; dla odłożenia na stosie słowa stanu należy użyć rozkazu PUSHF bez argumentu. Należy zwrócić uwagę, że w rozkazie PUSH możliwe jest niejawne podwójne odwołanie do pamięci, np.: PUSH [BX+5] powoduje odczyt spod adresu DS:(bx+5) i zapis pod adres SS:SP (po zwiększeniu SP o 2). Jednoargumentowy rozkaz POP powoduje zdjęcie ze stosu argumentu, tzn. wykonanie dwóch działań: odczytanie słowa do argumentu spod adresu SS:SP; SP:=SP+2 tzn. zwiększenie wskaźnika stosu o 2 (długość słowa). Argumentem rozkazu POP może być rejestr lub komórka pamięci, zawsze o długości słowa, np.: POP AX; dla zdjęcia ze stosu słowa stanu należy użyć rozkazu POPF bez 47

Wstęp do systemów komputerowych argumentu. Należy zwrócić uwagę, że w rozkazie POP możliwe jest niejawne podwójne odwołanie do pamięci. Np.: POP [BX] powoduje odczyt spod adresu SS:SP i zapis pod adres DS:BX. Rozkaz IN jest rozkazem wejścia polecającym odczytać zawartość rejestru wejściowego (zlokalizowanego w przestrzeni adresowej wejścia/wyjścia) do rejestru AL lub AX. Numer rejestru może być podany w rejestrze DX lub, jeśli jest mniejszy od 256, bezpośrednio w rozkazie: IN AL,0 ; odczytywany bajtowy rejestr nr 0, IN AX,254 ; odczytywany słowowy rejestr nr 254, IN AL,DX ; odczytywany bajtowy rejestr wg DX, IN AX,DX ; odczytywany słowowy rejestr wg DX. Rozkaz OUT jest rozkazem wyjścia polecającym zapisać zawartość AL lub AX do rejestru wyjściowego (zlokalizowanego w przestrzeni adresowej wejścia/wyjścia). Numer rejestru może być podany w rejestrze DX lub, jeśli jest mniejszy od 256, bezpośrednio w rozkazie: OUT 0,AL ; zapisywany bajtowy rejestr nr 0, OUT 254,AX ; zapisywany słowowy rejestr nr 254, OUT DX,AL ; zapisywany bajtowy rejestr wg DX, OUT DX,AX ; zapisywany słowowy rejestr wg DX. 5.3.3. Wybrane rozkazy arytmetyczne Rozkazy arytmetyczne pozwalają na wykonanie dodawania, odejmowania, mnożenia, dzielenia, porównania, wyznaczania liczby przeciwnej, zwiększania i zmniejszania o. Rozkazy arytmetyczne powodują ustawienie znaczników CF, OF, ZF, SF, PF, AF. W niniejszym podrozdziale przedstawiono niektóre rozkazy arytmetyczne wystarczające na potrzeby tworzenia programów organizacyjnych : ADD - dodawanie; ADC - dodawanie z przeniesieniem; SUB - odejmowanie; SBB - odejmowanie z przeniesieniem; CMP - porównanie; NEG - wyznaczenie liczby przeciwnej; INC - zwiększenie o ; DEC - zmniejszenie o. Rozkazy ADD, ADC, SUB, SBB i CMP są dwuargumentowe. Identyfikatory argumentów mogą dotyczyć: rejestru i stałej, dwu rejestrów, rejestru i pamięci, pamięci i stałej lub też pamięci i rejestru. Oba argumenty traktowane są jako zapisane w kodzie uzupełnieniowym i w wyniku wykonania operacji ustawiane są wskaźniki (flagi w słowie stanu) przeniesienia globalnego CF i nadmiaru OF. Do znacznika zera wyniku ZF ładowany jest rezultat badania wyniku na zero, bit znaku wyniku kopiowany jest do wskaźnika znaku SF. Ustawiany jest wskaźnik PF w zależności od liczby jedynek wyniku. Rozkaz dodawania ADD poleca wykonać dodawanie dwu argumentów i wynik umieścić w miejscu pierwszego z nich. Rozkaz dodawania z przeniesieniem 48

Mikroprocesory 8086 i 8088 ADC poleca wykonać dodawanie argumentów jak w rozkazie ADD i wynik powiększyć o wartość początkową wskaźnika CF. Rozkaz odejmowania SUB poleca wykonać odejmowanie dwu argumentów i wynik umieścić w miejscu pierwszego z nich. Rozkaz odejmowania z przeniesieniem SBB poleca wykonać odejmowanie od pierwszego argumentu wartości drugiego argumentu powiększonego wstępnie o wartość początkową wskaźnika CF, zaś wynik umieścić w miejscu pierwszego argumentu. Operacja rozkazu CMP wykonywana jest identycznie jak w rozkazie SUB (odejmowania) lecz wynik jest ignorowany - żaden z argumentów nie zmienia wartości, jedynym efektem jest ustawienie wskaźników w słowie stanu. Rozkazy NEG, INC i DEC są jednoargumentowe, przy czym argument może znajdować się w rejestrze (poza segmentowymi) lub pamięci. Należy zadbać o to, aby długość argumentu (BYTE lub WORD) była jednoznacznie określona, np.: DEC BYTE PTR [SI] lub INCW [BX]. Rozkaz wyznaczania liczby odwrotnej (przeciwnej) NEG powoduje wyznaczenie uzupełnienia argumentu i zapisanie go w miejscu argumentu, np.: NEG AX. Rozkazy INC i DEC powodują zwiększenie lub zmniejszenie (odpowiednio) argumentu o modulo 28 lub 26. Uwaga: rozkazy INC i DEC nie zmieniają stanu wskaźnika CF, lecz zmieniają OF, ZF, SF, PF i AF. 5.3.4. Rozkazy logiczne i przesunięcia Do rozkazów logicznych zalicza się rozkazy dokonujące: AND - iloczynu logicznego; OR - sumy logicznej; XOR - różnicy symetrycznej; TEST - sprawdzenia; NOT - negacji. Z wyjątkiem rozkazu NOT, są to rozkazy dwuargumentowe. We wszystkich tych rozkazach (poza rozkazem TEST) zmianie ulega pierwszy argument. Zmieniane są również wartości wskaźników SF, ZF i PF; wskaźniki OF i CF są zerowane, a wartość AF nieokreślona. Rozkaz TEST dokonuje, podobnie jak rozkaz AND iloczynu logicznego obu argumentów, lecz wynik tego działania jest ignorowany - jedynym efektem jest ustawienie wskaźników. Jednoargumentowy rozkaz NOT powoduje zanegowanie wszystkich bitów argumentu. Rozkazy przesunięć dzielą się na przesunięcia arytmetyczne, logiczne i obroty: SAL - przesunięcie arytmetyczne w lewo; SAR - przesunięcie arytmetyczne w prawo; SHL - przesunięcie logiczne w lewo ; SHR - przesunięcie logiczne w prawo; RCL - przesunięcie cykliczne (obrót) w lewo przez CF; RCR - przesunięcie cykliczne (obrót) w prawo przez CF; ROL - przesunięcie cykliczne (obrót) w lewo; ROR - przesunięcie cykliczne (obrót) w prawo. 49

Wstęp do systemów komputerowych Wszystkie rozkazy przesunięć są dwuargumentowe - pierwszym argumentem, którego zawartość podlega przesuwaniu, jest rejestr lub komórka pamięci (o długości bajtu lub słowa), drugim zaś argumentem, określającym liczbę przesunięć jest stała lub rejestr CL. Przesunięcia może odbywać się zatem o lub o zawartość rejestru CL, używaną modulo 32. Sposób wykonywania przesunięć przedstawiono na rysunkach: SHL i SAL 7 6 5 4 3 2 0 CF 0 SAR SHR 7 6 5 4 3 2 0 S CF 7 6 5 4 3 2 0 0 CF ROR 6 5 4 3 2 0 CF ROL RCR CF 7 6 5 4 3 2 6 5 4 3 2 0 CF RCL 7 6 5 4 3 2 CF Rozkazy przesunięć arytmetycznych i logicznych powodują ustawienie OF, ZF, SF, PF i CF, zaś AF przyjmuje nieokreśloną wartość. Rozkazy obrotów zmieniają wartości tylko wskaźników OF i CF. Wskaźnik OF jest należycie zmieniany tylko przy przesunięciach o. 50

Mikroprocesory 8086 i 8088 5.3.5. Wybrane rozkazy łańcuchowe Do rozkazów łańcuchowych, czyli działających na ciągach słów lub bajtów, zalicza się rozkazy: MOVS - przesyłania bloków; CMOS - porównywania bloków; LODS - odczytu z bloku do akumulatora; STOS - wypełniania bloku zawartością akumulatora; SCAS - poszukiwania wg akumulatora. Rozkazy łańcuchowe są rozkazami bezargumentowymi (w zapisie), dlatego wymagają określenia długości argumentu, np. przez dodanie liter B lub W do skrótu mnemonicznego rozkazu (MOVSB lub MOVSW dla rozkazu MOVS). Zawartości użytych rejestrów SI i DI, które określają położenie argumentów, zmieniane są o (w przypadku rozkazu bajtowego) lub o 2 (w przypadku słowowego). Kierunek zmian zależy od wartości znacznika DF: dla DF=0 zachodzi zwiększanie, zaś dla DF= zmniejszanie. Rozkaz MOVS powoduje wykonanie następujących działań: ES:[DI] := DS:[SI] (słowo/bajt); SI := SI±d DI := DI±d ; gdzie: d= dla rozkazu bajtowego; d=2 dla rozkazu słowowego. Rozkaz CMPS powoduje wykonanie następujących działań: wykonanie odejmowania (słów lub bajtów) DS:[SI] - ES[DI] z ignorowaniem wyniku i ustawieniem znaczników; SI := SI±d ; DI := DI±d. Rozkaz STOS powoduje wykonanie następujących działań: ES:[DI] := AL w przypadku rozkazu STOSB; ES:[DI] := AX w przypadku STOSW; DI := DI±d. Rozkaz LODS powoduje wykonanie następujących działań: AL := DS:[SI] w przypadku rozkazu STOSB; AX := DS:[SI] w przypadku STOSW; SI := SI±d. Rozkaz SCAS powoduje wykonanie odpowiednika rozkazu CMP AL,ES:[DI] lub CMP AX,ES:[DI] dla SCASB i SCASW odpowiednio (z ustawieniem znaczników) oraz zmianę wskaźnika DI := DI±d. 5.3.6. Rozkazy przenoszące sterowanie Do rozkazów przenoszących sterowanie zaliczono rozkazy skoków bezwarunkowych i warunkowych, rozkazy przerwań i powrotu. Mnemoniki rozkazów skokowych zaczynają się od litery J (Jump). Argumentami rozkazów skokowych są adresy docelowe, tzn. adresy umieszczane w liczniku rozkazów w 5

Wstęp do systemów komputerowych przypadku skoku efektywnego. Rozkazy skokowe nie zmieniają zawartości rejestru F (słowa stanu). Rozkaz JMP jest rozkazem skoku bezwarunkowego, pozwalającym na przeniesienie sterowania w obrębie ok. ±28 najbliższych bajtów (skok wewnątrzsegmentowy krótki SHORT o kodzie dwubajtowym), w obrębie segmentu określonego zawartością rejestru CS (skok wewnątrzsegmentowy NEAR o trzybajtowym zwykle kodzie) oraz w obszarze całej ( MB) przestrzeni adresowej pamięci mikroprocesora (skok międzysegmentowy FAR zwykle o pięciobajtowym kodzie). Adres skoku może być podany bezpośrednio w rozkazie (tej sytuacji dotyczą wcześniejsze uwagi o długości kodów rozkazowych), mówi się wówczas o skokach bezpośrednich. Rozkazy skokowe zawierające po kodzie operacji identyfikator miejsca, w którym znajduje się właściwy adres, do którego ma nastąpić przeniesienie sterowania nazywają się skokami pośrednimi. W przypadku, gdy rozkaz skokowy w swym kodzie zawiera informację o ile należy zmienić licznik rozkazów aby osiągnąć miejsce docelowe skoku, rozkaz taki nosi nazwę skoku względnego. W mikroprocesorze 8086 skoki względne mogą zawierać jednobajtową wartość zmiany, traktowaną jako liczba w kodzie uzupełnieniowym ze znakiem, co oznacza, że zmiana licznika rozkazów, a dokładniej: zawartości rejestru IP, nie może przekraczać wartości ok. 28 B "w przód" i "w tył". Krótkie (SHORT) rozkazy skoku bezwarunkowego są zawsze skokami bezpośrednimi względnymi, z uwagi jednak na prostotę posługiwania się nimi, zarówno assemblery, jak i debuggery jako argumenty takich rozkazów prezentują adresy bezwzględne np.: JMP SHORT adres. Rozkazy skoku wewnątrzsegmentowego (NEAR) są skokami bezpośrednimi, lub pośrednimi. W przypadku skoków pośrednich adres skoku może być umieszczony w rejestrze, np. JMP BX, lub w słowie pamięci, np.: JMP [BX]. Wykonanie skoków wewnątrzsegmentowych polega na umieszczeniu adresu docelowego skoku w rejestrze IP. Rozkaz skoku międzysegmentowego może być skokiem pośrednim tylko wówczas, gdy adres docelowy mieści się w pamięci - zajmuje dwa słowa, przy czym słowo mniej znaczące mieści żądaną wartość rejestru IP, zaś słowo bardziej znaczące - żądaną wartość rejestru CS. Wykonanie skoku polega na wpisaniu nowych wartości do rejestrów CS i IP (licznika rozkazów). Np.: JMP DWORD PTR [BX] lub JMP FAR adres. Skokami bezwarunkowymi w 8086 są również rozkazy CALL i RET związane z wykonywaniem podprogramów. Rozkaz CALL - wywołanie podprogramu - powoduje odłożenie na stos zawartości licznika rozkazów (wskazującego na początek następnego rozkazu po CALL) oraz skok bezwarunkowy pod adres będący argumentem rozkazu. Rozkaz ten może być skokiem bezpośrednim lub pośrednim, wewnątrzsegmentowym lub międzysegmentowym, np.: CALL adres ; wewnątrzsegmentowy, bezpośredni CALL AX ; wewnątrzsegmentowy, pośredni CALL WORD PTR adres[si] ; wewnątrzsegmentowy, pośredni CALL FAR adres ; międzysegmentowy, bezpośredni CALL DWORD PTR [BX] ; międzysegmentowy, pośredni 52

Mikroprocesory 8086 i 8088 skoki wewnątrzsegmentowe powodują odłożenie na stosie tylko zawartości rejestru IP, zaś skoki międzysegmentowe kolejno rejestrów CS i IP. Rozkaz powrotu z podprogramu RET jest rozkazem bezargumentowym lub jednoargumentowym, przy czym jeśli występuje argument, to jest on zawsze stałą (adresowanie natychmiastowe). Wykonuje się jako skok bezwarunkowy, przy czym zakłada się że adres skoku znajduje się na wierzchołku stosu. Występują rozkazy RET wewnątrzsegmentowe (NEAR) i międzysegmentowe (FAR); w przypadku rozkazu wewnątrzsegmentowego zakłada się, że na wierzchołku stosu znajduje się żądana nowa wartość rejestru IP; w przypadku rozkazu międzysegmentowego zakłada się, że na wierzchołku stosu znajduje się żądana nowa wartość rejestru IP, zaś bezpośrednio po niej żądana zawartość rejestru CS. Wykonanie rozkazu RET polega na zdjęciu ze stosu informacji i umieszczeniu jej w liczniku rozkazów. Ponadto, w przypadku, gdy rozkaz RET posiada argument, to jego wartość jest dodawana do zawartości rejestru SP po zdjęciu ze stosu adresu powrotu - zwykle zatem powinna być to wartość parzysta. Rozkazy skoków warunkowych w mikroprocesorze 8086 mogą być wyłącznie skokami względnymi - względem bieżącej wartości licznika rozkazów o ograniczeniu zakresu skoku do {-28 +27} względem początku następnego (w pamięci) rozkazu. Warunki badane dla ustalenia efektywności wykonania rozkazu dotyczą tylko stanu wskaźników OF, CF, SF, ZF i PF w słowie stanu (rejestrze flag F) : rozkazy skoku warunkowego warunki efektywności JA, JNBE CF=0 i ZF=0 JAE, JNB, JC CF=0 JB, JC, JNAE CF= JBE, JG, JNA, JNLE CF=0 lub ZF=0 JE, JZ ZF= JGE, JNL SF=OF JL, JNGE SF OF JLE, JNG SF OF lub ZF= JNE, JNZ ZF=0 JNO OF=0 JNP, JPO PF=0 JNS SF=0 JO OF= JP, JPE PF= JS SF=. Poniżej przedstawiono rozwinięcia skrótów mnemonicznych rozkazów skoku warunkowego: JA Jump If Above; JAE Jump If Above or Equal; JB Jump If Below; JBE Jump If Below or Equal; JC Jump If Carry; JCXZ Jump if CX Register Zero; JE Jump If Equal; JG Jump If Greater; JGE Jump If Greater or Equal; JL Jump If Less; JLE Jump If Less or Equal; JNA Jump If Not Above; JNAE Jump If Not Above or Equal; JNB Jump If Not Below; 53

Wstęp do systemów komputerowych JNBE Jump If Not Below or Equal; JNC Jump If No Carry; JNE Jump If Not Equal; JNG Jump If Not Greater; JNGE Jump If Not Greater or Equal; JNL Jump If Not Less; JNLE Jump If Not Less or Equal; JNO Jump If No Overflow; JNP Jump If No Parity; JNS Jump If No Sign; JNZ Jump If Not Zero; JO Jump If Overflow; JP Jump If Parity; JPE Jump If Parity Even; JPO Jump If Parity Odd; JS Jump If Sign; JZ Jump If Zero. 54

Mikroprocesory 8086 i 8088 Specyficznym rozkazem skoku warunkowego jest jednoargumentowy rozkaz pętli LOOP. Rozkaz ten służy zwykle do zamykania pętli programowej, w której licznikiem wykonań jest rejestr CX. Wykonanie polega na zmniejszeniu rejestru CX o i zbadaniu wyniku, czy jest on różny od zera. Skok jest efektywny, gdy zawartość CX po zmniejszeniu jest różna od zera. Odmianami tego rozkazu są LOOPE i LOOPZ, w których dla efektywności skoku dodatkowo musi być spełniony warunek ZF=, oraz LOOPNE i LOOPNZ, w których dla efektywności skoku dodatkowo musi być spełniony warunek ZF=0. Rozwinięcia skrótów mnemonicznych: LOOP Loop on Count; LOOPE Loop While Equal; LOOPNE Loop While Not Equal; LOOPNZ Loop While Not Zero; LOOPZ Loop While Zero. Należy pamiętać, że rozkazy pętli, podobnie jak pozostałe rozkazy skokowe nie zmieniają wartości wskaźników (słowa stanu w rejestrze F). Wśród rozkazów skoków warunkowych jeden - JCXZ - wykonywany jest nie w zależności od wartości wskaźników, lecz w zależności od wyniku badania zawartości rejestru CX: skok jest efektywny, gdy zawartość CX jest równa zeru. W przestrzeni adresowej pamięci mikroprocesora 8086 wydzielony został obszar początkowy o pojemności KB: od adresu 00000H do 003FFH, przeznaczony na tzw. wektory przerwań. Wektorem przerwania o numerze x nazywa się zawartość dwóch kolejnych słów pamięci o adresach 4*x i 4*x+2. Numer przerwania nazywany jest także typem przerwania. Łatwo zauważyć, że w obszarze wektorów mieści się 256 wektorów przerwań. Wektor przerwania interpretowany jest zawsze jako adres międzysegmentowy (typu FAR) gdzie wartość OFFSET pamiętana jest pierwsza (adres 4*x) zaś SEGMENT jako druga (adres 4*x+2). Sekwencja przerwania o numerze x w mikroprocesorze 8086 składa się z następujących kroków: wykonanie działań odpowiadających rozkazowi PUSHF, czyli odłożenie na stos zawartości rejestru znaczników F; wykonanie działań odpowiadających wykonaniu rozkazu CALL DWORD PTR 0000H:(4*x), czyli: odłożenie na stos zawartości rejestru CS; odłożenie na stos zawartości rejestru IP; ładowanie do rejestru IP zawartości słowa o adresie 4*x, zaś do rejestru CS słowa spod adresu 4*x+2; wyzerowanie flag IF i TF. Sekwencja przerwania może zostać spowodowana sygnałem żądania przerwania wymuszanym sprzętowo, lub też zostać zainicjowana w wyniku wykonania jednoargumentowego rozkazu przerwania INT x. Argumentem rozkazu INT jest zawsze stałą (adresowanie natychmiastowe) o wartości równej numerowi żądanego przerwania, z zakresu <0..255>. Poza omawianą postacią rozkazu INT - np. INT 5, występuje postać bezargumentowa tego rozkazu: INT (tzw. breakpoint), 5

Wstęp do systemów komputerowych wykonywana identycznie jak rozkaz INT 3; występuje ponadto jedyny rozkaz przerwania warunkowego INTO (przerwanie przy nadmiarze), bezargumentowy, wykonywany jak INT 4 jeśli OF=, zaś nie powodujący żadnych działań jeśli OF=0. Bezargumentowy rozkaz powrotu z przerwania IRET powoduje w mikroprocesorze 8086 wykonanie sekwencji powrotu, czyli: - zdjęcie ze stosu słowa do rejestru IP; - zdjęcie ze stosu słowa do rejestru CS; - zdjęcie ze stosu słowa do rejestru znaczników F. 5.3.7. Inne wybrane rozkazy Następujące bezargumentowe rozkazy pozwalają manipulować stanem wskaźnika CF (przeniesienia globalnego) w mikroprocesorze 8086: CLC - polecający wyzerować CF; STC - powodujący ustawienie CF w stan ; CMC - powodujący zmianę stanu CF na przeciwny. W mniejszym zakresie można sterować stanami flag DF (kierunku dla rozkazów łańcuchowych) oraz IF (maski przerwań), służą do tego bezargumentowe rozkazy: CLD - zerujący DF; STD - ustawiający DF w stan ; CLI - zerujący IF; STI - ustawiający IF w stan. Rozkazem nie powodującym żadnego działania jest bezargumentowy rozkaz NOP zajmujący bajt w pamięci. Istnieje bezargumentowy rozkaz stopu HLT wprowadzający mikroprocesor w stan zatrzymania ("stopu"). W stanie stopu po wykonaniu rozkazu HLT procesor nie pobiera rozkazów, ale przyjmuje sygnały żądania przerwań zewnętrznych (NMI zawsze, pozostałe, jeśli są niezamaskowane, tzn. IF=); stan licznika rozkazów wskazuje na następny rozkaz po HLT. Sekwencja przerwania powoduje wyjście procesora ze stanu zatrzymania. 6