Wykłady 1,2,3[2011]do druku


ZSK WC WAT
Architektura linii 80x86
język wewnętrzny od 8086 do IA-32
Adam E. Patkowski
Przedmiot
Przedmiot
dr inż. Adam E. Patkowski, p. 75, 839286
- aep@ita.wat.edu.pl 0-501 579 111
Podstawy Programowania Niskopoziomowego
- 14h wykładów, 16h laboratoriów
Kolokwium na ? ćwiczeniach: z architektury 80x86
Ocena z laboratorium AP; orientacyjnie:
- Na początku każdy ma ocenę wyjściową 3,5
- Za nieobecność na laboratorium -0,75 oceny
- Za wypowiedz można dostać od -0,5 do +05 oceny
- Ujemne wartości za wypowiedzi  dyskwalifikujące
- Oceny z odpowiedzi i ocenę końcową wystawia
prowadzący arbitralnie
Ocena z przedmiotu: wynik kolokwium.
2
Jeszcze o zaliczeniach
Jeszcze o zaliczeniach
Prowadzący laboratoria  mgr inż. Waldemar
Szylberg  zadecyduje, czy będą  wejściówki .
Jeśli prowadzący stwierdzi braki w postępach, na
ostatnich zajęciach zostanie przeprowadzone
dodatkowe kolokwium zaliczające (po zapowiedzi).
3
Literatura
Literatura
Dokumentacja techniczne procesorów 32-bitowych
Intel i AMD
Aktualne materiały z Internetu: dokumentacje
narzędzi, właściwe tematycznie FAQs, crackme,
tutorials, kursy (wybrane zostaną udostępnione)
http://en.wikipedia.org/wiki/X86
Zalecane podobne, ale nie starsze niż:
- Wróbel: Asembler 8086/8088, 1990
- Syck: Turbo Assembler Biblia użytkownika, 2002
- A.E.Patkowski Wstęp do systemów komputerowych
(wybrane elementy zostaną udostępnione)
4
Zawartość tematyczna
Zawartość tematyczna
Język wewnętrzny procesorów 80x86 a asembler, tryby
32-bitowe
Reverse engineering, zasady inspekcji kodu binarnego i
narzędzia podstawowe
Aplikacje Windows  NE i PE, liniowe i sterowane
zdarzeniami, ładowanie, uruchamianie, współistnienie.
Organizacja wewnętrzna systemu Windows
Minimalna aplikacja Windows w assemblerze 32b
Aączenie asemblera i języków wysokopoziomowch
Cel dydaktyczny: opanowanie umiejętności inspekcji kodu,
rozumienie działania komputera na najniższym poziomie,
zapoznanie z IA-32, API Windows i użyciem asemblera w
programowaniu wysokopoziomowym
5
Materiały bieżące, uwagi
Materiały bieżące, uwagi
\\SECLAB\PNAK
Kiedy używa się niskiego poziomu?
- Raczej nie do pisania aplikacji&
- Do optymalizacji tzw.  krytycznych obszarów kodu
- Do sprawdzania, czy program nie zawiera
niepożądanych funkcji (inspekcja kodu)
- Do badania budowy, np. wormów (to też inspekcja)
- Do wymuszania zmian zachowania binarnych postaci
programów  tzw. modułów wykonywalnych (to
najczęściej tzw. cracking: przełamywanie zabezpieczeń
przed nielegalnym wykorzystywaniem
oprogramowania)
- Do ataków zdalnych  shellcode, przepełnienia bufora
6
Język wewnętrzny
Język wewnętrzny
Rozkazem nazywa się ciąg zerojedynkowy pobrany z
pamięci w celu określenia na jego podstawie dalszych
działań procesora. Ten sam ciąg może być traktowany jak
dana.
Uwaga: z punktu widzenia programistów rozkazem jest
ciąg zerojedynkowy przewidziany do wykonania jako
rozkaz.
Zbiór wszystkich możliwych, jakościowo różnych
rozkazów komputera nazywa się listą rozkazów tego
komputera.
Lista rozkazów, wraz z tzw. formatami rozkazów i danych,
czyli regułami interpretacji fragmentów rozkazów i danych
(co w praktyce oznacza reguły poprawnego zapisu)
tworzą język wewnętrzny komputera (machine language).
W tym sensie można użyć wymiennie słowa instrukcja ze
słowem "rozkaz", chociaż w zasadzie pojęcie "instrukcja"
zarezerwowane jest dla języków programowania.
7
Przenoszenie sterowania
Przenoszenie sterowania
Pobieranie kolejnych rozkazów do wykonania w porządku ich
adresów w PAO nosi nazwę sekwencyjnego przenoszenia
sterowania.
Sekwencyjne przenoszenie sterowania wymaga pamiętania adresu
wykonywanego rozkazu w pewnym rejestrze bloku sterowania,
rejestr ten we wszystkich klasycznych komputerach nosi nazwę
licznika rozkazów.
Dla umożliwienia programiście niesekwencyjnego przenoszenia
sterowania (innego niż zgodne ze wspomnianą regułą) w
komputerach wprowadzono rozkazy skokowe.
Rozkazy skoku bezwarunkowego powodują zawsze wykonanie jako
kolejnego chronologicznie rozkazu spod adresu wskazanego w
rozkazie skoku.
Rozkazy skoku warunkowego poddają badaniu pewien warunek
dotyczący stanu komputera i dokonują przeniesienia
niesekwencyjnego (gdy warunek jest spełniony - mówi się wówczas
o efektywnym rozkazie skoku) lub sekwencyjnego (gdy warunek nie
jest spełniony - mówi się wówczas o nieefektywnym rozkazie
skoku).
8
8
Komputer von Neumanna
Komputer von Neumanna
W latach 40-tych amerykański matematyk pochodzenia
węgierskiego John von Neumann sformułował podstawowe cechy
komputerów cyfrowych, dalej podano je w znacznym skrócie:
1. Wspólna pamięć do przechowywania zarówno rozkazów jak i
danych. Pierwszym komputerem pracującym według tej zasady był
EDVAC (wcześniejszy ENIAC z 1946 r nie był komputerem z
zapamiętywanym programem).
2. Pamięć jednowymiarowa, złożona z kolejno ponumerowanych
komórek o jednakowej wielkości.
3. Brak jawnego rozróżniania rozkazów i danych.
4. Brak jawnej specyfikacji typów danych.
5. Praca sekwencyjna  przed rozpoczęciem wykonywania kolejnego
rozkazu musi zostać zakończone wykonywanie rozkazu
chronologicznie poprzedniego. Każdy rozkaz określa jednoznacznie
adres następnego.
Współczesne komputery w dużej mierze mają właśnie te cechy. Co
prawda punkt 5 już nie obowiązuje  wiele rozkazów naraz jest w
różnym stopniu zaawansowania  ale wyniki muszą być identyczne
jak w pozbawionym współbieżności komputerze von Neumanna.
9
9
Stan sterowania
Stan sterowania
Do sterowania zalicza się pewne rejestry, z których
większość nie jest dostępna bezpośrednio
programiście. M.in. licznik rozkazów - rejestr
jednoznacznie określający adres kolejnego
rozkazu do wykonania. Do rejestrów sterowania
zalicza się rejestry (głównie wskazniki), których
stan może mieć wpływ na sposób wykonywania
rozkazów.
Stanem sterowania nazywa się bieżącą wartość
części spośród rejestrów sterowania. Stan
sterowania definiowany jest dla każdego
komputera indywidualnie (przez producenta),
zawsze jednak w jego skład wchodzi zawartość
licznika rozkazów.
10
10
Sygnały żądania przerwań w mikroprocesorze 8086
Sygnały żądania przerwań w mikroprocesorze 8086
Przerwanie
zewnętrzne
Żądanie przerwania
Żądanie przerwania
maskowalnego
niemaskowalnego
INTR
NMI
Przerwanie
Wewnętrzny układ sterownia przerwań
wewnętrzne
Przerwanie Przerwanie Przerwanie Przerwanie dla
przy błędzie przy nadmiarze programowe pracy krokowej
dzielenia INTO (OF=1) INT n (TF=1)
Priorytety przerwań
Rodzaj
Priorytet
przerwania
Najwyższy Wewnętrzne
NMI
INTR
Najniższy Dla pracy krokowej
11
Przerwania
Przerwania
Sygnałem żądania przerwania nazywa się dowolny z sygnałów
powodujący (w sprzyjających warunkach) wykonanie tzw. sekwencji
przerwania.
Sekwencją przerwania nazywa się szereg działań sprzętowych,
radykalnie zmieniających stan sterowania komputera. Na sekwencję
przerwania składa się
- Zapamiętanie (zwykle pamięci) aktualnego stanu sterowania;
- wymuszenie nowego stanu procesora (sterowania).
Sekwencja przerwania, jeśli jest dozwolona, wykonywana jest
zawsze "między" rozkazami (aktualnie wykonywany rozkaz
musi być zakończony).
Sekwencja przerwania jest działaniem sprzętowym.
Wśród rozkazów występuje zawsze rozkaz noszący nazwę
"powrotu z przerwania", którego częścią jest tzw. sekwencja
powrotu wymuszająca nowy stan procesora według informacji
zapamiętanej w miejscu przewidzianym na zapamiętywanie stanu w
trakcie sekwencji przerwania.
Sekwencja powrotu jest zatem działaniem programowym.
Zwykle fragment programu przeznaczony do wykonania
bezpośrednio po sekwencji przerwania nazywany jest
podprogramem obsługi przerwania.
12
12
Klasy i maski
Klasy i maski
Przerwania dzielą się na
- przerwania zewnętrzne - gdy sygnał żądania przerwania generowany jest w
wyniku przyczyny zewnętrznej względem procesu wykonywania rozkazów w
procesorze, oraz
- przerwania wewnętrzne - gdy sygnał żądania przerwania generowany jest na
polecenie programisty w wyniku wykonania odpowiedniego rozkazu.
Sekwencje przerwań wewnętrznych wykonywane są przed
sekwencjami przerwań zewnętrznych
Przerwania zewnętrzne zwykle podzielone są na pewne podzbiory
(noszące czasem nazwę klas przerwań lub poziomów przerwań).
Przerwania zewnętrzne należące do każdej z klas mogą zostać
zablokowane w wyniku wpisania odpowiedniej wartości zwanej
maską przerwania do specjalnego rejestru maski przerwań.
Przerwania wewnętrzne nie mogą być maskowane.
Z każdym przerwaniem związany jest też tzw. priorytet przerwania
czyli liczba decydująca o kolejności wykonania sekwencji
przerwania przy jednoczesnej obecności kilku sygnałów żądania
przerwania.
W mikroprocesorach część sterownika przerwań jest wbudowana,
część znajduje się poza nim.
13
13
System przerwań
System przerwań
Systemem przerwań komputera nazywa się zespół
wszystkich ustaleń związanych z przerwaniami
obowiązujący w komputerze.
W jednopoziomowych systemach przerwań istnieją
dwa wyróżnione stany sterowania: w jednym z nich
przerwania są dozwolone, w drugim - zabronione.
W wielopoziomowych systemach przerwań istnieje
kilka stanów, w których dozwolone są różne
przerwania.
14
14
Tryby pracy linii 80x86
Tryby pracy linii 80x86
Dokumentacja Intela
Architektura: 253665.pdf (zob. 2.1)
Real-address mode (16-bitowy)
Protected address mode
- Native (IA-32  od Intel Architecture)
- Rozszerzony (IA-32e)
Zgodności (compatibility)
64-bitowy (x64, uwaga IA-64 to architektura Itanium!)
- Virtual-8086 mode (V86)
System management mode (SMM)
15
Tryby pracy linii 80x86
Tryby pracy linii 80x86
Dokumentacja Intela
Architektura: 253665.pdf (zob. 2.1)
Procesory 2008
Real-address mode (16-bitowy)
Protected address mode
- Native (IA-32  od Intel Architecture)
- Rozszerzony (IA-32e)
Zgodności (compatibility)
64-bitowy (x64, uwaga IA-64 to architektura Itanium!)
- Virtual-8086 mode (V86)
System management mode (SMM)
16
Tryby pracy procesora 32b
Tryby pracy procesora 32b
17
IA-32 system level registers
IA-32 system level registers
18
IA-32  little-endian
IA-32  little-endian
19
Dane w pamięci
Dane w pamięci
20
Format rozkazu  binarnie
Format rozkazu  binarnie
21
Bardziej przystępna forma
Bardziej przystępna forma
22
Architektura Real Address Mode
Architektura Real Address Mode
A teraz Real Address Mode& ale:
- Większość ograniczeń w IA-32 zniknie
- Wszystko 16-bitowe stanie się 32-bitowe (np.
szerokość dostępu do stosu, rejestr flag)
- W IA-32 każdy program dostanie swoją wirtualną
przestrzeń adresową
- Rejestry segmentowe w IA-32 można będzie ignorować
przy analizie programów
- Adresy fizyczne będą dane explicite, a nie seg:offset
- Liczba rozkazów zwiększy się kilkakrotnie L
- &
23
Skąd to się wzięło  8086
Skąd to się wzięło  8086
Obudowa 40 końcówek, 20 linii adresowych, 16
danych
Przestrzeń adresowa 1MB
Wszystkie rejestry 16 bitów (słowo)
Przyjęto regułę tworzenia adresów fizycznych
pamięci ("adresów do pamięci") zawsze z dwóch
szesnastobitowych wartości,
- z których jedna (oznaczana SEGMENT) określa adres
początkowy pewnego segmentu, zaś
- druga (oznaczana jako OFFSET) jest adresem
względnym względem początku tego segmentu.
Segmentem nazywa się dowolny spójny obszar
pamięci rozpoczynający się od adresu
podzielnego bez reszty przez 16 (10H).
w przestrzeni adresowej 1 MB można wyróżnić
24
64 K segmentów.
24
Adresy Real Address Mode
Adresy Real Address Mode
25
25
Adresy 16-bitowe&
Adresy 16-bitowe&
Przyjęto zasadę zapisu adresów fizycznych w następującej
konwencji:
SEGMENT:OFFSET
np. zapis 20H:10H oznacza adres fizyczny 210H (zaś
0FEDBH:1BH wyznacza adres 0FEDCBH).
Przeniesienie jest ignorowane (0FEDBH:1111H = 0FFEC1H).
Należy też zwrócić uwagę, że istnieje wiele sposobów zapisu
tego samego adresu fizycznego, np. adres 0400H można
zapisać jako 40H:0, 10H:300H, 20H:200H, 30H:100, 0:400H,
1FH:210H itd.
Podczas działania procesora w rozkazach określa się tylko
przesunięcia (adresy względne), zaś SEGMENT pobierany
jest z jednego z tzw. rejestrów segmentów (segment
registers).
26
26
Segmentacja  wizja programisty
Segmentacja  wizja programisty
27
Rejestry 80x86
Rejestry 80x86
28
28
Rejestry mikroprocesora 8086
Rejestry ogólnego przeznaczenia
15
0
8 7
Akumulator
Akumulator AH AX AL
Rejestr bazowy
Rejestr bazowy
BH BX BL
CH CX CL
Rejestr zliczający
Rejestr zliczający
Rejestr danych
Rejestr danych DH DX DL
AX - akumulator
AX - akumulator - niektóre rozkazy dotyczące tego rejestru wykonują się szybciej niż na innych
rejestrach ogólnych lub są o 1 bajt krótsze.
BX - rejestr bazowy
BX - rejestr bazowy - dodatkowo może być wykorzystany do tzw. adresowania bazowego -
zawiera wówczas przesunięcie (OFFSET) argumentu.
CX - rejestr zliczający licznikowy
CX - rejestr zliczający lub licznikowy - może być wykorzystywany w rozkazach jako licznik
wykonań - jest wówczas zmniejszany o 1 za każdym wykonaniem rozkazu
i jego zawartość podlega badaniu, czy nie uległa wyzerowaniu.
DX - rejestr danych
DX - rejestr danych - jako jedyny może być wykorzystywany do adresowania obiektów
w przestrzeni adresowej wej/wyj (portów) w rozkazach wej/wyj, a także
w rozkazach o argumentach lub wynikach długości większej niż jedno słowo
(np. rozkazy mnożenia lub dzielenia).
29
Ogólne: AX, BX, CX, DX
Ogólne: AX, BX, CX, DX
AX - akumulator; niektóre rozkazy dotyczące tego rejestru
wykonują się szybciej niż na innych rejestrach ogólnych
lub są o 1 bajt krótsze.
BX - rejestr bazowy (base register); dodatkowo może być
wykorzystany do tzw. adresowania bazowego - zawiera
wówczas przesunięcie (OFFSET) argumentu.
CX - rejestr zliczający lub licznikowy (count register);
dodatkowo może być wykorzystany w wielu rozkazach
jako licznik wykonań - jest wówczas zmniejszany o 1 za
każdym wykonaniem i jego zawartość podlega badaniu,
czy nie uległa wyzerowaniu.
DX - rejestr danych (data register), jako jedyny może być
wykorzystywany do adresowania obiektów w przestrzeni
adresowej wejścia/wyjścia (portów) w rozkazach
wejścia/wyjścia, a także w rozkazach o argumentach lub
wynikach długości większej niż jedno słowo (np. rozkazy
mnożenia lub dzielenia).
30
30
Rejestry mikroprocesora 8086
Rejestry adresowe
15
0
Wskaznik rozkazu IP
Wskaznik wierzchołka stosu
SP
BP
Wskaznik bazy
Indeks zródła SI
Indeks celu DI
IP - wskaznik rozkazu
IP - wskaznik rozkazu (ang. instruction pointer), zawiera zawsze adres względny (względem
początku segmentu określonego przez zawartość rejestru CS) aktualnie
pobieranego do wykonania rozkazu, rejestr ten stanowi z punktu widzenia
programisty (wraz z rejestrem CS) część licznika rozkazów; rejestr IP nie
może być zmieniany przez program.
SP - wskaznik wierzchołka stosu
SP - wskaznik wierzchołka stosu - zwykle zawiera adres względny (względem początku
segmentu określonego przez zawartość rejestru SS) wierzchołek stosu, tzn.
adres ostatniego słowa odłożonego na stosie.
BP - rejestr wskaznika bazy
BP - rejestr wskaznika bazy - zwykle zawiera adres względny (względem początku segmentu
określonego przez zawartość rejestru SS) parametrów odłożonych na stosie
(dla procedur w językach wysoko poziomowych); rejestr BP może być
wykorzystany także do innych celów.
31
Rejestry adresowe: IP, SP
Rejestry adresowe: IP, SP
IP - wskaznik rozkazu (instruction pointer), zawiera zawsze
adres względny (względem początku segmentu określanego
przez zawartość rejestru CS) aktualnie pobieranego do
wykonania rozkazu; uwaga: rejestr ten stanowi z punktu
widzenia programisty (wraz z rejestrem CS) część licznika
rozkazów; rejestr IP nie może być jawnie zmieniany przez
program.
SP - wskaznik wierzchołka stosu (stack pointer); zwykle zawiera
adres względny (względem początku segmentu określanego
zawartością rejestru SS) wierzchołka stosu, tzn. adres
ostatniego słowa odłożonego na stosie; w przypadku pisania
programów przeznaczonych do pracy pod kontrolą systemu
operacyjnego należy rejestrem SP posługiwać się ze
szczególną ostrożnością.
32
32
Rejestry adresowe BP, SI, DI
Rejestry adresowe BP, SI, DI
BP - rejestr wskaznika bazy (base pointer); zwykle zawiera adres
względny (względem początku segmentu określanego zawartością
rejestru SS) obszaru parametrów i/lub zmiennych lokalnych
odłożonych na stosie dla procedur w programach tworzonych w
językach wysokopoziomowych.
SI - rejestr indeksu zródła (miejsca, z którego pobierane są dane w
operacjach przesyłania danych - source index); zwykle zawiera
adres danych względem początku segmentu określonego
zawartością rejestru DS; rejestr SI wykorzystywany jest do tzw.
adresowania indek-sowego oraz w rozkazach łańcuchowych (na
ciągach), może też być wykorzystywany do innych celów.
DI - rejestr indeksu celu (destination index); zwykle zawiera adres
danych względem początku segmentu określonego zawartością
rejestru DS; rejestr DI wykorzystywany jest do tzw. adresowania
indeksowego oraz w rozkazach łańcuchowych - w tym przypadku
jednak zawiera adres względem początku segmentu określonego
zawartością rejestru ES; może też być wykorzystywany do innych
celów.
33
33
Rejestry mikroprocesora 8086
Rejestry segmentowe
15
0
Segment kodu programu
CS
Segment stosu SS
Segment danych DS
Segment dodatkowy
ES
CS - rejestr segmentu kodu
CS - rejestr segmentu kodu programu określa adres początku segmentu używany w przypadku
wszystkich dostępów do pamięci z adresowaniem względnym za pomocą
rejestru IP, tzn. pobierania rozkazów. Z punktu widzenia programisty
rejestr CS razem z rejestrem IP tworzy licznik rozkazów mikroprocesora
(CS:IP).
SS - rejestr segmentu stosu programu
SS - rejestr segmentu stosu programu określa adres początku segmentu używany w
przypadku wszystkich dostępów do pamięci z adresowaniem względnym za
pomocą rejestru SP lub BP.
DS - rejestr segmentu danych
DS - rejestr segmentu danych określa adres początku segmentu używany w przypadku
wszystkich dostępów do pamięci danych (np. za pomocą rejestrów BX, SI, DI
lub za pomocą adresu podanego bezpośrednio w rozkazie).
ES - rejestr segmentu danych
ES - rejestr segmentu danych określa adres początku segmentu używany w przypadku
wszystkich dostępów do pamięci danych w rozkazach łańcuchowych.
34
Rejestry segmentowe
Rejestry segmentowe
CS - rejestr segmentu kodu programu (code segment) określa adres początku
segmentu używany w przypadku wszystkich dostępów do pamięci z
adresowaniem względnym za pomocą rejestru IP, tzn. pobierania rozkazów
(instructions fetch). Z punktu widzenia programisty rejestr CS wraz z rejestrem IP
tworzy licznik rozkazów mikroprocesora 8086 (CS:IP).
SS - rejestr segmentu stosu (stack segment) określa adres początku segmentu
używany w przypadku wszystkich dostępów do pamięci z adresowaniem
względnym za pomocą rejestru SP lub BP (o ile nie zadano inaczej za pomocą
specjalnego rozkazu) oraz jeśli zadano wykorzystanie tego rejestru specjalnym
rozkazem.
DS - rejestr segmentu danych (data segment) określa adres początku segmentu
używany w przypadku wszystkich dostępów do pamięci do danych (np. za
pomocą rejestrów BX, SI, DI lub za pomocą adresu podanego bezpośrednio w
rozkazie - o ile nie zadano inaczej za pomocą specjalnego rozkazu) oraz jeśli
zadano wykorzystanie tego rejestru specjalnym rozkazem.
ES - rejestr segmentu dodatkowego (extra segment) określa adres początku
segmentu używany w przypadku dostępów do pamięci do danych w rozkazach
łańcuchowych - działania na ciągach adresowanych za pomocą rejestru DI, a
ponadto jeśli zadano wykorzystanie tego rejes-tru specjalnym rozkazem.
Rejestry segmentowe mogą być argumentami wyłącznie rozkazów przesyłania
MOV, PUSH i POP.
35
35
16, 32 a 64 bity&
16, 32 a 64 bity&
Rejestry są rozszerzane  w lewo :
63 32 31 16 15 8 7 0
AH AX AL
RAX EAX
Podobnie:
BX ąEBX ąRBX, CX ąECX ąRCX, DX ąEDX ąRDX
IP ąEIP ąRIP SP ąESP ąRSP itd.
SI ąESI ąRSI itd.
NIE DOTYCZY TO REJESTRÓW SEGMENTOWYCH!
CS, DS, SS i ES mają inne znaczenie w trybach 32b
Ale w przypadku analizy aplikacji działającej w IA-32 to nie
ma znaczenia.
36
Słowo stanu 80x86 (rejestr flag)
Słowo stanu 80x86 (rejestr flag)
37
37
CF - wskaznik przeniesienia globalnego, zmieniany
rozkazami arytmetycznymi i przesunięć, zerowany
rozkazami logicznymi;
OF - wskaznik nadmiaru, zmieniany rozkazami
arytmetycznymi i zerowany rozkazami logicznymi; OF jest
zmieniany również w rozkazach przesunięć, których drugi
argument jest równy 1;
SF - wskaznik znaku (ujemnego wyniku), zmieniany
rozkazami arytmetycznymi i logicznymi;
ZF - wskaznik zera wyniku, zmieniany rozkazami
arytmetycznymi i logicznymi;
PF - wskaznik parzystej liczby jedynek w zapisie
binarnym najmniej znaczącego bajtu wyniku, zmieniany
rozkazami arytmetycznymi i logicznymi;
AF - wskaznik przeniesienia pomocniczego (z bitu 3 na
4) ustawiany na potrzeby rozkazów arytmetyki dziesiętnej.
38
38
Rejestr znaczników (flag, słowo stanu) mikroprocesora 8086
Wskazniki ustawiane w wyniku wykonania różnych rozkazów
X X X X OF DF IF TF SF ZF X AF X PF X CF
Wskaznik zerowego wyniku (ang. Zero)
Przeniesienie pomocnicze (ang. Auxillary Carry)
Wskaznik parzystości (ang. Parity)
Przeniesienie (ang. Carry)
CF  wskaznik przeniesienia globalnego, zmieniany rozkazami arytmetycznymi i przesunięć,
zerowany rozkazami logicznymi;
PF  wskaznik parzystej liczby jedynek w zapisie binarnym wyniku, zmieniany rozkazami
arytmetycznymi i logicznymi;
AF  wskaznik przeniesienia pomocniczego (z bitu 3 na 4) ustawiany przy wykonywaniu
rozkazów arytmetyki dziesiętnej.
ZF  wskaznik zerowego wyniku, zmieniany rozkazami arytmetycznymi i logicznymi;
39
Rejestr znaczników (flag) mikroprocesora 8086
Wskazniki ustawiane w wyniku wykonania różnych rozkazów
X X X X OF DF IF TF SF ZF X AF X PF X CF
Nadmiar (ang. Overflow)
Wskaznik ujemnego wyniku (ang. Sign)
Wskaznik zerowego wyniku (ang. Zero)
Przeniesienie pomocnicze (ang. Auxillary Carry)
Wskaznik parzystości (ang. Parity)
Przeniesienie (ang. Carry)
SF  wskaznik znaku (ujemnego wyniku), zmieniany rozkazami arytmetycznymi i logicznymi;
OF  wskaznik nadmiaru, zmieniany rozkazami arytmetycznymi i zerowany rozkazami
logicznymi; flaga ta jest zmieniana również rozkazami przesunięć, których
drugi argument jest równy 1;
40
Wskazniki określające działanie
Wskazniki określające działanie
TF - bit 8 SW, powoduje (stan 1) przerwanie nr 3,
z jednoczesnym zgaszeniem TF, po wykonaniu
jednego rozkazu - wykorzystywany przez
specjalistyczne oprogramowanie uruchomieniowe;
IF - bit 9 SW, zezwala (stan 1) na przyjmowanie
przerwań zewnętrznych; wyzerowanie tego bitu
powoduje zablokowanie przyjmowania przerwań
zewnętrznych, poza tzw. przerwaniem
niemaskowalnym (NMI);
DF - bit 10 SW, określa czy zawartości rejestrów SI
i DI w trakcie wykonywania rozkazów
łańcuchowych mają być zwiększane (DF=0), czy
zmniejszane (DF=1).
41
41
Rejestr znaczników (flag) mikroprocesora 8086
Wskazniki określające sposób działania komputera
X X X X OF DF IF TF SF ZF X AF X PF X CF
Kierunek (ang. Direction)
Maska przerwań (and. Interrupt enable)
Maska przerwań po jednym rozkazie
(ang. Trap enable)
TF  ustawienie na 1 powoduje przerwania nr 3, z jednoczesnym zgaszeniem TF, po
wykonaniu jednego rozkazu (wykorzystywany głównie przez debugery);
IF  ustawienie na wartość 1 zezwala na przyjmowanie przerwań zewnętrznych, ustawienie na
0 powoduje zablokowanie przyjmowania przerwań zewnętrznych za
wyjątkiem przerwania NMI;
DF  ustawienie na 1 powoduje, że zawartość rejestrów DI oraz SI przy wykonywaniu rozkazów
łańcuchowych będzie zmniejszana, natomiast dla DF=0 będzie zwiększana.
42
Dla zasady  EFLAGS (IA-32)
Dla zasady  EFLAGS (IA-32)
43
Zapis asemblerowy rozkazu
Zapis asemblerowy rozkazu
mnemo {id_argumentu_1{,id_argumentu_2}}
gdzie:
mnemo - oznacza mnemoniczny skrót angielskiej
nazwy funkcji rozkazu;
id_argumentu_1 - oznacza identyfikator argumentu
1;
id_argumentu_2 - oznacza identyfikator argumentu
2;
nawiasami klamrowymi oznaczono elementy zapisu
nie zawsze występujące.
44
44
Rozkazy 16-bitowe
Rozkazy 16-bitowe
45
Rozkazy 32-bitowe
Rozkazy 32-bitowe
46
Tryby adresowania (Real Add& )
Tryby adresowania (Real Add& )
Natychmiastowy: identyfikatorem jest zadana wartość argumentu (stała),
np. w rozkazie MOV AX,123 (stałą podkreślono).
Rejestrowy: identyfikatorem jest nazwa rejestru, którego zawartość ma być
argumentem, np. w rozkazie MOV AX,123 (podkreślono nazwę rejestru).
Bezpośredni: identyfikatorem jest adres (OFFSET) jednostki informacji
przechowywanej w pamięci, np. w rozkazie MOV AX,[123] gdzie
podkreślono zapis adresu (dostęp nastąpi pod adres DS:123).
Bazowy: identyfikatorem jest adres (OFFSET) zawarty przynajmniej
częściowo w rejestrze bazowym BX lub BP, np.: MOV DX,[BX+0E12H]
gdzie podkreślono zapis adresu (dostęp nastąpi pod adres DS:(bx+0E12H),
gdzie bx oznacza zawartość rejestru BX).
Indeksowy: identyfikatorem jest adres (OFFSET) zawarty przynajmniej
częściowo w rejestrze indeksowym SI lub DI, np.: MOV DX,[SI+0E12H]
gdzie podkreślono zapis adresu (dostęp nastąpi pod adres DS:(si+0E12H).
Bazowo-indeksowy: identyfikatorem jest adres (OFFSET) zawarty
przynajmniej częściowo w jednym z rejestrów bazowych BX lub BP oraz w
jednym z rejestrów indeksowych SI lub DI, np. rozkaz: MOV
DX,[BX+SI+0E12H] gdzie podkreślono zapis adresu (dostęp nastąpi pod
adres DS:(bx+si+0E12H)).
Uwaga: rozkazy skokowe dopuszczają jeszcze adresy: względne,
pośrednie i międzysegmentowe  zostaną omówione pózniej.
47
47
48
Rozkazy
Rozkazy
Argumentem zmienianym nazwano ten z argumentów,
który skutkiem wykonania rozkazu ulegnie zmianie, gdyż
w jego miejscu zostanie umieszczony wynik rozkazu.
Pierwszy bajt pobierany z pamięci w cyklu rozkazowym
przez sterowanie mikroprocesora 8086 traktowany jest
jako kod operacji rozkazu. Część zbioru możliwych
wartości takiego bajtu stanowi zbiór tzw. kodów
niezdefiniowanych powodujących przerwanie o numerze
6. Niezdefiniowane kody operacji są fragmentami tzw.
rozkazów nielegalnych, których stosowanie nie jest
zalecane przez producenta.
Rozkazy mikroprocesora 8086 można podzielić na kilka
grup, obejmujących rozkazy tego samego typu: rozkazy
przenoszenia, arytmetyczne stałoprzecinkowe,
arytmetyczne dziesiętne, logiczne, łańcuchowe (działające
na ciągach), przenoszące niesekwencyjnie sterowanie i
inne.
49
49
Rozkazy prefiksujące
Rozkazy prefiksujące
Jednobajtowe rozkazy, które zmieniają sposób wykonania następnego (w
pamięci) rozkazu mikroprocesora 8086 nazwano rozkazami prefiksującymi lub
prefiksami. Do grupy tej należą rozkazy SEG, LOCK i REP. Rozkazy prefiksujące
nie zmieniają wartości znaczników (flag w słowie stanu).
Rozkaz SEG poleca w następnym rozkazie podczas odwołania do pamięci użyć
jako wartości określającej początkowy adres segmentu (SEGMENT) zawartości
tego rejestru segmentowego, którego nazwa stanowi identyfikator argumentu
rozkazu SEG. Format rozkazu SEG jest następujący:
SEG nazwa_rejestru_segmentowego
gdzie nazwa_rejestru_segmentowego {CS,DS,ES,SS}.
Np. w rozkazie MOV AX,[BX] nastąpi odczytanie słowa spod adresu DS:BX do
rejestru AX, natomiast w przypadku poprzedzenia tego rozkazu prefiksem SEG:
SEG CS
MOV AX,[BX]
nastąpi odczytanie słowa spod adresu CS:BX do rejestru AX. W assemblerze nie
wykorzystuje się jawnie tego rozkazu - w przypadku, gdy żądane jest użycie
innego niż wynikający z domniemania rejestru segmentowego podczas odwołania
do pamięci, identyfikator argumentu powinien być poprzedzony nazwą żądanego
rejestru segmentowego oddzieloną odeń dwukropkiem. Odpowiednik
poprzedniego przykładu to:
MOV AX,CS:[BX]
(omawianą konstrukcję wytłuszczono)
50
50
Prefiksujące cd.
Prefiksujące cd.
Rozkaz LOCK poleca zająć magistralę na czas
wykonywania następnego rozkazu; stosowany jest do
realizacji semaforów w systemach wieloprocesorowych,
typowa konstrukcja:
LOCK XCHG AX,semafor
zapewnia, że żaden inny użytkownik nie dostanie się do
pamięci między odwołaniami rozkazu XCHG.
Rozkaz REP (REPZ, REPE) poleca powtarzać
następujący po nim rozkaz łańcuchowy i zmniejszać CX
o 1 do wyzerowania CX. Dla rozkazów CMPS i SCAS
powtarzanie kończy się ponadto gdy ZF=0; dla tychże
rozkazów powtarzanie kończyć się będzie gdy ZF=1, jeśli
użyty zostanie rozkaz REPNZ (lub REPNE - odmiana
REP). Dla pozostałych rozkazów łańcuchowych MOVS,
LODS lub STOS wykonania rozkazów REPNZ, REPNE,
REPZ, REPE i REP nie różnią się.
51
51
Rozkazy przesyłania
Rozkazy przesyłania
Rozkazy przesyłania (przenoszenia danych) to rozkazy,
które powodują przeniesienie jednostek informacji (bajtów
lub słów) w komputerze. Do rozkazów przesyłania zalicza
się rozkazy MOV, XCHG, XLAT, PUSH, POP, IN i OUT.
Rozkazy przesyłania nie zmieniają wartości
wskazników. Rejestry segmentowe mogą być
argumentami tylko rozkazów MOV, PUSH i POP.
Dwuargumentowy rozkaz MOV poleca przenieść wartość
stałej do rejestru lub pamięci, zawartość rejestru do
rejestru lub pamięci lub zawartość komórki pamięci do
rejestru. Np.:
MOV AX,5 ; wartość 0005H do AX
MOV AL,5 ; wartość 05H do AL
MOV AL,[5] ; bajt spod adresu DS:5 do AL
MOV BX,[123] ; słowo spod adresu DS:123 do BX
MOV [BX],AX ; słowo z AX pod adres DS:BX
MOV BH,AL ; bajt z AL do BH
52
52
Rozkazy przesyłania (2)
Rozkazy przesyłania (2)
zawsze powinna być określona długość argumentów:
MOV BYTE PTR [SI],5 ; bajt 05H pod adres DS:SI
MOV WORD PTR [DI],5 ; słowo 0005H pod adres DS:DI.
Dwuargumentowy rozkaz XCHG poleca zamienić miejscami
argumenty. Jest to jedyny rozkaz, którego oba argumenty są
zmieniane - kolejność argumentów jest obojętna; żaden z
argumentów nie może być stałą. Np.:
XCHG AX,BX ; AX <---> BX
XCHG BH,AL ; BH <---> AL
XCHG AX,[123] ; AX <---> słowo spod adresu DS:123
Bezargumentowy rozkaz XLAT nazywany jest rozkazem
translacji - powoduje zapisanie do AL bajtu z pamięci spod adresu
DS:[BX+AL]. Zwykle w BX znajduje się adres tablicy
przekodowania, początkowa wartość AL stanowi wskaznik tej
tablicy, wynikiem jest wskazywana wartość. W assemblerze można
użyć argumentu (nazwy tablicy), ale nie będzie on miał znaczenia
dla wykonania rozkazu - zawartość BX musi być wcześniej
poprawnie ustawiona.
53
53
Rozkazy przesyłania (3)
Rozkazy przesyłania (3)
Jednoargumentowy rozkaz PUSH powoduje odłożenie na
stosie argumentu, tzn. wykonanie dwu działań:
- SP:=SP-2 tzn. zmniejszenie wskaznika stosu o 2 (długość
słowa);
- zapisanie argumentu pod adres SS:SP.
Argumentem rozkazu PUSH może być rejestr lub komórka
pamięci, zawsze o długości słowa, np.: PUSH AX;
dla odłożenia na stosie słowa stanu należy użyć rozkazu
PUSHF bez argumentu
Jednoargumentowy rozkaz POP powoduje zdjęcie ze stosu
argumentu, tzn. wykonanie dwóch działań:
- odczytanie słowa do argumentu spod adresu SS:SP;
- SP:=SP+2 tzn. zwiększenie wskaznika stosu o 2 (długość
słowa).
Argumentem rozkazu POP może być rejestr lub komórka
pamięci, zawsze o długości słowa, np.: POP AX; dla zdjęcia ze
stosu słowa stanu należy użyć rozkazu POPF bez argumentu.
Uwaga: w trybach 32-bitowych operacje na stosie są 32-bitowe,
a w trybach 64-bitowych  64-bitowe.
54
54
Rozkazy arytmetyczne
Rozkazy arytmetyczne
Rozkazy arytmetyczne pozwalają na wykonanie
dodawania, odejmowania, mnożenia, dzielenia,
porównania, wyznaczania liczby przeciwnej, zwiększania i
zmniejszania o 1. Rozkazy arytmetyczne powodują
ustawienie znaczników CF, OF, ZF, SF, PF, AF.
W niniejszym podrozdziale przedstawiono niektóre
rozkazy arytmetyczne wystarczające na potrzeby
tworzenia programów organizacyjnych :
- ADD - dodawanie;
- ADC - dodawanie z przeniesieniem;
- SUB - odejmowanie;
- SBB - odejmowanie z przeniesieniem;
- CMP - porównanie;
- NEG - wyznaczenie liczby przeciwnej (to nie NOT!);
- INC - zwiększenie o 1;
- DEC - zmniejszenie o 1.
55
55
Rozkazy arytmetyczne
Rozkazy arytmetyczne
Rozkazy ADD, ADC, SUB, SBB i CMP są
dwuargumentowe. Identyfikatory argumentów mogą
dotyczyć: rejestru i stałej, dwu rejestrów, rejestru i
pamięci, pamięci i stałej lub też pamięci i rejestru.
Oba argumenty traktowane są jako zapisane w
kodzie uzupełnieniowym i w wyniku wykonania
operacji ustawiane są wskazniki (flagi w słowie
stanu) przeniesienia globalnego CF i nadmiaru OF.
Do znacznika zera wyniku ZF ładowany jest rezultat
badania wyniku na zero, bit znaku wyniku
kopiowany jest do wskaznika znaku SF. Ustawiany
jest wskaznik PF w zależności od liczby jedynek
wyniku.
56
56
Rozkazy arytmetyczne
Rozkazy arytmetyczne
Rozkaz dodawania ADD poleca wykonać dodawanie dwu
argumentów i wynik umieścić w miejscu pierwszego z nich.
Rozkaz dodawania z przeniesieniem ADC poleca wykonać
dodawanie argumentów jak w rozkazie ADD i wynik
powiększyć o wartość początkową wskaznika CF.
Rozkaz odejmowania SUB poleca wykonać odejmowanie
dwu argumentów i wynik umieścić w miejscu pierwszego z
nich.
Rozkaz odejmowania z przeniesieniem SBB poleca wykonać
odejmowanie od pierwszego argumentu wartości drugiego
argumentu powiększonego wstępnie o wartość początkową
wskaznika CF, zaś wynik umieścić w miejscu pierwszego
argumentu.
Operacja rozkazu CMP wykonywana jest identycznie jak w
rozkazie SUB (odejmowania) lecz wynik jest
ignorowany - żaden z argumentów nie zmienia wartości,
jedynym efektem jest ustawienie wskazników w słowie stanu.
57
57
Rozkazy arytmetyczne
Rozkazy arytmetyczne
Rozkazy NEG, INC i DEC są jednoargumentowe;
argument może znajdować się w rejestrze (poza
segmentowymi) lub pamięci.
Rozkaz wyznaczania liczby przeciwnej NEG
powoduje wyznaczenie uzupełnienia argumentu i
zapisanie go w miejscu argumentu, np.: NEG AX.
Rozkazy INC i DEC powodują zwiększenie lub
zmniejszenie (odpowiednio) argumentu o 1 modulo
28 lub 216. Uwaga: rozkazy INC i DEC nie zmieniają
stanu wskaznika CF, lecz zmieniają OF, ZF, SF, PF
i AF.
58
58
Rozkazy logiczne
Rozkazy logiczne
Do rozkazów logicznych zalicza się rozkazy
wykonujące operacje:
AND - iloczynu logicznego;
OR - sumy logicznej;
XOR - różnicy symetrycznej;
TEST - sprawdzenia;
NOT - negacji.
Z wyjątkiem rozkazu NOT, są to rozkazy
dwuargumentowe. We wszystkich tych rozkazach
(poza rozkazem TEST) zmianie ulega pierwszy
argument. Zmieniane są również wartości
wskazników SF, ZF i PF; wskazniki OF i CF są
zerowane, a wartość AF nieokreślona.
NOT nie zmienia flag.
59
59
Rozkazy przesunięć
Rozkazy przesunięć
Rozkazy przesunięć dzielą się na przesunięcia
arytmetyczne, logiczne i obroty:
- SAL - przesunięcie arytmetyczne w lewo;
- SAR - przesunięcie arytmetyczne w prawo;
- SHL - przesunięcie logiczne w lewo ;
- SHR - przesunięcie logiczne w prawo;
- RCL - przesunięcie cykliczne (obrót) w lewo przez CF;
- RCR - przesunięcie cykliczne (obrót) w prawo przez CF;
- ROL - przesunięcie cykliczne (obrót) w lewo;
- ROR- przesunięcie cykliczne (obrót) w prawo.
Wszystkie rozkazy przesunięć są
dwuargumentowe - pierwszym argumentem, którego
zawartość podlega przesuwaniu, jest rejestr lub komórka
pamięci (o długości bajtu lub słowa), drugim zaś
argumentem, określającym liczbę przesunięć jest stała 1
lub rejestr CL. Przesunięcia może odbywać się zatem o 1
lub o zawartość rejestru CL, używaną modulo 32.
60
60
Arytmetyczne i logiczne
Arytmetyczne i logiczne
Rozkazy przesunięć arytmetycznych i logicznych powodują
ustawienie OF, ZF, SF, PF i CF, zaś AF przyjmuje nieokreśloną
wartość.
Rozkazy obrotów zmieniają wartości tylko wskazników OF i CF.
Wskaznik OF jest należycie zmieniany tylko przy przesunięciach o
1.
61
61
Obroty
Obroty
62
62
Rozkazy łańcuchowe
Rozkazy łańcuchowe
Do rozkazów łańcuchowych, czyli działających na ciągach słów lub
bajtów, zalicza się rozkazy:
- MOVS - przesyłania bloków;
- CMPS - porównywania bloków;
- LODS - odczytu z bloku do akumulatora;
- STOS - wypełniania bloku zawartością akumulatora;
- SCAS - poszukiwania wg akumulatora.
Rozkazy łańcuchowe są rozkazami bezargumentowymi (w zapisie),
dlatego wymagają określenia długości argumentu, np. przez dodanie
liter B lub W do skrótu mnemonicznego rozkazu (MOVSB lub
MOVSW dla rozkazu MOVS). Zawartości użytych rejestrów SI i DI,
które określają położenie argumentów, zmieniane są o 1 (w
przypadku rozkazu bajtowego) lub o 2 (w przypadku słowowego).
Kierunek zmian zależy od wartości znacznika DF: dla DF=0
zachodzi zwiększanie, zaś dla DF=1 zmniejszanie.
Rozkaz MOVS powoduje wykonanie następujących działań:
ES:[DI] := DS:[SI] (słowo/bajt);
SI := SIąd
DI := DIąd ; gdzie: d=1 dla rozkazu bajtowego; d=2 dla rozkazu
słowowego.
[CX zmienia się tylko, gdy MOVS jest poprzedzany przez REP]
63
63
Rozkazy przenoszące sterowanie
Rozkazy przenoszące sterowanie
Do rozkazów przenoszących sterowanie zaliczono
rozkazy skoków bezwarunkowych i warunkowych,
rozkazy przerwań i powrotu. Mnemoniki rozkazów
skokowych zaczynają się od litery J (Jump).
Argumentami rozkazów skokowych są adresy
docelowe, tzn. adresy umieszczane w liczniku
rozkazów w przypadku skoku efektywnego.
Rozkazy skokowe nie zmieniają zawartości
rejestru F (słowa stanu).
64
64
JMP, skoki
JMP, skoki
Rozkaz JMP jest rozkazem skoku bezwarunkowego, pozwalającym
na przeniesienie sterowania
- w obrębie ok. ą128 najbliższych bajtów (skok wewnątrzsegmentowy krótki SHORT o
kodzie dwubajtowym),
- w obrębie segmentu określonego zawartością rejestru CS (skok wewnątrzsegmentowy
NEAR o trzybajtowym zwykle kodzie)
- oraz w obszarze całej (1 MB) przestrzeni adresowej pamięci mikroprocesora (skok
międzysegmentowy FAR zwykle o pięciobajtowym kodzie).
Adres skoku może być podany bezpośrednio w rozkazie (tej sytuacji
dotyczą wcześniejsze uwagi o długości kodów rozkazowych), mówi
się wówczas o skokach bezpośrednich.
Rozkazy skokowe zawierające po kodzie operacji identyfikator
miejsca, w którym znajduje się właściwy adres, do którego ma
nastąpić przeniesienie sterowania nazywają się skokami pośrednimi.
W przypadku, gdy rozkaz skokowy w swym kodzie zawiera
informację o ile należy zmienić licznik rozkazów aby osiągnąć
miejsce docelowe skoku, rozkaz taki nosi nazwę skoku względnego.
W mikroprocesorze 8086 skoki względne mogą zawierać
jednobajtową wartość zmiany, traktowaną jako liczba w kodzie
uzupełnieniowym ze znakiem, co oznacza, że zmiana licznika
rozkazów, a dokładniej: zawartości rejestru IP, nie może
przekraczać wartości ok. 128 B "w przód" i "w tył". 65
65
CALL
CALL
Skokami bezwarunkowymi w 8086 są również rozkazy CALL i RET
związane z wykonywaniem podprogramów. Rozkaz
CALL - wywołanie podprogramu - powoduje odłożenie na stos
zawartości licznika rozkazów (wskazującego na początek
następnego rozkazu po CALL) oraz skok bezwarunkowy pod adres
będący argumentem rozkazu. Rozkaz ten może być skokiem
bezpośrednim lub pośrednim, wewnątrzsegmentowym lub
międzysegmentowym, np.:
- CALL adres ; wewnątrzsegmentowy, bezpośredni
- CALL AX ; wewnątrzsegmentowy, pośredni
- CALL WORD PTR adres[SI] ; wewnątrzsegmentowy, pośredni
- CALL FAR adres ; międzysegmentowy, bezpośredni
- CALL DWORD PTR [BX] ; międzysegmentowy, pośredni
skoki wewnątrzsegmentowe powodują odłożenie na stosie tylko
zawartości rejestru IP, zaś skoki międzysegmentowe kolejno
rejestrów CS i IP.
66
66
RET
RET
Rozkaz powrotu z podprogramu RET jest rozkazem
bezargumentowym lub jednoargumentowym, przy czym jeśli
występuje argument, to jest on zawsze stałą (adresowanie
natychmiastowe). Wykonuje się jako skok bezwarunkowy, przy
czym zakłada się że adres skoku znajduje się na wierzchołku stosu.
Występują rozkazy RET
- wewnątrzsegmentowe (NEAR) i
- międzysegmentowe (FAR);
w przypadku rozkazu wewnątrzsegmentowego zakłada się, że na
wierzchołku stosu znajduje się żądana nowa wartość rejestru IP; w
przypadku rozkazu międzysegmentowego zakłada się, że na
wierzchołku stosu znajduje się żądana nowa wartość rejestru IP,
zaś bezpośrednio po niej żądana zawartość rejestru CS.
Wykonanie rozkazu RET polega na zdjęciu ze stosu informacji i
umieszczeniu jej w liczniku rozkazów. Ponadto, w przypadku, gdy
rozkaz RET posiada argument, to jego wartość jest dodawana do
zawartości rejestru SP po zdjęciu ze stosu adresu powrotu - zwykle
zatem powinna być to wartość parzysta.
67
67
Skoki warunkowe
Skoki warunkowe
rozkazy skoku warunkowego warunki efektywności
JA, JNBE CF=0 i ZF=0
JAE, JNB, JNC CF=0
JB, JC, JNAE CF=1
JBE, JG, JNA, JNLE CF=0 lub ZF=0
JE, JZ ZF=1
JGE, JNL SF=OF
JL, JNGE SF`"OF
JLE, JNG SF`"OF lub ZF=1
JNE, JNZ ZF=0
JNO OF=0
JNP, JPO PF=0
JNS SF=0
JO OF=1
JP, JPE PF=1
JS SF=1
68
68
Skoki warunkowe
Skoki warunkowe
69
Rozkazy pętli i badania CX
Rozkazy pętli i badania CX
Rozkaz ten służy zwykle do zamykania pętli programowej, w której
licznikiem wykonań jest rejestr CX. Wykonanie polega na
zmniejszeniu rejestru CX o 1 i zbadaniu wyniku, czy jest on różny
od zera. Skok jest efektywny, gdy zawartość CX po zmniejszeniu
jest różna od zera. Odmianami tego rozkazu są LOOPE i LOOPZ, w
których dla efektywności skoku dodatkowo musi być spełniony
warunek ZF=1, oraz LOOPNE i LOOPNZ, w których dla
efektywności skoku dodatkowo musi być spełniony warunek ZF=0.
Rozwinięcia skrótów mnemonicznych:
- LOOP Loop on Count;
- LOOPE Loop While Equal;
- LOOPNE Loop While Not Equal;
- LOOPNZ Loop While Not Zero;
- LOOPZ Loop While Zero.
Rozkazy pętli, podobnie jak pozostałe rozkazy skokowe nie
zmieniają wartości wskazników (słowa stanu w rejestrze F).
Wśród rozkazów skoków warunkowych jeden - JCXZ - wykonywany
jest nie w zależności od wartości wskazników, lecz w zależności od
wyniku badania zawartości rejestru CX: skok jest efektywny, gdy
zawartość CX jest równa zeru.
70
70
Wektory przerwań
Wektory przerwań
W przestrzeni adresowej pamięci mikroprocesora
8086 wydzielony został obszar początkowy o
pojemności 1 KB: od adresu 00000H do 003FFH,
przeznaczony na tzw. wektory przerwań.
Wektorem przerwania o numerze x nazywa się
zawartość dwóch kolejnych słów pamięci o
adresach 4*x i 4*x+2.
Numer przerwania nazywany jest także typem
przerwania.
Aatwo zauważyć, że w obszarze wektorów mieści
się 256 wektorów przerwań. Wektor przerwania
interpretowany jest zawsze jako adres
międzysegmentowy (typu FAR) gdzie wartość
OFFSET pamiętana jest pierwsza (adres 4*x) zaś
SEGMENT jako druga (adres 4*x+2).71
71
Sekwencja przerwania
Sekwencja przerwania
Sekwencja przerwania o numerze x w
mikroprocesorze 8086 składa się z
następujących kroków:
- wykonanie działań odpowiadających rozkazowi
PUSHF, czyli odłożenie na stos zawartości
rejestru znaczników F;
- wykonanie działań odpowiadających wykonaniu
rozkazu CALL DWORD PTR 0000H:(4*x), czyli:
- odłożenie na stos zawartości rejestru CS;
- odłożenie na stos zawartości rejestru IP;
- ładowanie do rejestru IP zawartości słowa o
adresie 4*x, zaś do rejestru CS słowa spod
adresu 4*x+2;
72
- wyzerowanie flag IF i TF.
72
INT
INT
Sekwencja przerwania może zostać spowodowana
sygnałem żądania przerwania wymuszanym sprzętowo,
lub też zostać zainicjowana w wyniku wykonania
jednoargumentowego rozkazu przerwania INT x.
Argument rozkazu INT jest zawsze stałą (adresowanie
natychmiastowe) o wartości równej numerowi żądanego
przerwania, z zakresu <0..255>.
Poza omawianą postacią rozkazu INT - np. INT 5,
występuje postać bezargumentowa tego rozkazu: INT
(tzw. breakpoint), wykonywana identycznie jak rozkaz
INT 3;
Występuje ponadto jedyny rozkaz przerwania
warunkowego INTO (przerwanie przy nadmiarze),
bezargumentowy, wykonywany jak INT 4 jeśli OF=1, zaś
nie powodujący żadnych działań jeśli OF=0.
73
73
IRET
IRET
Bezargumentowy rozkaz powrotu z
przerwania IRET powoduje w
mikroprocesorze 8086 wykonanie sekwencji
powrotu, czyli:
- zdjęcie ze stosu słowa do rejestru IP;
- zdjęcie ze stosu słowa do rejestru CS;
- zdjęcie ze stosu słowa do rejestru znaczników F.
74
74
Inne
Inne
Bezargumentowe rozkazy pozwalające manipulować stanem
wskaznika CF:
- CLC - polecający wyzerować CF;
- STC - powodujący ustawienie CF w stan 1;
- CMC - powodujący zmianę stanu CF na przeciwny.
W mniejszym zakresie można sterować stanami flag DF (kierunku
dla rozkazów łańcuchowych) oraz IF (maski przerwań), służą do
tego bezargumentowe rozkazy:
- CLD - zerujący DF;
- STD - ustawiający DF w stan 1;
- CLI - zerujący IF;
- STI - ustawiający IF w stan 1.
Rozkazem nie powodującym żadnego działania jest
bezargumentowy rozkaz NOP zajmujący 1 bajt.
Istnieje bezargumentowy rozkaz stopu HLT wprowadzający
mikroprocesor w stan zatrzymania ("stopu"). W stanie stopu po
wykonaniu rozkazu HLT procesor nie pobiera rozkazów, ale
przyjmuje sygnały żądania przerwań zewnętrznych (NMI zawsze,
pozos-tałe, jeśli są niezamaskowane, tzn. IF=1); stan licznika
rozkazów wskazuje na następny rozkaz po HLT. Sekwencja
przerwania powoduje wyjście procesora ze stanu zatrzymania.
75
75


Wyszukiwarka

Podobne podstrony:
psychometria wykład, wersja do druku]02
WYKŁAD 1 Wprowadzenie do biotechnologii farmaceutycznej
do druku Swietne r wierszyk sylabami
wyklad 2 2011
mikro wykresy II11 all ladnie do druku
03 Wyklad 1 (wprowadzenie do BM)
Procesy biologicznego utleniania do druku
Optymalizacja zapasów w przedsiębiorstwie i łańcuchu dostaw Wersja do druku
Obiektywnie o chronologii biblijnej do druku i pytania
Wersja do druku Test 5 41 50
Psychologia Lekarska wykłady zagadnienia do kolokwium
projekt ogrzewnictwo do druku po poprawie
Tablica Snellena do druku(1)
BKiIG sem 3 wykład 3 Transport do organelli komórkowych i na zewnątrz komórki
Wyklad 1 Wprowadzenie do tematyki?z?nych

więcej podobnych podstron