2.
Mikroprocesor 16-bitowy 8086
71
2.1. Architektura mikroprocesora
___________________________________________________________
Pierwszy 16-bitowy mikroprocesor firmy Intel został wyprodukowany dla rodziny
komputerów osobistych firmy IBM. Kolejne ulepszenia tego układu uwzględniają kody pro-
cesora podstawowego. Mimo znacznej rozbudowy listy rozkazów nowych procesorów oraz
wprowadzenia dodatkowych rozwiązań w ich architekturze, istnieje możliwość pracy w trybie
procesora 8086.
Zarówno mikroprocesor 8086 jak i jego następcy komunikują się z otoczeniem za
pośrednictwem wspólnej magistrali, używanej zarówno do generowania adresów i wektorów
danych. Schemat blokowy mikroprocesora 8086 przedstawiono na rys. 2.1.
Centralny blok przetwarzający procesora składa się z dwóch części:
" układu sprzęgającego magistral (BIU - Bus Interface Unit).
" układu wykonawczego (EU - Execution Unit),
Pomijając 16-bitową architekturę wewnętrznych układów przetwarzających procesor
8086 jest znacznie bardziej sprawnym układem od jego 8-bitowych poprzedników, z uwagi
na bogatszą listę rozkazów oraz dużą różnorodność trybów adresacji.
Do podstawowych danych mikroprocesora 8086 zaliczamy:
" 20 linii adresowych definiujących bezpośrednio 220 = 1 MB komórek pamięci,
" 16 linii adresowych dla rozkazów definiujących lokacje 216 = 64 KB portów WE/WY,
" dwa niezależne układy operacyjne:
72
- dla realizacji rozkazu bieżącego (EU),
- dla równoległego pobierania rozkazu następnego (BIU),
" dwa tryby przetwarzania:
- w układzie maksymalnym ,
- w układzie minimalnym,
" możliwość współpracy z rodziną 8-bitowych układów sprzęgających firmy Intel stosowa-
nych również w otoczeniu mikroprocesorów 8-bitowych.
magistrala zewnętrzna
bufor We/Wy
adres/dane
20-bitowy adres, 16-bitowe dane
magistrala - adres/dane
sumator
adresu
6
5
4
kolejka
rozkazów
3
ES
blok sprzęgający
2
magistral
CS
1 (BIU)
SS
DS
IP
jednostka
sterująca
magistrala ALU
blok wykonawczy
(EU)
rejestry przejściowe
AH AL
BL
BH
CH
CL
DH
DL
ALU
SP
BP
SI
DI
rejestr wskazników
Rys. 2.1. Schemat blokowy mikroprocesora Intel 8086
73
Układ wykonawczy (EU)
Układ wykonawczy procesora 8086 zawiera szesnastobitową ALU współpracującą Z
rejestrami wskaznikowymi oraz rejestrami wewnętrznymi. Wszystkie rejestry i magistrale
wewnętrzne układu wykonawczego są 16-bitowe. Układ wykonawczy nie ma bezpośredniego
kontaktu z magistralą zewnętrzną. Rozkazy są do niej przekazywane z bloku rejestrów FIFO
(First-In First-Out) zwanego kolejką rozkazów. Kolejka rozkazów jest zapełniana za pośred-
nictwem układu sprzęgającego BIU. Wszystkie wektory adresowe generowane w obrębie
układu wykonawczego są 16-bitowe, choć układ sprzęgający magistrali steruje dwudziestoma
liniami adresującym 1 MB przestrzeni pamięciowej. Zadanie układu wykonawczego jest
dekodowanie i wykonywanie rozkazów gromadzonych w kolejce. W trakcie wykonywania
rozkazów w układzie wykonawczym układ sprzęgający magistrali zewnętrznej otrzymuje
zezwolenie na pobranie rozkazu następnego z pamięci programu. Gdy kolejnym bajtem w
pamięci to dane, zostają one pominięte w operacji przesłania do kolejki rozkazów. Gdy zaś
EU realizuje rozkaz skoku lub wywołania podprogramu, następuje wtedy wyzerowanie kolej-
ki i pobranie za pośrednictwem BIU rozkazów z przestrzeni pamięci związanej z tym rozga-
łęzieniem.
Układ wykonawczy zawiera:
" 16-bitową jednostkę arytmetyczno-logiczną,
" układ sterowania z rejestrem rozkazów,
" cztery 16-bitowe rejestry użytkownika: AX, BX, CX, DX;
lub cztery pary po 8 bitów: AL, AH, BL, BH, CL, CH, DL, DH (odpowiednio, L - młod-
szy, H - starszy bajt);
" cztery 16-bitowe rejestry adresacji:
SP (Stack Pointer) - wskaznika stosu,
BP (Base Pointer) - wskaznika bazy,
SI (Source Pointer) - indeksowy zródła danych,
DI (Destination Pointer) - indeksowy przeznaczenia danych, ,
" 16-bitowy rejestr wskazników (rejestr flagowy).
Układ sprzęgający magistrali (BIU)
Układ sprzęgający BIU (Bus Interface Unit) procesora 8086 przesyła dane między
procesorem a pamięcią operacyjną lub układami WE/WY pod nadzorem układu wyko-
nawczego. W czasie gdy układ wykonawczy realizuje kolejny rozkaz, BIU pobiera nowy
74
rozkaz z pamięci operacyjnej i przekazuje go do kolejki. Wykorzystuje w ten sposób stan
wolnej magistrali zewnętrznej w trakcie operacji przetwarzania wewnętrznego w obrębie
układu wykonawczego procesora. W procesorach poprzedniej (drugiej) generacji pobranie
kolejnego rozkazu było uwarunkowane zakończeniem rozkazu poprzedniego. Zasada równo-
ległego współdziałanie obu układów wewnętrznych procesorów trzeciej generacji została
pokazana na rys.2.2 jako schematem rozdziału faz pobrania - Fetch i wykonania - Execute.
Pobranie rozkazu i jego wykonanie w procesorze trzeciej generacji odbywa się z pełnym
wykorzystaniem faz dostępu do magistrali zewnętrznej procesora (A - magistrala aktywna).
Jeśli założymy równość czasów trwania poszczególnych cykli dla obu procesorów, można
zauważyć istotne przyspieszenie przetwarzania informacji (rys. 2.2b). Drugim istotnym zada-
niem układu sprzęgającego BIU jest wyznaczania adresu fizycznego na podstawie 16-
bitowych danych przekazywanych z EU. Zasady wyznaczania adresów 20-bitowych omó-
wiono w dalszej części podręcznika. Ich umiejętne wykorzystanie może dać znaczne skróce-
nie zapisu programu, zmniejszenie wymiarów pamięci operacyjnej niezbędnej dla zapisu
programu i danych oraz (w konsekwencji tych oszczędności) przyspieszenie procedur prze-
twarzania.
a)
CPU: Execute Write Fetch Execute Fetch Read Execute Fetch
BUS: A A A A A
b)
EU: Execute Execute Execute
BIU: Fetch Fetch Write Fetch Read Fetch
BUS: A A A A A A
Rys. 2.2. Schemat ideowy równoległego współdziałania bloków EU i BIU:
a) szeregowe pobranie i wykonanie rozkazów,
b) równoległe pobranie i wykonanie rozkazów.
Flagi
Procesor 8086 ma dziewięć 1-bitowych wskazników (bitów flagowych), których
wartości są zapisywane w 16-bitowym rejestrze flagowym. Rozmieszczenie bitów flagowych
pokazano na rys.2.3.
75
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- - - - O D I T S Z - A - P - C
Rys. 2.3. Rejestr wskaznikowy mikroprocesora 8086
Wskazniki można podzielić na dwie grupy: znaczniki stanu wewnętrznego i znaczniki
rozkazów sterujących.
Do znaczników stanu wewnętrznego zaliczamy:
C (Carry) - przeniesienie; wartość 1 na tej pozycji oznacza przeniesienie ze-
wnętrzne dla operacji arytmetycznych całkowitoliczbowych,
P (Parity) - parzystość; wartość 1 na tej pozycji oznacza parzystą liczbę jedynek
wyniku dowolnej operacji,
A (Auxiliary-Carry) -
- przeniesienie połówkowe; wartość 1 na tej pozycji oznacza obecność
przeniesienia po czwartym bicie rezultatu operacji arytmetycznych
BCD,
Z (Zero) - zero; wartość 1 na tej pozycji oznacza rezultat 0 operacji,
S (Sign) - znak; wartość 1 sygnalizuje ujemny wynik operacji arytmetycznej
całkowitoliczbowej,
O (Over-flow) - przepełnienie;1 na tej pozycji oznacza zbyt dużą liczbę dla wyniku
operacji arytmetycznej całkowitoliczbowej.
Do znaczników sterujących zaliczamy:
T (Trap) - jest znacznikiem pracy krokowej procesora, gdy T = 1 wówczas pro-
cesor przechodzi do pracy krokowej, tzn. następuje zatrzymanie po
każdym rozkazie, wywoływane jest przerwanie o numerze 1 a CPU
przesyła zawartość rejestru flagowego na stos (jak dla obsługi prze-
rwań). W pamięci wskazywanej przez sumę zawartości IP oraz CS
dla INTn =1 należy wpisać program obsługi tego żądania przerwania
(np. badanie stanu przycisku).
I (Interrupt enable) - znacznik wskazujący, czy wejście przerwania maskowanego
INTR jest odblokowane (I = 1), czy zablokowane (I = 0),
D (Direction) - znacznik sterowania kierunkiem zmian zawartości rejestrów SI i DI:
- dla D = 0, zawartość SI i DI zwiększa się o 1 przy operacjach 8-
bitowych a o 2 przy operacjach 16 - bitowych,
76
- dla D = 1, zmniejsza się zawartość tych rejestrów o 1 przy operacjach
8 - bitowych i o 2 przy operacjach 16 - bitowych.
Znaczniki stanu wewnętrznego są ustawiane w wyniku realizacji określonych operacji
arytmetycznych lub logicznych procesora, natomiast znaczniki sterujące rejestru wskazników
są ustawiane za pomocą odpowiednich rozkazów sterujących procesora w celu wymuszenia
określonego trybu pracy.
Rejestry ogólnego przeznaczenia
Procesory 16-bitowe zawierają blok ośmiu 16-bitowych rejestrów ogólnego przezna-
czenia. Można w nich wyróżnić trzy grupy rejestrów o zdefiniowanym przeznaczeniu:
" rejestry danych: cztery 16-bitowe w których wyróżniono bajt starszy (H - high) i bajt
młodszy (L - low).
" rejestry wskazników adresowych: stosu i bazy,
" rejestry indeksów adresowych: zródła i miejsca przeznaczenia.
Niektóre grupy rozkazów odnoszą się do operandów 8-bitowych inne do 16-bitowych.
Rozkazy operujące słowem 16-bitowym oznaczono tak samo jak w liście rozkazów proceso-
rów 8-bitowych przez X; tj. bajt starszy i bajt młodszy tego samego rejestru.
Rejestry segmentowe
Megabajt przestrzeni pamięciowej jest adresowany przez procesor, za pomocą 20-
bitowej magistrali adresowej. Obszar pamięci podzielono na segmenty po 64 KB każdy a
procesor ma bezpośredni dostęp do czterech segmentów. Lokacja początkowa tych segmen-
tów (16 starszych bitów słowa 20 bitowego) jest zapisywana w rejestrach segmentowych:
CS (code), DS (data), SS (stack), ES (extra).
Segment kodów - CS, wskazuje część adresu (16 bitów), odnoszącą się do obszaru
pamięci, w który zapisano kody rozkazów.
Segment stosu - SS, zawiera 16 bitów adresu, które lokalizują obszar pamięci trakto-
wany jako stos, przechowujący dane restartów przerwań.
Segment danych - DS, wskazuje 16 bitów adresu komórek pamięci które zawierają dane;
głównie zmienne programu.
Segment dodatkowy - ES, który jest używany jako dodatkowy obszar pamięci do zapisu
danych programu.
77
Wskaznik instrukcji
IP (instruction pointer), zwany wskaznikiem instrukcji lub wskaznikiem rozkazów,
jest odpowiednikiem licznika programu (PC) procesorów 8-bitowych. Zawartość wskaznika
rozkazów jest modyfikuje układ sprzęgający magistrali (BIU). Przed zapisaniem IP do stosu
następuje modyfikacja jego zawartości, tak aby po powrocie do tej lokacji został wskazany
następny rozkaz w programie. W czasie normalnej pracy procesora IP zawiera offset adresu
wskazujący kolejny rozkaz w segmencie programu.
78
2.2. Techniki adresacji mikroprocesorów 16-bitowych
___________________________________________________________
Program pracy komputera jest zapisywany ciągiem wektorów binarnych zarejestrowa-
nych w jego pamięci. Zawiera on zbiór rozkazów wykonujących operacje na danych binar-
nych. Dane do operacji są zawarte w pamięci, w rejestrach otaczających procesor lub bufo-
rach pamięci pośredniczących, usytuowanych między procesorem i urządzeniami WE/WY.
Lokacja danych jest definiowana za pomocą określonych kombinacji wartości zmiennych
adresowych.
Długość słowa adresowego określa liczbę adresowanych komórek pamięci. Najprost-
sza deklaracja bieżącego adresu polega na podaniu w programie wszystkich bitów adreso-
wych. Taka zasada adresacji jest jednak najkosztowniejsza, zajmuje, bowiem najwięcej pa-
mięci operacyjnej, a czas realizacji takiego programu jest najdłuższy. W celu uproszczenia
procedur adresacji wprowadzono szereg dodatkowych sposobów określania bieżącego (fi-
zycznego) adresu operandu.
Poniżej są wymienione podstawowe sposoby określania tzw. adresu bieżącego stoso-
wane w mikroprocesorach firmy Intel:
Adres Bieżący ! Adres Operandu + Modyfikator + ... + Modyfikator
Następne adresy wylicza się na podstawie adresów poprzednich operandu i modyfika-
torów adresów. Modyfikator jest zawarty w określonym rejestrze procesora lub w komórce
pamięci.
79
Przez umiejętne korzystanie z dostępnych trybów adresacji można uzyskać znaczny
wzrost efektywności obliczeń komputera
Adresacja bezpośrednia
Adresacja bezpośrednia (direct addressinig) polega na podaniu pełnego adresu ope-
randa bezpośrednio w programie. Ten adres jest bezpośrednim identyfikatorem lokacji ko-
mórki pamięci lub rejestru komputera.
Na rys 2.4 podano przykład przekazywania danych między wybranymi rejestrami
wewnętrznymi procesora; z pary BX do akumulatora 16-bitowego AX. Adresy operandów są
zapisane w kodzie rozkazu przesyłu danych.
(a) (b)
kopiowanie
AX 1111000011110000 1010101010101010 AX
BX 1010101010101010 1010101010101010 BX
CX 0000111100001111 0000111100001111 CX
MOV AX,BX
Rys. 2.4. Przykład adresacji bezpośredniej, dla przekazywania danych z rejestru do rejestru:
(a) - stan przed operacją, (b) - stan po operacji
Na rys. 2.5 przedstawiono inny przykład adresacji bezpośredniej dla przekazywania
danych z komórki pamięci wskazywanej przez adres adr do podanego w rozkazie rejestru
akumulatorowego.
Do rejestru AX wpisane zostają dwa kolejne bajty słowa 16-bitowego, zapisane w
pamięci według kolejności: młodszy a następnie starszy bajt słowa.
PAO
0041 H 01010101 1111000000001111 AX
zawartość rejestru AX
0042 H 00001111
po wykonaniu operacji
kopiowanie
0043 H 11110000
0044 H 11001100
0045 H 11111111 MOV AX,adr ;
etykieta adr wskazuje
16-bitowy adres: 42,43
adresy
Rys. 2.5. Przykład transferu danych z pamięci (PAO) komputera
do wskazanego rejestru (AX) z adresacją bezpośrednią (adr)
80
Adresacja pośrednia
Adresacja pośrednia (indirect addressing) polega na wskazywaniu lokacji operandu za
pomocą zawartości określonego rejestru procesora (Rys. 2.6) lub komórki pamięci operacyj-
nej (PAO). Przykładowy procesor dokonuje automatycznej zmiany zawartości tego reje-
stru/komórki pamięci (increment lub decrement) po wykonaniu operacji adresacji.
zawartość rejestru AX
PAO po wykonaniu operacji
kopiowanie
0041 H 01010101 1111000000001111 AX
0042 H 00001111 0000000001000010 BX
0043 H 11110000
0044 H 11001100
zawartość BX jest
MOV AX,[BX] ;
16-bitowym adresem: 42,43
0045 H 11111111
adresy
Rys. 2.6. Przykład adresacji pośredniej zawartością [BX] wskazanego
rejestru wewnętrznego mikroprocesora
Pokazany na rysunku przykład ilustruje zasady przepisywanie zawartości dwóch
komórek pamięci wskazywanych zawartością rejestru BX oraz jego inkrementowanej o 1
wartości ( [BX + 1]) lub ((BX) + 1).
Do tej grupy zaliczyć można również adresowanie stosu pamięci; zawartością specjal-
nego rejestru zwanego wskaznikiem stosu (SP - Stack Pointer), podobnie jak w przykładzie
dla adresacji pośredniej pokazanym na rys.2.6.
Adresacja względna
Adres względny (relative address) obliczamy względem adresu początku strony (sek-
cji) przez dodanie do niego zawartości określonego rejestru wewnętrznego procesora. Jest to
tzw. przemieszczenie adresowe (DISP - Displacement lub Offset). Przemieszczenie dotyczy
adresu wewnątrz strony - od adresu bazy o określaną liczbę komórek pamięci. Na rys. 2.7 jest
podany przykład adresacji względnej zawartością rejestru BX z przemieszczeniem 2.
81
zawartość rejestru AX
PAO po wykonaniu operacji
kopiowanie
0041 H 01010101 1111111111001100 AX
0042 H 00001111 0000000001000010 BX
0043 H 11110000
0044 H 11001100
0045 H 11111111 MOV AX,[BX] + 2 ; zawartość BX oraz
przemieszczenie wskazują
16-bitowy adres: 44,45
adresy
Rys. 2.7. Przykład adresacji względnej, zawartością rejestru
bazowego BX z przemieszczeniem 2
Operacja :
MOV AX,[BX] + 2 oznacza wpisanie do rejestru AX zawartości komórki pamięci wskazy-
wanej przez zawartość rejestru BX - bazy i przemieszczenia o 2 komórki pamięci (Offset = 2)
oraz kolejnego bajtu w pamięci. Dane są czytane z pamięci w kolejności młodszy bajt a na-
stępnie starszy bajt i w takiej kolejności wpisywane w odpowiednie części rejestru AX.
Adresacja natychmiastowa
Zapis danych w komórce pamięci następującej po lokacji kodu operacji nazywa się
adresacją natychmiastową (immediate addressing). Co oznacza że, w polu operandu występu-
jącym po kodzie operacji zapisane są dane dla tej operacji. Przykład adresacji natychmiasto-
wej przedstawiono na rys. 2.8.
zawartość rejestru AX
PAO po wykonaniu operacji
kopiowanie
0110010001110111 AX
0042 H 00001111
0043 H 10111000
0044 H 01100100
0000000001000011 IP
0045 H 01110111
adresy
MOV AX,6477H ;
adres zawarty w IP z
przemieszczeniem 0
Rys. 2.8. Przykład adresacji natychmiastowej (względnej z zawartością IP z przemieszcze-
niem 0)
82
Można to również uznać za szczególny przypadek adresacji względnej z adresem bazy
zawartym we wskazniku rozkazów (IP) z przemieszczeniem 0.
Adresacja indeksowana
Adres indeksowany (indexed address) obliczamy jako sumę podanego w rozkazie
adresu i zawartości rejestru indeksowego [SI], np:
MOV AX, adr[SI] oznacza wpisanie do rejestru AX zawartości
komórki pamięci adresowanej sumą
adresu adr i zawartości rejestru indeksowego [SI].
Na rys. 2.9 przedstawiono przykład adresacji indeksowanej z indeksem [SI]=3 dla
przekazywania danych z dwóch komórek pamięci o adresach 44H i 45H do 16-bitowego
rejestru wewnętrznego procesora, AX.
zawartość rejestru AX
PAO po wykonaniu operacji
adr
0041 H 01010101 1111111111001100 AX
0042 H 00001111
0043 H 11110000
kopiowanie
0044 H 11001100 0000000000000011 SI
0045 H 11111111
etykieta (adr=41H) + [SI]
MOV AX,adr[SI]
określa 16-bitowy adres: 44,45
adresy
Rys. 2.9. Przykład adresacji indeksowanej dla transferu
danych z pamięci do rejestru procesora
Oprócz wymienionych poprzednio czterech podstawowych trybów adresacji spotyka-
my różne kombinacje tych technik. Na przykład w mikroprocesorach firmy Intel można spo-
tkać kombinację adresacji pośredniej z indeksowaną. W tym celu procesor wyposażono w
specjalny rejestr bazowy BP (Base Pointer) - wskaznik bazy.
Operacja:
MOV AX, [BP][SI] oznacza wpisanie do rejestru AX zawartości dwóch komórek pamięci o
adresach określanych sumą zawartości rejestru BP - adresu bazowego i rejestru SI - indeksu
przemieszczenia. Przykład na rys. 2.10 ilustruje zasady realizacji operacji przemieszczenia
danych, z pamięci operacyjnej do rejestru AX, z adresacją pośrednią indeksowaną.
83
zawartość rejestru AX
PAO [BP] po wykonaniu operacji
0041 H 01010101 1111111110011001 AX
0042 H 00001111
0043 H 11110000 + 0000000001000001 BP
0044 H 11001100 0000000000000011 SI
kopiowanie
0045 H 11111111
41H + 3H określa
MOV AX,[BP][SI] ;
16-bitowy adres: 44,45
adresy
Rys. 2.10. Przykład adresacji pośredniej indeksowanej
W adresowaniu operandów za pomocą procesorów 8086 i 8088 (oraz ich następni-
ków) wyróżniono trzy podstawowe zapisy adresów:
" adres fizyczny,
" adres logiczny,
" adres efektywny.
Adres fizyczny
Adres fizyczny określa stan 20-bitowego wektora zewnętrznego, lokalizującego 1 MB
komórek pamięci, od 00000 H do FFFFF H. Pisząc program w języku maszynowym, progra-
mista używa pojęcia adresu logicznego, operując krótszym formatem adresu. Jeśli to jest 16-
bitowy adres będziemy dodawać cztery bity na najstarszych pozycjach (od bitu 16. do 19.) w
przedziale wartości od 0H do FH, będziemy adresować 16 segmentów po 64 KB każdy. Tego
typu organizacja adresów została przyjęta w procesorach 8086 firmy Intel.
Adres logiczny
Adres logiczny składa się z bazy (inaczej adresu początku segmentu) zawartej w
jednym z czterech rejestrów segmentowych - CS, DS, SS i ES oraz przemieszczenia liczone-
go od bazy. Schemat ideowy metody wyznaczania adresu fizycznego pokazano na rys. 2.11.
Blok BIU przesuwa wektor adresowy bazy o cztery bity w kierunku pozycji starszych. i
dodaje do niego 16-bitowy wektor przemieszczenia.
84
19 4 0
zawartość: CS, DS, SS, ES 0 0 0 0
0 0 0 0 przemieszczenie
19 15 0
20
Rys. 2.11. Zasada wyznaczania adresu fizycznego
Adres efektywny
W literaturze można spotkać również termin adres efektywny, który jest wartością
przemieszczenia (offset) wskazującego położenie komórki pamięci w bieżącym segmencie,
licząc od początku segmentu.
Format rozkazu
Rozkazy mikroprocesora 8086 mogą zawierać od 1 do 6 bajtów. Jednobajtowe to
zwykle rozkazy sterujące znacznikami lub danymi zawartymi w rejestrach wewnętrznych
procesora. Rozkazy wielobajtowe dotyczą operacji dwuargumentowych. Na rys. 2.12 pokaza-
no format rozkazu mikroprocesora 8086.
7 6 5 4 3 2 1 0 7 . . . 0
. . . 2 1 0
7
K O D MODE REG R/M
D W
. . .
1 - bajt 2 - bajt 6 - bajt
Rys. 2.12. Format rozkazu mikroprocesora 8086
Kod jest zawarty w sześciu najbardziej znaczących bitach (7 - 2) pierwszego bajtu
rozkazowego. Bit 1 pierwszego bajtu jest opisywany jako D, S,V lub Z.
D (Direction) oznacza kierunek transmisji danych:
D = 1 przesył do rejestru wskazywanego przez bity 3,4 i 5 drugiego bajtu,
D = 0 oznacza przesył danych z rejestru lub komórki pamięci wskazywanych przez
bity 0, 1 i 2 drugiego bajtu rozkazowego.
85
S interpretujemy łącznie z W - na bicie 0 pierwszego bajtu dla adresowania natychmiastowe-
go:
SW = 01 oznacza, że trzeci i czwarty bajt rozkazu to 16-bitowy argument,
SW = 11 oznacza, że bajt trzeci jest argumentem 1-bajtowym dla operacji wykony-
wanych na słowach 2-bajtowych, np. dodanie bajtu trzeciego do zawartości
rejestru 16 - bitowego.
V jest interpretowane jako parametr przesunięcia w rozkazach przesuwania:
V = 0 oznacza jedno przesunięcie,
V = 1 liczba przesunięć jest zapisana w rejestrze CL.
W (Word) deklaruje długość operandu:
W = 0 oznacza słowo 8- bitowe,
W = 1 słowo 16-bitowe.
Z (Zero) występuje tylko w jednobajtowym rozkazie REP (repetycja) deklarującym powta-
rzanie operacji:
Z = 0 powtarzanie odbywa się aż do chwili gdy znacznik Z ( w rejestrze znaczników)
osiągnie stan 1,
Z = 1 powtarzanie do czasu, gdy znacznik Z osiągnie stan 0.
W drugim bajcie rozkazowym zapisywane są:
pole REG, które wskazuje rejestr zawierający pierwszy argument w operacjach dwu-
argumentowych, zgodnie z tablicą 2.1, w rozkazach z adresowaniem natychmiastowym.
Tablica 2.1.
Kodowanie rejestrów zawierających argumenty operacji
REG
lub W = 0 W = 1
R/M
(dla MODE=11)
000 AL AX
001 CL CX
010 BL BX
011 DL DX
100 AH SP
101 CH BP
110 BH SI
111 DH DI
Pole REG jest rozszerzeniem kodu operacji:
86
- pole MODE określa tryb pracy, to znaczy czy drugi argument znajduje się w komór-
ce
pamięci, czy w rejestrze (tabl. 2.2),
- pole R/M wskazuje rejestr drugiego argumentu (tabl. 2.1) lub sposób obliczania adre-
su logicznego (tabl. 2.3).
Tablica 2.2.
Kodowanie lokacji drugiego operandu
MODE
drugi argument w pamię ci, bez OFS
0 0 z wyją tkiem R/M = 110
drugi argument w pamię ci,
0 1
OFS jednobajtowy
drugi argument w pamię ci,
1 0
OFS dwubajtowy
1 1 drugi argument w rejestrze
Tablica 2.3.
Zasady obliczania adresu logicznego
OFS jedno- OFS dwu-
bez OFS
bajtowy bajtowy
R/M
MODE=00
MODE=01 MODE=10
000 BX + SI BX + SI + OFS BX + SI + OFS
001 BX + DI BX + DI + OFS BX + DI + OFS
010 BP + SI BP + SI + OFS BP + SI + OFS
011 BP + DI BP + DI + OFS BP + DI + OFS
100 SI SI + OFS SI + OFS
101 DI DI + OFS DI + OFS
110 OFS 2-Bajty BP + OFS BP + OFS
111 BX BX + OFS BX + OFS
Odpowiednio do wybranego trybu adresacji (MODE), pole R/M koduje sposób wy-
znaczania adresu efektywnego w adresie logicznym rozkazu. OFS oznacza przemieszczenie -
offset 1- lub 2-bajtowy.
Trzeci i czwarty bajt rozkazu (rys 2.12) zawierają przemieszczenie lub dane, a bajty 5
i 6 zawierają dane odpowiednio do rodzaju rozkazu, tak jak to wynika z zasad kodowania w
polach KOD, D, W, MODE, REG i R/W omówionych wyżej.
Adresowanie układów WE/WY
87
Układy wejściowo-wyjściowe mikroprocesorów 8086 można lokalizować w prze-
strzeni adresowej:
" jednolitej,
" rozdzielonej.
W pierwszym przypadku układy WE/WY są traktowane jako komórki pamięci i loka-
lizowane według tych samych reguł jak pamięci. W drugim przypadku używamy innych reguł
adresacji, właściwych tym układom, jak:
" adresacja bezpośrednia odnosząca się do układów WE/WY, w której po kodzie
operacji występuje 8-bitowy adres układu.
" adresacja pośrednia rejestrowa odnosząca się do rozkazów we/wy, których kod
operacji wskazuje adres zawarty w rejestrze DX mikroprocesora; ten tryb adresacji
definiuje 65535 8-bitowych lub 32768 16-bitowych układów WE/WY.
Rozdzielona adresacja układów we/wy nie jest segmentowana. Adres pojawia się na 8.
lub 16 znaczących liniach adresowych, przy czym na liniach adresowych nie zdefiniowanych
są same zera.
88
2.3. Rodzaje rozkazów
___________________________________________________________
Mikroprocesory 8088 i 8086 mają dokładnie takie same listy rozkazów. Zawierają
również rozkazy typowe dla ich poprzedników 8-bitowych (jak 8080 i 8085) oraz szereg
dodatkowe jak: mnożenie i dzielenie binarne ze znakiem, bez znaku i w kodzie BCD, opera-
cja przesyłania i porównywania tablic (o wymiarze do 64 KB), badanie wartości określonych
bitów operandów, programowe generowanie przerwań, czy instrukcje ułatwiające programo-
wanie układów wieloprocesorowych.
W procesorach 8086 prawie każdy rozkaz dotyczy zarówno bajtów jak i słów 16-
bitowych. Zmienne można dodawać, odejmować, przesuwać, porównywać, itp. bezpośrednio
w pamięci bez potrzeby wcześniejszego przenoszenia ich do rejestrów. Ta właściwość w
znacznym stopniu skraca program i przyspiesza jego realizację. Przetwarzanie jest znacznie
wydajniejsze w porównaniu z mikroprocesorami 8-bitowymi. Długość rozkazu może wynosić
od 1 do 6 bajtów. Rozkaz może być bezargumentowy, jedno lub dwu argumentowy, ale tylko
jeden z argumentów może być pobrany z pamięci operacyjnej.
Grupy rozkazów
A. Rozkazy transmisji danych
89
Rejestry/Pamięć:
MOV - prześlij bajt lub słowo,
PUSH - prześlij słowo na szczyt stosu,
POP - pobierz słowo ze szczytu stosu,
XCHG - zamień miejscami bajty lub słowa,
XLAT - pobierz bajt z tablicy.
Układy WE/WY:
IN - pobierz bajt lub słowo z (portu) rejestru wejściowego,
OUT - prześlij port lub słowo do (portu) rejestru wyjściowego.
Aadowanie adresów:
LEA - załaduj adres efektywny,
LDS - załaduj adres logiczny do wskazanego rejestru i DS,
LES - załaduj adres logiczny do wskazanego rejestru i ES.
Rejestr znaczników:
LAHF - prześlij wskazany bajt słowa znaczników do rejestru AH,
SAHF - prześlij zawartość rejestru AH do rejestru znaczników,
PUSHF - prześlij zawartość rejestru wskazników na stos,
POPF - pobierz dane ze stosu i prześlij do rejestru wskazników.
B. Rozkazy arytmetyczne i logiczne
Grupa arytmetyczna:
Dodawanie
ADD - dodawanie bajtów lub słów 16-bitowych,
ADC - dodawanie bajtów lub słów 16-bitowych z uwzględnieniem przeniesienia,
INC - dodaj 1 do bajtu lub słowa,
AAA - poprawka dla dodawania w rozpakowanym kodzie BCD,
DAA - poprawka dziesiętna dla dodawania w kodzie BCD,
Odejmowanie
SUB - odejmowanie bajtów lub słów 16-bitowych,
SBB - odejmowanie bajtów lub słów 16-bitowych z uwzględnieniem pożyczki,
DEC - odejmij 1 od bajtu lub słowa,
NEG - zaneguj lub dopełnij do 2 bajt lub słowo,
90
CMP - porównaj bajt lub słowo z innym operandem,
AAS - poprawka po odejmowaniu w rozpakowanym kodzie BCD,
DAS - poprawka dziesiętna po odejmowaniu w kodzie BCD.
Mnożenie
MUL - mnożenie bajtów lub słów 16-bitowych, bez uwzględnienia znaku,
IMUL - mnożenie bajtów lub słów 16-bitowych z uwzględnieniem znaku,
AAM - poprawka po mnożeniu w rozpakowanym kodzie BCD.
Dzielenie
DIV - dzielenie bajtów lub słów 16-bitowych bez znaku,
IDIV - dzielenie bajtów lub słów z uwzględnieniem znaku,
AAD - poprawka przed dzieleniem w rozpakowanym kodzie BCD,
CBW - zamiana bajtu na słowo,
CWD - zamiana słowa na podwójne słowo (32-bitowe),
Grupa logiczna
NOT - negacja (dopełnienie) bajtu lub słowa,
AND - iloczyn logiczny bajtów lub słów,
OR - suma logiczna bajtów lub słów,
XOR - operacja exclusiwe-or bajtów lub słów,
TEST - porównanie logiczne (test) bajtów lub słów.
Przesunięcia
SHL - przesunięcie logiczne w lewo bajtu lub słowa,
SAL - przesunięcie arytmetyczne (w kierunku bitów starszych) bajtu lub słowa,
SHR - przesunięcie logiczne w prawo bajtu lub słowa,
SAR - przesunięcie arytmetyczne w prawo bajtu lub słowa,
ROL - przesunięcie cykliczne w lewo bajtu lub słowa,
ROR - przesunięcie cykliczne w prawo bajtu lub słowa,
RCL - przesunięcie cykliczne w lewo z bitem przeniesienia bajtu lub słowa,
RCR - przesunięcie cykliczne w prawo z bitem przeniesienia bajtu lub słowa.
C. Rozkazy przetwarzania tablic lub bloków danych
91
Mikroprocesory 8086 dysponują rozkazami umożliwiającymi operowanie na łańcu-
chach, (tablicach i blokach), danych umieszczonych w zdefiniowanym obszarze pamięci
operacyjnej. W tej grupie rozkazów wykorzystuje się rejestry specjalne procesora:
" SI i DI do adresacji zródła danych,
" ES i DI do adresowania miejsca umieszczenia wyników operacji,
" CX, jako licznik operacji.
Rozkazy pojedynczych operacji:
MOVS - przepisz w pamięci wskazany element łańcucha (tablicy lub bloku)
LODS - załaduj wskazany element łańcucha do akumulatora,
STOS - zapamiętaj element tablicy lub bloku znajdujący się w akumulatorze,
SCAS - porównaj element łańcucha z zawartością akumulatora,
CMPS - porównaj elementy dwóch łańcuchów.
Rozkazy powtórzeń (przedrostki):
REP - powtórz operację pojedynczą aż do wyzerowania rejestru CX,
REPZ/REPE - powtórz operację pojedynczą aż do wyzerowania rejestru CX lub
znacznika Z, rejestru flagowego (Z=0),
REPNZ/REPNE - powtórz operację pojedynczą aż do wyzerowania rejestru CX lub
ustawienia znacznika zera; Z=1.
Realizacja powtórzeń jest związana z badaniem stanu wyzerowania licznika CX lub
innych warunków związanych z ustawianiem znacznika zera (Z). Znacznik kierunku (D = 0)
oznacza zwiększenie zawartości rejestrów SI oraz DI po jednokrotnym wykonaniu rozkazu.
Dla D = 1, po każdorazowym wykonaniu rozkazów zawartość rejestrów SI oraz DI zmniejsza
się o 1 dla bajtów lub o 2 dla słów 16-bitowych. Oznacza to automatyczne zaadresowanie
kolejnego argumentu operacji przetwarzania.
D. Rozkazy skoków
Bezwarunkowe:
JMP - zwykły,
CALL - do podprogramu,
IRET - powrót z podprogramu.
Warunkowe:
Badające stan znacznika F
92
JF dla F=1 lub JNF dla F=0,
gdzie: F reprezentuje flagi (znaczniki) procesora, jak: C, O, S, P i Z.
Badające wynik porównania dwóch argumentów
JE / JNE - równe / nierówne, Z=1 / 0,
JG / JNG - większy / nie większy, (S " O) (" (Z = 0) / (S " O) (" (Z = 1)
JGE / JNGE - większy - równy / nie większy - równy,
(S " O = 0) / (S " O = 1)
JL / JNL - mniejszy / nie mniejszy, (S " O = 1) / (S " O = 0)
JLE / JNLE - mniejszy - równy / większy,
(S " O) (" (Z = 1) / (S " O) (" (Z = 0)
JA / JNA - powyżej / nie powyżej, (C (" Z = 0) / (C (" Z = 1)
JAE / JNAE - powyżej - równo / nie jest powyżej-równo, (C = 0) / (C = 1)
JB / JNB - poniżej / nie jest poniżej, (C = 1) / (C = 0)
JBE / JNBE - poniżej - równo / nie jest poniżej - równo,
(C (" Z = 1) / (C (" Z = 0)
E. Rozkazy przerwań
Rozkazy przerwań uruchamiają mechanizmy wywołania podprogramów w identyczny
sposób jak sygnały wysyłane przez urządzenia zewnętrzne:
INT - skok do podprogramu obsługi przerwania,
INTO - jak wyżej, gdy wystąpi przepełnienie,
IRET - powrót z podprogramu obsługi przerwania do miejsca wywołania
przerwania,
F. Rozkazy sterujące procesorem
Sterowanie znacznikami:
STC - ustaw znacznik przeniesienia,
CLC - zeruj znacznik przeniesienia,
CMC - zaneguj znacznik przeniesienia,
STD - ustaw znacznik kierunku,
CLD - zeruj znacznik kierunku,
STI - ustaw znacznik przerwania,
93
CLI - zeruj znacznik przerwania.
Rozkazy synchronizacji:
HLT - zatrzymanie pracy procesora,
WAIT - stan oczekiwania procesora na zmianę poziomu logicznego wejścia
TEST z wartości niskiej na wysoką (nieaktywną),
ESC - deklaracja wyłączenia rozkazów sterujących procesora; przełączenie
na procesor zewnętrzny,
LOCK - deklaracja dostępu do magistrali na czas wykonywania następnego
rozkazu
NOP - nie rób nic (no operation).
G. Pętle programowe
Rozkazy organizacji pętli wyliczanych badają stan rejestru CX zwanego licznikiem
obiegu pętli. Korzystają z tego stanu następujące rozkazy:
LOOP - powtórz sekwencję rozkazów jeśli zawartość CX `" 0
LOOPE/LOOPZ - powtórz sekwencję rozkazów jeśli zawartość CX `" 0 lub jest
równość argumentów/ wartość równa zeru,
LOOPNE/LOOPNZ - powtórz sekwencję rozkazów jeśli zawartość (CX`"0)
lub jest nierówność argumentów/ wartość różna od zera,
JCXZ - skok względny, gdy CX = 0.
Wymienione rozkazy realizują konstrukcje programowe odpowiadające instrukcjom
Do-While, Repeat-Until w językach wysokiego poziomu (przykłady w następnym rozdziale).
Błędy powstałe podczas realizacji niektórych rozkazów powodują generowanie prze-
rwań o określonych numerach. Czasem kody błędu odkładane są na stosie. Dane takie są
wykorzystywane są przez projektantów oprogramowania użytkowego.
Rozkazy wymienione wyżej stanowią część podstawową - wspólną dla wszystkich
procesorów 16 - bitowych: 8088/8086/80186/80286 i 32 bitowych: 80386/80486/Pentium
oraz P6, firmy Intel. Poczynając od procesorów 80286 lista rozkazów jest znacznie bogatsza
od wymienionej. Dochodzą dodatkowe rozkazy dla operandów 8- i 16-bitowych oraz nowe
rozkazy dla operacji 32- i 64-bitowych.
Wyliczanie adresów rozkazów
94
Przedstawiona wcześniej lista rozkazów jest uzupełniana adresem operandów i adre-
sem miejsca przeznaczenia wyników zgodnie ze schematem na rys.2.13. Adresy są wskazy-
wane w rozkazie zawartościami rejestrów BX, BP, SI i DI oraz parametrem przemieszczenia
(jak w tabl. 2.2). Adres fizyczny jest obliczany na podstawie dodatkowego wyliczenia przez
dodanie zawartości adresowej segmentu. Zawartości segmentów mają znaczenie standardowe
i są ustalane globalnie. Mogą być również definiowane na bieżąco w formie tzw. przedrostka
rozkazu; dla określonej grupy rozkazów.
A. indeks pojedynczy B. indeks podwójny
BX BX SI
BP BP DI
kodowane
SI
w
+
rozkazie
DI
+ Ofset-OFS określony w rozkazie
CS 0000
SS 0000
segmenty standardowe
lub
DS 0000
określane przez
przedrostek
+ +
ES 0000
dla A dla B
adres fizyczny
Rys. 2.13. Schemat obliczania adresów
95
2.4. Zasady organizacji programów w językach
maszynowych
___________________________________________________________
Rozgałęzienia programów
Programowanie komputera polega na zapisie określonych operacji za pomocą ciągu
instrukcji następujących po sobie bezwarunkowo lub instrukcji rozwidlanych odpowiednio do
wyników bieżących obliczeń. W językach wysokiego poziomu (Pascal, C++, ..) programista
dysponuje odpowiednimi instrukcjami rozwidlającymi (IF warunek THEN ... , CASE wyra-
żenie OF, i inne). Pisząc programy w języku poziomu maszynowego bardzo przydatna staje
się znajomość elementów budowy procesora, a w szczególności rodzajów rejestrów we-
wnętrznych, rodzaju wskazników flagowych oraz technik adresacji dostępnych dla programi-
sty. Innymi słowy, programowanie w języku maszyny oznacza operowanie elementami archi-
tektury komputera. Rodzi się zatem pytanie, po co programiście znajomość języka poziomu
maszyny. Można łatwo dowieść, że programy napisane na niższym poziomie językowym
wymagają prostszych, czyli szybszych procedur konwersyjnych. Programy pisane w językach
ogólnego przeznaczenia, zapewne rozwiążą wiele problemów według uniwersalnych proce-
dur, które zajmują znacznie więcej czasu niż procedury dedykowane, czyli napisane w pro-
96
stej, bezpośredniej formie. Do takiej grupy zadań na pewno można zaliczyć: przetwarzanie
danych binarnych, operacje wykorzystujące rejestry przesuwające, metody bezpośredniej
ingerencji w zawartość komórek pamięci, metody zapisu grafiki bitmapowej, techniki anima-
cji obrazów, itp.
Do podstawowych zadań z zakresu technik programowania zaliczamy z pewnością
metody rozgałęzień programów, które w językach maszynowych wykonywane są bezpośred-
nio opierając się na analizie wartości bitów flagowych (rejestru wskaznikowego procesora)
lub pośrednio na podstawie analizy zawartości rejestrów wewnętrznych procesora czy zawar-
tości komórek pamięci operacyjnej.
Skoki bezwarunkowe i warunkowe
Języki wysokiego poziomu pod względem hierarchicznym i historycznym są produk-
tem pózniejszym od języków maszynowych. Z uwagi na powszechność języków wysokiego
poziomu można założyć możliwość objaśniania zasad programowania w języku maszynowym
komputera na podstawie analogii do języków wysokiego poziomu.
GOTO
Skoki bezwarunkowe do określonych segmentów programów są, w języku asemblera,
realizowane według zasad instrukcji GOTO dla języków wysokiego poziomu. Podręczniki
programowania w językach wysokiego poziomu zalecają pisanie programów tak, aby GOTO
stosowane było tylko w przypadkach koniecznych. Te same zalecenia obowiązują dla języ-
ków poziomu maszynowego. Odpowiednikiem GOTO w języku asemblera jest rozkaz JMP.
Adres komórki pamięci dla JMP w tym przypadku jest obliczany tak samo jak dla omówio-
nych w rozdz. 2 metod komunikacji z pamięcią. Choć wytrawni programiści potrafią unikać
rozwidleń GOTO, wyeliminowanie rozkazu JMP adr w języku asemblera jest sprawą znacz-
nie trudniejszą, a czasem nawet nieuzasadnioną. Podstawową instrukcją rozwidlającą w języ-
kach wysokiego poziomu jest:
IF warunek THEN GOTO etykieta
Jest to skok warunkowy (warunek logiczny) do określonego miejsca (etykiety) w
programie. Realizacja skoków warunkowych w języku asemblera polega na wykorzystaniu
rozkazów uwarunkowanych stanem wybranego wskaznika flagowego. Badany jest stan
znacznika F, według zasady:
97
wykonaj skok: JF adr dla F=1 lub JNF adr dla F=0
gdzie F reprezentuje flagi: C - (Carry) przeniesienie
O - (Ovefow) przepełnienie,
S - (Sign) znak,
P - (Parity) parzystość,
Z - (Zero) zero.
oraz: adr - adres zapisywany zwykle w formie symbolicz-
nej
Wskazniki reprezentują wyniki niektórych operacji arytmetycznych lub operacji po-
równania dwóch argumentów. Np. C - Carry, jest równe 1 gdy w wyniku wykonania operacji
arytmetycznej wystąpiło przeniesienie na najstarszym bicie. W przeciwnym przypadku C = 0.
Wartości bitów wskazników (rejestru wskazników flagowych) opisanych wcześniej.
Badanie wyników operacji arytmetycznych i skoki warunkowe wykonują rozkazy
badania bitów flagowych. Dla przykładu przeanalizujmy rozkazy skoków względnych (z
przemieszczeniem - displ.) w wyniku porównania dwóch argumentów. We wszystkich opera-
cjach skoków przedstawionych niżej nie spełnienie warunku oznacza przejście do kolejnego
rozkazu. Warunek spełniony oznacza przemieszczenie adresu wtedy licznik programu: IP !
(IP) + displ., otrzymuje nowy adres. Przemieszczenie jest zapisywane jednobajtowo ze zna-
kiem, stąd displ.: przyjmuje wartości od - 128 do + 127. Badanie przedstawionych niżej
warunków dotyczy liczb bez znaku.
JA/JNBE (above/not above-equal) jest skokiem względnym gdy badana wartość
jest wyższa od zadanej (nie jest poniżej i nie jest równa).
Działanie: - jeśli badany operand ma wyższą wartość od wartości odniesienia
(odejmowanie operandu od wartości odniesienia) wtedy zostaje wy-
konany skok. Badane są wartości dwóch bitów flagowych:
C = 0 '" Z = 0, C = 0, gdy nie ma przeniesienia oraz Z = 0, gdy nie
zachodzi równość (C jest modyfikowane również przy odejmowaniu
Jako pożyczka).
- licznik programu IP ! (IP) + displ.
JAE/JNB (above-equal/not below) reprezentuje skok, gdy badana wartość jest
powyżej lub równa wartości zadanej (nie jest poniżej).
98
Działanie: - skok jeśli badany operand ma wartość nie mniejszą niż zadana war
tość progowa, wtedy C = 0,
- licznik programu IP ! (IP) + displ.
JB/JNAE/JC (below/not above-equal/carry) oznacza skok, gdy badana wartość jest
niższa od wartości zadanej (nie wyższa lub jest przeniesienie).
Działanie: - wymienione trzy przypadki w ten sam sposób określają wartość jed-
nego bitu flagowego; C = 1.
- licznik programu IP ! (IP) + displ.
JE / JZ (equal/zero) oznacza skok, gdy badana wartość jest równa wartości
zadanej lub wynik porównania (odejmowania) jest równy zero.
Działanie: odejmowane są dwa operandy:
- warunek spełniony oznacza Z = 1
- warunek nie spełniony oznacza Z = 0
JNE/JNZ nie równy/nie zero - jest przypadkiem odwrotnym do przedstawionego
powyżej. Gdy warunek spełniony Z = 0, warunek nie spełniony Z = 1.
JG / JNLE (greater/not less-equal) oznacza skok, gdy badana wartość jest większa
od wartości zadanej, inaczej nie-mniejsza/równa.
Działanie: przypadek większy niż lub nie mniejszy-równy niż odnosi się do trzech
bitów flagowych S, O i Z.
Dla spełnionego warunku
- wynik nie jest zero, czyli Z = 0,
- lub znak S taki sam jak przepełnienie O; S"O = 0
JL / JNGE (less/not greater-equal) oznacza skok gdy badana wartość jest mniej-
sza od wartości zadanej lub nie większa-równa.
Działanie: spełniony warunek oznacza ustawienie następujących znaczników:
znaku S = 1 oraz zera Z = 0,
JLE/JNG (less-equal/not grater) oznacza skok, gdy badana wartość jest mniej-
sza/równa lub nie większa od wartości zadanej.
Działanie: spełniony warunek ustawia wartości Z = 1 lub S " O = 1.
99
Procesory 16- i 32-bitowe dysponują bogatszą listą rozkazów skoków - o podobnym
działaniu. Pełną listę takich rozkazów czytelnik znajdzie w podręcznikach programowania w
języku asemblera.
Zapis operacji skoku warunkowego w języku asemblera wydaje się znacznie prostszy
niż w językach wysokiego poziomu. Należy jednak pamiętać, że rozkazy badania wskaznika
flagowego odnoszą się do tych operacji arytmetycznych, które te wskazniki modyfikują. Z
tego też względu przed podjęciem decyzji wyboru rozkazu rozwidlającego należy dokładnie
zbadać zasady oddziaływania tych operacji na bity flagowe. To znaczy, które wskaznik są
modyfikowane przez operacje poprzedzające rozwidlenia.
Zasada badania warunków dla rozgałęzień
Badanie warunków ma miejsce nie tylko dla operacji skoków, lecz także i dla wszyst-
kich rodzajów rozgałęzień programów. Zasadę badania warunków dla instrukcji rozgałęzień
programu pokazano na rys. 2.14.
Zapis operacji badania warunku w języku wysokiego poziomu wygląda następująco:
IF "warunek" {np. A>B}
{jeśli tak, to} THEN wariant YYY programu - dla warunku spełnionego,
{a jeśli nie, to} ELSE wariant XXX programu - dla warunku niespełnionego.
IF Nie
warunek
Tak
THEN ELSE
wariant pozytywny wariant negatywny
Rys. 2.14. Schemat ideowy realizacji rozgałęzień programu
Załóżmy, że 16-bitowa zmienna A wyliczana w programie zasadniczym zostaje zapi-
sana w parze rejestrów AX, a wartość odniesienia (porównawcza B) w parze rejestrów BX. W
100
lewej kolumnie zapisu programu występują słowa kluczowe języka Turbo Pascal, które są
jednocześnie nazwami bloków programu (adresami symbolicznymi pierwszych komórek).
Zaznaczone bloki są realizowane selektywnie, w kolejności odpowiadającej bieżącym wyni-
kom obliczeń.
Przedstawiony w drugiej i trzeciej kolumnie zapis jest formą maszynową programu,
która wykonuje takie same operacje jak program w języku wysokiego poziomu, np. w Turbo
Pascalu (TP).
Wersja TP
IF warunek THEN YYY ELSE XXX
Wersja asemblerowa (ASM)
(3) ELSE: ...
(XXX) wariant XXX programu ; w którym przetwarzana jest wartość A
...
(1) IF: CMP AX,BX ; badanie warunku A>B
(warunek) JNG ELSE ; nie większy, skok do adresu ELSE
(2) THEN: ...
(YYY) wariant YYY programu ; odpowiadający warunkowi spełnionemu
A>B
......
(4) NEXT: NOP ; instrukcja pusta ...
(koniec programu)
Badanie warunku A>B (1) realizują rozkazy CMP AX,BX oraz JNG ELSE. Zapis
JNG ELSE oznacza przejście do części oznaczonej etykietą ELSE w przypadku niespełnienia
warunku w operacji porównania (skok do ELSE, gdy nie większy niż). Dla warunku spełnio-
nego realizowana jest część programu o nazwie THEN.
Bardziej złożone rozgałęzienia programów, realizowane za pomocą instrukcji CASE -
w językach wysokiego poziomu - ilustruje schemat pokazany na rys. 2. 15
Schemat TP dla instrukcji wyboru:
CASE wyrażenie OF
sekwencja-parametrów i instrukcji-wyboru
101
ELSE instrukcja
END
CASE wyrażenie
of
w 1
w 1 - w n - warunki wyboru
blok 1
w 2
blok 2
w n
blok n
ELSE instrukcja instrukcja
end
Rys. 2.15. Schemat realizacji rozgałęzień programu według zasad instrukcji CASE
Wersja TP programu:
102
Poniżej przedstawiono przykład zapisu programu dla badania wielu jego rozgałęzień
w języku wysokiego poziomu:
begin
case A+B of
1.. 20 : begin {wynik operacji A+ B w przedziale -
w = A + 2; od 1 do 20 oznacza wykonanie -
z = B + 5 obliczeń według pierwszej formuły}
end;
21 .. 30: begin {dla przedziału od 21 do 30 obliczenia
w = B + 5; według formuły drugiej}
z = A + 2
end;
else begin {formuła trzecia dla pozostałych
w := 0; wartości}
z := 0
end
end
end.
Zapisane zostały trzy gałęzie programu rozwidlone instrukcją case. Dla trzech prze-
działów wartości wyrażenia A + B rozwiązywany jest inny problem numeryczny. Elementami
wyboru wariantu rozwiązania są wartości wyników wyrażenia A + B.
Wersja ASM programu dla instrukcji wyboru:
Wersja ASM tego samego fragmentu programu może być zapisana następująco:
...
case: ADD AX,BX ; dodanie zawartości par rejestrów A i B z zapisaniem
wyniku w rejestrze A
CASE_1: CMP AX,20D ; operacja porównania zawartości A z pierwszą wartoś-
cią progową (od zawartości A odejmowana jest war-
tość dziesiętna 20). Zawartość A pozostaje bez zmian.
Wynik porównania można zbadać przez sprawdzenie
wartości wskazników flagowych.
103
JG CASE_21 ; skok do drugiego bloku programu dla wartości powy-
żej 21 (jeśli >, to 21)
(jeśli nie) ADD CX,2 ; obliczenie wartości zmiennej w w przedziale 1 - 20
ADD DX,5 ; obliczenie wartości zmiennej z w przedziale 1 - 20
JMP NEXT ; wyjście z modułu rozgałęzień programu
CASE_21: CMP AX,30D ; drugi blok programu, dla wartości dziesiętnej (D)
powyżej 30
JG ELSE ; wyjście do trzeciego bloku programu (jeśli > to ELSE)
(jeśli nie) ADD CX,5 ; obliczenie wartości zmiennej w w przedziale 21 - 30
ADD DX,2 ; obliczenie wartości zmiennej z w przedziale 21 - 30
JMP NEXT ; wyjście poza moduł rozgałęzień
ELSE : SUB CX,CX ; zerowanie pary rejestrów C
SUB DX,DX ; zerowanie pary rejestrów D
NEXT : MOV adr1,CX; wyprowadzenie wyników operacji dla w
MOV adr2,DX; i dla z do komórek pamięci pod adresem adr
...
Pętle programowe
Realizacja repetycji programu określoną liczbę razy nazywana jest pętlą programową.
W językach wysokiego poziomu spotykamy wiele technik wykonywania takich repetycji i
wiele instrukcji, które najlepiej użyć do ich realizacji. Do realizacji najczęściej spotykanych
procedur repetycji w językach wysokiego poziomu używamy następujących instrukcji złożo-
nych:
- dla: FOR warunek DO instrukcja,
- dopóki: WHILE warunek DO instrukcja,
- powtarzaj: REPEAT instrukcja UNTIL warunek.
Pętla "DLA"
Wersja TP pętli liczonej pierwszego rodzaju można zilustrować następującą formułą:
FOR i =1 TO 10 DO
begin
104
I1; I2; ... ; In
end.
Instrukcja for ustawia warunki brzegowe 1 i 10, dla pętli.
Wersja ASM (takiej pętli programowej):
...
MOV DX, 1D ; ustawienie warunku początkowego pętli I = 1
PETLA: I1 ; operacja odpowiadająca instrukcji 1
I2 ; operacja odpowiadająca instrukcji 2
...
In ;
INC DX ; zwiększenie zawartości licznika numeru pętli
CMP DX, 10D ; porównanie numeru bieżącego pętli z numerem
końcowym I = 10
JLE PETLA ; powtórzenie pętli, gdy warunek końcowy nie
został osiągnięty (mniejszy lub równy)
...
Pętla "DOPÓKI"
Formuła repetycji jest tu zapisana określonym warunkiem, który należy badać w celu
zakończenia realizacji bloku programowego. Rozważmy przykład badania wartości K>J,
parametru obliczanego według znanej formuły.
Możemy go zapisać za pomocą instrukcji WHILE - dopóki, języka Turbo Pascal:
WHILE K>J DO I1;I2; ... ; In;
Wersja ASM (tego samego fragmentu programu) wygląda następująco:
...
MOV DX, KD ; zapis wartości dla K (D - wartość dziesiętna;
decymalna)
PTLA: CMP DX,JD ; sprawdzenie czy K>J
JLE END ; jeśli K < lub = J wtedy wykonywany jest
skok do końca; etykiety END
105
I1, ; operacja odpowiadająca instrukcji 1
dla K .> J
I2. ; operacja odpowiadająca instrukcji 2
... modyfikacja DX .
In ; operacja odpowiadająca n-tej instrukcji
JMP PTLA ; powrót do początku pętli
END: NOP ; koniec programu
Pętla "POWTARZAJ"
Powtarzanie fragmentów programu można również uwarunkować osiągnięciem okre-
ślonej wartości końcowej badanej na zakończenie bloku programowego. Rozważmy przykład
badania wartości, czy osiągnięto warunek K>J (z przykładu poprzedniego).
Operację można zapisać w języku TP za pomocą instrukcji:
REPEAT I1; I2; ...;In UNTIL K>J
To znaczy, powtarzaj ciąg instrukcji I1, ... , In do osiągnięcia wartości K wyliczanej w trakcie
realizacji obliczeń w pętli programowej, spełniającej założony warunek: K > J.
Wersja ASM (tego samego fragmentu programu) wygląda następująco:
...
MOV DX, KD ; zapis wartości dla K
PETLA: I1 ; operacja odpowiadająca instrukcji 1
I2 ; operacja odpowiadająca instrukcji 2
... modyfikacja zawartości DX
In ; operacja odpowiadająca n-tej instrukcji,
CMP DX, JD ; sprawdzenie czy K>J
JG END ; wyjście z pętli gdy osiągnięto warunek
JMP PETLA ; powtórka fragmentu programu
END: ... ; dalszy ciąg programu
106
Podprogramy
Niemal każdy z języków programowania komputerów uwzględnia zasady korzystania
w programach użytkowych z gotowych programów bibliotecznych, zwanych podprogramami.
W językach wysokiego poziomu programowania tego rodzaju bloki określa się słowem klu-
czowym PROCEDURE nazwa i wywołuje nazwą tej instrukcji. W językach maszynowych są
dostępne rozkazy wywołania - CALL adr podprogramów lokalizowanych adresem obszaru
pamięci, w którym są te podprogramy zapisane.
Użycie rozkazu CALL uruchamia ciąg operacji procesora zabezpieczających powrót
do miejsca wywołania podprogramu. Są to sekwencje takie same jak dla obsługi przerwań,
które omówiono w rozdziałach poświęconych budowie procesorów i ich działaniu przy ak-
tywnym INT.
Rozkaz CALL, przed skierowaniem procesu przetwarzania do podprogramu, urucha-
mia procedury przesłania na stos zawartości licznika rozkazów, podobnie jak rozkaz PUSH.
Do wydzielonego obszaru pamięci operacyjnej (LIFO - last in first out) zostają wprowadzone
dane zabezpieczające powrót do operacji przerwanych. Na końcu podprogramu należy użyć
rozkazu RET, który uruchamia mechanizm powrotu do miejsca programu, w którym wywoła-
no podprogram, tzn. pobrania ze stosu odłożonej uprzednio zawartości licznika. Jest to taki
sam ciąg operacji jak dla rozkazu POP.
Na rys. 2.16 przedstawiono schemat wywołania podprogramu B z programu głównego
A oraz podprogramu C z podprogramu B. Wywołanie realizuje rozkaz CALL. Podprogram
zostaje zamknięty rozkazem powrotu RET. Każde wywołanie CALL oznacza odłożenie na
stos zawartości licznika programu (IP) do odpowiedniej komórki stosu wskazywanej zawar-
tością wskaznika stosu [SP]. Każdy rozkaz RET odczytuje ze stosu ostatnie dwie komórki
(dwa bajty) i przepisuje ich zawartość na powrót do licznika programu. Następnie zwiększana
jest zawartość wskaznika stosu o ostatnio odczytane komórki.
107
program główny
A
B
podprogram B
X =
Y =
W =
T =
podprogram C
CALL
C
B
Q =
CALL
P =
C
Z =
M =
K =
N =
L =
RET
RET
Rys. 2.16. Zasada wywołania podprogramów w językach maszynowych
Wywołanie podprogramu:
CALL adres podprogramu oznacza: [SP] ! (IP) zapis do stosu,
SP ! (SP) - 2 modyfikacja wskaznika
stosu po odłożeniu dwóch
bajtów licznika IP,
IP ! adres lokacja podprogramu.
Powrót z podprogramu:
RET oznacza: IP ! [SP] odczyt ze stosu;
SP ! (SP) + 2 modyfikacja wskaznika
stosu.
Po wykonaniu operacji wywołania (CALL) rozpoczyna się przetwarzanie podprogra-
mu. Na jego początku winny znajdować się procedury zabezpieczające zawartość, używanych
w programie przerwanym, rejestrów wewnętrznych procesora. Zwykle są to operacje PUSH
108
dla wszystkich rejestrów. Przed powrotem do programu przerwanego, na koniec podprogra-
mu, należy wykonać operacje odwrotne, czyli POP wszystkich zawartości rejestrów procesora.
Tablice danych
Język poziomu maszynowego operuje na danych zapisywanych binarnie, tzn. progra-
mista jest w stanie określić, w jakim obszarze pamięci zostały zapisane dane należące do tego
samego bloku. Jak już wspomniano języki poziomu maszynowego są wykorzystywane w
przypadkach specjalnych zastosowań, w tym dla przetwarzania (konwersji) ciągów binar-
nych. W przypadku zarówno czytania, jak i pisania danych dokonujemy często operacji
przemieszczania całych bloków danych z jednego obszaru pamięci do drugiego.
Blok związanych ze sobą danych, zapisanych w określonym obszarze pamięci opera-
cyjnej nazwano łańcuchem (string) lub tablicą danych. Adresy takich bloków są zapisywane
w rejestrach SI i DI. Procesory 16- i 32-bitowe mogą wykonać operacje przepisywania całego
bloku danych zajmujących ciągły obszar pamięci, za pomocą pojedynczego rozkazu. Więk-
szość operacji na blokach (łańcuchach) danych dotyczy znaków ASCII - zapisywanych jed-
nobajtowo. Typ jednobajtowy musi zostać uprzednio zadeklarowany dyrektywą DB. Są rów-
nież dostępne rozkazy dla danych dwubajtowych, których typ powinien być wcześniej zade-
klarowany dyrektywą DW (word - słowo).
Rozkazy przenoszenia całych tablic danych odnoszą się do obszarów pamięci lokali-
zo- wanych zawartościami rejestrów DI (lokacja przeznaczenia) oraz SI (lokacja zródła). W
języ- kach wysokiego poziomu takie operacje też są możliwe, ale dotyczą zagadnień progra-
mowania całkiem odmiennych od operacji zapisywanych na poziomie języka maszynowego.
Trudno zatem o dyskusję analogii zasad programowania, jak w przykładach poprzednich.
Szesnastobitowy rejestr SI zawiera adres 64 KB danych, które mają być przeniesione
do tablicy o tym samym wymiarze, adresowanym zawartością rejestru DI. Operację prze-
mieszczenia tablic realizuje rozkaz:
REP MOVS tablica1 tablica2 ; powtarzaj przesuwanie danych z
tablicy 1 do tablicy 2
Licznikiem repetycji dla REP (repetycja) jest 16-bitowy rejestr CX. Powtarzanie trwa do
czasu gdy CX `" 0.
109
Jest to operacja odpowiadająca pętli programowej. W językach maszynowych dla
procesorów 16- i 32-bitowych są również dostępne rozkazy organizujące pętle liczone (na
zasadach do-while czy repeat-until). Należą do nich między innymi:
LOOP tak długo, jak CX`"0, po każdej pętli CX ! (CX) - 1
LOOPE powtórzenie, gdy CX = 0
Do problemów organizacji programów maszynowych można również zaliczyć działa-
nia w obrębie rozkazów poprzedzających analizowany fragment, w tym sterowanie znaczni-
kami flagowymi, sterowanie znacznikami kierunków, przerwań, zatrzymań itp.
Rozkazy przerwań
Rozkazy przerwań uruchamiają mechanizmy wywołania podprogramów w identyczny
sposób jak sygnały wysyłane przez urządzenia zewnętrzne:
INTn - skok do podprogramu obsługi przerwania,
INTO - skok do podprogramu, gdy wystąpiło przepełnienie,
IRET - powrót z podprogramu obsługi przerwania do miejsca wywołania
przerwania.
110
2.5. Magistrale procesora
___________________________________________________________
Magistrala standardowa
W czasie pracy komputera wykorzystywane są urządzenia peryferyjne do wprowa-
dzania i wyprowadzania informacji. Mimo dużej różnorodności tych urządzeń, techniki reali-
zacji podłączeń peryferii z jednostką centralną zostały znormalizowane i zapisane jako stan-
dard międzynarodowy.
Na rys.2.17 przedstawiony został schemat blokowy komputera wyróżniający podsta-
wowe układy, magistrale i złącza biorące udział w procesach wymiany informacji między
jednostką centralną, pamięcią operacyjną i urządzeniami zewnętrznymi (peryferyjnymi).
Złącza standardowe są montowane zwykle na karcie głównej komputera. Takie gniazda na-
zywa się popularnie slotem. Umożliwiają one rozbudowę komputera o dodatkowe układy
korzystające z sygnałów standardowych, pozwalających na bezpośrednią komunikację z
procesorem. Są to linie adresowe, linie danych oraz linie sygnałów sterujących.
Urządzenia zewnętrzne wykonują zadania określone przez użytkownika systemu, jak:
prezentacja informacji na monitorze ekranowym, czy zapis/odczyt informacji na/z dysku. Na
drodze sygnału zewnętrznego (bezpośredniego kontaktu z użytkownikiem) do procesora,
mają miejsce operacje przetwarzania formatu informacji przyjmowanej z urządzenia wej-
ściowego na standard wewnętrzny komputera lub odwrotnie - ze standardu wewnętrznego
komputera na lokalny format, właściwy dla urządzenia zewnętrznego. Układy odpowiedzial-
ne za realizację opisanych wyżej operacji zawarto w dwóch blokach (rys. 2.14): bloku kon-
111
wersji sygnałów standardowych karty głównej komputera na standard lokalny urządzenia
peryferyjnego oraz bloku konwersji standardu lokalnego na format zapisu lub prezentacji
informacji charakterystyczne dla urządzenia WE/WY.
RAM/ROM
adres
jednostka
centralna
dane
komputera
sterowanie
złącze standardowe
interface interface
interface
. . .
we/wy we/wy
we/wy
złącze lokalne
urządzenie
urządzenie urządzenie
. . .
we/wy - 2
we/wy - 1 we/wy - k
Rys. 2.17. Zasady podłączeń urządzeń peryferyjnych do jednostki centralnej komputera
Oba te układy zostają połączone ze sobą za pomocą złącza lokalnego we/wy. Pośred-
nie złącze lokalne zastosowano z myślą o daleko idącej specjalizacji firm produkujących
same urządzenia peryferyjne bądz same układy elektroniczne. Są one najczęściej realizowane
na podstawie własnych rozwiązania technicznych firm, zgodnych jedynie z lokalnymi stan-
dardami urządzenia peryferyjnego komputera, na poziomie styku układów. Wyróżnione
wyżej układy mogą być połączone w jeden blok sprzęgający wejściowo/wyjściowy.
Magistrala adresowa i magistrala danych procesora
W procesorze 8086 zastosowano tylko jedną zewnętrzną szynę WE/WY na której, w
określonym czasie (time shared bus), wystawiany jest adres i przesyłane są dane do i z proce-
sora. W celu określenia miejsca przechowywania informacji procesor musi być wyposażony
w dodatkowe układy zewnętrzne. W układach zewnętrznych procesora zapamiętane zostają
112
wartości wektorów adresowych i wektory danych. Na rys. 2.18 pokazano schemat połączeń
procesora z elementami jego najbliższego otoczenia.
Sygnałem zatrzasku adresów ALE (Address Latch Enable) zostaje zapisany wektor
adresowy w bloku rejestrów 8282 (Latch) taktowany sygnałem STB. Natomiast blok 8286
spełnia funkcję dwukierunkowego, trójstanowego wzmacniacza, zwiększającego obciążal-
ność linii danych.
M/IO
INTA
CLK
RD
8284
Ready
zegar
WR
Reset
DT/R
DEN
ALE
LATCH
adres/
adres
8282
AD0-AD15 dane
A16-A19
BHE
CPU 8086 dane
8286
CS0-L
ROM WE/WY
CS0-H
2xRAM
Rys. 2.18. Schemat organizacji połączeń zewnętrznych dla magistral procesora 8086/8088
W urządzeniach komputerowych stosuje się bloki pamięci, operujące standardowo
bajtem danych. Czytanie danych 16-bitową magistralą jest realizowane przez równoległe
połączenie dwóch modułów (banków) pamięci. Sygnał selekcji CS (Chip select) modułów
pamięci otwiera drogę transmisji dla danych transmitowanych w kierunku określonym za
pomocą sygnałów RD i WR, odpowiednio: do lub z procesora. Jeśli sygnał CS jest aktywny
jednocześnie na obu modułach RAM, na magistrali danych pojawi się 16-bitowy wektor
informacji. W układzie pokazanym na rys. 2.19 jednoczesną selekcję dwóch banków pamięci
zrealizowano za pomocą linii adresowej A0 (bajt młodszy) i sygnału sterującego BHE (dostęp
do bajtu starszego).
W trakcie realizacji rozkazów komunikacji z pamięcią sygnał BHE = L (niski poziom
logiczny). Niska wartość na linii adresowej A0 oznacza podłączenie obu banków RAM do
113
magistrali danych, uzyskując w ten sposób słowo 16-bitowe z pamięci o organizacji 8-
bitowej.
Sterowanie urządzeniami WE/WY realizują odpowiednie sygnały zapisz /odczyt linii
zewnętrznych (Rys. 2.20).
magistrala adresowa
A19 - A1
A0
BHE
CS A18 - A0 A18 - A0
CS
BANK H BANK L
D7-D0 D7-D0
magistrala danych
H
D15 - D8
L
D7 - D0
Rys.2.19. Przykład organizacji szesnastobitowej magistrali danych
MEMRD
M/IO
MEMWR
RD
I/ORD
WR
I/OWR
Rys. 2.20. Układ rozdzielania sygnałów odczyt/zapis
Operacje magistral
Operacje transmisji za pomocą wielofunkcyjnej magistrali zewnętrznej procesora 16-
bitowego są realizowane w czterech cyklach zegarowych (od T1 do T4). Schemat organizacji
operacji magistrali przedstawiono w tabl. 2.4 i na rys. 2.21.
114
Tablica 2.4
Operacje magistrali procesora 16-bitowego
Cykl zegara OPERACJA
Ti
cykl READ cykl WRITE
T procesor (BIU ) umieszcza
1
adres na magistrali
T2 procesor (BIU) przechodzi do BIU umieszcza dane
trybu czytania danych na magistrali
T 3 ,T 4 BIU przyjmuje dane dane pozostają na
z magistrali magistrali
cykl magistrali cykl magistrali
T1 T2 T3 T4 T1 T2 T3 T4
ADRES BUFOR DANE ADRES BUFOR DANE
Rys. 2.21. Podstawowy cykl czasowy dla magistrali zewnętrznej
W cyklu zegarowym T1 układ sprzęgający magistrali (BIU) ustawia wartości adresów
na liniach magistrali zewnętrznej procesora - od AD0 do AD15 i od A16 do A19 (dla proce-
sora 8086). W T2 układ sprzęgający przełącza magistralę na bufory (BUFOR) transmisji
danych dla operacji czytania (RD) lub na linie odczytu danych dla operacji pisania (WR). W
cyklach T3 i T4 jest realizowana operacja przesyłu danych z procesora lub do procesora.
Stan oczekiwania na dane (Tw - wait) jest wprowadzany między T3 i T4, gdy sygnał
Ready jest niski. Cykl obsługi magistrali zewnętrznej jest powtarzany przez układ sprzęgający
magistrali (BIU) w dwóch przypadkach:
" na żądanie układu wykonawczego EU, gdy komunikacja z otoczeniem jest częścią rozka-
zu,
" gdy kolejka rozkazów nie jest do końca zapełniona.
Oprócz linii adresowych i linii danych procesor przyjmuje i wysyła sygnały sterujące i
informacyjne. Linie: od A16/S3 do A19/S6 w cyklu T1 określają cztery najbardziej znaczące
bity adresowe, ale w cyklach T2, T3, Tw i T4 są to cztery starsze bity (S3 do S6) słowa statu-
sowego mikroprocesora.
115
S3 i S4 - określają stan aktywności rejestrów segmentowych aktualnie wykorzystywanych
do adresowania:
00 - gdy aktywny jest rejestr ES,
01 - gdy aktywny jest rejestr CS lub nie został użyty żaden z
rejestrów (dla cykli WE/WY i potwierdzenia przerwania),
10 - gdy aktywny jest rejestr SS,
11 - gdy aktywny jest rejestr DS.
S5 = IF- Przyjmuje wartość bitu flagowego przerwań.
S6 = 0 - Wartość stała zero.
BHE/S7 - Jest sygnałem selekcji starszego bajtu danych (rys.2.16) z banku pamięci w
takcie T1, dla operacji zapisu, odczytu i potwierdzenia przerwania. W taktach
T2, T3 i T4 wartość tej zmiennej reprezentuje bit S7 statusu procesora. S7 wraz
z dwoma innymi sygnałami koduje osiem cykli maszynowych, pokazanych w
tab. 2.5.
RD i WR - To wyjściowe sygnały trójstanowe, które taktują operacje czytania i pisania
danych niską wartością logiczną, w taktach zegarowych T2 - T4.
READY - Jest sygnałem gotowości (wartość wysoka) pamięci lub układu WE/WY do
transferu danych. Wartość niska oznacza przejście procesora w stan oczeki-
wania
INTR - Jest wejściowym sygnałem żądania przerwania maskowanego, z aktywnym
poziomem wysokim.
NMI - Jest sygnałem żądania przerwania niemaskowanego aktywizowany narastają-
cym zboczem tego sygnału.
TEST - Jest sygnałem wejściowym, który umożliwia zatrzymanie pracy procesora.
Poziom wysoki (nieaktywny) na tym przewodzie oznacza zatrzymanie proce-
sora. Poziom niski (co najmniej przez sześć taktów zegarowych) oznacza kon-
tynuowanie programu. TEST jest synchronizowany narastającym zboczem im-
pulsu CLK.
RESET - Jest sygnałem wejściowym zerowania procesora.
M/IO - Jest sygnałem wyróżniającym cykl współpracy z pamięcią (poziom wysoki)
od cyklu współpracy z portami WE/WY (poziom niski).
INTA - Potwierdzenie przejścia procesora do obsługi żądania przerwania.
116
ALE - Sygnał taktowania adresu, aktywny gdy na multipleksowanej magistrali proce-
sora jest wystawiany adres.
HOLD/HOLDA - Sygnały sterowania bezpośrednim dostępem do pamięci: odpowiednio
żądanie i potwierdzenie obsługiwane analogicznie jak w procesorach 8-bito-
wych.
DT/R - Sygnał wyjściowy określający kierunek przesyłania danych. Wartość wysoka
oznacza kierunek transmisji z procesora (T- transmiter), a wartość niska kie-
runek transmisji do procesora (R - receiver).
DEN - Wyjściowy sygnał sterowania buforami trójstanowymi; aktywny podczas
każdego cyklu zapisu i odczytu informacji oraz cyklu potwierdzenia przerwa-
nia.
RQ/GT0/GT1 i LOCK - są sygnałami określania dostępu do magistrali dla innych niż proce-
sor modułów.
QS0, QS1 - sygnały wskazujące rodzaj operacji wykonywanych na kolejce rozkazów
(status kolejki rozkazów):
00 - stan zawieszenia operacji dla kolejki rozkazów,
01 - pobranie pierwszego rozkazu z kolejki,
10 - wyzerowanie kolejki,
11 - stan pobranie bajtu rozkazu z kolejki.
117
2.6. Zasady obsługi przerwań
___________________________________________________________
Mikroprocesory 16-bitowe firmy Intel wyposażono w system przerwań reagujący na
zdarzenia wewnętrzne (programowe) wywoływane rozkazem INTn i zewnętrzne, na przewo-
dach INTR i NMI.
Przerwania wewnętrzne
INTn jest dwubajtowym rozkazem przerwania wewnętrznego. Występuje ono bezpo-
średnio po zakończeniu realizacji INTn, umieszczanego w programie. Drugi bajt rozkazu to
8-bitowa zmienna n wskazująca numer przerwania; 28 = 256 wektorów przerwań. Po rozpo-
znaniu kodu rozkazu INT czytany jest jednobajtowy numer (n) przerwania. Procesor przesu-
wa zawartość n o dwa bity w kierunku pozycji starszych (mnoży przez cztery) definiując w
ten sposób mapę pamięci o wymiarze 210 = 1024 bajtów, po cztery bajty dla każdego z 256
bloków. Tablica adresów jest zapisana w komórkach pamięci od 00000H do 003FFH, jedno-
kilobajtowej przestrzeni adresowej.
Na rys. 2.22 pokazano mapę 16-bitowych adresów logicznych, zawartości CS oraz IP.
Ostatnie pole mapy oznaczono adresem 3FE, ponieważ jest to lokacja pierwszego z dwóch
bajtów adresowych. Dwa pierwsze bajty każdego przerwania określają zawartość licznika
programu (IP), dwa następne określają zawartość rejestru segmentowego kodów (CS). Na tej
podstawie układ obliczania adresów procesora (BIU) wyznacza 20-bitowy adres fizyczny
procedury obsługi żądania przerwania.
118
numer
Bit 15 0
przerwania
00000
IP
Adres
0
(Hex)
CS
00004 IP
1
CS
00008
IP
2
CS
0000C
IP
3
CS
00010 IP
4
003FE
CS
255
FFFFF
Rys. 2.22. Tablica wektorów przerwań dla 8086
W trakcie realizacji programu mogą wystąpić pewne charakterystyczne zdarzenia,
które są sygnalizowane odpowiednią procedurą przerywającą. Projektant oprogramowania
systemowego komputera wprowadza elementy opisujące zdarzenia szczególne dla pracy
komputera. Możliwe jest też sporządzenie przez projektanta oprogramowania użytkowego
biblioteki własnych zdarzeń charakterystycznych dla zadanej aplikacji. Część procedur prze-
rywających jest wykorzystywana do diagnostyki i sygnalizacji stanów awaryjnych, sygnaliza-
cji błędów, obsługi typowych urządzeń peryferyjnych itp. Oto opis kilku wybranych przerwań
systemowych.
Przerwanie o numerze n = 0; jest wywoływane błędem dzielenia dla rozkazu DIV lub
IDIV. Gdy wynik przekracza dopuszczalny zakres, np. dla dzielenia przez 0, zostaje samo-
czynnie wygenerowane przerwanie n = 0. Błąd dzielenia powoduje automatyczne wpisanie
do licznika IP i rejestru CS wektorów zapisanych w tablicy adresów przerwań pod numerem
0.
119
Przerwanie o numerze n = 1; jest wywoływane po każdym rozkazie (znacznik pułap-
ki) jeśli znacznik flagowy TF = 1. Oznacza to możliwość krokowej realizacji programu. Jeśli
znacznik flagowy pułapki TF = 0, mechanizm pracy krokowej zostaje wyłączony.
Przerwanie o numerze n = 2; jest zarezerwowane dla niemaskowalnego przerwania
zewnętrznego (NMI).
Przerwanie o numerze n = 3; jest wywoływane rozkazem jednobajtowym INT3, o
specyficznym znaczeniu. Jest wykorzystywane do zatrzymywania realizacji programu (break
point) w zadanych punktach kontrolnych.
Przerwanie o numerze n = 4, jest wywoływane jednobajtowym rozkazem INTO
przerywającym pracę procesora, gdy operacje arytmetyczne poprzedzające rozkaz INTO
spowodują przepełnienie rejestrów (Overflow), sygnalizowane stanem wskaznika przepełnień
OF = 1.
Przerwanie o numerze n = ... , jest wywoływane programowo za pomocą dwubajto-
wego rozkazu INTn. Bezpośrednio po zakończeniu tego rozkazu następuje wywołanie prze-
rwania o numerze n (z przedziału od 32 do 255) i wyliczenie fizycznego adresu restartu.
Przerwanie zewnętrzne
Komputer współpracuje z urządzeniami WE/WY, takimi jak: klawiatura, monitor,
pamięci zewnętrzne, porty szeregowej transmisji informacji, czy porty równoległej transmisji.
Najprostszym sposobem obsługi tych wszystkich urządzeń jest metoda cyklicznego przeglą-
dania buforów pośredniczących i przekazywania ich zawartości do pamięci komputera. Zaletą
takiego rozwiązania jest prostota realizacji układu i programu sterowania. Zasadniczą wadę
tej techniki stanowi powtarzanie operacji komunikacji z wszystkimi buforami WE/WY bez
potrzeby (cyklicznie) w kanałach, w których nie odnotowano żadnych zmian wartości da-
nych.
Rozwiązaniem znacznie lepszym jest metoda wywołania reakcji procesora na sygnał
informujący o zmianach danych w określonym kanale. Procesor analizuje wagę sygnału i
decyduje o uruchomieniu procedur związanych z tym sygnałem - przerywając aktualnie reali-
zowane zadania. Każda operacja obsługi żądania przerwania bieżącego programu powinna
zabezpieczyć możliwość powrotu do miejsca, w którym to przerwanie nastąpiło, po zakoń-
czeniu obsługi przerwania. Istnieje zatem potrzeba zapamiętania zawartości rejestrów, które
były użyte w programie przerwanym, jak również odtworzenie tych zawartości przed powro-
tem do programu przerwanego (przed rozkazem IRET - Interrupt Return).
120
Przyjęcie nowego żądania przerwania w trakcie realizacji aktualnego przerwania jest
możliwe po ustawieniu I = 1. W przeciwnym razie przerwanie aktualnie realizowane ma
najwyższy priorytet. Wyjątki stanowią przerwania o numerach 0, 1, 2, 3 i 4. Można sobie
łatwo wyobrazić trudny problem wyboru obsługi żądania przerwania, gdy liczba ich jedno-
czesnych zgłoszeń znacznie przekracza możliwości ich obsługi przez procesor. Do obsługi
wielu przerwań jednoczesnych stosowane są sterowniki wyboru priorytetu przerwania.
" NMI jest sygnałem przerwania, którego nie można zamaskować, inicjowane narastającym
zboczem tego sygnału (zmiana wartości z 0 na 1; L na H). Zmiana poziomu logicznego na
linii NMI zostaje zarejestrowana w wewnętrznym przerzutniku przerwań, po czym po wy-
konaniu bieżącego rozkazu, zostaje podjęte żądanie przerwania oczekujące na obsługę.
Przerwaniu NMI jest przyporządkowany stały numer w tablicy adresów, n = 2.
" INTR jest sygnałem żądania przerwania, które można zamaskować, inicjowane aktywną
wartością INTR = 1, gdy znacznik flagowy I = 1. Jeśli znacznik I = 0 linia INTR jest nie-
aktywna. Przerwanie można zablokować rozkazem CLI, który zeruje znacznik flagowego
I. Zerowanie flagi I ma miejsce również po przyjęciu przerwania (w trakcie realizacji jego
obsługi) i po sygnale RESET = 1. Odblokowanie wejścia INTR umożliwia rozkaz STI,
który ustawia wartość I = 1. Żądanie INTR = 1 nie jest zapamiętywane, dlatego musi
trwać tak długo dopóki procesor nie odpowie potwierdzeniem INTA. Sygnały przerwań
maskowalnych mogą współpracować ze sterownikiem priorytetów przerwań, który prze-
kazuje do procesora 8-bitowe numer przerwania n w zakresie od 32 do 255. Choć pozosta-
łe numery restartów mogą być deklarowane, są jednak zarezerwowane dla obsługi prze-
rwań wewnętrznych.
Priorytety przerwań
Jest oczywiste, że nie da się jednocześnie zrealizować kilku procedur przerywających,
a ich ważność nie może być jednakowa. Konieczna jest zatem hierarchizacja sygnałów zgło-
szeń, co oznacza że zadanie o niższej wadze powinno być odłożone po to, aby zrealizować
zadanie o wadze wyższej. Podobnie żądanie przerwania o wadze wyższej ma być obsłużone
w pierwszej kolejności po czym kontynuowana jest obsługa żądania przerwania niższego
poziomu.
Na rys. 2.23 przedstawiony jest schemat blokowy programowalnego sterownika prio-
rytetów przerwań (8259) opracowanego przez firmę Intel (najczęściej zintegrowanego z
innymi układami WE/WY). Układ rozstrzyga ważność (priorytet) jednego z ośmiu żądań
121
przerwania rejestrowanych na wejściach od IR0 do IR7. Na wejście INTR procesora jest
przekazywany pojedynczy sygnał INT żądania przerwania, który reprezentuje aktualnie naj-
ważniejszą linię żądania przerwania (IRi). Po przekazaniu z procesora do sterownika sygnału
INTA, potwierdzenia przyjęcia żądania przerwania, sterownik wysyła numer przerwania na
młodszym bajcie linii danych.
INTA INT
STEROWANIE
D7 - D0
Bufor
Danych
(BD)
RD
IR0
Układ
Rejestry
WR
IR2
Rejestry Arbiter
Zapis/Odczyt
Poziomów Priorytetów Żądań
(Z/O)
A0
Przerwań (AP)
Przerwań
(RPP)
(RZP)
IR7
CS
CAS 0
Bufor
Kaskady/
CAS 1
Komparator
Rejestr maskowania przerwań (RMP)
(BK/K)
CAS 2
Szyna wewnętrzna układu
SP / EN
Rys. 2.23. Schemat blokowy sterownika priorytetów - 8259
Na linie od IR0 do IR7 dołączane są sygnałów żądania obsługi ośmiu urządzeń ze-
wnętrznych. Żądania przerwań są przechowywane i analizowane za pomocą czterech modu-
łów wejściowych:
" rejestru żądań przerwań (RZP), w którym zarejestrowane zostają sygnały przerywające,
" modułu analizy priorytetów (AP), który współpracuje z programowalnym układem (RMP)
" maskowania wejściowych linii (IR) żądania przerwań ,
" modułu rejestracji poziomów przerwań (RPP).
" w rejestrze masek przerwań (RMP) są przechowywane maski przerwań dla sygnałów od
IR0 do IR7, zadawane programowo przez procesor.
122
" BD jest buforem magistrali danych, który ustawia stan dużej impedancji na przewodach
magistrali danych sterownika, przyjmuje słowo sterujące z procesora oraz przechowuje
status sterownika przerwań.
" Z/O jest układem rejestrującym sygnały WR i A0 oraz słowa ICW i OCW programujące
rodzaj pracy sterownika. Blok zapis/odczyt zawiera również informację statusową o stanie
pracy sterownika czytaną sygnałami RD i A0.
" BK/K jest buforem kaskady/komparatora, który umożliwia połączenie ze sobą dziewięciu
sterowników 8259 w kaskadę o 64 sygnałach IRi. Jeden sterownik zostaje zaprogramowa-
ny jako nadrzędny - Master, a pozostałe pracują jako podporządkowane - Slave. Sygnały
wyjściowe CASO, 1 i 2 układu Master są przesyłane do wejść CASO, 1 i 2 układów Slave.
Sygnały zewnętrzne:
Sygnał SP/EN dla układu Master należy połączyć z napięciem zasilania, a dla ukła-
dów Slave - z masą.
D0 - D7 jest trójstanową Wejściowo/Wyjściowa magistralą danych,
Z/O jest układem Zapis/Odczyt służącym do przekazywania do sterownika
słów programujących tryb pracy:
- słowa inicjalizacji (ICW - Initialisation Control Word),
- słowa rodzaju operacji (OCW - Operational Command Word)
lub czytania statusu opisującego stan wewnętrzny bloków RPP, AP,
RZP i RMP sterownika.
Przerwania sterownika 8259 są taktowane sygnałem gotowości INTA, wysyłanym z
procesora. Pierwsze wysłanie tego sygnału oznacza gotowość procesora do realizacji żądania
przerwania. Sterownik 8259 może zostać zaprogramowany do współpracy z procesorami 8-
bitowymi lub 16-bitowymi. Dla procesorów 8-bitowych odpowiedzią na trzy kolejne INTA
jest 3-bajtowy rozkaz CALL przesyłany ze sterownika do procesora liniami danych. W przy-
padku współpracy 8259 z procesorem 16-bitowym pierwsze INTA zostaje przez sterownik
zignorowane. Po drugim INTA wystawiony zostaje 8-bitowy numer restartu. Dalej procesor
wykonuje dalej takie same operacje jak dla przerwań wewnętrznych INTn.
Cykl obsługi przerwań jest następujący:
- jeden z sygnałów IRi przyjmuje poziom wysoki, a wtedy sterownik 8259 przesyła sygnał
INT do procesora,
- procesor potwierdza przyjęcie żądania przerwania sygnałem INTA,
123
- sterownik 8259 zeruje odpowiedni przerzutnik w rejestrze żądań przerwań i wysyła do reje-
stru obsługi przerwań informację, która przypisuje sygnałowi IRi najwyższy priorytet żąda-
nia w trakcie obsługi,
- pierwszy cykl komunikacji z magistralą danych (CALL) zostaje zawieszony,
- w drugim cyklu obsługi przerwania procesor generuje kolejny sygnał INTA w oczekiwaniu
na numeru przerwania na młodszym bajcie adresowym.
W mikroprocesorach 8088 i x86 po sygnale INT generowane są tylko dwa impulsy
INTA. Po pierwszym impulsie INTA sterownik zeruje przerzutnik w rejestrze żądań prze-
rwań. Po drugim impulsie INTA sterownik przesyła do procesora bajt danych określających
numer restartu.
Programowanie sterownika rozpoczynamy od przesłania tzw. wektora inicjacji (ICW -
Initalisation Command Word). Na ten etap przygotowania sterownika składają się dwa (dla
pojedynczego elementu 8259) lub cztery (dla kaskady Master-Slave sterowników 8259)
słowa programujące. Pierwsze dwa słowa inicjacji służą do:
" określenia trybu pracy sterownika; jako układu pojedynczego lub jako kaskady typu Ma-
ster-Slave,
" określenia lokacji i rozmiarów przestrzeni pamięciowej przyporządkowanej poszczegól-
nym przerwaniom,
" zdefiniowania sposobu adresacji restartów,
" zaprogramowania sposobu reakcji wejść IRi ; na poziom sygnału lub narastające zbocze.
W jednym ze słów inicjacji sterownika jest zawarta również deklaracja trybu pracy,
dla procesorów 8- lub 16-bitowych.
Drugim etapem oprogramowania sterownika przerwań jest przesłanie trzech słów
operacyjnych (OCW1, 2, 3 - Operation Command Word), których zadaniem jest:
" maskowanie zadanych wejść IRi ,
" określanie kombinacji priorytetów sygnałów przerwań (np. rotacje),
" wywoływanie specjalnych trybów maskowania i aktywizacji wejść IR, np. pod kontrolą
oprogramowania użytkowego.
Słowa inicjalizacji (ICW) określają punkt startu systemu przerwań. Impulsami WR
wpisujemy kolejne słowa inicjujące ICW 1, 2, 3 i 4 (dwa lub cztery).
Słowa operacyjne (OCW) definiują różne formy operacji sterownika:
- maskowanie przerwań,
- zakończenie obsługi przerwań,
124
- rotację priorytetów przerwań,
- określenia statusu przerwań.
Słowo operacyjne OCW wprowadzamy dowolną liczbę razy i w dowolnej chwili, po
zainicjowaniu pracy sterownika 8259. Słowo operacyjne może być zmieniane przy niezmie-
nionym słowie inicjacji. Element 8259 może pracować w jednym z czterech trybów:
a) w trybie podstawowym, w którym każda z ośmiu linii IR0 - IR7 ma przyporządko-
wany stały priorytet bez możliwości jego zmiany i bez możliwości maskowania linii,
b) w trybie z rotacją priorytetu, w którym możliwa jest rotacyjna zmiana priorytetów
w czasie pracy układu (zamiast naturalnej kolejności: 0, 1, ..., 7 można zadać inną, np. 3, 4,
..., 7, 1, 2 lub 6, 7, 0, ..., 5 itp.);
c) w trybie z maskowaniem przerwań, w którym możliwa jest blokada żądania prze-
rwania na wybranych liniach IRi ,
d) w trybie ze sprawdzeniem przerwań, w którym wyszukiwane są linie zgłaszające
żądanie przerwania.
8224
CASO-3
...
zegar
IR0 IR56
0 0 INT 0
INT
8259
8259 - 0 8259 - 7
...
MASTER
ALE INTA SLAVE
SLAVE
INT
IR7 IR63
INT
7 7 7
8086
procesor
DEN DT/R
T
OE
8286
magistrala danych
8282
magistrala adresowa
STB
Rys. 2.24. Schemat ideowy 64 bitowego układu przerwań zrealizowany na elementach 8259,
w trybie Master-Slave
125
...
Do szczegółowego poznania złożonych procedur oprogramowania sterowników prze-
rwań niezbędne są katalogi firmowe opisujące bardzo dokładnie znaczenie wszystkich ele-
mentów inicjacji i deklaracji trybów operacyjnych.
Dla zwielokrotnienia liczby sygnałów przerywających możliwe jest kaskadowe połą-
czenie sterowników 8259, tak jak to pokazano na rys. 2.24.
Jeden ze sterowników (MASTER) gromadzi sygnały żądań przerwania ze sterowników
pracujących na niższym poziomie ważności (SLAVE). Na jego ośmiu wejściach MASTER
skoncentrowane zostają 64 sygnały żądania przerwań ze sterowników podrzędnych - SLAVE
0 - 7. Sterownie zgłoszeniami przerwań odbywa się za pomocą trzech sygnałów kaskady
priorytetów - CAS 0, 1 i 2, które łączą jeden sterownik master z ośmioma sterownikami
SLAVE.
126
2. 7. Przerwania systemowe dla procesorów 8086
___________________________________________________________
Mikrokomputery oprócz pamięci RAM korzystają także z pamięci stałej
ROM/EPROM, do której zapisywane są między innymi procedury stałe, służące do komuni-
kacji systemu operacyjnego z układami składowymi komputera (w tym z układami WE/WY,
do wprowadzania i wyprowadzania danych). Po załączeniu komputera do sieci lub po inicja-
cji restartu sygnałem RESET, zostają wykonane określone procedury stałe. Dla komputerów
zgodnych z IBM PC obszar pamięci stałej EPROM zlokalizowano w jego górnym obszarze
od adresu FFFF0H, gdzie zapisano pierwszą procedurę oprogramowania systemowego BIOS
(Basic Input-Output System).
Pierwsze czynności procesora związane są z samo sprawdzeniem poprawności wyko-
nywania podstawowych operacji przez podstawowe bloki procesora. Następnie zostają uru-
chamiane procedury testowania pozostałych elementów elektronicznych płyty głównej kom-
putera - w pierwszej kolejności badanie sumy kontrolnej wektorów binarnych samego BIOS.
Następnie badane są: dekodery, pamięci RAM i sterownik klawiatury.
Drugi etap testowania przejmuje system BIOS inicjując tablicę przerwań programo-
wych i sprzętowych od adresu 00000H do 003FFH. Zostaje sprawdzona i zainstalowana karta
graficzna (sterownik ekranu) monitora ekranowego komputera oraz obszar pamięci RAM od
adresu C0000H do C8000H związany z procedurami BIOS obsługującymi sterownik ekranu.
127
Trzeci etap rozpoczynają procedury inicjacji obszarów roboczych BIOS w pamięci
zaczynającej się od adresu 00400H, po czym następuje przejście do procedur ładowania
systemu operacyjnego komputera do pamięci RAM.
Cechą charakterystyczna BIOS jest jego rozdzielenie na bloki fizyczne odpowiadające
inicjowanym urządzeniom. Oznacza to, że tylko część systemu BIOS jest zainstalowana w
pamięci EPROM karty głównej komputera. Sterowniki urządzeń WE/WY (w szczególności
karty sterujące ekranem, czasem sterowniki dysków, portów szeregowych i równoległych
itp.) są obsługiwane za pomocą lokalnych części BIOS z ich własnej pamięci EPROM. Ozna-
cza to dostosowanie procedur obsługi do zainstalowanego sprzętu. Rozszerzenia BIOS są
wykrywane automatycznie w trakcie inicjacji systemu komputerowego. Podczas inicjacji
oprogramowania systemowego następuje ustawianie trybów pracy układów programowanych
(opisanych w rozdziale 3), odpowiednio do zaprojektowanych dla nich funkcji.
W niektórych komputerach część lub cały obszar pamięci EPROM zastępuje pamięć
RAM. Jest to tzw. mechanizm przesłaniania BIOS. Pod tym samym adresem co EPROM
zostaje zainstalowana pamięć RAM, do której przeładowane zostają te procedury BIOS z
których na bieżąco korzysta komputer. Przykładem mogą być procedury obsługi ekranu czy
procedury obsługi dysków. Pamięć RAM jest szybsza od EPROM i ma zwykle inaczej zorga-
nizowane słowo danych (np. 16- lub 32-bitowe dla RAM, 8-bitowe dla EPROM). Tu można
zwrócić uwagę na fakt, że zerowanie za pomocą klawiszy Ctrl-Alt-Del nie jest równoznaczne
z zerowaniem sprzętowym sygnałem Reset. W przypadku pierwszym pomija się niektóre
procedury diagnostyczne, np. test pamięci.
yródło przerwań BIOS
Obsługa urządzeń komputera do wprowadzania i wyprowadzania danych odbywa się
za pośrednictwem rutynowych procedur systemowych napisanych w języku maszynowym.
Zbiór wszystkich procedur diagnostycznych inicjujących oraz obsługi podstawowych urzą-
dzeń WE/WY zapisano w pamięci stałej EPROM stanowiącej część pamięci operacyjnej
komputera i nazwano ją BIOS.
Programista piszący programy użytkowe w językach wysokiego poziomu w zasadzie
nie musi wiedzieć o istnieniu oprogramowania BIOS, ponieważ może się posługiwać proce-
durami systemu operacyjnego. Czasami jednak, w szczególnych przypadkach, skorzystanie z
procedur BIOS staje się konieczne.
128
Może się również pojawić potrzeba napisania dodatkowej procedury w języku niskie-
go poziomu z uwagi na poszukiwania programów wydajniejszych, bezpośrednio operujących
na sprzęcie. W przypadku korzystania z niskiego poziomu oprogramowania (w tym z proce-
dur BIOS) należy mieć świadomość uzależnienia tego programu od sprzętu co oznacza, że
program może nie działać na komputerze z innym BIOS, czy na komputerze o zmienionej
architekturze. Bezpieczne jest jedynie korzystanie z procedur BIOS dla obsługi urządzeń,
których istnienie jest zagwarantowane dla wszystkich kolejnych wersji oprogramowania
systemowego komputerów.
Do realizacji wszelkich możliwych odwołań systemowych potrzebna jest znacznie
większa liczba procedur niż 255 adresowanych bezpośrednio za pośrednictwem INT. Przyjęto
zatem regułę, że z każdym przerwaniem jest związanych wiele funkcji przypisanych konkret-
nemu urządzeniu. Właściwą funkcję wyznacza się za pomocą kodu umieszczanego w reje-
strze AH, do których odwołują się poszczególne funkcje przerwań. Pozostałe rejestry można
wykorzystać do wyznaczania innych parametrów procedury wywołującej.
System operacyjny i programy użytkownika mogą się zwracać do procedur BIOS z
żądaniem wykonania operacji odpowiadających przerwaniom programowym INTn. Do reje-
stru AH należy wpisać kod funkcji, która ma być wykonana przez procedurę. Wynik działania
funkcji jest wpisywany do określonych rejestrów, a wystąpienie błędów inicjuje bity flagowe:
przeniesienia - C lub przepełnienia - O, sygnalizujące stany wyjątkowe.
W procedurach BIOS zawierają również elementy sygnalizacji błędów przetwarzania i
błędów sprzętowych. Zwykle są one traktowane jak procedury przerywające, choć niektóre z
nich określa się terminem wyjątek, oznaczający stan błędnej pracy komputera.
W komputerach odpowiadających IBM PC występują cztery zródła przerwań:
" przerwania inicjowane błędem (niemaskowalne) spowodowane przez:
a) błąd kontroli parzystości zawartości pamięci,
b) błąd sygnalizowany przez kartę rozszerzeń na złączu z płytą główną (sygnał
IOCHK I/O Check),
" błąd sygnalizowany przez koprocesor arytmetyczny maszyny,
" przerwania sprzętowe pochodzące od urządzeń WE/WY obsługiwanych zarówno przez
układy zainstalowane na karcie głównej jak i układy na kartach rozszerzeń, które można
zablokować przez wyzerowanie bitu flagowego przerwań - I w rejestrze znaczników fla-
gowych,
129
" przerwania generowane przez procesor (zwane wyjątkami) sygnalizują nieprawidłowości
wyników przetwarzania (na przykład błąd operacji dzielenia przez zero), których wystą-
pienie powoduje wywołania niemaskowalnego przerwania programowego o odpowiednim
numerze.
" przerwania programowe będące skutkiem wykonania rozkazu INTn, gdzie n jest wartością
dziesiętną z przedziału od 0 do 0FFH oznaczającą numer przerwania.
Przerwania sprzętowe i generowane przez procesor
Oprogramowanie systemowe może przejąć obsługę pewnych przerwań sprzętowych;
generowanych przez urządzenia dołączone do komputera. W chwili wejścia do procedury
obsługi żądania przerwania wszystkie sygnały przerwań zostają zablokowane przez wyzero-
wanie bitu flagowego I. Uruchomienie mechanizmów przerywających wewnątrz podprogra-
mu obsługi przerwania jest możliwe po odblokowaniu przerwań procesora rozkazem STI, co
umożliwia przerwanie żądaniem o wyższym priorytecie. Następna procedura przerywająca
nie może modyfikować zawartości żadnych rejestrów ani używać zbyt dużego obszaru stosu.
Oprogramowanie systemowe komputerów zgodnych z PC IBM zawiera podprogramy
obsługi standardowych urządzeń wejściowo-wyjściowych, na przykład:
- generowania i sterowania dzwiękiem za pomocą portu równoległego 8255 (pod adre-
sem 61H),
- sterowania układem Game (adres 20H),
- obsługi rejestru maski przerwań (IMR) sterownika priorytetów przerwań 8259 (pod ad-
resem 21H),
- obsługi pamięci ekranu w obszarze B0000H - B8000H,
- definicji zmiennych roboczych dla obszaru pamięci roboczej BIOS,
- użycia przez programy odmierzające czas, wewnętrznego zegara (timer) czasu syste-
mowego,
- funkcji kopiowania, za pomocą sterowników dyskowych, programów chronionych,
- rozpoznania typu procesora.
Procedury przerwań sprzętowych i przerwania spowodowane wykonaniem instrukcji
INTn (w trybie rzeczywistym) zostały zapisane w tablicy o rozmiarze 1kB w pamięci RAM o
adresach od 00000H do 003FFH (rys.2.19). Każdy adres jest czterobajtowy, z dwubajtowym
numerem segmentu i dwubajtowym przemieszczeniem. W zestawieniu poniżej zamieszczono
numer, przyczynę oraz rodzaj przerwania: N - niemaskowalne, W - wyjątek, P - programowe,
130
S - sprzętowe, IRQi oznacza linię żądania przerwania dostępną na złączu uniwersalnym płyty
głównej.
OH Dzielenie przez 0 (Divide by Zero):
- rodzaj przerwania: W,
- przyczyna: błąd dzielenia przez zero wykryty przez procesor,
- reakcja BIOS: standardowy powrót,
- zastosowanie: podprogram do sygnalizacji błędów operacji arytmetycznych.
1H Praca krokowa (Single Step):
- rodzaj przerwania: W,
- przyczyna: bit TF=1 (trap flaf),
- reakcja BIOS: standardowy powrót,
- zastosowanie: najczęściej w programach uruchomieniowych (debugger) do
realizacji pracy krokowej.
2H Przerwanie niemaskowalne (NMI):
- rodzaj przerwania: N,P,
- przyczyna: błąd parzystości pamięci RAM lub sygnał przerwania z koproce-
sora (porównaj opis przerwania 75H) dla błędu operacji arytmetycznych ko-
procesora,
- reakcja BIOS:
- dla błędu parzystości: procedury BIOS poszukują adres komórki pamięci, w
którym wystąpił błąd, po czym drukowany jest komunikat o błędzie i za-
trzymany zostaje procesor instrukcją HALT,
- dla błędu koprocesora: powrót bez wykonania operacji obsługi błędu,
- zastosowanie: podprogram obsługi żądania przerwania.
Programy korzystające z koprocesora arytmetycznego mogą przejąć to przerwanie.
Sprawdzenie, czy przyczyną wystąpienia przerwania był koprocesor odbywa się przez odczy-
tanie stanu wewnętrznego koprocesora. Jeśli koprocesor nie był zródłem przerwania, to ste-
rowanie zostaje przekazane programowi obsługi przerwania, do procesora zasadniczego.
Przerwanie niemaskowalne NMI - Non Maskable Interrupt, może wbrew swojej nazwie,
zostać zablokowane programowo przez wykonanie odpowiednich operacji WE/WY.
3H Pułapka (Breakpoint):
- rodzaj przerwania: W,
- przyczyna: wykonanie przez procesor jednobajtowej instrukcji INT,
131
- reakcja BIOS: standardowy powrót,
- zastosowanie: najczęściej wykorzystywane przez programy uruchomieniowe
do realizacji pułapek (z wyświetleniem stanów rejestrów wewnętrznych pro-
cesora).
4H Nadmiar (Overflow):
- rodzaj przerwania: W,
- przyczyna: wykonanie przez procesor instrukcji INTO (Interrupt on Over-
flow), jeśli bit O = 1,
- reakcja BIOS: standardowy powrót,
- zastosowanie: służy do wykrywania nadmiaru (przepełnienia) podczas wy-
konywania operacji arytmetycznych na liczbach całkowitych.
5H Drukowanie ekranu (Print Screen):
- rodzaj przerwania: W, P,
- przyczyna: naciśnięcie przez użytkownika klawisza PRTSC lub wykonaniem
instrukcji BOUND,
- reakcja BIOS: obsługa podprogramu,
- zastosowanie: wydrukowanie zawartości ekranu na drukarce.
6H Zarezerwowane (Reserved):
- rodzaj przerwania: W,
- przyczyna: procesor napotka kod nie będący instrukcją (underfined opcode),
- reakcja BIOS: standardowy powrót,
- zastosowanie: nie powinno wystąpić podczas normalnej pracy systemu; syg-
nalizacja stanu nienormalnego.
7H Zarezerwowane (Reserved):
- rodzaj przerwania: W,
- przyczyna: może wystąpić, gdy bity TS=1 lub MP=1 w rejestrze MSW proce-
sora (opisane dalej),
- reakcja BIOS: standardowy powrót,
- zastosowanie: sygnalizacja stanu nienormalnego nie powinna wystąpić pod-
czas normalnej przy systemu.
8H Przerwanie zegara (Time of Day):
- rodzaj przerwania: S, (IRQ 0)
- przyczyna: zgłoszenie przerwania przez układ odmierzania czasu (około 18,2
132
razy na sekundę),
- reakcja BIOS: zwiększenie stanu zegara czasu systemowego (zmiennej
TIMER_LOW i TIMER_HIGH; porównaj z opisem przerwania 1AH),
zmniejszenie zawartości licznika czasu włączenia silnika obracającego dys-
kietkę i ewentualne jego wyłączenie oraz wykonanie przerwania 1CH.
- zastosowanie: przerwanie to może być użyte do określenia czasu, jaki upły-
nął od włączenia komputera.
9H Przerwanie klawiatury (keyboard)
- rodzaj przerwania: S, (IRQ 1),
- przyczyna: naciśnięcie bądz zwolnienie klucza klawiatury,
- reakcja BIOS: wykonanie procedury obsługi klawiatury,
- zastosowanie: podprogram obsługi klawiatury.
0AH Zarezerwowane (Reserved):
- rodzaj przerwania: S (IRQ 2),
- przyczyna: zgłosi je urządzenie zewnętrzne, np. karta znajdująca się w złączu
na płycie głównej (w PC/AT linia IRQ2 jest dołączona do wyjścia INT pod-
rzędnego sterownika przerwań 8259, por. opis przerwania 71H),
- reakcja BIOS: standardowy powrót,
- zastosowanie: podprogram obsługi urządzenia zewnętrznego.
0BH Przerwanie portu szeregowego 2:
- rodzaj przerwania: S, (IRQ 3),
- przyczyna: żądanie obsługi przez łącze szeregowe 2 (COM 2),
- reakcja BIOS: standardowy powrót,
- zastosowanie: wywołanie podprogramu obsługi urządzenia zewnętrznego.
0CH Przerwanie łącza szeregowego 1:
- rodzaj przerwania: S, (IRQ 4),
- przyczyna: żądanie obsługi przez łącze szeregowe 1 (COM),
- reakcja BIOS: standardowy powrót,
- zastosowanie: podprogram obsługi urządzenia zewnętrznego.
0DH Przerwanie drukarki LPT 2 lub przerwanie sterownika twardego dysku:
- rodzaj przerwania: S, (IRQ 5),
- przyczyna: generowane jest żądanie obsługi przez urządzenie zewnętrzne,
- reakcja BIOS: w PCx86 ma miejsce standardowy powrót,
133
- zastosowanie: podprogramu obsługi urządzenia zewnętrznego.
Karty obsługujące łącza równoległe do drukarek stosowane w PCx86 zwykle
nie generują tego przerwania, ani też nie używa go oprogramowanie.
OEH Przerwanie sterownika dyskietki:
- rodzaj przerwania: S, (IRQ 6),
- przyczyna: generowany sygnał żądania obsługi przez sterownik,
- reakcja BIOS: wykonanie procedury obsługi sterownika,
- zastosowanie: podprogram obsługi sterownika dyskietki.
OFH Przerwanie drukarki LPT 1:
- rodzaj przerwania: S, (IRQ 7),
- przyczyna: sygnał żądania obsługi przez drukarkę,
- reakcja BIOS: standardowy powrót,
- zastosowanie: podprogram obsługi sterownika portu LPT1.
Karty obsługujące łącza równoległe do drukarek zwykle nie generują tego
przerwania.
70H Przerwanie zegara czasu rzeczywistego:
- rodzaj przerwania: S, (IRQ 8),
- przyczyna: zgłoszenie przez zegar czasu rzeczywistego przerwania po upły
wie ustawionego czasu (budzik), lub odblokowanie okresowych przerwań
tego zegara (porównaj opis przerwania 1AH),
- reakcja BIOS: wykonanie procedury obsługi zegara czasu rzeczywistego; dla
przerwania pochodzącego od sygnału alarmu (budzika), generowany jest
podprogram o lokacji 4AH,
- zastosowanie: podprogramy odmierzania czasu.
71H Zarezerwowane (Reserved):
- rodzaj przerwania: S, (IRQ 9),
- przyczyna: rezerwa dla dodatkowej karty montowanej w złączu uniwersal-
nym płyty głównej,
- reakcja BIOS: wykonane zostaje programowe przerwanie 0AH (IRQ 2).
72H Zarezerwowane (Reserved):
- rodzaj przerwania: S, (IRQ 10),
- przyczyna: wystąpiło zgłoszenie urządzenia zewnętrznego (karta dodatkowa
znajdująca się w złączu płyty głównej),
134
- reakcja BIOS: standardowy powrót.
73H Zarezerwowane (Reserved):
- rodzaj przerwania: S, (IRQ 11),
- przyczyna: wystąpiło zgłoszenie urządzenia zewnętrznego z karty dodatko-
wej znajdująca się w złączu na płycie głównej,
- reakcja BIOS: standardowy powrót.
74H Zarezerwowane (Reserved):
- rodzaj przerwania: S, (IRQ 12),
- przyczyna: wystąpiło zgłoszenie urządzenia zewnętrznego z karty dodatko-
wej znajdującej się w złączu na płycie głównej,
- reakcja BIOS: standardowy powrót.
75H Przerwanie koprocesora:
- rodzaj przerwania: S, (IRQ 13),
- przyczyna: zgłoszenie przerwania przez koprocesor arytmetyczny x87, w
przypadku wystąpienia niezamaskowanego błędu,
- reakcja BIOS: skasowanie zapamiętanego w przerzutniku sygnału BUSY ko-
procesora i przekazanie sterowania do procedury 2 obsługi przerwania (dla
NMI),
- zastosowanie: podprogram obsługi błędów koprocesora.
76H Przerwanie sterownika dysku twardego:
- rodzaj przerwania: S, (IRQ 14),
- przyczyna: żądanie obsługi przez sterownik dysku twardego,
- reakcja BIOS: wykonanie procedury obsługi sterownika,
- zastosowanie: podprogram obsługi sterownika dysku twardego.
77H Zarezerwowane (Reserved):
- rodzaj przerwania: S, (IRQ 15),
- przyczyna: wystąpiło zgłoszenie z dodatkowej karty urządzenia zewnętrzne
go znajdującej się w złączu płyty głównej,
- reakcja BIOS: standardowy powrót.
Przerwania programowe
Przerwania programowe służą do wykonywania różnorodnych operacji związanych z
obsługą sprzętu. Niektóre z tych przerwań mogą wykonywać różne funkcje. Numer funkcji
135
jest przekazywany zawsze w rejestrze AH. Jeśli w jednej funkcji występują podfunkcje, to
numer podfunkcji jest przekazywany w rejestrze AL.
10H Obsługa ekranu (Video):
- rodzaj przerwania: P,
- przyczyna: uruchomienie operacji obsługi standardowego urządzenia wyj-
ściowego - ekranu,
- reakcja BIOS: przerwanie jest punktem wejścia do procedury BIOS wykonu-
jącej obsługę sterownika ekranu.
11H Konfiguracja systemu (Equipment Check):
- rodzaj przerwania: P,
- przyczyna: wywołanie podprogramu badania konfiguracji komputera,
- reakcja BIOS: w rejestrze AX zapisana zostaje informacja o rodzaju zainsta-
lowanych urządzeń:
bity:15,14 - liczba drukarek (lub łączy równoległych),
13 - w komputerze zainstalowano wewnętrzny modem,
12 - nieużywany w x86,
11,10,9 - deklaracja liczby portów szeregowych (RS 232),
8 - nieużywany;
7, 6 - liczba napędów dysków: 00 = 1,
01 = 2,
10 = 3,
11 = 4,
5, 4 - początkowy tryb pracy sterownika ekranu:
00 - nieużywany,
01 - 40 x 25 czarno-biały, karta CGA,
10 - 80 x 25 czarno-biały, karta CGA,
11 - 80 x 25 czarno-biały, karta mono,
3, 2 - nieużywane,
1 - obecność koprocesora arytmetycznego,
0 - obecność sterownika dysków miękkich.
- zastosowanie: przerwanie podaje zestaw urządzeń zainstalowanych w kom-
puterze.
136
12H Wymiar pamięci operacyjnej (Memory):
- rodzaj przerwania: P,
- przyczyna: wywołanie podprogramu badania pamięci,
- reakcja BIOS: w rejestrze AX zostaje zapisana liczba pełnych bloków pa-
mięci RAM o wymiarze 1 KB,
- zastosowanie: podaje wymiar pamięci operacyjnej komputera.
13H Obsługa dysku miękkiego lub twardego (Diskette/Disk):
- rodzaj przerwania: P,
- zastosowanie: przerwanie to jest punktem wejścia do procedury systemowej
BIOS wykonującej obsługę sterownika dysku miękkiego i twardego.
14H Obsługa łączy szeregowych (Serial I/O):
- rodzaj przerwania: P,
- reakcja BIOS: wszystkie funkcje tego przerwania wymagają podania w rejes-
trze DX numeru łącza szeregowego: DX - numer łącza (np. 0 - COM1).
Funkcja 0 (dla 14H) programowania podstawowych parametrów pracy układu
złącza (interfejsu) szeregowego 8250.
Wywołanie z podaniem parametrów łącza w rejestrze AL, gdzie:
bity 7,6,5 kodują szybkość transmisji, w bitach na sekundę
(bodach):
000 - 110 bodów (bitów/s),
001 - 150 bodów,
010 - 300 bodów,
011 - 600 bodów,
100 - 1200 bodów,
101 - 2400 bodów,
110 - 4800 bodów,
111 - 9600 bodów.
bity 4,3 kodują funkcję bitu parzystości:
00 - brak bitu parzystości,
01 - nieparzysty,
10 - brak bitu parzystości,
11 - parzysty,
bit 2 określa liczbę bitów stopu,
137
0 - jeden bit stopu,
1 - dwa bity stopu.
bity 1,0 kodują długość słowa danych:
10 - 7 bitów danych,
11 - 8 bitów danych.
Powrót z zapisem stanu łącza w rejestrze AX.
Funkcja 1 (dla 14H) wysłania znaku przez łącze szeregowe.
Wywołanie z zapisem w rejestrze AL wysyłanego znaku.
Powrót z podaniem w rejestrze AX stanu łącza. W przypadku błędu transmisji
na bicie 7 rejestru AH ustawiana jest wartość 1.
Funkcja 2 (dla 14H) odczytu znaku na złączu szeregowym.
Wywołanie bez podania dodatkowych parametrów.
Powrót zapisem w rejestrze AL odczytanego znaku. W rejestrze AH zawarty
jest zapis stanu linii transmisyjnej.
Funkcja 3 (dla 14H) odczyt stanu łącza szeregowego i linii komunikacyjnej
Wywołanie nie wymaga podania dodatkowych parametrów.
Powrót z zapisem w rejestrze AX stanu łącza transmisyjnego. W rejestrze AH
zapisany jest stan linii, gdzie bity:
7 - błąd przeterminowania (time-out error register),
6 - rejestr transmisji pusty (transmission shift empty),
5 - rejestr wyjściowy pusty (transmission buffor empty),
4 - stan 0 linii (break detect),
3 - błąd ramki (frame error),
2 - błąd parzystości (parity error),
1 - błąd nałożenia (overrun error),
0 - dane gotowe (data ready).
W rejestrze AL zapisany jest stan modemu.
- zastosowanie: przerwanie jest punktem wejścia do procedur systemu BIOS
wykonujących obsługę łączy szeregowych RS 232.
15H Rozszerzenie systemowe:
- rodzaj przerwania: P,
- zastosowanie: Przerwanie jest punktem wejścia do procedur obsługi rozsze-
rzeń systemowych pomocnych przy realizacji systemów wielozadaniowych
138
(współbieżnych), obsługi niektórych urządzeń oraz do procedur współpracy
z pamięcią rozszerzoną (extended memory).
Ponieważ funkcje wspomagające wielozadaniowość nie są używane przez system
DOS, omówimy tu jedynie funkcję przechwytywania przerwania klawiatury, funkcję odczy-
tania położenia manipulatora (joystick) i funkcje współpracy z pamięcią rozszerzoną dla
PC/AT.
Funkcja 4FH (dla 15H), przechwytywania znaku (przerwania od) klawiatury.
Funkcja jest wywoływana przez procedurę obsługi przerwania 9H po odczyta-
niu kodu klawisza, z zapisem do rejestru AH wartości 4FH a rejestr AL zawie-
ra kod klawisza.
Powrót: gdy bit C = 1 rejestr AL zawiera kod klawisza,
dla C = 0 rejestr AL nie zawiera kodu, tzn. klawisz jest ignorowa-
ny.
Standardowo BIOS nie zamienia kodu klawisza, a więc funkcja zwraca nie
zmienioną zawartość rejestru AL z bitem przeniesienia C = 1.
Funkcja 84H (dla 15H), czytania stanu manipulatora, tj. czytania stanu jego
przełączników i potencjometrów.
Wywołanie 1 gdy zawartość rejestru DX = 0, dla czytania stanu przełączni-
ków. Powrót z zapisem na bitach od 7 do 4 rejestru AL stanu przełączników.
Wywołanie 2 gdy zawartość rejestru DX = 1, dla czytania położenia mani-
putora joystick. Powrót z zapisem do rejestrów wartości rezystancji odpowied-
nich potencjometrów:
w AX = wartość położenia A(x),
w BX = wartość położenia A(y),
w CX = wartość położenia B(x),
w DX = wartość położenia B(y).
Bit C = 1, jeśli w systemie nie ma karty Game I/O lub wywołanie było niepo-
poprawne.
Funkcja 87H (dla 15H) przeniesienia bloku danych między standardowym
obszarem pamięci a pamięcią rozszerzoną (z lub do pamięci).
Wywołanie za pomocą deklaracji ES:SI, definiującej adres tablicy deskrypto-
rów GDT (Global Descriptor Table - omówionych w rozdz. 4) w rejestrze CX
139
jest zapisana deklaracja liczby słów dwubajtowych do przepisania (maksymal-
nie 8000H słów, czyli 64 KB).
Powrót z zapisem do rejestrów:
AH = 0 gdy przepisanie jest zakończone pomyślnie,
AH = 1 gdy wystąpił błąd parzystości,
AH = 2 gdy w czasie wykonywania operacji wystąpił wyjątek
(exception) sygnalizowany błędem procesora,
AH = 3 gdy wystąpił błąd funkcji blokowania linii adresowej A20, oraz
bit C = 1 tzn., że wystąpił błąd, a gdy bit ZF=1 błędu nie było.
Funkcja korzysta z wirtualnego trybu pracy mikroprocesora (protected mode),
który dotyczy adresowania pamięci (RAM) rozszerzonej.
Funkcja 88H (dla 15H), czytania rozmiaru pamięci rozszerzonej (extended
memory size).
Wywołanie nie wymaga podania parametrów.
Powrót z zapisem bitu C = 1, co oznacza wystąpienie błędu. W rejestrze AX
zapisana jest liczba pełnych bloków po 1 KB pamięci rozszerzonej w obszarze
powyżej adresu 100000H (1 MB).
Funkcja 89H (dla15H) przejścia z rzeczywistego do wirtualnego trybu pracy
procesora (szczegółowo opisane w rozdz.4).
Wywołanie z podaniem w rejestrze BL numeru przerwania IRQ0 (przerwania
IRQ1 - IRQ7 obsługują kolejne funkcje). W rejestrze BH zapisany jest numer
przerwania IRQ8 (przerwania IRQ9 - IRQ15 obsługują kolejne funkcje). De-
klaracja DS:SI zawiera adres tablicy deskryptorów GDT (opisanych w
rozdz.4)
Tablica GDT zawiera co najmniej 8 elementów:
0 - deskryptor pusty,
1 - deskryptor tablicy GDT,
2 - deskryptor tablicy IDT,
3 - deskryptor segmentu DS,
4 - deskryptor segmentu ES,
5 - deskryptor segmentu SS,
6 - deskryptor segmentu CS,
140
7 - nie inicjowany, używany do utworzenia deskryptora segmentu
kodu BIOS.
W rejestrze CX zapisane jest przemieszczenie początku programu wykonywa-
nego w trybie wirtualnym.
Powrót z zapisem C = 1 jeśli wystąpił błąd, w rejestrze AH = FFH, jeśli wystą-
pił błąd odblokowania linii adresowej A20.
Funkcja C0H (dla 15H) czytania konfiguracji i wersji systemu.
Wywołanie nie wymaga podania parametrów.
Powrót z wartością C = 1 jeśli wystąpił błąd lub funkcja nie jest dostępna,
Zawartość rejestru AH = 0 co oznacza prawidłowe wykonanie funkcji. Dekla-
racja ES:BX zawiera adres tablicy informacji systemowych, w której są zapi-
sane następujące informacje:
bajty 0 i 1 zawierają deklarację długości tablicy (słowo 16-bitowe),
bajt 2 zawiera numer modelu systemu,
bajt 3 zawiera numer wersji systemu,
bajt 4 zawiera numer wersji BIOS (BIOS revision level),
bajt 5 jest numerem konfiguracji systemu (feature information),
o następującym znaczeniu wartość 1 na odpowiednich bitach:
7 gdy BIOS obsługuje dysk twardy (trzeci kanał DMA),
6 gdy komputer obsługuje dwa sterowniki przerwań,
5 gdy komputer posiada zegar czasu rzeczywistego,
4 gdy procedura BIOS obsługi klawiatury wykonuje
funkcję przechwytywania przerwań z klawiatury
(przerwanie 15H, funkcja 4FH);
3 jest zarezerwowane dla funkcja specjalnej,
2 sygnalizuje pracę BIOS w rozszerzonym obszarze
danych (extended BIOS area - na końcu
640KB);
1 sygnalizuje obecność szyny Micro Channel,
0 - zarezerwowany.
bajty 6,7,8 są zarezerwowane dla rozszerzeń systemowych.
16H Obsługa klawiatury:
- przyczyna: naciśnięcie klawisza.
141
- zastosowanie: przerwanie umożliwia odczytanie i sprawdzenie stanu klawia-
tury.
Dodatkowo wykonywane są funkcje: 3H, 5H (dla IBM PC/AT), 10H, 11H, 12H.
Funkcje 10H, 11H, 12H są stosowane do współpracy z klawiaturami rozszerzonymi (exten-
ded keyboard), zawierającymi 101 lub 102 klawisze.
Funkcje 0 i 10H (dla 16H), odczytu znaku z bufora klawiatury.
Wywołanie nie wymaga podania parametrów.
Powrót z zapisem w rejestrze AL przeczytanego znaku. W rejestrze AH zapi-
sany jest kod (scan code) klawisza.
Funkcja 10H działa analogicznie do funkcji 0, ale jest wykorzystywana do współpracy
z klawiaturą zawierającą 101 (lub 102) klawiszy.
Funkcje 1H i 11H (dla 16H ) sprawdzania, czy w buforze procedury obsługi
klawiatury znajduje się znak gotowy do odczytu.
Wywołanie nie wymaga podania parametrów.
Powrót z zapisem Z = 1, który oznacza , że bufor klawiatury nie zawiera znaku
do odczytu. Gdy bit Z = 0 w buforze klawiatury oraz w rejestrze AX znajduje
się czytany znak.
Funkcja 11H działa analogicznie do funkcji 1H dla klawiatury zawierającej 101 lub
102 klawisze.
Funkcje 2H i 12H (dla 16H) czytania stanu klawiszy modyfikujących (shift
status).
Wywołanie nie wymaga podania parametrów.
Powrót z zapisem do AL bieżącego stanu klawiszy modyfikujących,
W rejestrze AH zawarty jest bieżący stan klawiszy modyfikujących dla kla-
wiatury rozszerzonej (tylko dla funkcji 12H).
Funkcja 12H działa analogicznie do funkcji 2H, dla klawiatury zawierającej 101 lub
102 klawisze.
Funkcja 3H (dla 16H) ustawienia szybkości powtarzania znaków i początko-
wego opóznienia (Set Typematic Rate).
Wywołanie wymaga zapisu następujących parametrów: AL = 5, a do rejestru
BL należy wpisać parametr szybkości powtarzania (kodowania liczby znaków
na sekundę): BL = 0 odpowiada szybkości 30 zn/s, BL = 8 dla 15 zn/s, BL =
10H dla szybkości 7,5 zn/s, BL=1FH dla 2 zn/s. Rejestr BH zawiera wartość
142
początkowego opóznienia (przed rozpoczęciem powtarzania odczytu naciśnię-
tego klawisza). Dozwolone są cztery wartości: 0 dla opóznienia 250 ms, 1 dla
500 ms, 2 dla 750 ms, 3 dla 1000 ms.
Powrót nie zwraca żadnej wartości. W razie wystąpienia błędu na bicie 7 w
rejestrze AH jest ustawiana wartość wysoka.
Funkcja 5H (dla 16H), wpisywania znaku do bufora klawiatury.
Wywołanie poprzedzamy zapisem do CL znaku w kodzie ASCII, CH zawiera
kod klawisza.
Powrót z AL = 0 oznacza , że operacja została zakończona pomyślnie.
AL=1 oznacza, że bufor klawiatury pełny, czyli nie można wpisać kolejnego
znaku.
17H Obsługa drukarki:
- przyczyna: uruchomienie instrukcji drukowania.
- zastosowanie: programowe przesłanie znaku do drukarki, inicjacja sterowni-
ka drukarki oraz odczyt stanu drukarki.
Wszystkie funkcje tego przerwania wymagają podania w rejestrze DX numeru dru-
karki (np. 0 dla LPT1). Wywoływane są dodatkowo funkcje 0H, 1H i 2H.
Funkcja 0H (17H) przesłania znaku do drukarki.
Wywołanie poprzedzamy wpisaniem do AL wysłanego znaku.
Powrót z AH = 1 oznacza błąd przeterminowania danych. Jeśli AH nie jest
równe 1, to rejestr ten zawiera stan drukarki (por. opis funkcji 2H).
Funkcja 1H (dla 17H) inicjacji sterownika drukarki.
Wywołanie nie wymaga podania dodatkowych parametrów.
Funkcja 2H (dla 17H), badania stanu drukarki i sterownika.
Wywołanie nie wymaga podania dodatkowych parametrów.
Powrót z AH zawierającym zapis stanu (statusu) drukarki. Wartość wysoka na
bicie: 7 drukarka nie zajęta,
6 potwierdzenie,
5 brak papieru,
4 drukarka wybrana,
3 błąd komunikacji,
2 nieużywany,
1 nieużywany,
143
0 stan przeterminowania danych.
18H Przerwanie wywołane wbudowanym interpreterem języka Basic:
Wywołanie nie wymaga podania parametrów.
Interpreter nie wykonuje powrotu do systemu BIOS.
19H Aadowanie systemu operacyjnego:
- zastosowanie: uruchamia z pamięci masowej (FD lub HD) program ładujący
(Bootstrap) system operacyjny i przekazuje mu sterowanie komputera.
W pierwszej kolejności podejmowana jest próba (powtarzana 3 razy) odczytu progra-
mu ze stacji A. Jeśli próba nie powiedzie się następuje próba odczytania pierwszego sektora
na pierwszym dysku twardym, głównego rekordu ładującego (Master Boot Record) i spraw-
dzenie, czy dwa ostatnie bajty tego 512-bajtowego sektora zawierają wartości odpowiednio
55H i AAH. Jeśli odczytanie z dyskietki lub dysku twardego powiedzie się, sterowanie jest
przekazywane (instrukcją JMP FAR) do początku pamięci RAM (adres 7C00H) zawierające-
go odczytany sektor.
Wywołanie nie wymaga podania parametrów.
Przerwanie nie wykonuje powrotu.
1AH Data i godzina (Time of Day)
- zastosowanie: ustawienie i odczyt zegara systemowego obsługiwanego przez
BIOS i zegara czasu rzeczywistego (astronomicznego).
Podczas inicjowania systemu, BIOS zeruje zawartość dwóch zmiennych
TIMER_LOW i TIMER_HIGH (porównaj opis przerwania 8H). Zawartość tych zmiennych
jest wykorzystywana przez DOS do podawania czasu, na przykład przy wykonaniu polecenia
TIME. Zegar czasu rzeczywistego komputera działa także wówczas, gdy zasilanie jest wyłą-
czone (zasilanie z wbudowanej baterii). Podczas inicjowania BIOS odczytuje godzinę z tego
zegara i ustawia odpowiednio zegar czasu systemowego (tzn. zmienne TIMER_LOW i
TIMER_HIGH). Jeśli zegar czasu rzeczywistego nie działa, to zegar czasu systemowego jest
zerowany, co odpowiada godzinie 00:00:00.
Funkcja 0 (dla 1AH) czytania stanu zegara czasu systemowego.
Wywołanie nie wymaga podania parametrów.
Powrót z zapisem do CX bardziej znaczącej część stanu zegara w DX jest za-
pisywana mniej znacząca część stanu zegara (liczby 4- bajtowej),
AL = 0 jeśli od ostatniego odczytania upłynęło mniej niż 24 godziny w prze-
ciwnym razie AL = 1.
144
Funkcja 1 (dla 1AH) ustawiania zegara czasu systemowego.
Wywołanie poprzedzane w CX bardziej znaczącej część stanu zegara, DX za-
wiera mniej znacząca część stanu zegara.
Powrót nie zwraca żadnej wartości.
Funkcja 2 (dla 1AH) odczytu zegara czasu rzeczywistego.
Wywołanie nie wymaga podania parametrów.
Powrót: z zapisem do CH godziny w kodzie BCD (od 0 do 23). W CL zawarte
są minuty w kodzie BCD a w rejestrze DH sekundy również w kodzie BCD.
Bit C = 1, jeśli zegar nie działa.
Funkcja 3 (dla 1AH) ustawiania zegara czasu rzeczywistego.
Wywołanie poprzedzamy wpisem do CH godziny w kodzie BCD, w CL zap-
sane są minuty (w kodzie BCD) a w DH sekundy. Zawartość rejestru DL = 1
dla czasu letniego w przeciwnym razie DL = 0.
Powrót nie zwraca żadnej wartości.
Funkcja 4 (dla 1AH) odczytu daty z zegara czasu rzeczywistego.
Wywołanie nie wymaga podania parametrów.
Powrót: z zapisem do CH wieku w kodzie BCD (19 lub 20). W CL zawarty
jest rok, w DH miesiąc a w DL dzień (w kodzie BCD), bit C = 1, jeśli zegar
nie działa.
Funkcja 5 (dla 1AH) ustawiania daty w zegarze czasu rzeczywistego.
Wywołanie poprzedzamy ustawieniem zawartości CH - wieku w kodzie BCD
(19 lub 20), do CL wpisujemy rok, do DH wpisujemy miesiąc, a do DL dzień
(wszystko w kodzie BCD).
Powrót nie zwraca żadnej wartości.
Funkcja 6 (dla 1AH), ustawienie alarmu (budzika) w zegarze czasu rzeczowi-
stego.
Wywołanie poprzedzamy zapisem w CH godziny, w CL minut a w DH sekund
(w kodzie BCD).
Powrót z bitem C = 1 jeśli alarm był już ustawiony lub jeśli zegar nie działa.
Funkcja 6 umożliwia wykonanie przerwania 4AH po upływie ustawionego czasu, nie
większego niż 23:59:59. Przerwanie będzie wykonywane okresowo co 24 godziny, do czasu
ustawienia budzika. Może być ustawiony najwyżej jeden alarm. Użytkownik musi wpisać
adres swojej procedury dla obsługi alarmu do tablicy przerwań (dla przerwania 4AH).
145
Funkcja 7 (dla 1AH) skasowania alarmu (budzika) w zegarze czasu rzeczowi-
stego.
1BH Klawisz BREAK na klawiaturze:
- przyczyna: naciśnięcie klawiszy CTRL + BREAK.
Wywołanie wykonywane przez procedurę BIOS obsługi klawiatury.
Standardowo jest wykonywany powrót z przerwania (instrukcją IRET).
Przerwanie jest wykonywane, jeśli użytkownik komputera nacisnął jednocześnie
klawisze CTRL - BREAK (lub CTRL - SCROLL LOCK). DOS przechwytuje to przerwanie i,
przez przerwanie 23H, zgłasza je do programu działającego pod kontrolą systemu DOS. W
przypadku braku powrotu sterowania do procedury BIOS należy:
- wysłać rozkaz EOI do sterownika (lub sterowników) przerwań tak, aby zakończyć
obsługę przerwań, które mogły być realizowane,
- wyzerować wszystkie urządzenia WE/WY, ponieważ przerwanie mogło wystąpić
podczas wykonywania operacji WE/WY.
1CH Przerwanie zegara czasu systemowego
- przyczyna: przerwanie jest wywoływane przez procedurę obsługi zegara
(przerwanie 8H),
- zastosowanie: użytkownik może wpisać adres swojej procedury do tablicy
przerwań pod numer tego przerwania. Procedura jest okresowo wywoływana
(około 18,2 razy na sekundę) przez zegar systemowy BIOS.
W przypadku korzystania z tego przerwania należy zachować dużą ostrożność (starać
się zakończyć jego obsługę jak najszybciej), ponieważ jest wykonywane przy zablokowanych
przerwaniach 9H. Są one odblokowywane dopiero po powrocie do przerwania 8H.
Wywołanie wykonywane przez procedurę obsługi układu 8254.
Powrót: z przerwania jest wykonywany standardowo instrukcją IRET.
Wskazniki obszarów pamięci
1 DH Zawiera parametry sterownika ekranu.
Wskazanie obszar pamięci, w którym są przechowywane początkowe parame-
try karty graficznej.
1EH Zawiera parametry napędu dysku miękkiego.
Wskazanie obszaru pamięci, w którym znajdują się początkowe parametry
napędu dysku miękkiego (NEC 765).
146
1FH Zawiera rozszerzone znaki graficzne.
Wskazanie tablicy, w której znajdują się wzorce znaków odpowiadających
kodom ASCII od 128 do 255 (80H - FFH) używane podczas pracy sterownika
ekranu w trybie graficznym 320x200 i 640x200.
41H Zawiera parametry dysku twardego nr 1.
Wskazanie obszaru pamięci zawierającego tablicę opisu dysku twardego nr 1.
43H Zawiera znaki graficzne dla karty EGA/VGA.
Wskazanie: tablicy w której znajdują się wzorce znaków, stosowane w gra-
ficznych trybach pracy karty EGA.
46H Parametry dysku twardego nr 2.
Wskazanie obszaru pamięci zawierającego tablicę opisu dysku twardego nr 2.
147
Wyszukiwarka
Podobne podstrony:
Skrócona lista rozkazów mikroprocesora 80868086 asemblerwięcej podobnych podstron