Skrypt z WSK

Transkrypt

Skrypt z WSK
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 16 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 16 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 1/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.1. Przestrzeń adresowa
Przestrzeń adresowa pamięci mikroprocesora 8086 obejmuje 1 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 1 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 16 (10H). 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
1 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 * 16 + OFFSET
lub w postaci binarnej:
SEGMENT
1 1 1 1 1 1 9 8 7 6 5 4 3 2 1 0 0 0 0 0
5 4 3 2 1 0
OFFSET
1 1 1 1 1 1 9 8 7 6 5 4 3 2 1 0
5 4 3 2 1 0
Adres
fizyczny
1 1 1 1 1 1 1 1 1 1 9 8 7 6 5 4 3 2 1 0
9 8 7 6 5 4 3 2 1 0
+
Przyjęto zasadę zapisu adresów fizycznych w następującej konwencji:
SEGMENT:OFFSET
np. zapis 20H:10H oznacza adres fizyczny 210H (zaś 0FEDBH:1BH wyznacza adres
0FEDCBH).
Przeniesienie jest ignorowane (0FEDBH:1111H = 0FEC1H). 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, 10H:300H, 20H:200H, 30H:100,
0:400H, 1FH:210H 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 14 szesnastobitowych rejestrów widocznych dla
programisty:
40
Mikroprocesory 8086 i 8088
98
76543210
14 12 10
15 13 11
Rejestry ogólnego przeznaczenia
Akumulator
AX
AH
AL
Rejestr bazowy
BX
BH
BL
Rejestr zliczający (licznik)
CX
CH
CL
Rejestr danych
Rejestry adresowe
Wskaźnik rozkazu
DX
DH
DL
IP
Wskaźnik wierzchołka stosu
SP
Wskaźnik bazy
BP
Indeks źródła
SI
Indeks celu
Rejestry segmentowe
Rejestr segmentu kodu
DI
CS
Rejestr segmentu stosu
SS
Rejestr segmentu danych
DS.
Rejestr segmentu dodatkowego
Rejestr stanu
Rejestr znaczników
ES
F
1. 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 1 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 1 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
41
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ć:
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
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 1) przerwanie nr 3, z jednoczesnym
zgaszeniem TF, po wykonaniu jednego rozkazu - wykorzystywany przez
specjalistyczne oprogramowanie uruchomieniowe;
IF - bit 9 SW, zezwala (stan 1) na przyjmowanie przerwań zewnętrznych;
wyzerowanie tego bitu powoduje zablokowanie przyjmowania przerwań
zewnętrznych, poza tzw. przerwaniem niemaskowalnym (NMI);
DF - bit 10 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=1).
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 1;
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_1{,id_argumentu_2}}
gdzie:
mnemo - oznacza mnemoniczny skrót angielskiej nazwy funkcji rozkazu;
id_argumentu_1 - oznacza identyfikator argumentu 1;
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:
1. Natychmiastowy, gdy identyfikatorem jest zadana wartość argumentu (stała), np.
w rozkazie MOV AX,123 gdzie stałą podkreślono.
2. Rejestrowy, gdy identyfikatorem jest nazwa rejestru, którego zawartość ma być
argumentem rozkazu np. w rozkazie MOV AX,123 gdzie podkreślono nazwę
rejestru.
3. Bezpośredni, gdy identyfikatorem jest adres (OFFSET) jednostki informacji
przechowywanej w pamięci, np. w rozkazie MOV AX,[123] gdzie podkreślono
zapis adresu (dostęp nastąpi pod adres DS:123).
4. Bazowy, gdy identyfikatorem jest adres (OFFSET) zawarty przynajmniej
częściowo w rejestrze bazowym BX lub BP, np.: MOV DX,[BX+0E12H] gdzie
podkreślono zapis adresu (dostęp nastąpi pod adres DS:(bx+0E12H), 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+0E12H] gdzie
podkreślono zapis adresu (dostęp nastąpi pod adres DS:(si+0E12H), 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+0E12H] gdzie podkreślono zapis adresu (dostęp nastąpi pod adres
DS:(bx+si+0E12H), 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],10 lub MOV WORD PTR [BX],10; w
niektórych debuggerach kod operacji powinien w omawianym przypadku być
rozszerzony o literę B w przypadku rozkazów bajtowych, np.: MOVB [BX],10
lub o literę W w przypadku rozkazów działających na słowach MOVW [BX],10;
błędny jest zapis MOV [BX],10.
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.1. 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 1 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=1, 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,[123] ; słowo spod adresu DS:123 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,[123] ; AX <---> słowo spod adresu DS:123
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 1. 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 1;
DEC - zmniejszenie o 1.
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 1 modulo 28 lub 216. 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 1
lub rejestr CL. Przesunięcia może odbywać się zatem o 1 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
1
0
◄▬ 0
CF ◄▬
SAR
7
S▬►
6
7
6
5
4
3
2
1
0
▬►
CF
▬►
CF
SHR
0
5
4
3
2
1
0
▬►
ROR
┌─────────────────────────── ─┐
│
▼
6
5
4
3
2
1
0
─┴►
CF
ROL
┌─ ───────────────────────────┐
│ 7
6
5
4
3
2
1
▼
CF ◄┴─
RCR
┌─────────────────────────────────┐
▼
6
5
4
3
2
1
0
│
▬► CF
RCL
┌────────────────────────────────┐
│
7
6
5
4
3
2
1
▼
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 1.
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 1
(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=1 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=1 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
51
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. ±128 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 (1 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. 128 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 {-128…+127} 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=1
JBE, JG, JNA, JNLE
CF=0 lub ZF=0
JE, JZ
ZF=1
JGE, JNL
SF=OF
JL, JNGE
SF≠OF
JLE, JNG
SF≠OF lub ZF=1
JNE, JNZ
ZF=0
JNO
OF=0
JNP, JPO
PF=0
JNS
SF=0
JO
OF=1
JP, JPE
PF=1
JS
SF=1.
Poniżej przedstawiono rozwinięcia skrótów mnemonicznych rozkazów skoku
warunkowego:
JA
JAE
JB
JBE
JC
JCXZ
JE
Jump If Above;
Jump If Above or Equal;
Jump If Below;
Jump If Below or Equal;
Jump If Carry;
Jump if CX Register Zero;
Jump If Equal;
JG
JGE
JL
JLE
JNA
JNAE
JNB
Jump If Greater;
Jump If Greater or Equal;
Jump If Less;
Jump If Less or Equal;
Jump If Not Above;
Jump If Not Above or Equal;
Jump If Not Below;
53
Wstęp do systemów komputerowych
JNBE
JNC
JNE
JNG
JNGE
JNL
JNLE
JNO
JNP
JNS
JNZ
JO
JP
JPE
JPO
JS
JZ
54
Jump If Not Below or Equal;
Jump If No Carry;
Jump If Not Equal;
Jump If Not Greater;
Jump If Not Greater or Equal;
Jump If Not Less;
Jump If Not Less or Equal;
Jump If No Overflow;
Jump If No Parity;
Jump If No Sign;
Jump If Not Zero;
Jump If Overflow;
Jump If Parity;
Jump If Parity Even;
Jump If Parity Odd;
Jump If Sign;
Jump If Zero.
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 1 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=1, 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 1 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=1, 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 1;
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 1;
CLI - zerujący IF;
STI - ustawiający IF w stan 1.
Rozkazem nie powodującym żadnego działania jest bezargumentowy rozkaz
NOP zajmujący 1 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=1); stan licznika rozkazów
wskazuje na następny rozkaz po HLT. Sekwencja przerwania powoduje wyjście
procesora ze stanu zatrzymania.
6

Podobne dokumenty