ORGANIZACJA I
ORGANIZACJA I
REALIZACJA ROZKAZÓW
REALIZACJA ROZKAZÓW
(2)
(2)
Rotacje i przesunięcia
Rotacje i przesunięcia
Operacje na łańcuchach
Operacje na łańcuchach
Operacje na stosie
Operacje na stosie
Operacje na znacznikach
Operacje na znacznikach
Operacje WE/WY
Operacje WE/WY
ROTACJE I PRZESUNIĘCIA
ROTACJE I PRZESUNIĘCIA
LOGICZNE ORAZ ARYTMETYCZNE
LOGICZNE ORAZ ARYTMETYCZNE
Rozkazy rotacji
Rozkazy rotacji
:
:
ROL,
ROL,
ROR,
ROR,
RCL,
RCL,
RCR,
RCR,
rozkazy przesunięć logicznych
rozkazy przesunięć logicznych
:
:
SAL/SHL,
SAL/SHL,
SHR
SHR
przesunięć arytmetycznych
przesunięć arytmetycznych
:
:
SAR,
SAR,
Wynik rotacji lub przesunięcia wpisywany jest zawsze w miejsce
Wynik rotacji lub przesunięcia wpisywany jest zawsze w miejsce
argumentu (operandu).
argumentu (operandu).
Rotacja różni się tym od przesunięć, iż w przesunięciach następuje
Rotacja różni się tym od przesunięć, iż w przesunięciach następuje
utrata bitów skrajnych przesuwanych rejestrów lub komórek pamięci,
utrata bitów skrajnych przesuwanych rejestrów lub komórek pamięci,
natomiast w rotacjach nie ma tej utraty.
natomiast w rotacjach nie ma tej utraty.
Rozkazy przesunięć logicznych z uwagi na "pewne swoje
Rozkazy przesunięć logicznych z uwagi na "pewne swoje
pokrewieństwo w działaniu" do rozkazów mnożenia i dzielenia,
pokrewieństwo w działaniu" do rozkazów mnożenia i dzielenia,
używane są często zamiennie, tym bardziej, że wykonują się od nich
używane są często zamiennie, tym bardziej, że wykonują się od nich
o wiele szybciej.
o wiele szybciej.
Rozkazy przesunięć oraz rozkazy rotacji oddziałują na znaczniki
Rozkazy przesunięć oraz rozkazy rotacji oddziałują na znaczniki
(flagi) CF i OF.
(flagi) CF i OF.
przemieszczają bity rejestru
lub komórki pamięci 8- lub 16-
bitowej o 1 bit (lub więcej) w
prawo lub w lewo
CF
CF
0
0
1
1
2
2
3
3
13
13
14
14
15
15
ROL x,wielkość
ROL x,wielkość
CF
CF
0
0
1
1
2
2
3
3
13
13
14
14
15
15
ROR x,wielkość
ROR x,wielkość
CF
CF
0
0
1
1
2
2
3
3
13
13
14
14
15
15
RCL x,wielkość
RCL x,wielkość
CF
CF
0
0
1
1
2
2
3
3
13
13
14
14
15
15
RCR x,wielkość
RCR x,wielkość
ROZKAZY ROTACJI (PRZESUNIĘCIA
ROZKAZY ROTACJI (PRZESUNIĘCIA
CYKLICZNEGO)
CYKLICZNEGO)
Rozkaz ROL dokonuje przesunięcia cyklicznego argumentu1 w
lewo, o liczbę bitów, określoną argumentem2.
ROL argument1,argument2
ROL argument1,argument2
gdy dokonujemy przesunięcia o liczbę bitów większą niż 1 to
gdy dokonujemy przesunięcia o liczbę bitów większą niż 1 to
argumentem2 jest rejestr CL, który uprzednio należy załadować
argumentem2 jest rejestr CL, który uprzednio należy załadować
liczbą, określającą o ile bitów należy przesunąć lewy argument.
liczbą, określającą o ile bitów należy przesunąć lewy argument.
W rotacji bit opuszczający rejestr (komórkę pamięci) z jednego
W rotacji bit opuszczający rejestr (komórkę pamięci) z jednego
końca, wchodzi do niego (do niej) z drugiego końca, a jego
końca, wchodzi do niego (do niej) z drugiego końca, a jego
wartość kopiowana jest do rejestru znaczników, jako znacznik
wartość kopiowana jest do rejestru znaczników, jako znacznik
(flaga) przeniesienia, CF. Jeśli podczas tej rotacji, o 1 bit w lewo,
(flaga) przeniesienia, CF. Jeśli podczas tej rotacji, o 1 bit w lewo,
nie zmieni się zawartość bitu znaku, to wówczas znacznik OF
nie zmieni się zawartość bitu znaku, to wówczas znacznik OF
jest zerowany, w przeciwnym razie znacznik OF przyjmuje
jest zerowany, w przeciwnym razie znacznik OF przyjmuje
wartość 1.
wartość 1.
Przykłady:
Przykłady:
......
......
ROL AL, 1
ROL AL, 1
.......
.......
MOV CL,14
MOV CL,14
ROL BX,CL
ROL BX,CL
............
............
ROTACJA W LEWO - ROL
ROTACJA W LEWO - ROL
CF
CF
0
0
1
1
2
2
3
3
13
13
14
14
15
15
1
1
0100010
0100010
01000101
01000101
zmiana znaku
zmiana znaku
0
0
0010010
0010010
00100100
00100100
brak zmiany znaku
brak zmiany znaku
ROTACJA W LEWO - ROL
ROTACJA W LEWO - ROL
Rozkaz ROR dokonuje przesunięcia cyklicznego argumentu1 w
prawo, o liczbę bitów, określoną argumentem2.
ROR argument1,argument2
ROR argument1,argument2
gdy dokonujemy przesunięcia o liczbę bitów większą niż 1 to
gdy dokonujemy przesunięcia o liczbę bitów większą niż 1 to
argumentem2 jest rejestr CL, który uprzednio należy załadować liczbą,
argumentem2 jest rejestr CL, który uprzednio należy załadować liczbą,
określającą o ile bitów należy przesunąć lewy argument.
określającą o ile bitów należy przesunąć lewy argument.
W rotacji bit opuszczający rejestr (komórkę pamięci) z jednego końca,
W rotacji bit opuszczający rejestr (komórkę pamięci) z jednego końca,
wchodzi do niego (do niej) z drugiego końca, a jego wartość kopiowana
wchodzi do niego (do niej) z drugiego końca, a jego wartość kopiowana
jest do rejestru znaczników, jako znacznik (flaga) przeniesienia, CF. Jeśli
jest do rejestru znaczników, jako znacznik (flaga) przeniesienia, CF. Jeśli
podczas tej rotacji, o 1 bit w lewo, nie zmieni się zawartość bitu znaku,
podczas tej rotacji, o 1 bit w lewo, nie zmieni się zawartość bitu znaku,
to wówczas znacznik OF jest zerowany, w przeciwnym razie znacznik OF
to wówczas znacznik OF jest zerowany, w przeciwnym razie znacznik OF
przyjmuje wartość 1.
przyjmuje wartość 1.
Przykłady:
Przykłady:
......
......
ROR AL, 1
ROR AL, 1
.......
.......
MOV CL,14
MOV CL,14
ROR BX,CL
ROR BX,CL
............
............
ROTACJA W PRAWO - ROR
ROTACJA W PRAWO - ROR
CF
CF
0
0
1
1
2
2
3
3
13
13
14
14
15
15
Rozkaz RCL
Rozkaz RCL
dokonuje przesunięcia cyklicznego argumentu1 w
dokonuje przesunięcia cyklicznego argumentu1 w
prawo, o liczbę bitów, określoną argumentem2 (jeśli więcej niż 1
prawo, o liczbę bitów, określoną argumentem2 (jeśli więcej niż 1
bit to użyć rejestru CL).
bit to użyć rejestru CL).
W tego rodzaju rotacji („rotacja długa”) bit CF jest łącznikiem
W tego rodzaju rotacji („rotacja długa”) bit CF jest łącznikiem
między
najmłodszym
a
najstarszym
bitem
rolowanego
między
najmłodszym
a
najstarszym
bitem
rolowanego
argumentu (operandu). Skrajny bit po opuszczeniu rolowanego
argumentu (operandu). Skrajny bit po opuszczeniu rolowanego
argumentu wchodzi na miejsce znacznika CF, podczas gdy
argumentu wchodzi na miejsce znacznika CF, podczas gdy
poprzednia wartość CF wchodzi na brakujące miejsce po stronie
poprzednia wartość CF wchodzi na brakujące miejsce po stronie
przeciwnej tegoż argumentu.
przeciwnej tegoż argumentu.
Rozkaz RCR
Rozkaz RCR
działa analogicznie do rozkazu RCL
działa analogicznie do rozkazu RCL
ROTACJA W LEWO (W PRAWO) Z
ROTACJA W LEWO (W PRAWO) Z
PRZENIESIENIEM - RCL (RCR)
PRZENIESIENIEM - RCL (RCR)
CF
CF
0
0
1
1
2
2
3
3
13
13
14
14
15
15
RCL argument1,argument2
RCL argument1,argument2
RCR argument1,argument2
RCR argument1,argument2
CF
CF
0
0
1
1
2
2
3
3
13
13
14
14
15
15
0
0
1000101
1000101
1000101
1000101
1
1
CF=1
CF=1
CF=0
CF=0
ROTACJA W LEWO (W PRAWO) Z
ROTACJA W LEWO (W PRAWO) Z
PRZENIESIENIEM - RCL (RCR)
PRZENIESIENIEM - RCL (RCR)
CF
CF
0
0
1
1
2
2
3
3
13
13
14
14
15
15
SHL x,wielkość
SHL x,wielkość
0
0
CF
CF
0
0
1
1
2
2
3
3
13
13
14
14
15
15
SHR x,wielkość
SHR x,wielkość
0
0
Rozkazy SHL i SHR używane są w programach jako
Rozkazy SHL i SHR używane są w programach jako
rozkazy odpowiednio zastępujące: rozkaz mnożenia
rozkazy odpowiednio zastępujące: rozkaz mnożenia
MUL i rozkaz dzielenia DIV, jak też w sytuacjach
MUL i rozkaz dzielenia DIV, jak też w sytuacjach
związanych z tablicami, z uzyskiwaniem dostępu do
związanych z tablicami, z uzyskiwaniem dostępu do
danego elementu tablicy.
danego elementu tablicy.
ROZKAZY PRZESUNIĘCIA
ROZKAZY PRZESUNIĘCIA
LOGICZNEGO W LEWO (SHL) I PRAWO
LOGICZNEGO W LEWO (SHL) I PRAWO
(SHR)
(SHR)
0
0
0000010
0000010
0000010
0000010
0
0
0
0
ROZKAZY PRZESUNIĘCIA
ROZKAZY PRZESUNIĘCIA
LOGICZNEGO W LEWO (SHL)
LOGICZNEGO W LEWO (SHL)
W czasie przesuwania najmniej znaczące bity
W czasie przesuwania najmniej znaczące bity
argumentu są wprowadzane kolejno w miejsce
argumentu są wprowadzane kolejno w miejsce
znacznika CF, natomiast najbardziej znaczący bit nie
znacznika CF, natomiast najbardziej znaczący bit nie
zmienia wartości.
zmienia wartości.
CF
CF
0
0
1
1
2
2
3
3
13
13
14
14
15
15
SAR x,wielkość
SAR x,wielkość
Arytmetyczne przesunięcie w lewo (SAL) nie istnieje.
Arytmetyczne przesunięcie w lewo (SAL) nie istnieje.
Gdy wartość danej zajmuje mniej bitów niż długość
Gdy wartość danej zajmuje mniej bitów niż długość
pojemnika
danych
zmniejszona
o
wielkość
pojemnika
danych
zmniejszona
o
wielkość
przesunięcia, to można użyć przesunięcia w lewo.
przesunięcia, to można użyć przesunięcia w lewo.
Działa jak przesunięcie logiczne w lewo (SHL).
Działa jak przesunięcie logiczne w lewo (SHL).
W innych przypadkach bit znaku musi być
W innych przypadkach bit znaku musi być
programowo zapamiętany i potem przywrócony.
programowo zapamiętany i potem przywrócony.
ROZKAZY PRZESUNIĘCIA
ROZKAZY PRZESUNIĘCIA
ARYTMETYCZNEGO W PRAWO (SAR)
ARYTMETYCZNEGO W PRAWO (SAR)
1
1
10101010110101
10101010110101
0
0
1
1
11010101011010
11010101011010
1
1
1
1
111010101011010
111010101011010
ROZKAZY PRZESUNIĘCIA
ROZKAZY PRZESUNIĘCIA
ARYTMETYCZNEGO W PRAWO (SAR)
ARYTMETYCZNEGO W PRAWO (SAR)
PRZETWARZANIE ŁAŃCUCHÓW
PRZETWARZANIE ŁAŃCUCHÓW
Przez
Przez
łańcuchy
łańcuchy
rozumiemy bloki kolejnych bajtów lub słów w
rozumiemy bloki kolejnych bajtów lub słów w
pamięci, których rozmiar może sięgać do 64kB.
pamięci, których rozmiar może sięgać do 64kB.
Bloki te mogą się składać z:
Bloki te mogą się składać z:
wartości liczbowych, które są reprezentowane przez kody
wartości liczbowych, które są reprezentowane przez kody
binarne lub kody BCD
binarne lub kody BCD
wartości alfanumeryczne
wartości alfanumeryczne
Rozkazy
operujące
na
łańcuchach
realizują
pięć
Rozkazy
operujące
na
łańcuchach
realizują
pięć
elementarnych operacji:
elementarnych operacji:
kopiowanie
kopiowanie
zapisywanie
zapisywanie
odczytywanie
odczytywanie
porównywanie
porównywanie
przeszukiwanie
przeszukiwanie
Rozkazy łańcuchowe używają zawsze tych samych rejestrów
Rozkazy łańcuchowe używają zawsze tych samych rejestrów
do adresowania argumentów (operandów) oraz do zliczania
do adresowania argumentów (operandów) oraz do zliczania
powtórzeń:
powtórzeń:
DS:SI - para rejestrów adresująca źródło danych
DS:SI - para rejestrów adresująca źródło danych
ES:DI - para rejestrów adresująca miejsce przeznaczenia, wyniku
ES:DI - para rejestrów adresująca miejsce przeznaczenia, wyniku
CX - rejestr powtórzeń, licznik
CX - rejestr powtórzeń, licznik
Rozkazy:
• MOVS
• MOVSB (przesyła bajty)
• MOVSW (przesyła słowa)
pozwalają na przesyłanie z jednego miejsca pamięci do drugiego
pojedynczych bajtów, słów lub łańcuchów znakowych, posługując się
przy tym przedrostkiem powtórzeń REP, umożliwiającym powtarzanie
operacji, aż do wyzerowania licznika powtórzeń.
Każdy z rozkazów blokowych automatycznie wykonuje zwiększanie lub
zmniejszanie swoich wskaźników zawartych w rejestrach SI (źródło) i DI
(cel), natomiast przedrostek REP zadba już o to, by odliczać
powtórzenie operacji wg wskazań rejestru CX, za każdym jej zajściem
(dekrementując rejestr CX).
Przesyłanie (kopiowanie) w pamięci może się odbywać:
• "do przodu" - rozkaz CLD (ustawiający znacznik kierunku CF=0)
towarzyszy rozkazom blokowym MOVS, MOVSB, MOVSW
• "do tyłu" - rozkaz STD (ustawiający znacznik kierunku CF=1)
towarzyszy rozkazom blokowym MOVS, MOVSB, MOVSW
KOPIOWANIE W OBRĘBIE PAMIĘCI -
KOPIOWANIE W OBRĘBIE PAMIĘCI -
MOVS, MOVSB, MOVSW
MOVS, MOVSB, MOVSW
kopiowanie „do przodu”, CF=0 (CLD)
kopiowanie „do przodu”, CF=0 (CLD)
a
d
re
s
y
w
zg
lę
d
n
e
a
d
re
s
y
w
zg
lę
d
n
e
0500
0500
1000
1000
1500
1500
2000
2000
2500
2500
3000
3000
3500
3500
4000
4000
źródłowy
źródłowy
obszar
obszar
pamięci
pamięci
wynikowy
wynikowy
obszar
obszar
pamięci
pamięci
źródłowy
źródłowy
obszar
obszar
pamięci
pamięci
wynikowy
wynikowy
obszar
obszar
pamięci
pamięci
kopiowanie „do tyłu”, CF=1 (STD)
kopiowanie „do tyłu”, CF=1 (STD)
offset pamięci
offset pamięci
...
...
MOV SI,0000H
MOV SI,0000H
;offset źródła, skąd pobieramy dane
;offset źródła, skąd pobieramy dane
MOV DI,0100H
MOV DI,0100H
;offset przeznaczenia, dokąd dane skopiujemy
;offset przeznaczenia, dokąd dane skopiujemy
MOV CX,500
MOV CX,500
;ilość bajtów do przesłania
;ilość bajtów do przesłania
CLD
CLD
;zerujemy flagę kierunku, kopiowanie "do przodu"
;zerujemy flagę kierunku, kopiowanie "do przodu"
REP MOVSB
REP MOVSB
;kopiuj, aż rejestr CX osiągnie wartość 0
;kopiuj, aż rejestr CX osiągnie wartość 0
...
...
Przykład
Przykład
:
:
KOPIOWANIE W OBRĘBIE PAMIĘCI -
KOPIOWANIE W OBRĘBIE PAMIĘCI -
MOVS, MOVSB, MOVSW
MOVS, MOVSB, MOVSW
DS:SI
DS:SI
DS:SI
DS:SI
ES:DI
ES:DI
ES:DI
ES:DI
CX
CX
CX
CX
Obszar źródłowy pamięci (do kopiowania DS:SI)
Obszar źródłowy pamięci (do kopiowania DS:SI)
MOV SI,0000H
MOV SI,0000H
;offset źródła, skąd pobieramy dane
;offset źródła, skąd pobieramy dane
MOV DI,0100H
MOV DI,0100H
;offset przeznaczenia, dokąd dane skopiujemy
;offset przeznaczenia, dokąd dane skopiujemy
MOV CX,08
MOV CX,08
;ilość bajtów do przesłania
;ilość bajtów do przesłania
CLD
CLD
;zerujemy flagę kierunku, kopiowanie "do przodu"
;zerujemy flagę kierunku, kopiowanie "do przodu"
REP MOVSB
REP MOVSB
;kopiuj, aż rejestr CX osiągnie wartość 0
;kopiuj, aż rejestr CX osiągnie wartość 0
Obszar docelowy pamięci (po skopiowaniu ES:DI)
Obszar docelowy pamięci (po skopiowaniu ES:DI)
Obszar docelowy pamięci (ES:DI)
Obszar docelowy pamięci (ES:DI)
Przykład:
Przykład:
KOPIOWANIE W OBRĘBIE PAMIĘCI -
KOPIOWANIE W OBRĘBIE PAMIĘCI -
MOVS, MOVSB, MOVSW
MOVS, MOVSB, MOVSW
Rozkazy:
• STOS
• STOSB (kopiuje bajty)
• STOSW (kopiuje słowa)
pozwalają na przesyłanie z rejestru AX (akumulatora) bajtu lub
słowa, do pamięci adresowanej parą rejestrów ES:DI.
Po każdym przesłaniu rejestr DI jest zwiększany (kopiowanie
„do przodu”) lub zmniejszany (kopiowanie „do tyłu”) o 1 lub o 2
zależnie od tego czy kopiujemy bajty, czy też słowa.
Użycie mnemoników STOSB i STOSW określa wprost czy mają
być kopiowane bajty, czy słowa.
KOPIOWANIE Z AKUMULATORA DO
KOPIOWANIE Z AKUMULATORA DO
PAMIĘCI - STOS, STOSB, STOSW
PAMIĘCI - STOS, STOSB, STOSW
AH
AL
15
7
0
AX
ES:D
I
ES:D
I
Pamięć
Obszar docelowy pamięci (ES:DI)
Obszar docelowy pamięci (ES:DI)
Przykład:
Przykład:
Obszar docelowy pamięci po kopiowaniu (ES:DI)
Obszar docelowy pamięci po kopiowaniu (ES:DI)
KOPIOWANIE Z AKUMULATORA DO
KOPIOWANIE Z AKUMULATORA DO
PAMIĘCI - STOS, STOSB, STOSW
PAMIĘCI - STOS, STOSB, STOSW
Rozkazy:
• LODS
• LODSB (kopiuje bajty)
• LODSW (kopiuje słowa)
pozwalają na przesyłanie bajtu lub słowa do rejestru AX (akumulatora) z
pamięci adresowanej parą rejestrów DS:SI.
Po każdym przesłaniu rejestr SI jest zwiększany (kopiowanie „do
przodu”) lub zmniejszany (kopiowanie „do tyłu”) o 1 lub o 2 zależnie od
tego czy kopiujemy bajty, czy też słowa.
Użycie mnemoników LODSB i LODSW określa wprost czy mają być
kopiowane bajty, czy słowa.
Przykłady
Przykłady
:
:
...
...
CLD
CLD
MOV SI,0
MOV SI,0
LODSB
LODSB
...
...
STD
STD
MOV SI,10
MOV SI,10
LODSW
LODSW
...
...
KOPIOWANIE Z PAMIĘCI DO
KOPIOWANIE Z PAMIĘCI DO
AKUMULATORA - LODS, LODSB,
AKUMULATORA - LODS, LODSB,
LODSW
LODSW
AH
AL
15
7
0
AX
DS:SI
DS:SI
Pamięć
MOV SI,0
MOV SI,0
MOV CX,8
MOV CX,8
CLD
CLD
REP LODSB
REP LODSB
KOPIOWANIE Z PAMIĘCI DO
KOPIOWANIE Z PAMIĘCI DO
AKUMULATORA - LODS, LODSB,
AKUMULATORA - LODS, LODSB,
LODSW
LODSW
Rozkazy:
• CMPS
• CMPSB (porównuje bajty)
• CMPSW (porównuje słowa)
pozwalają na porównanie bajtu lub słowa znajdującego się w źródle i
celu.
Działają podobnie jak CMP z tą różnicą, że odejmują argument
przeznaczenia (adresowany przez parę rejestrów ES:DI) od argumentu
źródła (adresowany przez parę rejestrów DS:SI).
Po wykonaniu porównywania, rejestry DI i SI są zwiększane lub
zmniejszane, o 1 lub o 2 (w zależności to od tego czy porównujemy "do
przodu", czy "do tyłu" pamięci oraz czy porównujemy bajty, czy też
słowa).
Użycie mnemoników CMPSB i CMPSW określa wprost czy mają być
porównywane bajty, czy słowa.
W celu porównania więcej niż jednego elementu, należy stosować
przedrostki
• REPE - sprawia, iż procesor porównuje łańcuchy dopóty, dopóki
rejestr CX będzie miał wartość 0 lub też zostaną znalezione dwa nie
pasujące do siebie elementy
lub
• REPNE - sprawia, iż procesor porównuje łańcuchy dopóty, dopóki
rejestr CX będzie posiadał wartość 0 lub też zostaną znalezione
dwa te same elementy
PORÓWNYWANIE ŁAŃCUCHÓW
PORÓWNYWANIE ŁAŃCUCHÓW
Rozkazy:
• SCAS
• SCASB (porównuje bajty)
• SCASW (porównuje słowa)
powodują odjęcie łańcucha (bajtu lub słowa) adresowanego
przez rejestry ES:DI od zawartości akumulatora (AL lub AX).
Wynik nie jest zapamiętywany, ustawiane są tylko znaczniki.
Po wykonaniu porównywania rejestr DI jest zwiększany lub
zmniejszany o 1, lub o 2; zależy to od tego czy porównujemy "do
przodu" czy "do tyłu" pamięci oraz czy porównujemy bajty, czy
też słowa.
Użycie mnemoników SCASB i SCASW określa wprost czy mają
być porównywane bajty, czy słowa.
Podobnie jak dla rozkazów CMPS, CMPSB, CMPSW, tak i w tym
przypadku, nie stosuje się przedrostka REP, natomiast stosuje
się przedrostki REPE lub REPNE.
PORÓWNYWANIE Z ZAWARTOŚCIĄ
PORÓWNYWANIE Z ZAWARTOŚCIĄ
AKUMULATORA
AKUMULATORA
ROZKAZY OPERACJI NA
ROZKAZY OPERACJI NA
STOSIE
STOSIE
Stos omówiliśmy już wcześniej - wtedy sygnalizowałem
Stos omówiliśmy już wcześniej - wtedy sygnalizowałem
istnienie dwóch instrukcji, które służą do obsługi stosu
istnienie dwóch instrukcji, które służą do obsługi stosu
- PUSH i POP.
- PUSH i POP.
PUSH
PUSH
- powoduje zapisanie wartości lub zawartości
- powoduje zapisanie wartości lub zawartości
rejestru na stos
rejestru na stos
POP
POP
- pobranie wartości ze stosu i zapisanie jej do
- pobranie wartości ze stosu i zapisanie jej do
rejestru.
rejestru.
Składnia:
Składnia:
PUSH REJ16
PUSH REJ16
PUSH WAR16
PUSH WAR16
POP REJ16
POP REJ16
"REJ16" i "WAR16" - oznaczają odpowiednio rejestr i
"REJ16" i "WAR16" - oznaczają odpowiednio rejestr i
wartość 16-bitową - tzn. nie można zapisywać ani
wartość 16-bitową - tzn. nie można zapisywać ani
pobierać ze stosu wartości 8-bitowych np. AL, AH...;
pobierać ze stosu wartości 8-bitowych np. AL, AH...;
inaczej: instrukcje PUSH i POP operują jedynie na
inaczej: instrukcje PUSH i POP operują jedynie na
słowach czyli danych 2-bajtowych.
słowach czyli danych 2-bajtowych.
Instrukcja PUSHA i POPA powodują zapisanie na stos
wszystkich rejestrów - nie trzeba wywoływać kilkakrotnie
instrukcji PUSH i POP - wpływa to więc na skrócenie
programu.
Instrukcje te nie są dostępne we wszystkich wersjach
procesora (tylko dla procesorów 80188 i lepszych).
PUSHA
PUSHA
- zapisuje wartości wszystkich rejestrów
- zapisuje wartości wszystkich rejestrów
na stos,
na stos,
POPA
POPA
- pobiera wartości wszystkich rejestrów ze
- pobiera wartości wszystkich rejestrów ze
stosu.
stosu.
Oczywiście, nie dotyczy to rejestrów IP i kilku innych, gdyż
pobranie ze stosu wartości rejestru IP (wskaźnik instrukcji -
wskaźnik aktualnie wykonywanej instrukcji) spowodowałoby
przeskok do miejsca w programie, już wykonanego, tj. przed
instrukcję PUSHA, doprowadziłoby to do powstania "pętli
nieskończonej".
Składnia:
Składnia:
PUSHA
PUSHA
POPA
POPA
ROZKAZY OPERACJI NA STOSIE -
ROZKAZY OPERACJI NA STOSIE -
PUSHA, POPA
PUSHA, POPA
Ostatnią już parą instrukcji jest
PUSHF
i
POPF
, których
działanie jest identyczne do PUSHA i POPA, lecz ogranicza się
wyłącznie do rejestru flagowego
Składnia:
Składnia:
PUSHF
PUSHF
POPF
POPF
Bezargumentowy rozkaz PUSHF nie wpływa na stan flag, w
przeciwieństwie do "nierozłącznego" z nim rozkazu POPF
wykonującego czynność odwrotną w stosunku do PUSHF, a
dokładniej rozkazu, który odczytuje słowo ze stosu i
umieszcza go w rejestrze znaczników (flagowym).
ROZKAZY OPERACJI NA STOSIE -
ROZKAZY OPERACJI NA STOSIE -
PUSHF, POPF
PUSHF, POPF
Operacji na rejestrze flagowym można też dokonywać za pomocą
bezargumentowych rozkazów LAHF i SAHF.
Rozkaz
LAHF
powoduje załadowanie do rejestru akumulatora, do
części AH, mniej znaczącego bajtu rejestru znaczników czyli bitów
flagowych od nr 0 do 7 (CF, PF, AF, ZF, SF).
Jego "bliźniaczym" rozkazem jest rozkaz
SAHF
, który powoduje
załadowanie rejestru AH do mniej znaczącego bajtu rejestru
znaczników.
Przykłady użycia rozkazów operujących na znacznikach:
PF=0
AF=0
ZF=0
SF=0
CF=0
O
O
F
F
D
D
F
F
I
I
F
F
T
T
F
F
S
S
F
F
Z
Z
F
F
A
A
F
F
P
P
F
F
C
C
F
F
0
7
8
15
0
1
0
0
0
0
0
0
O
O
F
F
D
D
F
F
I
I
F
F
T
T
F
F
S
S
F
F
Z
Z
F
F
A
A
F
F
P
P
F
F
C
C
F
F
0
7
8
15
1
0
1
1
1
1
1
1
ROZKAZY OPERACJI NA ZNACZNIKACH
ROZKAZY OPERACJI NA ZNACZNIKACH
- (poza PUSHF, POPF) LAHF, SAHF
- (poza PUSHF, POPF) LAHF, SAHF
Rozkazy wejścia/wyjścia służą do przesyłania informacji między
Rozkazy wejścia/wyjścia służą do przesyłania informacji między
procesorem a jego otoczeniem.
procesorem a jego otoczeniem.
Do komunikowania się procesora 8086/88 z jego otoczeniem utworzono
Do komunikowania się procesora 8086/88 z jego otoczeniem utworzono
65536 "okienek" (o numerach od 0 do 65535) zwanych portami.
65536 "okienek" (o numerach od 0 do 65535) zwanych portami.
Odczyt z tych portów (zapis do nich) odbywa się zawsze za
Odczyt z tych portów (zapis do nich) odbywa się zawsze za
pośrednictwem:
pośrednictwem:
•
rejestru akumulatora AL (port - 8 bitowy)
rejestru akumulatora AL (port - 8 bitowy)
•
rejestru akumulatora AX (port 16 - bitowy).
rejestru akumulatora AX (port 16 - bitowy).
Do odczytywania danej z portu służy
Do odczytywania danej z portu służy
dwuargumentowy rozkaz IN o
dwuargumentowy rozkaz IN o
składni:
składni:
IN akumulator, nr_portu
IN akumulator, nr_portu
lub
lub
IN akumulator, rejestr DX
IN akumulator, rejestr DX
Do zapisywania danej do portu służy
Do zapisywania danej do portu służy
rozkaz OUT o składni:
rozkaz OUT o składni:
OUT nr_portu, akumulator
OUT nr_portu, akumulator
lub
lub
OUT rejestr DX, akumulator
OUT rejestr DX, akumulator
Przykłady
Przykłady
:
:
IN AL,16
IN AL,16
;odczytaj do rejestru AL bajt z portu o adresie nr 16
;odczytaj do rejestru AL bajt z portu o adresie nr 16
IN AX,DX
IN AX,DX
;
;
odczytaj do rejestru AX słowo z portu o numerze w
odczytaj do rejestru AX słowo z portu o numerze w
rejestrze DX
rejestrze DX
OUT 6D,AX
OUT 6D,AX
;wyprowadź słowo z rejestru AX do portu o numerze 6D
;wyprowadź słowo z rejestru AX do portu o numerze 6D
OUT DX,AX
OUT DX,AX
;wyprowadź słowo z rejestru AX do portu o numerze w
;wyprowadź słowo z rejestru AX do portu o numerze w
rejestrze DX
rejestrze DX
ROZKAZY WEJŚCIA/WYJŚCIA - IN, OUT
ROZKAZY WEJŚCIA/WYJŚCIA - IN, OUT
DZIĘKUJĘ ZA UWAGĘ !
DZIĘKUJĘ ZA UWAGĘ !