background image

1 | 

S t r o n a

 

ASK 

Architektura  von  Neumanna  -  rodzaj  architektury  komputera,  przedstawionej  po  raz  pierwszy  w  1945  roku  przez 
Johna von Neumanna stworzonej wspólnie z Johnem W. Mauchly'ym i Johnem Presper Eckertem. 

Polega na ścisłym podziale komputera na trzy podstawowe części: 

    * procesor (w ramach którego wydzielona bywa częśd sterująca oraz częśd arytmetyczno-logiczna) 

    * pamięd komputera (zawierająca dane i sam program) 

    * urządzenia wejścia/wyjścia 

System komputerowy zbudowany w oparciu o architekturę von Neumanna powinien: 

    * mied skooczoną i funkcjonalnie pełną listę rozkazów 

    *  mied  możliwośd  wprowadzenia  programu  do  systemu  komputerowego  poprzez  urządzenia  zewnętrzne  i  jego 
przechowywanie w pamięci w sposób identyczny jak danych 

    * dane i instrukcje w takim systemie powinny byd jednakowo dostępne dla procesora 

    *  informacja  jest  tam  przetwarzana  dzięki  sekwencyjnemu  odczytywaniu  instrukcji  z  pamięci  komputera  i 
wykonywaniu tych instrukcji w procesorze. 

Podane  warunki  pozwalają  przełączad  system  komputerowy  z  wykonania  jednego  zadania  (programu)  na  inne  bez 
fizycznej ingerencji w strukturę systemu, a tym samym gwarantują jego uniwersalnośd. 

System  komputerowy  von  Neumanna  nie  posiada  oddzielnych  pamięci  do  przechowywania  danych  i  instrukcji. 
Instrukcje  jak  i  dane  są  zakodowane  w  postaci  liczb.  Bez  analizy  programu  trudno  jest  określid  czy  dany  obszar 
pamięci  zawiera  dane  czy  instrukcje.  Wykonywany  program  może  się  sam  modyfikowad  traktując  obszar  instrukcji 
jako dane, a po przetworzeniu tych instrukcji - danych - zacząd je wykonywad. 

Model  komputera  wykorzystującego  architekturę  von  Neumanna  jest  często  nazywany  przykładową  maszyną 
cyfrową (PMC). 

Architektura  harwardzka  -  rodzaj  architektury  komputera.  W  odróżnieniu  od  architektury  von  Neumanna,  pamięd 
danych programu jest oddzielona od pamięci rozkazów. 

Podstawowa architektura komputerów zerowej generacji i początkowa komputerów pierwszej generacji. 

Prostsza (w stosunku do architektury von Neumanna) budowa przekłada się na większą szybkośd działania - dlatego 
ten  typ  architektury  jest  często  wykorzystywany  w  procesorach  sygnałowych  oraz  przy  dostępie  procesora  do 
pamięci cache. 

Separacja  pamięci  danych  od  pamięci  rozkazów  sprawia,  że  architektura  harwardzka  jest  obecnie  powszechnie 
stosowana w  mikrokomputerach jednoukładowych,  w których dane programu są najczęściej zapisane w nieulotnej 
pamięci ROM (EPROM/EEPROM), natomiast dla danych tymczasowych wykorzystana jest pamięd RAM (wewnętrzna 
lub zewnętrzna). 

RISC (Reduced Instruction Set Computers) - nazwa architektury mikroprocesorów która  została przedstawiona pod 
koniec lat 70. w teoretycznych pracach na uniwersytecie Berkeley oraz w wynikach badao Johna Cocke z Thomas J. 
Watson Research Center. 

background image

2 | 

S t r o n a

 

Ówczesne procesory (budowane w architekturze CISC) charakteryzowały się bardzo rozbudowaną listą rozkazów, ale 
jak wykazały  badania tylko nieliczna ich częśd była wykorzystywana w statystycznym programie. Okazało się np. że 
ponad 50% rozkazów w kodzie to zwykłe przypisania, tj. zapis zawartości rejestru do pamięci i odwrotnie. 

Ponadto  badania  wykazały,  że  podczas  działania  programu  ok.  26-45%  wykonywanych  instrukcji  to  instrukcje 
wywołania  podprogramów  lub  instrukcje  obsługujące  pętle,  ok.  13-15%  to  wspomniane  przypisania,  7-21%  to 
instrukcje warunkowe (jeśli warunek to …), natomiast reszta to tylko 1-3% [1]. 

W  związku  z  powyższym  zaprezentowano  architekturę  mikroprocesorów,  w  której  uwzględniono  wyniki  badao.  Jej 
podstawowe cechy to: 

   1.  Zredukowana  liczba  rozkazów  do  niezbędnego  minimum.  Ich  liczba  wynosi  kilkadziesiąt,  podczas  gdy  w 
procesorach CISC sięga setek. Upraszcza to znacznie dekoder rozkazów. 

   2.  Redukcja  trybów  adresowania,  dzięki  czemu  kody  rozkazów  są  prostsze,  bardziej  zunifikowane,  co  dodatkowo 
upraszcza wspomniany wcześniej dekoder rozkazów. Ponadto wprowadzono tryb adresowania, który ogranicza ilośd 
przesłao - większośd operacji wykonuje się wg schematu: rejestr_C = rejestr_A \quad operacja \quad rejestr_B[2]. 

   3. Ograniczenie komunikacji pomiędzy pamięcią, a procesorem. Przede wszystkim do przesyłania danych pomiędzy 
pamięcią, a rejestrami służą dedykowane instrukcje,  które zwykle nazywają się load (załaduj z pamięci), oraz store 
(zapisz  do  pamięci);  pozostałe  instrukcje  mogą  operowad  wyłącznie  na  rejestrach.  Schemat  działania  na  liczbach 
znajdujących  się  w  pamięci  jest  następujący:  załaduj  daną  z  pamięci  do  rejestru,  na  zawartości  rejestru  wykonaj 
działanie, przepisz wynik z rejestru do pamięci. 

   4. Zwiększenie liczby rejestrów (np. 32, 192, 256, podczas gdy np. w architekturze x86 jest zaledwie 8 rejestrów), co 
również ma wpływ na zmniejszenie liczby odwołao do pamięci. 

   5.  Dzięki  przetwarzaniu  potokowemu  (ang.  pipelining)  wszystkie  rozkazy  wykonują  się  w  jednym  cyklu 
maszynowym[3], co pozwala na znaczne uproszczenie bloku wykonawczego, a zastosowanie superskalarności także 
na umożliwienie równoległego wykonywania rozkazów. Dodatkowo czas reakcji na przerwania jest krótszy.  

Obecnie  popularne  procesory  Intela  z  punktu  widzenia  programisty  są  widziane  jako  CISC,  ale  ich  rdzeo  jest  RISC-
owy.  Rozkazy  CISC  są  rozbijane  na  mikrorozkazy  (ang.  microops),  które  są  następnie  wykonywane  przez  RISC-owy 
blok  wykonawczy.  W  praktyce  okazuje  się  że  rozwiązanie  takie  (pomimo  wielu  znaczących  wad)  jest  podejściem 
znacznie  bardziej  wydajnym  (szczególnie  że  RISC-owy  blok  wykonawczy  jest  znacznie  bardziej  nowoczesny  od 
architektury CISC widocznej dla programisty). 

Wymienid architektury RISC  

-  MIPS  (Microprocessor  without  Interlocked  Piped  Stages)  jest  to  architektura  komputerowa  (w  szczególności 
procesor typu RISC) rozwijana przez firmę MIPS Technologies. Istnieje zarówno w wersji 32- jak i 64-bitowej. 

Procesory MIPS stanowiły do roku 2007 jednostkę centralną komputerów firmy SGI. Ponadto są szeroko stosowane 
w  systemach  wbudowanych  (ang.  embedded  systems),  w  szczególności  w  urządzeniach  opartych  na  systemie 
operacyjnym Windows CE. Są używane w routerach firmy Cisco, oraz we współczesnych konsolach do gier takich jak 
Nintendo 64, Sony PlayStation, Sony PlayStation 2, Sony PSP. Szacuje się, że procesory MIPS stanowią jedną trzecią 
produkcji mikroprocesorów typu RISC. 

-SPARC 

-ARM 

-POWERPC 

background image

3 | 

S t r o n a

 

CISC (ang. Complex Instruction Set Computers) – nazwa architektury mikroprocesorów o następujących cechach: 

    *  Występowanie  złożonych,  specjalistycznych  rozkazów  (instrukcji)  -  które  do  wykonania  wymagają  od  kilku  do 
kilkunastu cykli zegara 

    * Szeroka gama trybów adresowania 

    *  Przeciwnie  niż  w  architekturze  RISC  rozkazy  mogą  operowad  bezpośrednio  na  pamięci  (zamiast  przesłania 
wartości do rejestrów i operowania na nich) 

    * Powyższe założenia powodują iż dekoder rozkazów jest skomplikowany 

Istotą architektury CISC jest to, iż pojedynczy rozkaz mikroprocesora, wykonuje kilka operacji niskiego poziomu, jak 
na przykład pobranie z pamięci, operację arytmetyczną i zapisanie do pamięci. 

Przed powstaniem procesorów RISC, wielu komputerowych architektów próbowało zmostkowad lukę semantyczną – 
aby  zaprojektowad  zestawy  rozkazów,  które  wspierałyby  języki  programowania  wysokiego  poziomu  przez 
dostarczenie  rozkazów  wysokiego  poziomu  np.  wywołania  funkcji  i  zwrócenia  jej  wartości,  instrukcje  pętli  czy 
kompleksowe tryby adresowania. Rezultatem tego były programy o mniejszym rozmiarze i z mniejszą ilością odwołao 
do pamięci, co w tamtym czasie było istotne z punktu widzenia wydajności przy jednoczesnym dążeniu do obniżenia 
kosztów pojedynczego komputera. 

Współczesne procesory zgodne z x86 produkowane przez firmy Intel i  AMD przetwarzają rozkazy procesora x86 na 
proste mikropolecenia pracujące wg idei RISC, często wykonujące się równolegle.  

Architektura ARM (Advanced RISC Machine, pierwotnie Acorn RISC Machine) jest 32-bitową architekturą (modelem 
programowym) procesorów typu RISC. 

Różne  wersje  procesorów  ARM  są  szeroko  stosowane  w  systemach  wbudowanych  (ang.  embedded  systems)  i 
systemach o niskim poborze mocy, ze względu na ich energooszczędną architekturę. 

Procesor ARM jest jednym z najczęściej stosowanych procesorów na świecie. Jest używany między innymi w dyskach 
twardych,  telefonach  komórkowych,  routerach,  kalkulatorach  a  nawet  w  zabawkach  dziecięcych.  Obecnie  zajmuje 
ponad 75% rynku 32-bitowych CPU dla systemów wbudowanych. Najbardziej udanym projektem ARM był procesor 
ARM7TDMI  szeroko  stosowany  w  telefonach  komórkowych.  Moc  obliczeniowa  procesorów  ARM  umożliwia 
instalacje  na  tym  procesorze  systemu  operacyjnego,  z  zaimplementowanymi  mechanizmami  wielowątkowości,  z 
możliwością wykorzystania zawartego w systemie stosu TCP/IP czy systemu plików(np. FAT32). Powstało wiele takich 
systemów:  Windows  CE,  FreeBSD,  NUTOS(Ethernut),  i  wiele  dystrybucji  Linuksa  opatrzonym  hasłem  embedded 
(Embedded Debian, Embedded Ubuntu). 

Zestaw  instrukcji  procesora  ARM  stanowi  rozwinięcie  zestawu  instrukcji  MOS  6502.  Główne  zmiany  dotyczą 
zwiększenia efektywności potokowego przetwarzania  instrukcji. Zgodnie z założeniami architektury RISC, rozkazy są 
tak skonstruowane, aby wykonywały się w ściśle określonym czasie - zwykle w jednym cyklu maszynowym. 

Interesującą  zmianą  jest  użycie  4-bitowego  kodu  warunkowego  na  początku  każdej  instrukcji.  Dzięki  temu  każda 
instrukcja może byd wykonana warunkowo. Ogranicza to przestrzeo dostępną, na przykład, dla instrukcji przeniesieo 
w  pamięci,  ale  z  drugiej  strony  nie  ma  potrzeby  stosowania  instrukcji  rozgałęzieo  dla  kodu  zawierającego  wiele 
prostych  instrukcji  warunkowych.  Klasycznym  przykładem  jest  implementacja  algorytmu  Euklidesa  wyznaczania 
największego wspólnego dzielnika. 

PIC  (ang.  Peripheral  Interface  Controller)  to  rodzina  mikrokontrolerów  typu  RISC  produkowana  przez  firmę 
Microchip Technology. Rodzina ta wywodzi się z 8-bitowego mikrokontrolera PIC1650 zaprojektowanego pierwotnie 
przez firmę General Instrument. 

background image

4 | 

S t r o n a

 

Firma  Microchip  zamiast  akronimu  PIC  używa  nazwy  PICmicro.  Uważa  się,  że  akronim  PIC  oznacza  ang.  Peripheral 
Interface  Controller,  chod  oryginalna  nazwa  nadana  mikrokontrolerowi  PIC1650  przez  General  Instrument  to  ang. 
Programmable Intelligent Computer. 

Architektura mikrokontrolera PIC16F84 

Procesory  PIC  firmy  MICROCHIP  są  procesorami  posiadającymi  cechy  architektury  RISC  to  oznacza,  że  posiadają 
zminimalizowana listę rozkazów. Zaletą procesorów PIC (PIC16FXX) jest przede wszystkim:  

tylko 35 pojedynczych rozkazów łatwych do nauczenia,  

wszystkie  rozkazy  wykonywane  są  w  jednym  cyklu  (dla  zegara  taktującego  10  MHz  jeden  cykl  =  400  ns,  a  1  cykl 
maszynowy  jest  równy  4  taktom  oscylatora)  wyłączając  rozkazy  skoków,  które  realizowane  są  w  dwóch  cyklach 
maszynowych,  

maksymalna częstotliwośd zegara 10 MHz,  

czternastobitowa długośd słowa rozkazu,  

ośmiobitowa długośd słowa pamięci danych RAM oraz rejestrów sterujących,  

5 rejestrów specjalnych służących do konfigurowania układu,  

ośmiopoziomowy stos,  

natychmiastowy (bezpośredni) i pośredni tryb adresowania,  

ośmiobitowy licznik z ośmiobitowym podzielnikiem wstępnym,  

cztery źródła wywołujące przerwania:  

-  zewnętrzne,  po  wystąpieniu  odpowiedniego  zbocza  (rodzaj  zbocza  definiowany  programowo)  na  nóżce  RB0/INT 
procesora,  

- wewnętrzne, poprzez zmianę stanu na jednej z nóżek portu B (porty RB4, RB5, RB6, RB7),  

- wewnętrzne, poprzez przepełnienie TIMER-a,  

- wewnętrzne, wywoływane gdy zakooczone zostanie programowanie jednej z komórek pamięci danych w EEPROM-
ie.  

ponad 1.000.000 cykli programowania pamięci danych EEPROM,  

zachowanie zawartości pamięci danych EEPROM ponad 40 lat,  

wykonanie w technologii CMOS,  

szeroki zakres napiec zasilających oraz niewielki pobór prądu (<2mA dla 5V 4MHz, 15mA dla 2V 32kHz oraz poniżej 
1mA w stanie uśpienia).  

Mikrokontroler PIC16F84 jest oparty na architekturze RISC. Charakteryzuje się niewielką ilością instrukcji (tylko 35). 
Każda  z  instrukcji  wykonywana  jest  w  jednym  cyklu,  z  wyjątkiem  skoków  warunkowych  i  bezwarunkowych,  które 
trwają dwa cykle. Przy częstotliwości 20MHz (górna granica) cykl instrukcyjny trwa 200ns. 

Układ ma dwa tryby adresowania: bezpośrednie i pośrednie. Pamięd programu ma objętośd 1024 słów o długości 14 
bitów. Poza tym dostępne jest 68 bajtów pamięci  RAM i 64 bajty pamięci  EEPROM. Dane w tych pamięciach są 8 -

background image

5 | 

S t r o n a

 

bitowe. Mikrokontroler posiada 15 sprzętowych rejestrów specjalnego zastosowania; ośmiopoziomowy,  sprzętowy 
stos oraz cztery źródła przerwao. Ma 13 linii wejścia-wyjścia podzielonych na dwa porty: 5-bitowy port A i 8-bitowy 
port  B.  Każda  z  linii  I/O  ma  indywidualną  kontrolę  kierunku  i  obcią-żalnośd  prądową  do  25mA.  Wewnątrz 
mikrokontrolera  wbudowany  jest  8-bitowy  timer-licznik,  8-bitowy  preskaler  i  układ  nadzoru  (watchdog),  Power-on 
Reset (POR), Power-up timer (PWRT). Dodatkowo jest zabezpieczenie przed odczytem programu (CP) oraz tryb pracy 
o  zmniejszonym  poborze  mocy  (SLEEP).  PIC16F84  jest  układem,  który  programuje  się  szeregowo  przez  dwa 
wyprowadzenia.  Programowanie  może  odbywad  się  w  systemie,  w  którym  mikrokontroler  pracuje  (ICSPTM). 
Diagram struktury wewnętrznej przedstawiony jest na poniżej. 

 

Pamięd programu i danych 

W  mikrokontrolerze  PIC16F84  są  dwie  pamięci:  14-bitowa  pamięd  programu  i  8-bitowa  pamięd  danych.  Pamięd 
danych jest podzielona pomiędzy dwa obszary - RAM i obszar rejestrów specjalnych. Rejestry specjalne są używane 
do  kontroli  układów  peryferyjnych,  takich  jak  porty  I/O,  preskaler,  timer,  układy  przerwao,  itp.  Poprzez  rejestry 
specjalne jest także dostęp do pamięci EEPROM. Pamięd danych jest podzielona na dwa banki. Wybór banku odbywa 
się poprzez ustawienie bitu RP0 w rejestrze STATUS. Dostęp do obszaru danych może byd bezpośredni lub pośrednio 
poprzez rejestr FSR. Licznik programu (instrukcji) umożliwia zaadresowanie 8k x 14-bitów pamięci fizycznej. Jako, że 
mikrokontroler PIC16F84 ma tylko 1k pamięci programu, pamięd ta została niejako "zapętlona", tzn. odwołanie do 
adresu  powyżej  3FFh  powoduje  pobranie  instrukcji  z  odpowiedniego  obszaru  pamięci  zaimplementowanej. 
Przykładowo lokacje 20h, 420h, 820h itd. odwołują się do tej samej komórki. Dwa adresy obszaru pamięci programu 
mają  specjalne  znaczenie.  Pierwszy  adres  0000h  to  wektor  początku  programu.  Drugi  adres  0004h  to  wektor 
przerwania. 

 

Stos 

Stos  nie  jest  zaimplementowany  ani  w  obszarze  pamięci  programu,  ani  pamięci  danych.  Ma  on  osiem  poziomów. 
Wskaźnik poziomu stosu nie jest dostępny do odczytu ani do zapisu, tak więc nie jest możliwe odwołanie do poziomu 
innego  niż  aktualnie  wskazywany,  bez  wcześniejszego  zdjęcia  danych  z  wyższych.  Dziewiąte  odłożenie  na  stos 
powoduje  nadpisanie  poziomu  pierwszego,  dziesiąte  -  drugiego  itd.  Trzeba  zatem  pamiętad  o  pilnowaniu  w 
programie ilości danych odkładanych na stos. 

 

Porty wejścia-wyjścia 

Wyprowadzenia  tych  portów  są  częściowo  dzielone  z  innymi  funkcjami  zewnętrznymi.  Porty  są  w  pełni 
konfigurowalne.  Dzielą  się  na  dwie  grupy:  5-bitowy  port  A  i  8-bitowy  port  B.  W  przypadku  portu  A  linia  RA4  jest 
dzielona  z  wejściem  zegarowym  timera  i  jako  wyjście  jest  typu  otwarty  dren.  Za  kontrolę  nad  portem  A 
odpowiedzialne są rejestry TRISA i PORTA. Port B ma dzieloną linię portu RB0 z wejściem zewnętrznego przerwania. 
Poza tym bity RB4:7 mogą byd ustawione w  tryb wywołania przerwania w przypadku wystąpienia na nich zmian. W 
trakcie  programowania  układu  wejście  RB6  jest  wejściem  linii  zegarowej,  a  RB7  wejściem  danych.  Kontrolę  nad 
portem sprawują rejestry TRISB i PORTB. 

 

 

Timer 

PIC16F84  ma  wbudowany  8-bitowy  timer-licznik,  który  można  odczytywad  i  zapisywad.  Jako  wejście  impulsów 
zegarowych  można  wybrad  wewnętrzny  zegar  lub  wejście  zewnętrzne  (RA4).  Można  również  określid  zbocze 
zewnętrznego  zegara,  na  którym  ma  się  odbywad  zliczanie.  Do  zegara  można  programowo  dołączyd  wewnętrzny 
programowalny,  8-bitowy  preskaler.  Przy  przepełnieniu,  tzn.  przejściu  z  FFh  na  00h  wywoływane  może  byd 
przerwanie. Odczyt rejestru timera następuje natychmiastowo. Przy zapisie natomiast pojawia się opóźnienie trzech 
cykli, zanim licznik przystąpi do odliczania. 

background image

6 | 

S t r o n a

 

 

 

Preskaler 

Preskaler może byd dołączony do timera-licznika lub do układu WDT (watchdog). Kiedy jest on przydzielony timerowi 
jego  stopieo  podziału  wynosi  1:2,  1:4,  ..., 1:256,  a jeśli  do  układu  WDT  to  1:1,  1:2,  ..., 1:128.  Przypisanie  dzielnika 
może odbywad się w trakcie pracy mikrokontrolera. W takiej sytuacji ani rejestr timera ani licznik układu WDT nie są 
zerowane. 

 

 

Przerwania 

PIC16F84,  jak  już  wcześniej  nadmieniono  ma  cztery  źródła  przerwao.  Każde  z  przerwao  może  byd  programowo 
wyłączone i załączone. Kontrolę nad nimi sprawuje rejestr INTCON. Pomimo czterech źródeł jest tylko jeden wektor 
przerwao,  zatem  trzeba  programowo  rozpoznawad,  z  którego  źródła  nastąpiło  wywołanie  Źródłami  przerwao  są: 
przepełnienie  timera-licznika  z  FFh  na  00h,  zmiany  na  wejściach  4-7  portu  B,  wyzwolenie  z  wejścia  przerwania 
zewnętrznego RB0/INT, zakooczenie zapisu do pamięci EEPROM. Każde ma swój znacznik w rejestrze. 

Mikrokontroler->rozbudowana  komunikacja  z  otoczeniem,możemy  konfigurowad  każde  wyjście(nóżkę),porty 
generalnego przeznaczenia. Spora dowolnośd implementacji/konfiguracji/dostosowania do potrzeb 

MCU) - to komputer wykonany w jednym układzie scalonym, używany do sterowania urządzeniami elektronicznymi. 
Układ  oprócz  jednostki  centralnej  CPU  posiada  zintegrowaną  różnego  rodzaju  pamięd  oraz  układy  wejścia-wyjścia. 
Mikrokontroler stanowi użyteczny i całkowicie autonomiczny system mikroprocesorowy, który z reguły do swej pracy 
nie  potrzebuje  dodatkowych  układów  może  bezpośrednio  współpracowad  z  różnymi  urządzeniami  zewnętrznymi. 
Mikrokontrolery wykorzystuje się powszechnie w sprzęcie AGD, układach kontrolno-pomiarowych, w przemysłowych 
układach automatyki, w telekomunikacji itp. 

Mikroprocesor->ograniczona(sztywna)  komunikacja  z  otoczeniem,(kontrolę  czyny  uważamy  za  komunikację  z 
otoczeniem) 

Mikroprocesor  to  układ  cyfrowy  wykonany  jako  pojedynczy  układ  scalony  o  wielkim  stopniu  integracji  zdolny  do 
wykonywania  operacji  cyfrowych  według  dostarczonych  mu  instrukcji.  Mikroprocesor  (w  skrócie  μP)  jest 
programowalnym cyfrowym elektronicznym układem, który łączy w sobie funkcje centralnej jednostki obliczeniowej 
(CPU)  w  pojedynczym  półprzewodnikowym  układzie  scalonym.  Pierwszy  mikroprocesor  powstał  w  wyniku 
zredukowania rozmiaru słowa do 4 bitów, tak aby tranzystory tworzące jego obwody logiczne zmieściły się w jednym 
układzie. Jeden  lub więcej mikroprocesorów zazwyczaj służą jako CPU w systemach  komputerowych, komputerach 
wbudowanych lub urządzeniach. 

Potokowość  (ang.  pipelining)  —  technika  budowy  procesorów  polegająca  na  podziale  logiki  procesora 
odpowiedzialnej  za  proces  wykonywania  programu  na  specjalizowane  grupy  w  taki  sposób,  aby  każda  z  grup 
wykonywała częśd pracy związanej z wykonaniem rozkazu. Grupy te są połączone sekwencyjnie — potok (ang. pipe) 
— i wykonują pracę równocześnie, pobierając dane od poprzedniego elementu w sekwencji. W  każdej z tych grup 
rozkaz  jest  na  innym  stadium  wykonania.  Można  to  porównad  do  taśmy  produkcyjnej.  W  uproszczeniu,  potok 
wykonania instrukcji procesora może wyglądad następująco: 

Uproszczony schemat potokowości. Części rozkazów oznaczone na zielono wykonywane są równocześnie.  

1.Pobranie instrukcji z pamięci - ang. instruction fetch (IF) 

2.Zdekodowanie instrukcji - ang. instruction decode (ID) 

background image

7 | 

S t r o n a

 

3.Wykonanie instrukcji - ang. execute (EX) 

4.Dostęp do pamięci - ang. memory access (MEM) 

5.Zapisanie wyników działania instrukcji - ang. store; write back (WB) 

W powyższym 5-stopniowym potoku, przejście przez wszystkie stopnie potoku (wykonanie jednej instrukcji) zabiera 
co  najmniej  5  cykli  zegarowych.  Jednak  ze  względu  na  jednoczesną  pracę  wszystkich  stopni  potoku,  jednocześnie 
wykonywanych  jest  5  rozkazów  procesora,  każdy  w  innym  stadium  wykonania.  Oznacza  to,  że  taki  procesor  w 
każdym cyklu zegara rozpoczyna i kooczy wykonanie jednej instrukcji i statystycznie wykonuje rozkaz w jednym cyklu 
zegara.  Każdy  ze  stopni  potoku  wykonuje  mniej  pracy  w  porównaniu  do  pojedynczej  logiki,  dzięki  czemu  może 
wykonad ją szybciej - z większą częstotliwością - tak więc dodatkowe zwiększenie liczby stopni umożliwia osiągnięcie 
coraz wyższych częstotliwości pracy. 

Podstawowym  mankamentem  techniki  potoku  są  rozkazy  skoku,  powodujące  w  najgorszym  wypadku  potrzebę 
przeczyszczenia  całego  potoku  i  wycofania  rozkazów,  które  następowały  zaraz  po  instrukcji  skoku  i  rozpoczęcie 
zapełniania  potoku  od  początku  od  adresu,  do  którego  następował  skok.  Taki  rozkaz  skoku  może  powodowad 
ogromne opóźnienia w wykonywaniu programu  - tym większe, im  większa jest długośd potoku. Dodatkowo szacuje 
się,  że  dla  modelu  programowego  x86  taki  skok  występuje  co  kilkanaście  rozkazów.  Z  tego  powodu  niektóre 
architektury  programowe  (np.  SPARC)  zakładały  zawsze  wykonanie  jednego  lub  większej  ilości  rozkazów 
następujących po rozkazie skoku, tzw. skok opóźniony. Stosuje się także skomplikowane metody predykcji skoku lub 
metody programowania bez użycia skoków. 

CPLD (ang. Complex Programmable Logic Device) - złożone programowalne układy elektroniczne. 

Układy te są koncepcyjnie podobne do SPLD, lecz są bardziej złożone, czyli mają większe zasoby logiczne i możliwości 
funkcjonalne.  Mają  architekturę  hierarchiczną  opartą  na  makrokomórkach  logicznych,  których  zawierają  od 
kilkudziesięciu  do  kilkuset.  Zazwyczaj  od  4  do  16  makrokomórek  jest  połączonych  w  większe  bloki  funkcjonalne. 
Większa  ilośd  bloków  jest  łączona  za  pomocą  matrycy  połączeniowej  kluczy,  której  zdolnośd  łączeniowa  określa  w 
jakim stopniu układ jest programowalny. Jedną z najważnieszych cech architektury układów CPLD jest liczba termów 
przypadających na jedną makrokomórkę oraz możliwośd pożyczki termów z sąsiednich makro komórek. Jeśli układ 
zawiera  wiele  bloków  funkcjonalnych,  są  one  łączone  między  sobą  za  pomocą  matrycy  połączeniowj  kluczy,  której 
zdolnośd  łączeniowa  jest  ważną  cechą  układów  CPLD.  Ta  liczba  połączeo  wewnętrz  matrycy  określa  bowiem,  jak 
łatwo jest „wpasowad” jakiś projekt w dany układ programowalny. 

FPGA  (ang.  Field  Programmable  Gate  Array)  -  dosł.  "bezpośrednio  programowalna  macierz  bramek"  to  rodzaj 
programowalnego układu logicznego. Dla projektanta ma funkcjonalnośd taką samą jak układ typu ASIC, jednak może 
byd  wielokrotnie  przeprogramowany  po  tym  jak  został  już  wytworzony,  zakupiony  i  zamontowany  w  urządzeniu 
docelowym. Największymi dostawcami tego typu układów są firmy Altera Corp. i Xilinx a także Actel, Atmel, Cypress, 
Lattice Semiconductor, QuickLogic. 

Układy FPGA są zazwyczaj wolniejsze od odpowiadających im układów ASIC i pobierają więcej mocy. Mają natomiast 
wiele innych zalet takich jak krótszy czas projektowania, niższe koszty produkcji (dla małych serii). Ponadto istnieje 
obecnie  możliwośd  wykonania  tzw.  Hard-Copy  układu  FPGA,  czyli  układu  scalonego  o  funkcjonalności  takiej  jak 
wgrany do układu FPGA projekt. Układ taki jest szybszy i pobiera mniej mocy. 

Na ogół układy FPGA zawierają rozmieszczone matrycowo bloki logiczne CLB. Poszczególne bloki są łączone ze sobą 
za  pośrednictwem  linii  traktów  połączeniowych  (Routing  Channels)  oraz  programowalnych  matryc  kluczy 
połączeniowych  umieszczonych  w  miejscu  krzyżowania  się  traktów  poziomych  i  pionowych.  Na  obrzeżach matrycy 
bloków logicznych znajdują się programowalne bloki IOB (wejściowo-wyjściowe). Struktury FPGA zawierają od 64 do 
dziesiątków tysięcy bloków logicznych o bardzo zróżnicowanej budowie. Bloki logiczne mogą byd bardzo złożone, jest 
ich  wówczas  mniej  w  układzie,  lub  względnie  proste  i  jest  ich  wówczas  więcej.  Zazwyczaj  złożone  bloki  logiczne 

background image

8 | 

S t r o n a

 

zawierają dwie lub więcej pamięci RAM umożliwiających tworzenie tablic wartości funkcji LUT (Look-up Table) i dwa 
lub więcej przerzutników. W większości układów są to tablice czterowejściowe (pamięd RAM o pojemności 16 bitów). 
W  układach  o  prostszej  budowie,  bloki  logiczne  zawierają  zwykle  dwuwejściowe  układy  generacji  funkcji 
kombinacyjnych lub multipleksery czterowejściowe i ewentualnie przerzutniki. 

Nowoczesne  układy  FPGA  mają  możliwośd  przeprogramowania  'w  locie'  co  prowadzi  do  pomysłu 
rekonfigurowalnego  komputera  czy  rekonfigurowalnego  systemu  -  czyli  układów,  które  mogą  dostosowad  swoją 
strukturę tak by lepiej sprostad zadaniom, przed którymi stoją w danym momencie. 

Układy FPGA używane są w cyfrowym przetwarzaniu sygnałów, lotnictwie i wojsku,  w fazie prototypowej układów 
ASIC  i  w  wielu  innych  dziedzinach.  Np.  układy  FPGA  firmy  Xilinx  z  powodzeniem  sprawdziły  się  w  misji  na  Marsa 
zakooczonej lądowaniem łazików Spirit i Opportunity. 

Aby  zdefiniowad  zachowanie  układu  FPGA  używa  się  języka  opisu  sprzętu  takiego  jak  Verilog  czy  VHDL.  Następnie 
przy  pomocy  narzędzi  syntezy  generuje  się  listę  połączeo,  która  potem  w  procesie  implementacji  jest 
odwzorowywana  w  konkretnym  układzie.  Należy  zwrócid  uwagę,  że  proces  syntezy  dopuszcza  tworzenie  układów 
logicznych dowolnych rozmiarów, podczas gdy proces implementacji jest próbą wpisania go do konkretnego układu 
FPGA,  gdzie  może  zabraknąd  zasobów  do  realizacji  zadanej  logiki.  Do  zaprogramowania  układu  FPGA  służy  plik 
binarny, który zawiera informacje o konfiguracji układu. 

 

Układy  rekonfigurowalne  można  podzielid  ze  względu  na  rodzaj  technologii  wykorzystywanej  w  celu  pamiętania 
swojej konfiguracji: 

    * SRAM - Bazuje na technologii pamięci statycznej, dlatego przy braku zasilania tracą swoją konfigurację. 

    *  EPROM  -  Zazwyczaj  programowalne  tylko  raz.  Ewentualnie  można  wykasowad  ich  konfigurację  przy  pomocy 
promieniowanie ultrafioletowego. 

    * EEPROM - Wielokrotnego użytku. Zachowują swoją konfigurację przy braku zasilania. 

    * FLASH -  Wielokrotnego użytku. Zazwyczaj komórki FLASH są mniejsze niż odpowiadające im  komórki  EEPROM, 
dlatego układy takie są taosze do wyprodukowania. 

    * przepalenia (ang. fuse), udrożnienia (ang. anti-fuse) - Programowalne tylko raz. Jest to stary typ technologiczny, 
ale nadal chętnie wykorzystywany przez wojsko z uwagi na wysoką odpornośd na impuls elektromagnetyczny z broni 
nuklearnej.  W  układach  tego  typu  podczas  programowania  następuje  "przepalenie"  wybranych  wewnętrznych 
rezystorów (typ. 300 Ω) połączeniowych, co skutkuje trwałością i nieodwracalnością zapisu układu. 

Układy FPGA to jedna z dwóch rodzin programowalnych cyfrowych układów  logicznych o dużym stopniu scalenia  - 
drugą grupę stanowią układy CPLD (Complex Programmable Logic Device) o nieco innej architekturze.  

Różnica między CPLD i FPGA 

Układy FPGA i CPLD różnią sie budową wewnętrzną (chociaż te różnice czasami są słabo widoczne). Układy FPGA to 
matryca  identycznych  bloków  logicznych  pomiędzy  którymi  znajdują  się  trakty  połączeniowe  (do  łączenia  logiki 
wewnątrz układu FPGA). Najczęściej do konfigurowania tych układów jest wykorzystywana pamięd SRAM. 

Układ  CPLD  można  wyobrazid  jako  połączenie  kilku  (kilkunastu)  układów  typu  SPLD  (np.:  GAL)  -  zwanych 
makrokomórkami. Pomiędzy makrokomórkami znajdują się trakty połączeniowe. Do  konfigurowania układów CPLD 
najczęściej wykorzystywana jest pamięd typu EEPROM (FLASH). 

Raid 

background image

9 | 

S t r o n a

 

University of California w Berkeley 

RAID – Redundant Array of Independent Disks 

RAID 0 – nie przewiduje redundancji. Zastosowania : wydajnośd i  

pojemnośd najważniejsza.  

RAID 1 – Redundancja poprzez duplikowanie danych. Zmniejszona  

pojemnośd, wysoka wydajnośd. 

RAID 2 – paski bardzo małe, często równe jednemu słowu. Osobne dyski na  

kod korekcyjny (zwykle kod Hamminga).  

RAID 3 – podobnie jak RAID 2. Tylko jeden dysk na kod korekcyjny – bit  

parzystości. 

RAID 4 – każdy dysk działa niezależnie. Zastosowania : wymagana szybka  

odpowiedź na żądania we/wy. Paski duże. Bity parzystości na  

osobnym dysku.  

RAID 5 – ppodobnie jak RAID 4. Paski parzystośdi rozproszone na  

wszystkich dyskach. 

Taksonomia Flynna jest klasyfikacją architektur komputerowych, zaproponowaną w latach sześddziesiątych XX wieku 
przez Michaela Flynna, opierająca się na liczbie przetwarzanych strumieni danych i strumieni rozkazów. 

W taksonomii tej wyróżnia się cztery grupy: 

SISD (Single Instruction, Single Data) - przetwarzany jest jeden strumieo danych przez jeden wykonywany program - 
komputery skalarne (sekwencyjne). 

SIMD  (Single  Instruction,  Multiple  Data)  -  przetwarzanych  jest  wiele  strumieni  danych  przez  jeden  wykonywany 
program - tzw. komputery wektorowe. 

MISD  (Multiple  Instruction,  Single  Data)  -  wiele  równolegle  wykonywanych  programów  przetwarza  jednocześnie 
jeden  wspólny  strumieo  danych.  W  zasadzie  jedynym  zastosowaniem  są  systemy  wykorzystujące  redundancję 
(wielokrotne wykonywanie tych samych obliczeo) do minimalizacji błędów. 

MIMD  (Multiple  Instruction,  Multiple  Data)  -  równolegle  wykonywanych  jest  wiele  programów,  z  których  każdy 
przetwarza własne strumienie danych - przykładem mogą byd komputery wieloprocesorowe, a także klastry i gridy. 

Klaster komputerowy (ang. cluster) - grupa połączonych jednostek komputerowych,  które  współpracują ze  sobą w 
celu udostępnienia zintegrowanego środowiska pracy. 

Komputery wchodzące w skład klastra (będące członkami klastra) nazywamy węzłami (ang. node).  

Jedną z najbardziej popularnych implementacji klastrów obliczeniowych jest klaster typu Beowulf gdzie rolę węzłów 
pełnią wydajne komputery klasy PC, pracujące pod kontrolą GNU/Linuksa oraz z zainstalowanym oprogramowaniem 
pozwalającym uzyskad przetwarzanie równoległe np. bibliotekami MPI, PVM. 

background image

10 | 

S t r o n a

 

Obecnie  najszybszy  klaster  komputerowy  w  Polsce  to  superkomputer  Galera  będący  częścią  Centrum 
Informatycznego Trójmiejskiej Akademickiej Sieci Komputerowej. 

 

Typy klastrów  

W  istniejących  rozwiązaniach  klastrowych  można  wyodrębnid  trzy  podstawowe  klasy  wynikające  z  celów  budowy 
takich rozwiązao: 

    *  Klastry  wydajnościowe:  pracujące  jako  zespół  komputerów,  z  których  każdy  wykonuje  własne  zadania 
obliczeniowe. Celem ich budowy jest powiększenie mocy obliczeniowej, w sytuacji kiedy różne komputery w klastrze 
pracują  nad  odrębnymi  podzadaniami  pojedynczego  dużego  zadania  obliczeniowego.  Wiele  obecnych 
superkomputerów działa na tej zasadzie. 

    *  Klastry  niezawodnościowe:  pracujące  jako  zespół  komputerów  dublujących  nawzajem  swoje  funkcje  (łączenie 
równoległe). W razie awarii jednego z węzłów, następuje automatyczne przejęcie jego funkcji przez inne węzły. 

    * Klastry równoważenia obciążenia: pracujące jako zespół komputerów, z których każdy wykonuje własne zadanie 
z  puli  zadao  skierowanych  do  całego  klastra.  W  takiej  sytuacji  pojedynczy  komputer  może  wykonywad  niezależne 
zadanie  lub  współpracowad  z  kilkoma  innymi  węzłami  klastra  wykonując  podzadanie  większego  zadania 
obliczeniowego.  Klastry  równoważenia  obciążenia  mogą  byd  traktowane  jako  pierwowzór,  a  obecnie  także  jako 
częsty element składowy, systemów gridowych 

W  praktyce  rozwiązania  klastrowe  mają  charakter  mieszany  i  wykonują  dla  pewnych  aplikacji  funkcje 
wydajnościowe,  przy  jednoczesnym  odgrywaniu  roli  niezawodnościowej  lub  równoważenia  obciążenia.  Szczególnie 
często taki tryb pracy klastra dotyczy serwerów WWW, pocztowych itp., z racji sposobu pracy aplikacji obsługujących 
tego  typu  serwisy.  Z  drugiej  strony  aplikacje  bazodanowe,  wykorzystywane  w  biznesie,  słabo  poddają  się 
zrównolegleniu (szczególnie, gdy żądamy transakcyjności). 

Procesory SMP - Wieloprocesory symetryczne 

a) Cechy szczegolne 

- Dwa lub wieksza liczba podobnych procesorow o porownywalnych mozliwosciach 

- Procesory wspolnie uzytkuja pamiec glowna i urzadzenia I/O. 

- Sa wzajemnie polaczone za pomoca magistrali, w  taki sposob, ze czas dostepu do pamieci dla  kazdego procesora 
jest taki samo 

- Wszystkie procesory moga realizowac takie same funkcje 

- System sterowany jest przez zintegrowany system operacyjny, ktory zapewnia wspolprace miedzy procesorami i ich 
programami. 

b) Plusy 

- Wydajnosc-wiele procesorow, niektore czesci programu moga byc wykonywane rownolegle 

- Dostepnosc-uszkodzenie jakiegos procesora nie powoduje zatrzymania komputera, po prostu spada wydajnosc 

- Mozliwosc rozbudowy-dodawanie procesorow 

- Skalowanie 

RODZAJE ORGANIZACJI SYSTEMOW WIELOPROCOESOROWYCH 

background image

11 | 

S t r o n a

 

c)magistrala z podzialem czasu 

- najprostsze rozwiazanie - kazdy procesor ma taka sama ilosc czasu 

- elastycznosc - latwo jest rozszerzyc system, dodajac kolejny procesor 

- niezawodnosc - uszkodzenie procesora nie spowoduje padniecia systemu 

- ograniczona wydajnosc - wszystkie odniesienia do pamieci przechodza przez wspolna magistrale 

d) pamiec wieloportowa 

- Kazdy procesor ma swoj wlasny modul pamieci glownej 

- Bardziej zlozona niz rozwiazanie magistralowe 

- Czesc pamieci moze byc skonfigurowana jakos pamiec "wlasna" procesora 

- Brak srodkow alarmowania innych procesorow o aktualizacji pamieci - powinien byc stosowany zapis jednoczesny. 

c) Centralna jednostka sterujaca 

-  Centralna  jednostka  sterujaca  -  kierowanie  przeplywem  oddzielnych  strumieni  danych  miedzy  niezaleznymi 
modulami: procesorem,pamiecia,I/O. 

2. Protokol MESI 

M- modified - w pamieci podrecznej jest najnowszy stan pamieci, w pamieci glownej jest nieaktualny 

E- wylaczny - w pamieci podrecznej jest najnowszy stan w pamieci, w pamieci glownej rowniez 

S - wspolny - w kilku pamieciach podreczny jest najnowszy stan pamiec, w pamieci glownej rowniez 

I - niewazny - w pamieci podrecznej jest stary wpis, 

3. Klastry 

a) Cechy szczegolne 

- grupa polaczonych ze soba, kompletnych komputerow, tworzacych razem jednolity zasob obliczeniowy 

sprawiajacy wrazenie, ze jest jedna maszyna 

- Czesto stosowane macierze dyskowe RAID - uszkodzenie jednego dysku nie powoduje zepsucia systemu( 

mozna przywrocic dane np. poprzez kody parzystosci) 

b) Korzysci 

- Skalowalnosc bezwzgledna - klaster moze zawierac dziesiatki komputerow, z ktory kazdy jest wieloprocesorem 

- Skalowalnosc przyrostowa - Mozna poszerzac Klaster bez koniecznosci dokonywania powaznej modernizacji 

- Wysoka dostepnosc - Uszkodzenia wezla w klastrze nie powoduje utraty mozliwosci obslugi 

- Korzystny stosunek ceny do wydajnosci - mozna uzyskac wysoka wydajnosc przy stosunkowo malej cenie 

c) Metody tworzenia klastrow 

background image

12 | 

S t r o n a

 

-  Rezerwa  bierna  -  Dodatkowy  serwer  przejmuje  zadania  w  przypadku  uszkodzenia  serwera  podstawowego    - 
Zwieksza dostepnosc, ale nie poprawia wydajnosci 

- Dodatkowy serwer czynny - Klasyczna definicja klastra 

- Odrebne serwery - Brak dyskow wspolnych, ciagle wymienianie danych miedzy soba, aby jeden mogl przejac prace 
drugiego w razie uszkodzenia 

- Serwery polaczone dyskami - Polaczone sa tymi samymi dyskami, ale kazdy ma rowniez swoj dysk 

- Serwery wspoluzytkujace dyski 0 

4. NUMA - systemy oparte na niejednorodnym dostepie do pamieci 

a) Cechy szczegolne 

- Wszystkie procesory maja dostep do kazdej czesci pamieci glownej przy pomocy operacji ladowania i zapisu. 

- Czas dotepu do pamieci zalezy od rejonu ktorego ten dostep dotyczy 

- CC-NUMA - systemy NUMA, w ktory jest zachowania spojnosc pamieci podrecznych 

-  System  NUMA  pozbawiony  spojnosci  pamieci  podrecznych  jest  w  mniejszym  lub  wiekszym  stopniu  rownowazny 
klastrowi 

-  Kazdy  wezel  CC-NUMA  sklada  sie  z  N  procesorow,  zawierajacy  pamiec  podreczna  L1,  oraz  polaczony  z  osobista 
pamiecia L2. 

 Pamieci podreczne polaczone sa ze wspolna magistrala, do ktorej polaczona jest pamiec glowna kazdego wezla, I/O 
oraz katalog, ktory 

 realizuje przesylanie zadan pobrania danego wiersza pamieci do innych wezlow CC-NUMA 

 
"Stos" 

Stos jest obszarem pamięci używanym do "tymczasowego" przechowywania danych istotnych dla programu. 

Jak  powiedzieliśmy  w  sekcji  "Rejestry  i  flagi"  rejestry  są  obszarem  kilku(nasto)bajtowym  i  nie  nadają  się  raczej  do 
przechowywania danych - raczej do ich obróbki. 

Funkcję magazynu pełni właśnie stos. 

 Jak działa stos? 

Wyobraź sobie kilka kartek - umownie ponumerowanych od 1 do 10 - symbolizujących dane. Jeśli na stole położysz 
kartkę o numerze 1, to masz już jedną kartkę "na stosie". Jeśli na kartce 1 położysz kartkę 2, to wówczas  masz na 
stosie  już  dwie  kartki.  Dołóż  jeszcze  kartki  3  i  4  -  4  kartki  na  stosie.  Zauważ  jednak,  że  w  danym  momencie  masz 
dostęp tylko do  kartki 4 - tylko ją możesz w danym  momencie zdjąd ze stosu. Kartki 1 2 i 3 są  dla ciebie aktualnie 
niedostępne - aby móc zobaczyd co jest na nich napisane musisz zdjąd kartkę 4, 3 i 2. Wniosek 1: ze stosu dane mogą 
byd pobierane w odwrotnej kolejności, niż zostały na nim umieszczone. Wniosek 2: W danym momencie masz dostęp 
do  ostatnio  umieszczonego  na  stosie  elementu  -  bez  możliwości  natychmiastowego  dostępu  do  elementów 
poprzednich. 

Assembler  -  do  obsługi  stosu  -  posiada  dwie  analogiczne  instrukcję  -na_stos  (push)  i  ze_stosu  (pop),  ale  o  tym 
powiemy w dalszej części tego kursu. 

background image

13 | 

S t r o n a

 

Asembler x86 

Asembler x86 to język programowania z rodziny asemblerów do komputerów klasy PC, które posiadają architekturę 
głównego procesora zgodną z x86. 

Język ten jest pełen sprzeczności ze względu na to, że każdy nowy procesor wprowadzający różne ulepszenia musi 
jednocześnie pozostawad kompatybilny z  poprzednikami. W  procesorach 80286 jest około 250 rozkazów,  w 80486 
już ok. 350, natomiast w procesorze Pentium 4 – ok. 580 (w procesorach firmy AMD jest ich ponad 620). 

Język  jest  dodatkowo  komplikowany  przez  obecnośd  dwóch  składni:  Intela  i  AT&T  (istnieją  automatyczne 
translatory),  oraz  przez  fakt,  że  możliwości  i  zasady  wykorzystania  tego  języka  są  mocno  zależne  od  systemu 
operacyjnego oraz kompilatora, różne są także sposoby komunikacji asemblera z innymi językami programowania. 

Instrukcje 

Tu musze to skonczyc. 

Rejestry  

32-bitowe rejestry ogólnego przeznaczenia to: 

    *  EAX  –  Accumulator  (akumulator  -  jego  pamięd  wykorzystuje  arytmometr;  używa  się  go  do  przechowywania 
wyników wielu operacji) 

    * EBX – Base Register (rejestr bazowy - służy do adresowania) 

    * ECX – Counter Register (rejestr licznikowy - służy jako liczik w pętli) 

    * EDX – Data Register (rejestr danych - umożliwia przekaz/odbiór danych z portów wejścia/wyjścia) 

    * ESP – Stack Pointer (przechowuje wskaźnik wierzchołka stosu) 

    * EBP – Base Pointer (rejestr bazowy - służy do adresowania) 

    * ESI – Source Index (rejestr źródłowy - trzyma źródło łaocucha danych) 

    * EDI – Destination Index (rejestr przeznaczenia - przetrzymuje informacje o miejscu docelowym łaocucha danych) 

Możliwy jest też dostęp do ich 16-bitowych mniej znaczących części  – AX, BX, CX, DX, SP, BP, SI, DI, a w przypadku 
czterech pierwszych także do młodszego (Low) i starszego bajta (High) – odpowiednio AL, AH, BL, BH, CL, CH, DL, DH. 

W procesorach 64-bitowych do rejestrów o długości 64 bitów odwołuje się poprzez nazwę z przedrostkiem R zamiast 
E - np. RAX, RBX. 

Są też dostępne rejestry segmentów, określające położenie segmentów pamięci w przestrzeni adresowej: 

    * CS – Code Segment (segment kodu) 

    * DS – Data Segment (segment danych) 

    * ES – Extra Segment (dodatkowy segment danych) 

    * SS – Stack Segment (segment stosu) 

    * FS – dodatkowy rejestr segmentu 

    * GS – dodatkowy rejestr segmentu 

background image

14 | 

S t r o n a

 

Ponadto istnieją: 

    * EFLAGS – rejestr flag procesora, składający się z pojedynczych bitów określających stan procesora 

    *  EIP  –  wskaźnik  adresowy  na  aktualnie  wykonywaną  instrukcję.  Za  jego  pomocą  procesor  realizuje  m.in.  skoki, 
pętle, przejścia do podprogramów. 

    * rejestry kontrolne procesora CRn (n – numer rejestru) 

    * rejestry debugera DRn (n – numer rejestru); 

    * rejestry koprocesora arytmetycznego: 

          o  osiem  rejestrów  stosu  koprocesora,  oznaczanych  w  zależności  od  kompilatora  jako  ST0...  ST7,  0...  7  lub 
ST(0)... ST(7); 

          o rejestr stanu koprocesora; 

          o rejestr stanu stosu koprocesora; 

          o rejestr sterujący koprocesora 

Zadania z asm. 

Liczba 0 w bajcie 

_asm { 
 
  MOV AX, wejscie 
  MOV BX, 0x00 
  MOV CX, 0x01 
 
petla: 
  TEST AX, CX 
  JNZ etykieta 
  INC BX 
etykieta: 
  SHL CX, 1 
  TEST CX, 0x100 
  JZ petla 
 
  MOV wynik, BX 
 

Liczba 1 w bajcie 

xor bh,bh 
petla: 
mov bl,wejscie 
and bl,00000001b 
jz przesun: 
add bh,1 

background image

15 | 

S t r o n a

 

przesun: 
shr wejscie,1 
test wejscie,1 
jnz petla: 
mov wynik,bh 

Dzielenie przez 3.2 

MOV AX,input  //przerzucamy wejście do AX 

SHL  AX, 3   //przesuwamy 3 bity w lewo, czyli tak, jakbyśmy mnożyli razy 8 

ADD AX,input//dodajemy do AX wejście 

ADD AX,input//dodajemy do AX wejście 

SHR AX, 5 // przesuwamy o 6 bity, czyli tak, jakbyśmy dzielili przez 32 

MOV wynik, BX  //zapisujemy do zmiennej wynik nasze obliczenia