ASK - PYTANIA NA KOŁO I
A) Podstawowe zasady działania komputera.
1) Omówić koncepcję programu w modelu komputera wg von Neumanna.
Procesor składa się z wielu różnych podzespołów, które wykonują określone działania, np.
sumowanie liczb, wskutek otrzymania sygnałów z innych modułów. Zatem realizacja
przetwarzania w procesorze (np. wykonanie jakiegoś obliczenia) wymaga skierowania do
tych podzespołów odpowiednich sygnałów. Ażeby było to możliwe, program (w sensie
modelu von Neumanna) musi być przekształcony na poprawną sekwencję sygnałów,
oddziaływujących na sprzęt. Program ten musi być bezpośrednio dostępny, tak by
niezwłocznie po zakończeniu jednej operacji można było zacząć następną. Oznacza to, że
program musi być przechowywany w pamięci ściśle współdziałającej z procesorem.
Wynikają z tego od razu dwa wnioski:
-pamięć współpracująca z procesorem musi być dostatecznie szybka, tak by oczekiwanie na
odczytanie potrzebnych informacji nie powodowało przestojów w pracy procesora;
-ponieważ wszelkie przetwarzane informacje mają charakter binarny, więc także program
przechowywany w pamięci musi być zakodowany w postaci binarnej.
Sam program składa się z ciągu poleceń (przechowywanych w pamięci operacyjnej),
zakodowanych w sposób zrozumiały dla procesora.
Ponadto wykonywany program może się sam modyfikować traktując obszar instrukcji jako
dane, a po przetworzeniu tych instrukcji - danych - zacząć je wykonywać.
2) Wyjaśnić znaczenie terminu ‘lista rozkazów procesora’.
Ażeby uprościć programowanie, przyjęto pewien podstawowy zbiór operacji (dla
konkretnego typu procesora) i każdej operacji przypisano ustalony kod w postaci ciągu
zerojedynkowego. Do zbioru operacji podstawowych należą zazwyczaj cztery działania
arytmetyczne, operacje logiczne na bitach (negacja, suma logiczna, iloczyn logiczny),
operacje przesyłania, operacje porównywania i wiele innych. W takim ujęciu zadaniem
układu sterowania procesora po odczytaniu takiego ciągu jest wygenerowanie odpowiedniej
Procesor
Pamięć
Urządzenia
wejścia/wyjścia
Jednostka
arytm. – logiczna
Jednostka
sterująca
Rozkazy
Dane
sekwencji sygnałów do poszczególnych podzespołów, tak by w rezultacie wykonać
wymaganą operację (np. dodawanie).
Operacje zdefiniowane w zbiorze podstawowym nazywane są rozkazami lub instrukcjami
procesora.
Podstawowy zbiór operacji procesora jest zwykle nazywany listą rozkazów procesora.
3) Na czym polega różnica między pamięcią fizyczną i pamięcią wirtualną w komputerze?
Pamięć fizyczna
Rozkazy (instrukcje) programu odczytujące dane z pamięci operacyjnej (czy też zapisujące
wyniki) zawierają informacje o położeniu danej w pamięci, czyli zawierają adres danej; w
wielu procesorach adres ten ma postać adresu fizycznego, czyli wskazuje jednoznacznie
fizyczną komórkę pamięci,
gdzie znajduje się potrzebna dana; w trakcie operacji odczytu adres
fizyczny kierowany do układów pamięci poprzez linie adresowe, a ślad za tym układy
pamięci odczytują i odsyłają potrzebną daną.
Pamięć wirtua1na
Pamięć operacyjna komputera w kształcie widzianym przez programistę. Jest pewną iluzją
pamięci rzeczywistej (fizycznej).
Pozwala na odseparowanie pamięci logicznej użytkownika od pamięci fizycznej.
-można jedynie część programu załadować do pamięci w celu wykonania;
-logiczna przestrzeń adresowa procesu może dlatego być znacznie większa niż fizyczna
przestrzeń adresowa;
-potrzeba wymiany stron między dyskiem a pamięcią.
4) Jaką rolę w trakcie wykonywania programu przez procesor pełni wskaźnik instrukcji (liczik
rozkaz
ów)?
Proces pobierania kolejnych instrukcji z pamięci operacyjnej i ich wykonywania musi być
precyzyjnie zorganizowany, tak by natychmiast po wykonaniu kolejnej instrukcji procesor
pobierał z pamięci następną; aby pobrać tę instrukcję, procesor musi oczywiście znać jej
położenie w pamięci operacyjnej — informacje o położeniu kolejnej instrukcji są
umieszczone w specjalnym rejestrze, nazywanym wskaźnikiem instrukcji;
3l
l5
7 o
EIP
IP
W architekturze IA–32 wskaźnik instrukcji jest rejestrem 32-bitowym oznaczonym symbolem
EIP.
5) Omówić klasę instrukcji procesora, które mają zdolność do zmiany naturalnego porządku
wykonywania rozkazów.
Instrukcje sterujące warunkowe
na ogół nie wykonują żadnych obliczeń, ale tylko
sprawdzają, czy uzyskane wyniki mają oczekiwane własności. W zależności od rezultatu
sprawdzenia wykonywanie programu może być kontynuowane przy zachowaniu naturalnego
porządku instrukcji albo też porządek ten może być zignorowany poprzez przejście do
wykonywania instrukcji znajdującej się w odległym miejscu pamięci operacyjnej.
Istnieją też instrukcje sterujące zwane bezwarunkowymi, których jedynym zadaniem jest
zmiana porządku wykonywania instrukcji (nie wykonują one żadnego sprawdzenia).
W architekturze IA–32 rozmaite instrukcje sterujące testują zawartość pojedynczych bitów w
rejestrze znaczników, a niekiedy obliczają pewne wyrażenia logiczne określone na tych
bitach. Dla każdej instrukcji sterującej (warunkowej) określono testowany warunek, np. dla
instrukcji sterującej:
jz warunek jest spełniony, gdy znacznik ZF = 1;
jnz warunek jest spełniony, gdy znacznik ZF = 0;
ja warunek jest spełniony, gdy znaczniki CF = 0 i ZF = 0.
W zależności od tego czy warunek jest spełniony czy nie, do wskaźnika instrukcji EIP
wpisywane są inne wartości, jak podano poniżej;
Obliczanie EIP przez instrukcje sterujące:
1. gdy testowany warunek jest spełniony:
EIP ← EIP + <liczba bajtów aktualnie wykonywanej instrukcji> + <zawartość pola
adresowego instrukcji>
2. gdy testowany warunek nie jest spełniony:
EIP ← EIP + <liczba bajtów aktualnie wykonywanej instrukcji>
6) Omówić funkcje znaczników CF i ZF w ‘rejestrze znaczników’.
W trakcie wykonywania niektórych instrukcji (rozkazów) ustawiane są również znaczniki
(rejestry jednobitowe) — znaczniki te, zebrane razem, tworzą 32-bitowy rejestr znaczników
EF (lub EFLAGS) o strukturze podanej na rysunku:
0
1
2
3
4
5
6
7
8
9
11
12
13
14
15
10
16
17
18
19
20
21
31
ID VIP VIF AC VM RF 0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF
CF (ang. carry) znacznik przeniesienia - do znacznika tego wpisywane jest przeniesienie
(pożyczka) z najbardziej znaczącego bitu; znacznik używany jest do sygnalizacji nadmiaru w
operacjach na liczbach bez znaku;
ZF (ang. zero) znacznik zera - znacznik ten ustawiany jest w stan 1, gdy wynik operacji
arytmetycznej lub logicznej jest równy 0 i zerowany w przypadku przeciwnym;
7) Omówić podstawowe elementy architektury koprocesora arytmetycznego.
Koprocesor arytmetyczny stanowi odrębny procesor, współdziałający z procesorem głównym,
i w przypadku Pentiuma znajdujący się w tej samej obudowie;
liczby, na których wykonywane są obliczenia, składowane są w 8 rejestrach 80-bitowych
tworzących stos;
rozkazy koprocesora adresują rejestry stosu nie bezpośrednio, ale względem wierzchołka
stosu; w kodzie asemblerowym rejestr znajdujący się na wierzchołku stosu oznaczany jest
ST(0) lub ST, a dalsze ST(1), ST(2),..., ST(7); ze względu na specyficzny sposób
adresowania koprocesor arytmetyczny zaliczany jest do procesorów o architekturze stosowej;
mechanizmy stosu rejestrów koprocesora są analogiczne do mechanizmów stosu w
procesorze (m.in. stos rośnie w kierunku malejących numerów rejestrów);
lista rozkazów koprocesora arytmetycznego zawiera rozkazy wykonujące działania na
liczbach zmiennoprzecinkowych, w tym rozkazy przesłania, działania arytmetyczne,
obliczanie pierwiastka kwadratowego, funkcji trygonometrycznych (sin, cos, tg, arc tg),
wykładniczych i logarytmicznych;
B) Kodowanie danych i instrukcji.
1) Omówić różne rodzaje kodowania liczb binarnych w komputerze.
Kodowanie liczb całkowitych:
W przypadku liczb bez znaku stosowany jest naturalny kod binarny, wartość liczby określa
w
x
i
i
i
m
=
⋅
=
−
∑
2
0
1
, gdzie m oznacza liczbę bitów rejestru lub komórki pamięci.
W przypadku liczb ze znakiem, kodowanych w systemie U2, wartość liczby określa formuła:
w
x
x
m
m
i
i
i
m
= −
⋅
+
⋅
−
−
=
−
∑
1
1
0
2
2
2
, gdzie m oznacza liczbę bitów rejestru lub komórki pamięci.
W przypadku kodowania w systemie BCD, każdy upakowany bajt zawiera dwie cyfry
dziesiętne, za to nie upakowany bajt zawiera jedną cyfrę dziesiętną (4 starsze bity są
wyzerowane).
Liczby zmiennoprzecinkowe kodujemy za pomocą mantysy i wykładnika.
mantysa * 2 ^ wykładnik,
gdzie: wartość bezwzględna mantysy należy do przedziału [1, 2).
Podane wyrażenie w rea1izacjach komputerowych ma nieco inna postać.
2) Podać w przybliżeniu zakresy liczb, które mogą być kodowane w postaci binarnej jako
liczby bez znaku na 16 lub 32 bitach.
liczby 16-bitowe
<0, 65535>
liczby 32-bitowe
<0, 4 294 967 295>
3) W jaki sposób w procesorach z IA-32 sygnalizowane jest wystąpienie nadmiaru w
operacjach dodawania, odejmowania?
Dodawanie – ustawiane są znaczniki OF ( liczby ze znakiem) lub CF (liczby bez znaku)
Odejmowanie – ustawiane są znaczniki OF (liczby ze znakiem) lub CF (liczby bez znaku)
4) Przedstawić w postaci graficznej schemat konwersji liczb 32-bitowych zapisanych w
pamięci wg reguły mniejsze niżej na postać mniejsze wyżej.
W produkowanych obecnie procesorach stosuje się dwa podstawowe schematy
rozmieszczenia poszczególnych bajtów liczb w pamięci: mniejsze niżej (ang. little endian) i
mniejsze wyżej
(ang. big endian);
Do konwersji liczby zapisanej w formacie mniejsze niżej na format mniejsze wyżej (i
odwrotnie) można zastosować rozkaz BSWAP
Rejestr
32-bitowy
31
24 23
16 15
8 7
0
5) Omówić technikę porównywania liczb stałoprzecinkowych stosowaną w procesorach z IA-
32.
CMP – instrukcja porównująca ustawia znaczniki ZF i CF, ale nigdzie nie zapisuje wyniku
operacji (odejmowanie).
Porównanie (CMP bx, cx):
Jeżeli liczba w bx = cx to ZF=1 i CF=0
Jeżeli liczba w bx > cx to ZF=0 i CF=0
Jeżeli liczba w bx < cx to ZF=0 i CF=1
Dla liczb ze znakiem sprawdza się zawartość znaczników ZF, OF, SF;
Dla liczb bez znaku sprawdza się zawartość znaczników ZF i CF za pomocą instrukcji
bitowych.
6) Dlaczego obliczenia na liczbach stałoprzecinkowych są kłopotliwe jeśli działania
wykonywane są na wartościach bardzo dużych i bardzo małych?
Przykładowo, można przyjąć format kodowania podany na poniższym rysunku:
0
1
2
3
4
5
6
7
8
9
11
12
13
14
15
10
bit znaku
2
-2
2
-3
2
-4
2
-5
3
2
2
2
1
2
0
2
-1
2
6
2
5
2
4
2
2
9
2
8
2
7
Podany wyżej sposób kodowania jest kłopotliwy w przypadku, gdy obliczenie wykonywane
jest na liczbach bardzo dużych i bardzo małych, np. obliczenie stałej czasowej obwodu RC:
R = 4.7 M , C = 68 pF
RC
Ω
=
⋅
⋅
⋅
=
⋅
−
−
4 7 10 68 10
3196 10
6
12
6
.
.
Wartości R i C w postaci binarnej mają postać
R = 01000111 10110111 01100000
C = 0.00000000 00000000 00000000 00000000 01001100 . . . . .
z tego względu obliczenia na liczbach niecałkowitych wykonywane są zazwyczaj w
arytmetyce zmiennoprzecinkowej (zmiennopozycyjnej); w architekturze IA-32 zdefiniowana
jest znaczna liczba rozkazów wykonujących działania na liczbach zmiennoprzecinkowych
przetwarzanych przez koprocesor arytmetyczny.
7) Co oznacza termin ‘wartości specjalne’ używany w kontekście koprocesora
arytmetycznego.
Są to liczby generowane w wyniku błędu, nie mogą być przedstawione w zwykły sposób.
Spośród dopuszczalnych wartości liczb wyłączono niektóre i nadano im znaczenie specjalne.
Takie liczby określane są terminem wartości specjalne; wartości specjalne mogą być
argumentami obliczeń tak jak zwykłe liczby; jeśli jeden z argumentów jest wartością
specjalną, to wynik jest też wartością specjalną – w wielu przypadkach obserwuje się
propagację wartości specjalnych.
W koprocesorze arytmetycznym przyjęto, że wszystkie liczby, których pole wykładnika
zawiera same zera lub same jedynki traktowane są jako wartości specjalne;
W zależności od ustawienia bitów w rejestrze sterującym koprocesora, wystąpienie wartości
specjalnej może powodować przerwanie (wyjątek koprocesora), albo też obliczenia mogą być
kontynuowane.
8) Omówić format 32-bitowych liczb zmiennoprzecinkowych (pole mantysy zawiera 23 bity,
pole wykładnika zawiera 8 bitów)
Liczby zmiennoprzecinkowe, nazywane też zmiennopozycyjnymi, kodowane są w postaci pary
liczb określanych jako mantysa i wykładnik;
w przypadku ogólnym wartość liczby zmiennoprzecinkowej (różnej od zera) określa
wyrażenie:
Podane wyrażenie w realizacjach komputerowych ma zwykle nieco inną postać;
Pole wykładnika można interpretować jako liczbę pozycji, o którą trzeba przesunąć w lewo
lub w prawo umowną kropkę rozdzielającą część całkowitą i ułamkową mantysy;
Zazwyczaj wprowadza się warunek normalizacji mantysy (dla liczb ≠ 0)
1
2
≤
<
mantysa
format 32-bitowy — liczby zapisane w tym formacie określane są jako liczby
zmiennoprzecinkowe krótkie
(ang. single precision);
mantysa
wykładnik
mantysa
wykladnik
⋅
2
W formacie 32-bitowym część całkowita mantysy występuje w postaci niejawnej;
W formacie 32-bitowym można kodować liczby o wartościach do 3.37∗10
38
9) Omówić zasady wykonywania operacji arytmetycznych na stałoprzecinkowych liczbach
wielokrotnej długości.
Dodawanie – realizowane jest przy użyciu instrukcji ADD lub ADC. ADD dodaje do siebie
dwa argumenty, a wynik umieszcza w pierwszym z nich. Jeżeli wynik operacji nie mieści się
w argumencie docelowym ustawiony zostanie znacznik przeniesienia CF. ADC służy do
dodawania liczb wielobajtowych. Pozwala w trakcie dodawania uwzględnić przeniesienie
powstałe w przypadku dodawania młodszych bajtów.
Instrukcje ADD i ADC ustawiają znaczniki:
•
Nadmiaru OF (nadmiar przy dodawaniu)
•
Znaku SF (zgodnie ze znakiem)
•
Zera ZF (jeżeli wynik operacji=0)
•
Parzystości PF, gdy w wyniku jest parzysta liczba jedynek
•
Przeniesienia CF, gdy ustawiany jest najmłodszy bit argumentu
•
Przeniesienia pomocniczego AF
Odejmowanie – polega na dodaniu do pierwszego argumentu drugiego w postaci U2. Funkcja
SBB to odejmowanie dwóch liczb z pożyczką (odejmowanie bardziej znaczących słów liczby
wielobajtowej).Ustawiane są te same znaczniki, co w przypadku dodawania.
Mnożenie – przy korzystaniu z instrukcji mnożenia MUL (dla liczb bez znaku) i IMUL (dla
liczb ze znakiem) należy pamiętać, że wynik umieszczany jest w dwóch rejestrach.
Dzielenie – instrukcje DIV i IDV, trzeba pamiętać ze rozmiar dzielnej powinien być 2 razy
większy niż dzielnik ( 32-bit dzielimy przez 16-bit).
10) Dlaczego w formatach liczb zmiennoprzecinkowych zgodnych z normą 754 nie występuje
bit znaku wykładnika?
Przyjęto normę IEEE 754, która została opracowana z myślą, aby ułatwić przenoszenie
programów z jednego procesora do drugiego — określa ona specyficzne metody i procedury
służące temu, aby arytmetyka zmiennoprzecinkowa dawała jednolite i przewidywalne wyniki,
niezależnie od platformy sprzętowej; norma ta jest stosowana praktycznie we wszystkich
współczesnych procesorach i koprocesorach arytmetycznych;
Norma IEEE 754 określa też standardowe formaty liczb zmiennoprzecinkowych;
podstawowym formatem liczb jest format 64-bitowy; pokazano, że uzyskiwanie dokładnych
wyników 64-bitowych wymaga wykonywania niektórych obliczeń na liczbach 80-bitowych.
S
mantysa
8 bitów
23 bity
wykł.
format 32-bitowy
Ponieważ nie ma jednoznaczności względem zera, gdyby był znak moglibyśmy zapisać +0 i
-0, a poza tym dzięki takiemu ułożeniu dostajemy dodatkowo jedną liczbę
.
11) Jakie wady i zalety ma kodowanie znaków w systemie Unicode?
Zalety:
-możesz zakodować 65536 znaków (co daje możliwość zakodowania wszystkich alfabetów
ś
wiata;), nie wymaga dzięki temu stron kodowych;
- jest jednoznaczny i znormalizowany;
- pozwala na pisanie w jednym dokumencie po angielsku chińsku i po łacinie;
Wady:
- jeden znak zajmuje 2 bajty przez co zajmuje to dwa razy więcej miejsca w pamięci
.
C) Mechanizmy adresowania
1) Omówić podstawowe zasady modyfikacji adresowych
Modyfikacje adresowe
- polegają na dodawaniu (sumowaniu) zawartości rejestrów
modyfikacji z polem adresowym rozkazu; adres lokacji pamięci, na której wykonywane jest
działanie określony jest nie tylko poprzez pole adresowe instrukcji, ale zależy również od
zawartości jednego lub dwóch wskazanych rejestrów;
W architekturze IA–32 dostępne są rozbudowane mechanizmy modyfikacji adresowych:
•
modyfikatorami mogą być 16-bitowe rejestry ogólnego przeznaczenia: BX, SI,
DI, BP, a także ich pary: (BX, SI), (BX, DI), (BP, SI), (BP, DI);
•
modyfikatorami mogą być dowolne 32-bitowe rejestry ogólnego przeznaczenia:
EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP;
•
może również wystąpić drugi rejestr modyfikacji spośród ww., z wyłączeniem
rejestru ESP;
•
drugi rejestr modyfikacji może być skojarzony z tzw. współczynnikiem skali,
który podawany jest w postaci ∗1, ∗2, ∗4, ∗8 — podana liczba wskazuje przez ile
zostanie pomnożona zawartość drugiego rejestru modyfikacji podczas obliczania
adresu;
obliczanie adresu efektywnego w trybie 32- i 16-bitowym wg reguły modulo 2
32
i 2
16
pozwala uzyskiwać adresy efektywne mniejsze niż zawartość pola adresowego —
odpowiednio duże liczby umieszczone w rejestrze modyfikacji działają tak liczby ujemne;
♦
niekiedy pole adresowe instrukcji jest całkowicie pominięte, a wartość adresu określona
jest wyłącznie poprzez wskazane rejestry modyfikacji; takie rozwiązanie jest:
•
niezbędne, jeśli adres lokacji pamięci zostaje obliczony dopiero w trakcie
wykonywania programu (nie jest znany ani w trakcie kodowania programu przez
programistę ani też podczas translacji) — dotyczy to często kodu generowanego
przez kompilatory języków wysokiego poziomu;
•
szczególnie korzystne w przypadku wielokrotnego odwoływania się do tej samej
lokacji pamięci — ponieważ pole adresowe nie występuje, więc instrukcja może być
zapisana na mniejszej liczbie bajtów (zwykle 2 bajty);
Modyfikacja adresowa z użyciem rejestru EBP działa trochę inaczej; rejestr ten został
bowiem zaprojektowany do wspomagania operacji przekazywania parametrów do procedur za
pośrednictwem stosu — z tego względu użycie ww. rejestrów jako modyfikatorów powoduje,
ż
e operacja zostanie wykonana na danych zawartych w obszarze stosu;
2) Wyjaśnić zasady adresowanie pośredniego.
Modyfikacja pośrednia
polega na wskazaniu komórki pamięci, w której znajduje się
potrzebny adres;
W architekturze IA-32 adresowanie pośrednie stosowane jest w instrukcjach sterujących
(skokowych).
Adres
007E2309H
007E230EH
007E230DH
007E230CH
007E230BH
007E230AH
007E2308H
007E2307H
007E2310H
007E2311H
007E230FH
007E2306H
007E2305H
007E2304H
007E2303H
007E2302H
kod operacji
007E2312H
007E230CH
pole adresowe
03H
23H
7EH
00H
3) Jaka wartość zostanie doprowadzona do rejestru DX po wykonaniu podanego niżej
fragmentu programu?
Dane3a SEGMENT
Linie dw421,422,443,442,444,427,432
- - - - - - - - - - - - - - - - -
polacz SEGMENT
ASSUME cs:polacz , ds:dane3a
- - - - - - - - - - - -- - - -- - -- -- -
mov esi, OFFSET linie + 4
mov ebx, 4
mov dx, [ebx][esi]
Odp. 442.
D) Programowanie w asemblerze
1) Wyjaśnić, na czym polega różnica między językiem maszynowym a językiem asemblera.
Algorytm, który jest zakodowany w postaci sekwencji ciągów zerojedynkowych, które są
zdefiniowane w podstawowym zbiorze operacji -> nazywamy programem w języku
maszynowym.
Program ten jest przechowywany w pamięci, a samo wykonanie programu polega na
przesłaniu kolejnych ciągów zerojedynkowych z pamięci głównej do układu sterowania
procesora. Po odczytaniu takiego ciągu jest generowana odpowiednia sekwencja sygnałów
kierowana do poszczególnych podzespołów. Język maszynowy jest generalnie trudny w
użyciu, znacznie wygodniejszy jest spokrewniony z nim ASEMBLER
Zasadniczą różnicą między językiem maszynowym a językiem asemblera jest fakt, że
posługuje się skrótem literowym, tzw. mnemonikiem, który zastępuje w ten sposób ciąg zer i
jedynek;
Kodowanie programu w asemblerze powinno pozwalać na zapisywanie algorytmów za
pomocą pojedynczych rozkazów procesora; także definiowanie danych powinno być
realizowane na poziomie pojedynczych bajtów lub słów;
2) Omówić dyrektywy używane do definiowania danych na poziomie asemblera.
Dyrektywa nie jest instrukcją procesora, lecz poleceniem dla asemblera nakazującym mu
określone działanie lub sposób interpretacji określonych instrukcji.
Dyrektywy DB, DW, DD, DF, DQ, DT służą do deklarowania danych statycznych i
dynamicznych w programie.
DB
– definiowanie bajtu (8 bitów),
DW
– definiowanie słowa (16 bitów),
DD
– definiowanie słowa o podwójnej długości (32 bity),
DF
– definiowanie 6 bajtów (48 bitów);
DQ
– definiowanie słowa poczwórnej długości (64 bity),
DT
– definiowanie 10 bajtów (80 bitów).
3) Co oznacza znak „?” podany zamiast wartości danej w kodzie asemblerowym
?
Przyjęte jest, że po lewej stronie dyrektywy podaje się nazwę zmiennej, a po prawej wartość
początkową; znak zapytania (?) oznacza, że wartość początkowa zmiennej jest nieokreślona;
nazwę zmiennej można pominąć; przykłady:
kcal
DB
169
linia7a
DQ
?
DW
−
19331
elem_sygn DD
18B706H
alfa
dw
4567H, 5678H, 6789H
4) Dlaczego rozkaz add [edi], 3 jest traktowany przez asembler jako błędny?
Operandy instrukcji nie precyzują, czy liczba 3 ma być zapisana na 8-miu bitach, 16-tu czy
też 32 - bitach. Aby tego błędu unikać należy sformułować ilość bajtów za pomocą instrukcji
PTR:
add byte PTR [edi], 3
add word PTR [edi], 3
add dword PTR [edi], 3
5) Jak należy rozumieć termin ‘licznik lokacji’ w kontekście programu asemblerowego?
W
procesie asemblacji programów istotną rolę odgrywa rejestr programowy (tj. definiowany
przez asembler), zwany licznikiem lokacji;
Licznik lokacji określa lokację w pamięci, do której zostanie przesłany aktualnie tłumaczony
rozkaz lub dana; po załadowaniu rozkazu lub danej, licznik lokacji zostaje zwiększony o ilość
bajtów zajmowanych przez ten rozkaz lub daną;
W asemblerach dla procesorów zgodnych z IA-32 licznik lokacji wskazuje położenie
ładowanej lokacji względem początku segmentu; w trakcie tłumaczenia pierwszego wiersza
segmentu licznik lokacji zawiera 0; w wyrażeniach adresowych licznik lokacji
reprezentowany jest przez symbol $;
6) Jakie działania wykonuje asembler w pierwszym i drugim przebiegu asemblacji?
W istocie zarówno asemblacja jak i kompilacja mają na celu przekształcenie kodu
ź
ródłowego programu na ciąg instrukcji procesora, aczkolwiek uzyskany ciąg (zawarty w
pliku z rozszerzeniem .OBJ) wymaga jeszcze dalszych przekształceń, które wykonywane są w
trakcie konsolidacji i ładowania;
Asemblacja realizowana jest dwuprzebiegowo: w każdym przebiegu czytany jest cały plik
ź
ródłowy (ściśle: moduł) od początku do końca;
W pierwszym przebiegu asembler stara się wyznaczyć ilości bajtów zajmowane przez
poszczególne rozkazy i dane; jednocześnie asembler rejestruje w słowniku symboli wszystkie
pojawiające się definicje symboli (zmiennych i etykiet);
W drugim przebiegu asembler tworzy kompletną wersję przetłumaczonego programu,
określając adresy wszystkich instrukcji w oparciu o informacje zawarte w słowniku symboli;
7) W jaki sposób asembler oblicza pola adresowe rozkazów sterujących (skokowych)?
EIP <- EIP + < liczba bajtów aktualnie wykonywanego rozkazu> + < zawartość pola
adresowego rozkazu>
Rozkazy sterujące dodają do wskaźnika instrukcji EIP liczbę umieszczoną w polu adresowym
rozkazu; ponieważ sumowanie wykonywane jest modulo 2
32
, więc dodanie odpowiednio
dużej liczby powoduje zmniejszenie rejestru EIP;
Rozkazy sterujące bezwarunkowe zmieniają porządek wykonywania rozkazów; poprzez
odpowiednie zwiększenie lub zmniejszenie wskaźnika instrukcji EIP można pominąć
(przeskoczyć) kolejne rozkazy, albo wznowić wykonywanie rozkazów, które zostały już
wcześniej wykonane;
8) Napisać rozkaz w asemblerze realizujący operacje sumowanie AX
AX +[0040026AH]
add
ax, ds:[ 0040026AH]
E) Operacje stosu i podprogramy
1) W jaki sposób interpretuje się zawartość rejestru wskaźnika stosu ESP w procesorze z IA-
32?
Rejestr ESP wskazuje wierzchołek stosu, czyli obszar 4- lub 2-bajtowy, w którym
przechowywana jest ostatnio zapisana dana. Na stosie mogą być zapisywane wyłącznie
wartości 16- i 32-bitowe!
2) Co oznacza sformułowanie: „Stos rośnie w kierunku malejących adresów”
Oznacza to, że pierwszą daną na stosie zapisujemy na największym adresie, a potem
wierzchołek jest przesuwany tak, że jego adres jest coraz mniejszy. Lokacje bardziej odległe
od wierzchołka stosu mają większe adresy.
3) Omówić drogi i sposoby przekazywania parametrów do podprogramów.
Stosowane są dwa podstawowe sposoby przekazywania parametrów:
•
przekazywanie przez wartość (ang. call by value) – do podprogramu
przekazywana jest bezpośrednio wartość parametru, którym może być liczba,
tablica liczb, łańcuch znaków, itp;
•
przekazywanie przez adres (ang. call by location) – do podprogramu
przekazywany jest adres lokacji pamięci, w której znajduje się przekazywana
wartość;
Przekazywanie adresu zmiennej umożliwia bezpośredni dostęp do niej wewnątrz
podprogramu, m.in. pozwala to na wpisanie wyniku uzyskanego w trakcie wykonywania
podprogramu bezpośrednio do tej zmiennej; taki sposób pozwala także na dostęp do tablicy
bez konieczności przekazywania wartości wszystkich jej elementów;
Drogi przekazywania parametrów:
•
przez rejestry,
•
przez stos (typowa, powszechnie stosowana metoda),
•
przez ślad (tj. przez obszary pamięci znajdujące się bezpośrednio za instrukcją
CALL lub INT),
•
przez bufory (tj. przez zarezerwowane obszary pamięci o ustalonych adresach).
4) Omówić zasady działania rozkazów CALL i RET.
CALL - odpowiedzialny w procesorach z IA-32 za zapamiętywanie śladu. Występuje w
wersji z adresowaniem bezpośrednim i pośrednim. Wywołuje podprogram i zostawia ślad na
stosie (adres powrotu, miejsce, do którego ma powrócić sterowanie po zakończeniu
wykonywania podprogramu);
RET - po zakończeniu wykonywania podprogramu przepisuje do rejestru EIP zawartość
wierzchołka stosu; po wykonaniu podprogramu zdejmuje z wierzchołka stosu ślad zostawiony
przez CALL i wraca do programu głównego;
5) W jakim celu rozkaz wywołania podprogramu pozostawia ślad na stosie?
Konieczne jest bowiem zapamiętanie adresu powrotu (śladu) tj. miejsca, do którego ma
powrócić sterowanie po zakończeniu wykonywania podprogramu. Ślad zapisywany jest w
procesorze z IA-32 na stosie, w innych procesorach ślad zapisywany jest w rejestrach.
6) Dlaczego wiele programów generowanych przez kompilatory języków wysokiego poziomu
używa stosu do przechowywania wartości zmiennych lokalnych?
W praktyce programowania występują wielokrotnie sytuacje, w których konieczne jest
tymczasowe przechowanie zawartości rejestru — zazwyczaj rejestrów ogólnego
przeznaczenia jest zbyt mało by przechowywać w nich wszystkie wyniki pośrednie
występujące w trakcie obliczeń. Dodatkową zaletą przechowywania danych na stosie jest
krótszy kod rozkazu.
Procedury i funkcje często wykonują działania na zmiennych lokalnych, które są potrzebne
tylko w trakcie wykonywania procedury czy funkcji i często nie muszą być inicjalizowane w
segmencie danych programów.
7) Jaką rolę w trakcie odczytywania wartości parametrów przekazanych do podprogramu
pełni pomocniczy wskaźnik stosu EBP?
Ponieważ zawartość rejestru ESP może się zmieniać w trakcie wykonywania podprogramu,
konieczne jest użycie innego rejestru, którego zawartość, ustalona przez cały czas
wykonywania podprogramu, będzie wskazywała obszar parametrów na stosie — rolę tę pełni
specjalnie do tego celu zaprojektowany rejestr EBP, czasami określany jako pomocniczy
wskaźnik stosu
;
Jeśli zawartość rejestru EBP jest równa zawartości ESP, to adres określony przez EBP
wskazuje wierzchołek stosu, a EBP zwiększony o 4, 8, 12,... wskazuje kolejne, uprzednio
zapisane, podwójne słowa na stosie;
8) Na czym polegają różnice standardów wywoływania podprogramów: Pascal, C i StdCall
Główne różnice między standardami dotyczą kolejności ładowania parametrów na stos i
obowiązku zdejmowania parametrów, który należy najczęściej do wywołanego podprogramu
(funkcji), jedynie w standardzie C zajmuje się tym program wywołujący; w standardzie
Pascal parametry wywoływanej funkcji zapisywane są na stos w kolejności od lewej do
prawej, natomiast w standardzie C i StdCall od prawej do lewej;
Standard wywoływania funkcji i procedur typu Pascal jest szeroko stosowany w różnych
systemach programowania (m.in. w systemie Windows); standard StdCall, stanowiący
połączenie standardów C i Pascal, stosowany jest w 32-bitowych wersjach Windows do
wywoływania funkcji wchodzących w skład interfejsu Win32 API;
Warto zwrócić uwagę, że w wielu przypadkach parametry wywołania funkcji mają postać
wyrażeń — w takim przypadku najpierw obliczana jest wartość parametru, która następnie
zapisywana jest na stosie;
9) W jaki sposób w programie wywołuje się funkcje usługowe systemu operacyjnego?
Funkcje usługowe (systemowe) jak i funkcje biblioteczne mogą być wywoływane w
programach napisanych w języku wysokiego poziomu, jak również w programach napisanych
w asemblerze; wywołanie usługi systemu operacyjnego lub funkcji bibliotecznej realizowane
jest za pomocą rozkazu CALL (lub podobnego);
Standard
Kolejność ładowania parametrów
na stos
Obowiązek zdjęcia parametrów ze
stosu
Pascal
od lewej do prawej
wywołany podprogram
C
od prawej do lewej
program wywołujący
StdCall
od prawej do lewej
wywołany podprogram
Dla funkcji zdefiniowanych w interfejsie Win32 API stosowana jest konwencja wołania
StdCall
(parametry na stosie ładowane są wg zasad C, natomiast zdejmowanie parametrów
wykonuje wywołana procedura); wyjątek stanowi funkcja wsprintf, która ma zmienną liczbę
parametrów; z kolei dla funkcji zdefiniowanych w bibliotece języka C stosowana jest
konwencja C, a dla funkcji zdefiniowanych w bibliotece języka Pascal — konwencja Pascal;
10) Wyjaśnić znaczenie terminu ‘interfejs programowania aplikacji’.
API
-
application
programming
interface;
Interfejs określający sposób porozumiewania się programu z systemem operacyjnym
(parametry i sposoby przekazywania ich do podprogramów systemowych).
Zbiór zasad, protokołów i narzędzi służących do tworzenia oprogramowania.
Dobrze zaprojektowany API zawiera zestaw najczęściej używanych elementów programów
(w postaci udokumentowanych bibliotek), umożliwia dostęp do systemu operacyjnego, baz
danych, interfejsu graficznego, itp. Dzięki temu proces tworzenia nowych aplikacji może
zostać znacznie przyśpieszony.
11) Omówić podstawowe zasady programowania mieszanego (hybrydowego).
Dwie
metody
dołączania
kodu
asemblerowego:
*w formie wstawek asemblerowych umieszczonych bezpośrednio wewnątrz kodu w JWP
**w formie odrębnych modułów asemblerowych, które są odrębnie kompilowane
(asemblowane) i łączone z pozostałym kodem w czasie linkowania;
Stosowanie wstawek nie wymaga oddzielnej kompilacji – używany jest asembler wbudowany
w kompilator JWP. Wstawki nie pozwalają na pełne wykorzystanie możliwości kodowania w
asemblerze – umożliwia to stosowanie oddzielnych modułów asemblerowych;
Podprogramy w obu językach muszą być skonstruowane na tych samych zasadach, tę samą
metodą muszą być przekazywane parametry i tak samo nazywać się segmenty (i ich atrybuty).
W instrukcjach asemblerowych można odwoływać się zarówno do zmiennych lokalnych jak i
globalnych (zewnętrznych);
F) Lista rozkazów procesora.
1) Czym różnią się rozkazy sterujące warunkowe od bezwarunkowych?
Specjalne instrukcje, które w zależności od własności uzyskanego wyniku (np. czy jest
ujemny) zmienią zawartość rejestru EIP, dodając lub odejmując jakąś liczbę, albo też zmienią
zawartość EIP w konwencjonalny sposób — instrukcje takie nazywane są instrukcjami
sterującymi
(skokowymi);
Rozkazy sterujące (skokowe) zmieniają naturalny porządek wykonywania rozkazów; jeśli
testowany warunek, specyficzny dla każdego rozkazu sterującego, jest spełniony, to do
wskaźnika instrukcji EIP dodawana jest liczba bajtów zajmowana przez rozkaz (zwykle 2
bajty) i liczba znajdująca się w polu adresowym rozkazu sterującego; jeśli warunek jest nie
spełniony, to dodawana jest tylko liczba bajtów zajmowana przez rozkaz;
Rozkazy sterujące bezwarunkowe
- ich jedynym zadaniem jest zmiana porządku
wykonywania instrukcji (nie wykonują one żadnego sprawdzenia); poprzez odpowiednie
zwiększenie lub zmniejszenie wskaźnika instrukcji EIP można pominąć (przeskoczyć) kolejne
rozkazy, albo wznowić wykonywanie rozkazów, które zostały już wcześniej wykonane;
Instrukcje sterujące warunkowe
na ogół nie wykonują żadnych obliczeń, ale tylko
sprawdzają, czy uzyskane wyniki mają oczekiwane własności; w zależności od rezultatu
sprawdzenia wykonywanie programu może być kontynuowane przy zachowaniu naturalnego
porządku instrukcji albo też porządek ten może być zignorowany poprzez przejście do
wykonywania instrukcji znajdującej się w odległym miejscu pamięci operacyjnej;
2) Scharakteryzować grupę rozkazów procesora określanych jako operacje bitowe?
Rozkazy AND, TEST, OR, XOR wykonują operacje logiczne na odpowiadających sobie
bitach obu operandów — rezultat wpisywany jest do operandu docelowego, i jednocześnie
ustawiane są znaczniki ZF, SF, PF (znaczniki CF i OF są zerowane); rozkaz TEST ustawia
znaczniki, ale nie wpisuje wyniku; rozkaz NOT jest jednoargumentowy — następuje
zanegowanie wszystkich bitów;
AND
bitowy iloczyn logiczny
TEST
bitowy iloczyn logiczny (bez wpisywania wyniku)
OR
bitowa suma logiczna
XOR
bitowa suma modulo dwa
NOT
negacja bitowa
Poniżej podano przykład ilustrujący działanie rozkazu NOT:
0
1
2
3
4
5
6
7
0
1
2
3
4
5
6
7
negacja
0 1 1 1 0 1 0 1
1 0 0 0 1 0 1 0
rejestr AH
zawartość AH
po wykonaniu
rozkazu NOT AH
ah
bitowa
3) Jak zmieni się zawartość rejestru EBX po wykonaniu rozkazu XOR EBX , 7
EBX nie zmieni się na bitach od 3 do 31, a na bitach od 0 do 2 zmieni wartość na przeciwną;
XOR - ogólnie rozkaz taki wykonuje operację sumy modulo dwa na dwóch wartościach
wskazanych przez pierwszy i drugi operand, a wynik wpisywany jest do pierwszego
operandu; zatem rozkaz:
„operacja”
cel, źródło
wykonuje działanie
cel
←
cel „operacja” źródło
4) Omówić technikę wyodrębniania zawartości pól bitowych?
Rozkazy przesunięć i operacji logicznych stosowane są często do wyodrębniania pól
bitowych; w podanym niżej przykładzie zadanie polega na wyznaczeniu liczby umieszczonej
na bitach 5 ÷ 3 rejestru AH;
0
1
2
3
4
5
6
7
0
1
2
3
4
5
6
7
1 0 1 0 0 1 1 1
0 0 1 1 1 0 0 0
rejestr AH
rejestr BL
0
1
2
3
4
5
6
7
iloczyn logiczny
0 0 1 0 0 0 0 0
rozkazu and ah, bl
zawartość AH
po wykonaniu
bitowy
na bitach 5-3
umieszczona jest
"maska" bitowa
liczba 3-bitowa
0
1
2
3
4
5
6
7
logiczne w prawo
0 0 0 0 0 1 0 0
rozkazu shr ah, 3
zawartość AH
po wykonaniu
przesunięcie
o 3 pozycje
Po wykonaniu powyższych instrukcji rejestr AH zawiera analizowaną liczbę 3-bitową
zakodowaną w zwykły sposób.
5) Czym różnią się przesunięcia cykliczne od logicznych?
W procesorze z IA-32 zdefiniowano różne rodzaje operacji przesunięcia bitów w rejestrze lub
w lokacji pamięci; wyróżnia się przesunięcia w lewo lub w prawo, przesunięcia logiczne i
cykliczne (tzw. obroty); dodatkowo zdefiniowano przesunięcie cykliczne (rozkazy RCL i
RCR), w którym znacznik CF traktowany jest jako dodatkowy bit przesuwanego rejestru;
SHL
(SAL)
przesunięcie logiczne (arytmetyczne) w
lewo
SHR
przesunięcie logiczne w prawo
SAR
przesunięcie arytmetyczne w prawo
ROL
przesunięcie cykliczne w lewo
ROR
przesunięcie cykliczne w prawo
RCL
przesunięcie cykliczne w lewo przez
CF
RCR
przesunięcie cykliczne w prawo przez
CF
Poniższy rysunek przedstawia schematycznie przesunięcie cykliczne (obrót) w lewo; bity
wychodzące z pozycji 7 kierowane są na pozycję 0; dodatkowo bity wychodzące
wprowadzane są także do znacznika CF;
CF
7 6 5 4 3 2 1 0
Przesunięcia logiczne działają podobnie, ale bity wychodzące nie są zawracane, a na bit nr 0
wprowadzane są zera; przesunięcia w prawo działają analogicznie.
6) W jaki sposób kodowane są mnemoniki (skróty literowe) rozkazów wykonujących działania
na liczbach zmiennoprzecinkowych?
Ze względu na to, że posługiwanie się w procesie kodowania programu wartościami
zerojedynkowymi byłoby bardzo kłopotliwe, wprowadzono skróty literowe (tzw. mnemoniki)
dla poszczególnych instrukcji (rozkazów) procesora;
Pierwsza litera f oznacza, że mamy do czynienia z koprocesorem (właściwie to z jednostką
zmiennoprzecinkową - jednoznacznie wskazuje to na rodzaj zapisanej liczby), następnie
pojawia się skrót operacji np div, sub czy też sqrt (kwadrat); następnie może się pojawić
literka p (pop), która oznacza skasowanie ostatniej wartości z wierzchołka stosu;
G) Sterowanie urządzeniami zewnętrznymi.
1) Wyjaśnić różnice w sposobie komunikacji procesora z urządzeniami zewnętrznymi poprzez
pamięć współadresowalną i poprzez porty.
Sterowanie pracą urządzeń jest realizowane za pomocą podzespołów tworzących układy
wejścia/wyjścia; podzespoły te umożliwiają testowanie stanu (gotowości) urządzenia,
wysyłanie poleceń do urządzenia oraz wysyłanie i przyjmowanie danych; od strony procesora
ww. komunikacja odbywa się zazwyczaj poprzez zapis i odczyt rejestrów zainstalowanych w
układach wejścia/wyjścia;
♦
stosowane są dwie metody dostępu do zawartości rejestrów układów wejścia/wyjścia:
•
rejestry udostępniane są jako zwykłe komórki pamięci w przestrzeni adresowej
pamięci — mówimy wówczas o współadresowalnych układach wejścia/wyjścia;
•
rejestry urządzenia dostępne są w odrębnej przestrzeni adresowej zwanej
przestrzenią adresową wejścia-wyjścia
lub przestrzenią adresową portów; takie
rozwiązanie określane jest czasami jako izolowane wejście-wyjście;
Stosując pierwszą metodę
można odczytywać i zapisywać rejestry urządzenia tak samo jak
zwykłe komórki pamięci, np. za pomocą instrukcji MOV; w komputerach PC metoda ta
stosowana jest m.in. w odniesieniu do pamięci ekranu;
Stosując drugą metodę
konieczne jest zdefiniowanie odrębnych rozkazów przesyłania,
działających w przestrzeni adresowej portów: w architekturze IA–32 rolę te pełnią rozkazy IN
i OUT (i ich rozszerzenia);
2) Jak zorganizowana jest pamięć ekranu w trybie tekstowym?
Typowym przykładem wykorzystania techniki układów współadresowalnych jest pamięć
ekranu w komputerach PC; w trybie tekstowym typowego sterownika graficznego znaki
wyświetlane na ekranie stanowią odwzorowanie zawartości obszaru pamięci operacyjnej
(RAM) od adresu fizycznego B8000H; pamięć ta należy do przestrzeni adresowej procesora,
ale zainstalowana jest na karcie sterownika;
Każdy znak wyświetlany na ekranie jest opisywany przez dwa bajty w pamięci ekranu: bajt o
adresie parzystym zawiera kod ASCII znaku, natomiast następny bajt zawiera opis sposobu
wyświetlania, nazywany atrybutem znaku;
3) Omówić różne techniki skojarzenia rejestrów urządzenia z portami
.
Zazwyczaj sterowniki urządzeń mają kilka, a czasami nawet kilkadziesiąt rejestrów; w
najprostszym przypadku każdy rejestr jest skojarzony z jednym portem; wówczas zapis i
odczyt poszczególnych rejestrów realizowany jest za pomocą rozkazów IN i OUT
działających na odrębnych portach — ilustruje to poniższy rysunek:
W innych rozwiązaniach kolejne dane wysyłane do określonego portu (np. 3C9H) są
automatycznie kierowane do kolejnych rejestrów urządzenia:
Porty
Rejestry
Port
Rejestry
Przy znacznej liczbie rejestrów urządzenia stosowany jest często dostęp za pośrednictwem
dwóch portów: portu adresowego i portu danych; każda operacja odczytu/zapisu rozpoczyna
się od przesłania przez port adresowy numeru wewnętrznego rejestru, na którym ma być
wykonane działanie; następnie właściwe dane są odczytywane lub zapisywane za
pośrednictwem portu danych:
Często stosowanym rozwiązaniem jest używanie tego samego portu do odczytu jednego
rejestru i zapisu innego rejestru; taka konstrukcja jest charakterystyczna dla wielu urządzeń, w
którym zdefiniowano rejestr stanu (ang. status register), opisujący aktualny stan urządzenia i
rejestr sterujący (ang. control register), za pośrednictwem którego wysyłane są dyspozycje do
urządzenia; rejestr stanu może być tylko odczytywany (wyjątkowo także zerowany), a rejestr
sterujący może być tylko zapisywany:
4) Omówić organizację pamięci ekranu w trybie graficznym 13H (raster 320*200)
Współczesne sterowniki (karty) graficzne oferują zazwyczaj wiele trybów wyświetlania,
różniących się rozdzielczością, liczbą kolorów i innymi parametrami — wszystkie sterowniki
realizują nadal funkcje zwykłego sterownika VGA, który oferuje między innymi dość prosty
tryb graficzny oznaczony numerem 13H; w trybie tym raster ma wymiary 320 * 200 pikseli,
przy 256 kolorach;
W trybie 13H pamięć ekranu, zawierająca 64000 bajtów (320 * 200), umieszczona jest
począwszy od adresu fizycznego A0000H; kolejne bajty w tym obszarze opisują kolory
pikseli wg standardowej palety VGA (paletę można zmienić), np.10 oznacza kolor
jasnozielony;
Port adresowy
Rejestry
Port danych
Port
Rejestry
5) Omówić podstawowe elementy systemu przerwań stosowanego w komputerach PC.
W nowszych komputerach PC system przerwań obsługiwany jest przez układ APIC, który
pełni rolę „sekretarki” procesora, a także wspomaga prace wieloprocesorową; wcześniej
przerwania były obsługiwane przez dwa układy typu 8259 (PIC);
Sygnały przerwań wysyłane są przez różne urządzenia zewnętrzne komputera (klawiatura,
drukarka, mysz, dyski, itd.) do procesora; sygnalizują one procesorowi wystąpienie pewnych
zdarzeń (np. naciśnięcie przycisku myszki), które wymagają podjęcia niezwłocznej obsługi
przez procesor;
Procesor po otrzymaniu sygnału przerwania przerywa wykonywanie bieżącego programu i
rozpoczyna wykonywanie innego programu; program ten identyfikuje otrzymany sygnał
przerwania i podejmuje odpowiednie działania w stosunku do urządzenia, które wysłało
przerwanie; po wykonaniu tych działań procesor powraca do dalszego wykonywania
przerwanego programu;
Zarówno sprzętowe jak i programowe aspekty systemu przerwań są stosunkowo mało znane
nawet dla zawodowych programistów; obsługa przerwań jest bowiem realizowana przez
system operacyjny, który nie zezwala aplikacjom na jakiekolwiek ingerencje w tym zakresie;
Reasumując, w praktyce zwykłego programowania mechanizmy przerwań nie są
bezpośrednio widoczne, ich znajomość jednak jest niezbędna do tworzenia oprogramowania
obsługi urządzeń;
Zazwyczaj każde urządzenie dołączone do komputera jest w stanie generować sygnały
przerwań; wymaga to odpowiedniego zorganizowania systemu przerwań, tak by poszczególne
przerwania były przyjmowane wg ustalonej hierarchii; na ogół procesor nie jest
przygotowany do bezpośredniej obsługi przerwań, zwłaszcza jeśli jest zainstalowanych dużo
urządzeń;
Stosowane są różne systemy obsługi przerwań; niekiedy zainstalowana jest wspólna linia
przerwań dla wszystkich urządzeń — po nadejściu przerwania procesor sprawdza stany
poszczególnych urządzeń identyfikując urządzenie, które wysłało przerwanie (metoda
odpytywania); w innych systemach linia przerwań przechodzi przez wszystkie zainstalowane
urządzenia ustawione wg priorytetów; w komputerach PC priorytet przerwania ustalany jest
poprzez odpowiednie skonfigurowanie układów PIC lub APIC.
6) Jaką rolę w obsłudze przerwań sprzętowych pełni „tablica deskryptorów przerwań”?
W architekturze IA–32 tablica deskryptorów przerwań zawiera adresy podprogramów obsługi
przerwań sprzętowych wysyłanych przez różne urządzenia komputera; tablica zawiera także
adresy podprogramów obsługujących wyjątki procesora (przerwania generowane przez sam
procesor); ponadto mogą być w niej umieszczone adresy podprogramów systemowych, które
wywoływane są z poziomu aplikacji za pomocą rozkazu INT (np. w Linuksie);
Omawiana tablica zawiera 256 elementów nazywanych deskryptorami; każdy deskryptor
zajmuje 8 bajtów; wyróżnia się trzy rodzaje deskryptorów: furtki przerwania (używane przy
obsłudze przerwań sprzętowych), furtki potrzasku (używane przy obsłudze wyjątków
procesora i wywołań za pomocą rozkazu INT) oraz furtki zadania (używane w sytuacjach
awaryjnych);
Furtki przerwania i potrzasku zawierają adresy odpowiednich podprogramów obsługujących
przerwania i wyjątki; deskryptory znajdujące się na pozycjach 0 ÷ 31 używane są do obsługi
wyjątków generowanych przez procesor; pozostałe deskryptory mogą zawierać adresy
podprogramów obsługujących przerwania sprzętowe i wywołania systemowe;
Położenie tablicy deskryptorów przerwań w pamięci głównej komputera wskazane jest przez
zawartość rejestru IDTR;
G) Hierarchia pamięci
1) Co oznaczają terminy ‘trafienie’ i ‘chybienie’ w odniesieniu do pamięci podręcznej?
W trakcie wykonywania rozkazów procesor szuka najpierw rozkazów i danych w pamięci
podręcznej:
•
jeśli potrzebna informacja zostanie znaleziona, co jest określane jako trafienie (ang.
cache hit)
, to jest przesyłana do procesora;
•
jeśli potrzebnej informacji nie ma w pamięci podręcznej (chybienie, ang. cache
miss
), to jest ona pobierana z pamięci głównej, przy czym jednocześnie wpisywana
jest do pamięci podręcznej w postaci całego bloku;
2) Na czym polega technika dostepu do pamięci podręcznej z odwzorowaniem bezpośrednim
W technice tej nie występuje konieczność jednoczesnego porównywania wielu etykiet;
♦
32-bitowy adres pamięci jest dzielony na trzy pola: pole etykiety (16 bitów), pole obszaru
(12 bitów) i pole słowa (4 bity);
przypuśćmy, że pamięć podręczna jest na razie
całkowicie pusta i zachodzi konieczność skopiowania do niej bloku 16-bajtowego z
pamięci RAM o adresie A4447650H; wówczas blok ten zostanie wpisany do wiersza
pamięci podręcznej o indeksie 765H i jednocześnie do pola etykiety tego wiersza zostanie
wpisana wartość A444H;
♦
jeśli w trakcie dalszych działań zajdzie konieczność odczytu bajtu o adresie A4447652H,
to zostaną podjęte niżej podane działania:
•
zostanie wyznaczona liczba zapisana w polu etykiety (16 bitów) oraz liczba w
polu obszaru (12 bitów) podanego adresu — w analizowanym przykładzie mają
one wartości A444H i 765H;
•
z wiersza pamięci podręcznej o indeksie 765H zostanie odczytana zawartość pola
etykiety i porównana z liczbą A444H (pole etykiety adresu 32-bitowego);
•
jeśli porównywane wartości są identyczne, to zostanie odczytany indeksowany
wiersz, w którym na pozycji 2 znajduje się potrzebny bajt;
•
jeśli porównywane wartości nie są jednakowe, to bajt trzeba odczytać z pamięci
RAM;
♦
istnieje wiele adresów 32-bitowych, które mają identyczne 12-bitowe pole obszaru i różne
wartości pola etykiety — w pamięci podręcznej będzie zapisany tylko jeden blok 16-
bajtowy; ograniczenie to stanowi główny problem występujący przy odwzorowaniu
bezpośrednim;
Adres 32-bitowy generowany przez procesor
etykieta (16 bitów)
nr linii
(12 bitów)
adres
wewn.
bloku
Pamięć podręczna
etykieta
blok
000
001
002
FFF
3)
Omówić schemat współdzia1ania różnych rodzajów pamięci w komputerze znany jako
‘hierarchia pamięci’
rejestry
procesora
pamięć
podręczna
zintegrowana z
procesorem (SRAM)
pamięć główna (operacyjna)
(DRAM)
pamięć masowa (ang. secondary
storage) (dyski lokalne)
pamięć masowa
(rozproszone systemy plików, serwery sieciowe)
pamięć podręczna
niezintegrowana z
procesorem (SRAM)
Pamięć L1 przechowuje
informacje uzyskane z
pamięci L2
Rejestry procesora przechowuja
informacje uzyskane z pamieci L1
L0
(off-chip) L2:
L3:
L4:
L5:
Mniejsza,
szybsza i
droższa
Większa,
wolniejsza
i tańsza
(on-chip) L1:
Pamięć L2 przechowuje
informacje uzyskane z
pamięci głównej
Pamięć główna
przechowuje
informacje uzyskane
z pamięci masowej
Pamięć masowa przechowuje
informacje uzyskane z dysków
w serwerach sieciowych