background image

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

 

background image

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. 

background image

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); 

background image

 
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) 
 
 

background image

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

 

background image

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

 

background image

 
 
 
 
 
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 

background image

 

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; 

 

background image

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  

 

background image

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ą;  

background image

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! 
 
 

background image

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 

background image

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  

background image

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; 
 

background image

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 

 
 

background image

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 

 

background image

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); 

background image

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

background image

 
 
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

background image

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); 

background image

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; 

 
 

background image

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