ORGANIZACJA I
ORGANIZACJA I
REALIZACJA ROZKAZÓW
REALIZACJA ROZKAZÓW
(1)
(1)
Rozkazy przesłań
Rozkazy przesłań
Rozkazy arytmetyczne i logiczne
Rozkazy arytmetyczne i logiczne
Rozkazy przesłań:
Rozkazy przesłań:
MOV -
MOV -
move
move
- przesłanie słowa między dwoma rejestrami
- przesłanie słowa między dwoma rejestrami
STR -
STR -
store
store
- przesłanie słowa ze wskazanego w rozkazie rejestru do
- przesłanie słowa ze wskazanego w rozkazie rejestru do
komórki pamięci
komórki pamięci
LD -
LD -
load
load
- przesłanie słowa z pamięci do wskazanego rejestru
- przesłanie słowa z pamięci do wskazanego rejestru
XCH -
XCH -
exchange
exchange
- wymiana zawartości rejestrów
- wymiana zawartości rejestrów
Rozkazy arytmetyczno-logiczne:
Rozkazy arytmetyczno-logiczne:
ADD -
ADD -
addition
addition
- dodawanie
- dodawanie
SUB -
SUB -
subtraction
subtraction
- odejmowanie
- odejmowanie
MUL -
MUL -
multiplication
multiplication
- mnożenie
- mnożenie
DIV -
DIV -
division
division
- dzielenie
- dzielenie
NEG -
NEG -
negate
negate
- negacja
- negacja
DEC -
DEC -
decrement
decrement
- zmniejszanie wartości o
- zmniejszanie wartości o
jeden
jeden
INC -
INC -
increment
increment
- awiększanie wartości o
- awiększanie wartości o
jeden
jeden
Rozkazy sterujące pracą programu:
Rozkazy sterujące pracą programu:
JMP -
JMP -
jump
jump
- skok bezwarunkowy do wyspecyfikowanego miejsca w
- skok bezwarunkowy do wyspecyfikowanego miejsca w
pamięci
pamięci
CALL -
CALL -
jump to subroutine
jump to subroutine
- wywołanie podprogramu
- wywołanie podprogramu
RET -
RET -
return
return
- skok powrotny z podprogramu
- skok powrotny z podprogramu
SKIP -
SKIP -
skip
skip
- przeskok przez jeden rozkaz
- przeskok przez jeden rozkaz
Rozkazy sterujące pracą procesora :
Rozkazy sterujące pracą procesora :
HALT -
HALT -
stop
stop
- zatrzymanie wykonania programu
- zatrzymanie wykonania programu
NOP -
NOP -
no operation
no operation
- rozkaz pusty
- rozkaz pusty
AND -
AND -
conjuction
conjuction
- iloczyn
- iloczyn
OR -
OR -
disjunction
disjunction
- suma
- suma
EXOR -
EXOR -
exclusive-OR
exclusive-OR
-suma mod 2
-suma mod 2
NOT -
NOT -
complement
complement
- negacja
- negacja
LISTA ROZKAZÓW - PRZYKŁADY
ROZKAZÓW
ROZKAZ PRZESYŁANIA DANYCH
ROZKAZ PRZESYŁANIA DANYCH
Zostanie przedstawiony jeden podstawowy
rozkaz
MOV
Instrukcja
MOV
należy
do
grupy
instrukcji
przesyłania danych i stanowi jeden z podstawowych
rozkazów używanych w asemblerze.
Zadaniem jej jest kopiowanie danej z jednego do
drugiego miejsca (nie można jednak przesyłać
danych między komórkami pamięci - musi się to
odbywać poprzez rejestr procesora).
Przykład:
Przykład:
mov
mov
operand1,operand2
operand1,operand2
źródło (skąd lub
źródło (skąd lub
co?)
co?)
cel (gdzie?)
cel (gdzie?)
ROZKAZ PRZESYŁANIA DANYCH -
ROZKAZ PRZESYŁANIA DANYCH -
MOV
MOV
Tryb rejestrowy
W zależności od trybu adresowania użycie tej instrukcji może
wyglądać:
Przykład:
Przykład:
MOV AX,BX
MOV AX,BX
0000000100010
0000000100010
111
111
0000000000100
0000000000100
011
011
0000000000010
0000000000010
000
000
0000000000000
0000000000000
000
000
0000000000100
0000000000100
011
011
0000000000010
0000000000010
000
000
0000000000000
0000000000000
000
000
0000000000100
0000000000100
011
011
AX
AX
BX
BX
CX
CX
DX
DX
rejestry przed
rejestry przed
wykonaniem
wykonaniem
rozkazu
rozkazu
rejestry po
rejestry po
wykonaniu rozkazu
wykonaniu rozkazu
AX
AX
BX
BX
CX
CX
DX
DX
Jeżeli argument znajduje się w rejestrze, to tryb adresowania nazywa
się trybem rejestrowym (register mode). Można zauważyć, że rozkaz
zawiera numer rejestru procesora, w którym przechowywany jest
argument operacji.
KOD
KOD
OPERACJI
OPERACJI
NR REJESTRU
NR REJESTRU
BLOK REJESTRÓW
BLOK REJESTRÓW
ARGUMENT
ARGUMENT
ROZKAZ PRZESYŁANIA DANYCH -
ROZKAZ PRZESYŁANIA DANYCH -
MOV
MOV
Tryb natychmiastowy
Przykład:
Przykład:
MOV CL,5DH
MOV CL,5DH
0000000100010
0000000100010
111
111
0000000000100
0000000000100
011
011
0000000000010
0000000000010
000
000
0000000000000
0000000000000
000
000
0000000000100
0000000000100
011
011
00000000
00000000
01011
01011
101
101
0000000000000
0000000000000
000
000
AX
AX
BX
BX
CX
CX
DX
DX
rejestry przed
rejestry przed
wykonaniem
wykonaniem
rozkazu
rozkazu
rejestry po
rejestry po
wykonaniu rozkazu
wykonaniu rozkazu
AX
AX
BX
BX
CX
CX
DX
DX
5D
5D
H
H
=
=
01011101
01011101
0000000100010
0000000100010
111
111
Jeżeli argument znajduje się w kodzie rozkazu, to tryb adresowania
nazywa się trybem natychmiastowym (immediate mode). Można
zauważyć, że stała 8-, 16- czy 32-bitowa jako argument źródłowy
zawarta jest w rozkazie (umieszczona tam przez asembler), a nie w
rejestrze czy komórce pamięci.
KOD
KOD
OPERACJI
OPERACJI
ARGUMENT
ARGUMENT
ROZKAZ PRZESYŁANIA DANYCH -
ROZKAZ PRZESYŁANIA DANYCH -
MOV
MOV
Jeśli adres znajduje się w rejestrze, to tryb taki nazywany jest trybem
adresowania pośredniego przez rejestr (register indirect mode).
Wykorzystuje się rejestry: bazowy (BX), wskaźnik bazy (BP - odnosi się
do rejestru SS), indeksowy (SI lub DI).
KOD OPERACJI
NR REJESTRU
BLOK REJESTRÓW
BLOK REJESTRÓW
ADRES
ADRES
ARGUMENTU
ARGUMENTU
SEGMENT DANYCH
SEGMENT DANYCH
ARGUMENT
ARGUMENT
...............
...............
Tryb adresowania pośredniego przez rejestr (1/2)
ROZKAZ PRZESYŁANIA DANYCH -
ROZKAZ PRZESYŁANIA DANYCH -
MOV
MOV
Rejestr jako argument pośredni zapisuje się w asemblerze w nawiasie
kwadratowym (w odróżnieniu od rejestru jako argumentu).
Przykład:
MOV AX,BX do rejestru AX ładowana jest zawartość rejestru
BX
Tryb adresowania pośredniego przez rejestr (2/2)
MOV AX,[BX] do rejestru AX ładowana jest zawartość komórki
MOV AX,[BX] do rejestru AX ładowana jest zawartość komórki
pamięci, której adres od początku segmentu danych (offset)
pamięci, której adres od początku segmentu danych (offset)
określa rejestr BX
określa rejestr BX
MOV BX,0001
MOV BX,0001
.........................
.........................
MOV AX,[BX]
MOV AX,[BX]
000
000
0
0
000
000
1
1
000
000
2
2
000
000
3
3
000
000
4
4
8B
8B
1A
1A
1A8B
1A8B
AX
AX
=
=
0001
0001
BX
BX
=
=
ROZKAZ PRZESYŁANIA DANYCH -
ROZKAZ PRZESYŁANIA DANYCH -
MOV
MOV
bajt o adresie młodszym
bajt o adresie młodszym
bajt o adresie starszym
bajt o adresie starszym
młodszy bajt starszy
młodszy bajt starszy
bajt
bajt
Przykład: Stosując tryb adresowania pośredniego przez rejestr
Przykład: Stosując tryb adresowania pośredniego przez rejestr
chcemy w akumulatorze umieścić bajt pamięci o adresie
chcemy w akumulatorze umieścić bajt pamięci o adresie
0C3F:0100
0C3F:0100
ROZKAZ PRZESYŁANIA DANYCH -
ROZKAZ PRZESYŁANIA DANYCH -
MOV
MOV
ROZKAZ PRZESYŁANIA DANYCH -
ROZKAZ PRZESYŁANIA DANYCH -
MOV
MOV
Zasadnicze ograniczenia instrukcji MOV:
Zasadnicze ograniczenia instrukcji MOV:
MOV nie może przenosić danych z jednej komórki pamięci
MOV nie może przenosić danych z jednej komórki pamięci
do innej, np. instrukcja:
do innej, np. instrukcja:
MOV [SI],[BX] w procesie kompilacji będzie błędem
MOV [SI],[BX] w procesie kompilacji będzie błędem
MOV nie może przenosić zawartości jednego rejestru
MOV nie może przenosić zawartości jednego rejestru
segmentowego do innego np. instrukcja:
segmentowego do innego np. instrukcja:
MOV CS,DS w procesie kompilacji będzie błędem
MOV CS,DS w procesie kompilacji będzie błędem
Toteż by np. przenieść zawartość rejestru DS do CS trzeba
Toteż by np. przenieść zawartość rejestru DS do CS trzeba
wpierw przenieść zawartość DS do innego rejestru
wpierw przenieść zawartość DS do innego rejestru
ogólnego przeznaczenia i dopiero jego zawartość do CS, np.
ogólnego przeznaczenia i dopiero jego zawartość do CS, np.
MOV AX,DS
MOV AX,DS
;AX:=DS
;AX:=DS
MOV CS,AX
MOV CS,AX
;CS:=AX
;CS:=AX
MOV nie może przenosić danych natychmiastowych do
MOV nie może przenosić danych natychmiastowych do
rejestru segmentowego, np. instrukcja:
rejestru segmentowego, np. instrukcja:
MOV CS,0B80H w procesie kompilacji będzie błędem
MOV CS,0B80H w procesie kompilacji będzie błędem
MOV nie może przenosić jednej z 8-bitowych połówek
MOV nie może przenosić jednej z 8-bitowych połówek
rejestru do rejestrów 16-bitowych i odwrotnie.
rejestru do rejestrów 16-bitowych i odwrotnie.
ROZKAZ PRZESYŁANIA DANYCH -
ROZKAZ PRZESYŁANIA DANYCH -
MOV
MOV
Zobacz jak może wyglądać realizacja rozkazów przesyłania
danych
zrealizowana
z
wykorzystaniem
symulatora
procesora SMS32v50
program:
in_mov1.asm
ROZKAZY LOGICZNE
ROZKAZY LOGICZNE
Zostaną przedstawione rozkazy
NOT
AND
OR
XOR
ROZKAZY LOGICZNE
ROZKAZY LOGICZNE
Wszystkie te rozkazy, których działanie jest oparte
Wszystkie te rozkazy, których działanie jest oparte
bezpośrednio
na
zasadach
logiki
nazywamy
bezpośrednio
na
zasadach
logiki
nazywamy
rozkazami logicznymi.
rozkazami logicznymi.
Rozkazy te operują na poszczególnych bitach
Rozkazy te operują na poszczególnych bitach
wewnątrz rejestrów czy komórek pamięci. Z tego
wewnątrz rejestrów czy komórek pamięci. Z tego
też względu rozkazy logiczne (wraz z rozkazami
też względu rozkazy logiczne (wraz z rozkazami
przesunięć)
często
są
nazywane
rozkazami
przesunięć)
często
są
nazywane
rozkazami
operowania na bitach.
operowania na bitach.
Do najważniejszych rozkazów tej grupy należą:
Do najważniejszych rozkazów tej grupy należą:
Negacja logiczna (bajtu lub słowa) - NOT
Negacja logiczna (bajtu lub słowa) - NOT
Mnożenie logiczne (bajtu lub słowa) - AND
Mnożenie logiczne (bajtu lub słowa) - AND
Dodawanie logiczne (bajtów lub słów) - OR
Dodawanie logiczne (bajtów lub słów) - OR
Logiczna nierównoważność (bajtów lub słów) - XOR
Logiczna nierównoważność (bajtów lub słów) - XOR
Rozkaz NOT neguje logicznie bity argumentu, tzn.
odwraca stan każdego bitu rejestru lub komórki
pamięci. Nie wpływa na stan rejestru znaczników
(flag).
Przykład:
jeśli do rejestru BL przesłano liczbę
9C
H =
10011100B
, to po użyciu rozkazu
NOT BL
,
otrzymamy:
01100011B
=
63
H.
MOV BL,9C
NOT BL
;ładuj do BL wartość 9CH = 10011100B
;w BL otrzymamy liczbę 01100011 B = 63H
W języku asemblera można to przedstawić jako:
ROZKAZ NEGACJI LOGICZNEJ -
ROZKAZ NEGACJI LOGICZNEJ -
NOT
NOT
Rozkaz AND wykonuje mnożenie logiczne odpowiadających sobie bitów
Rozkaz AND wykonuje mnożenie logiczne odpowiadających sobie bitów
dwóch argumentów (operandów) i umieszcza wynik w miejscu lewego
dwóch argumentów (operandów) i umieszcza wynik w miejscu lewego
argumentu (operandu).
argumentu (operandu).
Bit wyniku ma wartość 1 wówczas, gdy odpowiadające sobie bity w obydwu
Bit wyniku ma wartość 1 wówczas, gdy odpowiadające sobie bity w obydwu
argumentach mają wartość 1, w pozostałych przypadkach bit wyniku ma
argumentach mają wartość 1, w pozostałych przypadkach bit wyniku ma
wartość 0.
wartość 0.
Przykład
Przykład
:
:
jeśli do rejestru AL przesłano liczbę
jeśli do rejestru AL przesłano liczbę
9C
9C
H =
H =
10011100B
10011100B
, a do BL
, a do BL
4C
4C
H =
H =
01001100B
01001100B
to po użyciu rozkazu
to po użyciu rozkazu
AND AL,BL
AND AL,BL
otrzymamy w
otrzymamy w
rejestrze AL liczbę
rejestrze AL liczbę
0C
0C
H =
H =
00001100B
00001100B
.
.
ROZKAZ MNOŻENIA LOGICZNEGO -
ROZKAZ MNOŻENIA LOGICZNEGO -
AND
AND
Rozkaz OR wykonuje dodawanie logiczne odpowiadających sobie bitów dwóch
Rozkaz OR wykonuje dodawanie logiczne odpowiadających sobie bitów dwóch
argumentów (operandów) i umieszcza wynik w miejscu lewego argumentu
argumentów (operandów) i umieszcza wynik w miejscu lewego argumentu
(operandu).
(operandu).
Bit wyniku ma wartość O wówczas, gdy odpowiadające sobie bity w obydwu
Bit wyniku ma wartość O wówczas, gdy odpowiadające sobie bity w obydwu
argumentach mają wartość O, w pozostałych przypadkach bit wyniku ma wartość
argumentach mają wartość O, w pozostałych przypadkach bit wyniku ma wartość
1.
1.
Przykład
Przykład
:
:
jeśli do rejestru AL przesłano liczbę
jeśli do rejestru AL przesłano liczbę
9C
9C
H =
H =
10011100B
10011100B
, a do BL
, a do BL
4C
4C
H =
H =
01001100B
01001100B
to po użyciu rozkazu
to po użyciu rozkazu
OR AL,BL
OR AL,BL
otrzymamy w rejestrze AL
otrzymamy w rejestrze AL
liczbę
liczbę
DC
DC
H =
H =
11011100B
11011100B
.
.
ROZKAZ DODAWANIA LOGICZNEGO -
ROZKAZ DODAWANIA LOGICZNEGO -
OR
OR
Rozkaz
XOR
wykonuje
funkcję
nierównoważnści
(sumę
modulo
2)
Rozkaz
XOR
wykonuje
funkcję
nierównoważnści
(sumę
modulo
2)
odpowiadających sobie bitów dwóch argumentów (operandów) i umieszcza
odpowiadających sobie bitów dwóch argumentów (operandów) i umieszcza
wynik w miejscu lewego argumentu (operandu).
wynik w miejscu lewego argumentu (operandu).
Bit wyniku przyjmuje wartość 1 tylko wówczas, gdy odpowiadające sobie bity w
Bit wyniku przyjmuje wartość 1 tylko wówczas, gdy odpowiadające sobie bity w
obydwu argumentach mają wartość przeciwną. Rozkaz XOR może być użyty do
obydwu argumentach mają wartość przeciwną. Rozkaz XOR może być użyty do
odwrócenia ustawień wybranych bitów bądź też do określenia, który z bitów
odwrócenia ustawień wybranych bitów bądź też do określenia, który z bitów
dwóch argumentów różni się od siebie.
dwóch argumentów różni się od siebie.
Przykład
Przykład
:
:
jeśli do rejestru AL przesłano liczbę
jeśli do rejestru AL przesłano liczbę
9C
9C
H =
H =
10011100B
10011100B
01001100B
01001100B
to
to
po użyciu rozkazu
po użyciu rozkazu
XOR AL, 4CH
XOR AL, 4CH
otrzymamy w rejestrze AL liczbę
otrzymamy w rejestrze AL liczbę
D0
D0
H
H
=
=
11010000B
11010000B
.
.
ROZKAZ NIERÓWNOWAŻNOŚCI
ROZKAZ NIERÓWNOWAŻNOŚCI
LOGICZNEJ - XOR
LOGICZNEJ - XOR
Zobacz jak może wyglądać realizacja rozkazów logicznych
zrealizowana z wykorzystaniem symulatora procesora
SMS32v50
program: logic.asm
ROZKAZY LOGICZNE
ROZKAZY LOGICZNE
ROZKAZY ARYTMETYCZNE
ROZKAZY ARYTMETYCZNE
Do najważniejszych rozkazów tej grupy należą:
Do najważniejszych rozkazów tej grupy należą:
Dodawanie - ADD, ADC
Dodawanie - ADD, ADC
Odejmowanie - SUB, SBB
Odejmowanie - SUB, SBB
Mnożenie - MUL, IMUL
Mnożenie - MUL, IMUL
Dzielenie - DIV, IDIV
Dzielenie - DIV, IDIV
Powielanie długości argumentu - CBW, CWD
Powielanie długości argumentu - CBW, CWD
Negacja lub uzupełnienie do dwóch - NEG
Negacja lub uzupełnienie do dwóch - NEG
Inkrementacja i dekrementacja - INC, DEC
Inkrementacja i dekrementacja - INC, DEC
Porównywanie przeznaczenia ze źródłem - CMP
Porównywanie przeznaczenia ze źródłem - CMP
Dodawania całkowite dokonujemy za pomocą rozkazu ADD
Dodawania całkowite dokonujemy za pomocą rozkazu ADD
ADD argument1,argument2
ADD argument1,argument2
rejestr
rejestr
komórka pamięci (z pewnymi
komórka pamięci (z pewnymi
wyjątkami)
wyjątkami)
rejestr
rejestr
komórka pamięci (z pewnymi
komórka pamięci (z pewnymi
wyjątkami)
wyjątkami)
dana natychmiastowa
dana natychmiastowa
Do
Do
argumentu1
argumentu1
dodaj
dodaj
argument2
argument2
i wynik zapisz w
i wynik zapisz w
argument1
argument1
Przykłady:
Przykłady:
ADD AL,BL
ADD AL,BL
ADD AL,4Ch
ADD AL,4Ch
Rozkaz ten ma wpływ na następujące znaczniki rejestru flagowego
Rozkaz ten ma wpływ na następujące znaczniki rejestru flagowego
(zależne od wyniku dodawania):
(zależne od wyniku dodawania):
OF - flaga nadmiaru
OF - flaga nadmiaru
(przepełnienia)
(przepełnienia)
SF - flaga znaku
SF - flaga znaku
ZF - flaga zera
ZF - flaga zera
AF - flaga przeniesienia
AF - flaga przeniesienia
pomocniczego
pomocniczego
PF - flaga parzystości
PF - flaga parzystości
CF - flaga
CF - flaga
przeniesienia
przeniesienia
DODAWANIE
DODAWANIE
Zobaczmy dwa przykłady realizacji dodawania:
Zobaczmy dwa przykłady realizacji dodawania:
1.
1.
DODAWANIE
DODAWANIE
2.
2.
DODAWANIE
DODAWANIE
Zadanie
Zadanie
: dodaj zawartość komórki pamięci DS:0100 do
: dodaj zawartość komórki pamięci DS:0100 do
DS:102
DS:102
Dodawanie zawartości komórki pamięci do zawartości
Dodawanie zawartości komórki pamięci do zawartości
komórki pamięci jest niedozwolone
komórki pamięci jest niedozwolone
ADD word ptr DS:[100], word ptr DS:[102]
ADD word ptr DS:[100], word ptr DS:[102]
DODAWANIE
DODAWANIE
Można to jednak wykonać – zobacz przykład
Można to jednak wykonać – zobacz przykład
Zadanie
Zadanie
: dodaj zawartość komórki pamięci DS:0100 do
: dodaj zawartość komórki pamięci DS:0100 do
DS:102
DS:102
10H
10H
+50H
+50H
60H
60H
DODAWANIE
DODAWANIE
Dodawania całkowite bajtów lub słów z uwzględnieniem przeniesienia z
Dodawania całkowite bajtów lub słów z uwzględnieniem przeniesienia z
dolnego do górnego bajtu dokonujemy za pomocą rozkazu ADC
dolnego do górnego bajtu dokonujemy za pomocą rozkazu ADC
ADC argument1,argument2
ADC argument1,argument2
rejestr
rejestr
komórka pamięci (z pewnymi
komórka pamięci (z pewnymi
wyjątkami)
wyjątkami)
rejestr
rejestr
komórka pamięci (z pewnymi
komórka pamięci (z pewnymi
wyjątkami)
wyjątkami)
dana natychmiastowa
dana natychmiastowa
Do
Do
argumentu1
argumentu1
dodaj
dodaj
argument2
argument2
i przeniesienie CF a wynik zapisz w
i przeniesienie CF a wynik zapisz w
argument1
argument1
Rozkaz ten ma wpływ na następujące znaczniki rejestru flagowego (zależne od
Rozkaz ten ma wpływ na następujące znaczniki rejestru flagowego (zależne od
wyniku dodawania):
wyniku dodawania):
OF - flaga nadmiaru
OF - flaga nadmiaru
(przepełnienia)
(przepełnienia)
SF - flaga znaku
SF - flaga znaku
ZF - flaga zera
ZF - flaga zera
AF - flaga przeniesienia
AF - flaga przeniesienia
pomocniczego
pomocniczego
PF - flaga parzystości
PF - flaga parzystości
CF - flaga
CF - flaga
przeniesienia
przeniesienia
Rozkaz ten musi występować zawsze po rozkazie ADD, gdyż dopiero po rozkazie
Rozkaz ten musi występować zawsze po rozkazie ADD, gdyż dopiero po rozkazie
ADD może być wiadomo, że występuje (bądź nie występuje) przeniesienie. W
ADD może być wiadomo, że występuje (bądź nie występuje) przeniesienie. W
przypadku gdyby nie było przeniesienia to rozkaz ADC zadziała dokładnie tak jak
przypadku gdyby nie było przeniesienia to rozkaz ADC zadziała dokładnie tak jak
rozkaz ADD.
rozkaz ADD.
DODAWANIE
DODAWANIE
Dodawanie liczb w kodzie BCD dokonujemy za pomocą rozkazu ADD (ADC)
Dodawanie liczb w kodzie BCD dokonujemy za pomocą rozkazu ADD (ADC)
z zastosowaniem instrukcji DAA.
z zastosowaniem instrukcji DAA.
DAA dokonuje poprawki dziesiętnej po dodawaniu dwójkowym w kodzie
DAA dokonuje poprawki dziesiętnej po dodawaniu dwójkowym w kodzie
BCD. Liczba podlegająca korekcji musi się zawsze znajdować w rejestrze
BCD. Liczba podlegająca korekcji musi się zawsze znajdować w rejestrze
AL
AL
skoryguj wynik w akumulatorze AL po
skoryguj wynik w akumulatorze AL po
dodawaniu BCD z przeniesieniem lub bez
dodawaniu BCD z przeniesieniem lub bez
DAA
DAA
Algorytm dla DAA jest następujący:
Algorytm dla DAA jest następujący:
AL
AL
0
0
3
3
7
7
4
4
częśćY
częśćY
częśćX
częśćX
Jeśli AF=1 lub
Jeśli AF=1 lub
częśćX
częśćX
> 9
> 9
to [AL]=[AL]+06h oraz AF=1
to [AL]=[AL]+06h oraz AF=1
AF - flaga przeniesienia
AF - flaga przeniesienia
pomocniczego
pomocniczego
CF - flaga
CF - flaga
przeniesienia
przeniesienia
Jeśli CF=1 lub
Jeśli CF=1 lub
częśćY
częśćY
> 9
> 9
to [AL]=[AL]+06h oraz CF=1
to [AL]=[AL]+06h oraz CF=1
DODAWANIE
DODAWANIE
AL
AL
0
0
3
3
7
7
4
4
częśćY
częśćY
częśćX
częśćX
Jeśli AF=1 lub
Jeśli AF=1 lub
częśćX
częśćX
> 9
> 9
to [AL]=[AL]+06h oraz
to [AL]=[AL]+06h oraz
AF=1
AF=1
Flagi:
Flagi:
CF - przeniesienie
CF - przeniesienie
AF - przeniesienie
AF - przeniesienie
pomocnicze
pomocnicze
Jeśli CF=1 lub
Jeśli CF=1 lub
częśćY
częśćY
> 9
> 9
to [AL]=[AL]+06h oraz
to [AL]=[AL]+06h oraz
CF=1
CF=1
AF=0
AF=0
AF=1
AF=1
Przykład:
Przykład:
dodać w kodzie BCD dwie liczby dziesiętne 8 i 4
dodać w kodzie BCD dwie liczby dziesiętne 8 i 4
0000 1000
0000 1000
+
+
0000 0100
0000 0100
0000 1100
0000 1100
+ poprawka
+ poprawka
0000 0110
0000 0110
0001 0010
0001 0010
1 2
1 2
większe od 9
większe od 9
DODAWANIE - algorytm dla DAA
DODAWANIE - algorytm dla DAA
Dodawanie liczb w kodzie BCD dokonujemy za pomocą rozkazu ADD
Dodawanie liczb w kodzie BCD dokonujemy za pomocą rozkazu ADD
(ADC). Zamiast instrukcji DAA można użyć AAA.
(ADC). Zamiast instrukcji DAA można użyć AAA.
AAA dokonuje poprawki dziesiętnej po dodawaniu dwójkowym w kodzie
AAA dokonuje poprawki dziesiętnej po dodawaniu dwójkowym w kodzie
BCD. Liczba podlegająca korekcji musi się zawsze znajdować w rejestrze
BCD. Liczba podlegająca korekcji musi się zawsze znajdować w rejestrze
AL
AL
skoryguj wynik w akumulatorze AL po
skoryguj wynik w akumulatorze AL po
dodawaniu BCD z przeniesieniem lub bez
dodawaniu BCD z przeniesieniem lub bez
AAA
AAA
DODAWANIE
DODAWANIE
•
przeniesienie dziesiętne przechodzi do AH (nie do starszej
przeniesienie dziesiętne przechodzi do AH (nie do starszej
tetrady AL, która jest zawsze zerowana) i jednocześnie CF = AF =
tetrady AL, która jest zawsze zerowana) i jednocześnie CF = AF =
1,
1,
•
przy braku przeniesienia CF = AF = 0
przy braku przeniesienia CF = AF = 0
Przykład:
Przykład:
dodać w kodzie BCD dwie liczby dziesiętne 8 i 4
dodać w kodzie BCD dwie liczby dziesiętne 8 i 4
0000 0000 0000 1000
0000 0000 0000 1000
+
+
0000 0000 0000 0100
0000 0000 0000 0100
0000 0000 0000 1100
0000 0000 0000 1100
+ poprawka
+ poprawka
0000 0000 0000 0110
0000 0000 0000 0110
0000 0001 0000 0010
0000 0001 0000 0010
1 2
1 2
DODAWANIE- zasada działania
DODAWANIE- zasada działania
AAA
AAA
Przypomnijmy zasadę zapisu U2 (uzupełnienie do 2)
Przypomnijmy zasadę zapisu U2 (uzupełnienie do 2)
W zapisie U2 (uzupełnień do 2) liczbę binarną można przedstawić jako:
a
n-1
...a
0
= -a
n-1
.
2
n-1
+a
n-2
.
2
n-2
+
...
+a
0
.
2
0
Najstarszy bit nie jest tylko bitem znaku ale niesie wraz ze swoją wagą wartość ujemną
W zapisie U2 (uzupełnień do 2) liczbę binarną można przedstawić jako:
a
n-1
...a
0
= -a
n-1
.
2
n-1
+a
n-2
.
2
n-2
+
...
+a
0
.
2
0
Najstarszy bit nie jest tylko bitem znaku ale niesie wraz ze swoją wagą wartość ujemną
1101
1101
U2
U2
= -1
= -1
.
.
2
2
3
3
+1
+1
.
.
2
2
2
2
+0
+0
.
.
2
2
1
1
+1
+1
.
.
2
2
0
0
= -8+4+1 =
= -8+4+1 =
-3
-3
D
D
0111
0111
U2
U2
= -0
= -0
.
.
2
2
3
3
+1
+1
.
.
2
2
2
2
+1
+1
.
.
2
2
1
1
+1
+1
.
.
2
2
0
0
= 4+2+1 =
= 4+2+1 =
7
7
D
D
~0111
~0111
U2
U2
1000
1000
+ 1
+ 1
1001
1001
U2
U2
negacja wszystkich bitów i dodanie 1
negacja wszystkich bitów i dodanie 1
-7
-7
D
D
7
7
D
D
110111
110111
+111000
+111000
1 101111
1 101111
-9
-9
D
D
=
=
-1
-1
.
.
32+1
32+1
.
.
16+0
16+0
.
.
8+1
8+1
.
.
4+1
4+1
.
.
2+1
2+1
.
.
1
1
-8
-8
D
D
=
=
-1
-1
.
.
32+1
32+1
.
.
16+1
16+1
.
.
8+0
8+0
.
.
4+0
4+0
.
.
2+0
2+0
.
.
1
1
-17
-17
D
D
=
=
-1
-1
.
.
32+0
32+0
.
.
16+1
16+1
.
.
8+1
8+1
.
.
4+1
4+1
.
.
2+1
2+1
.
.
1
1
bit poza zakresem -
bit poza zakresem -
odrzucamy
odrzucamy
10111
10111
+11000
+11000
1 01111
1 01111
-9
-9
D
D
= -1
= -1
.
.
16+0
16+0
.
.
8+1
8+1
.
.
4+1
4+1
.
.
2+1
2+1
.
.
1
1
-8
-8
D
D
= -1
= -1
.
.
16+1
16+1
.
.
8+0
8+0
.
.
4+0
4+0
.
.
2+0
2+0
.
.
1
1
-17
-17
D
D
=
=
-1
-1
.
.
32+0
32+0
.
.
16+1
16+1
.
.
8+1
8+1
.
.
4+1
4+1
.
.
2+1
2+1
.
.
1
1
bit poza zakresem - nie
bit poza zakresem - nie
odrzucamy
odrzucamy
DODAWANIE LICZB ZE ZNAKIEM
DODAWANIE LICZB ZE ZNAKIEM
Stosujemy zapis U2
Stosujemy zapis U2
Wpiszmy do AX liczbę -9
Wpiszmy do AX liczbę -9
D
D
= 11111111 11110111 = FFF7H
= 11111111 11110111 = FFF7H
Wpiszmy do BX liczbę -8
Wpiszmy do BX liczbę -8
D
D
= 11111111 11111000 = FFF8H
= 11111111 11111000 = FFF8H
11111111 11101111 = -17
11111111 11101111 = -17
D
D
Wykonajmy dodawanie: -9
Wykonajmy dodawanie: -9
D
D
+ (-8
+ (-8
D
D
)
)
Bit znaku wskazuje na liczbę
Bit znaku wskazuje na liczbę
ujemną
ujemną
DODAWANIE LICZB ZE ZNAKIEM
DODAWANIE LICZB ZE ZNAKIEM
Rozkaz negacji (uzupełnienia do dwóch) bajtu lub słowa -
NEG
, jest rozkazem, który odwraca znak zmiennej zawartej w
pamięci lub w rejestrach powszechnego stosowania.
NEG odejmuje argument (operand) przeznaczenia od zera,
tworząc w ten sposób uzupełnienie do dwóch.
-9
-9
D
D
= 11111111 11110111 = FFF7H
= 11111111 11110111 = FFF7H
NEGACJA LUB UZUPEŁNIENIE DO
NEGACJA LUB UZUPEŁNIENIE DO
DWÓCH - NEG
DWÓCH - NEG
A jak realizować dodawanie liczb ze znakiem stosując NEG?
A jak realizować dodawanie liczb ze znakiem stosując NEG?
Zawartość rejestrów przed dodawaniem
Zawartość rejestrów przed dodawaniem
Zawartość rejestrów po dodawaniu
Zawartość rejestrów po dodawaniu
Realizacja dodawania
Realizacja dodawania
-9
-9
D
D
+ (-8
+ (-8
D
D
)
)
11111111 11101111 = -17
11111111 11101111 = -17
D
D
NEGACJA LUB UZUPEŁNIENIE DO
NEGACJA LUB UZUPEŁNIENIE DO
DWÓCH - NEG
DWÓCH - NEG
Odejmowanie całkowite dokonujemy za pomocą rozkazu SUB
Odejmowanie całkowite dokonujemy za pomocą rozkazu SUB
SUB argument1,argument2
SUB argument1,argument2
rejestr
rejestr
komórka pamięci
komórka pamięci
rejestr
rejestr
komórka pamięci
komórka pamięci
dana
dana
natychmiastowa
natychmiastowa
Od
Od
argumentu1
argumentu1
odejmij
odejmij
argument2
argument2
i wynik zapisz w
i wynik zapisz w
argument1
argument1
Przykłady:
Przykłady:
SUB AL,BL
SUB AL,BL
SUB AL,4Ch
SUB AL,4Ch
Rozkaz ten ma wpływ na następujące znaczniki rejestru flagowego
Rozkaz ten ma wpływ na następujące znaczniki rejestru flagowego
(zależne od wyniku odejmowania):
(zależne od wyniku odejmowania):
OF - flaga nadmiaru
OF - flaga nadmiaru
(przepełnienia)
(przepełnienia)
SF - flaga znaku
SF - flaga znaku
ZF - flaga zera
ZF - flaga zera
AF - flaga przeniesienia
AF - flaga przeniesienia
pomocniczego
pomocniczego
PF - flaga parzystości
PF - flaga parzystości
CF - flaga
CF - flaga
przeniesienia
przeniesienia
ODEJMOWANIE
ODEJMOWANIE
Odejmowanie całkowite bajtów lub słów z uwzględnieniem pożyczki
dokonujemy za pomocą rozkazu SBB
SBB argument1,argument2
SBB argument1,argument2
rejestr
rejestr
komórka pamięci
komórka pamięci
rejestr
rejestr
komórka pamięci
komórka pamięci
dana natychmiastowa
dana natychmiastowa
Od
Od
argumentu1
argumentu1
odejmij
odejmij
argument2
argument2
i wartość flagi przeniesienia CF
i wartość flagi przeniesienia CF
a wynik zapisz w
a wynik zapisz w
argument1
argument1
Rozkaz ten ma wpływ na następujące znaczniki rejestru flagowego (zależne od
Rozkaz ten ma wpływ na następujące znaczniki rejestru flagowego (zależne od
wyniku odejmowania):
wyniku odejmowania):
OF - flaga nadmiaru
OF - flaga nadmiaru
(przepełnienia)
(przepełnienia)
SF - flaga znaku
SF - flaga znaku
ZF - flaga zera
ZF - flaga zera
AF - flaga przeniesienia
AF - flaga przeniesienia
pomocniczego
pomocniczego
PF - flaga parzystości
PF - flaga parzystości
CF - flaga
CF - flaga
przeniesienia
przeniesienia
Rozkaz ten musi występować zawsze po rozkazie SUB, gdyż dopiero po rozkazie
Rozkaz ten musi występować zawsze po rozkazie SUB, gdyż dopiero po rozkazie
SUB może być wiadomo, że występuje (bądź nie występuje) przeniesienie. W
SUB może być wiadomo, że występuje (bądź nie występuje) przeniesienie. W
przypadku gdyby nie było przeniesienia to rozkaz SBB zadziała dokładnie tak jak
przypadku gdyby nie było przeniesienia to rozkaz SBB zadziała dokładnie tak jak
rozkaz SUB.
rozkaz SUB.
ODEJMOWANIE
ODEJMOWANIE
Odejmowanie liczb w kodzie BCD dokonujemy za pomocą rozkazu SUB
(SBB) z zastosowaniem instrukcji DAS.
DAS dokonuje poprawki dziesiętnej po odejmowaniu dwójkowym w kodzie
BCD. Liczba podlegająca korekcji musi się zawsze znajdować w rejestrze
AL
skoryguj wynik w akumulatorze AL po
skoryguj wynik w akumulatorze AL po
odejmowaniu BCD z pożyczką lub bez
odejmowaniu BCD z pożyczką lub bez
DAS
DAS
Algorytm dla DAS jest następujący:
Algorytm dla DAS jest następujący:
AL
AL
0
0
3
3
7
7
4
4
częśćY
częśćY
częśćX
częśćX
Jeśli AF=1 lub
Jeśli AF=1 lub
częśćX
częśćX
> 9
> 9
to [AL]=[AL]-06h oraz AF=1
to [AL]=[AL]-06h oraz AF=1
AF - flaga przeniesienia
AF - flaga przeniesienia
pomocniczego
pomocniczego
CF - flaga
CF - flaga
przeniesienia
przeniesienia
Jeśli CF=1 lub
Jeśli CF=1 lub
częśćY
częśćY
> 9
> 9
to [AL]=[AL]-60h oraz CF=1
to [AL]=[AL]-60h oraz CF=1
ODEJMOWANIE
ODEJMOWANIE
Rozkaz negacji
Rozkaz negacji
NEG
NEG
jest użyteczny tam, gdzie nie wystarcza rozkaz
jest użyteczny tam, gdzie nie wystarcza rozkaz
odejmowania SUB, a mianowicie podczas odejmowania argumentu np. typu
odejmowania SUB, a mianowicie podczas odejmowania argumentu np. typu
rejestr lub komórka pamięci od wartości natychmiastowej.
rejestr lub komórka pamięci od wartości natychmiastowej.
Np. jeżeli zechcemy odjąć 35h od wartości w AL (np. AL=30h), to nie możemy
Np. jeżeli zechcemy odjąć 35h od wartości w AL (np. AL=30h), to nie możemy
tego zrobić za pomocą rozkazu SUB, gdyż wartość natychmiastowa nie stanowi
tego zrobić za pomocą rozkazu SUB, gdyż wartość natychmiastowa nie stanowi
przecież przeznaczenia:
przecież przeznaczenia:
SUB 35,AL
SUB 35,AL
;jest niedozwolony
;jest niedozwolony
Dlatego:
Dlatego:
NEG AL
NEG AL
ADD AL,35
ADD AL,35
ODEJMOWANIE
ODEJMOWANIE
Mnożenie liczb całkowitych bez znaku dokonujemy za pomocą
Mnożenie liczb całkowitych bez znaku dokonujemy za pomocą
rozkazu MUL
rozkazu MUL
MUL argument2
MUL argument2
rejestr (rej)
rejestr (rej)
komórka pamięci (mem)
komórka pamięci (mem)
Pomnóż
Pomnóż
argumentu2
argumentu2
przez niejawny argument1 (wartość rejestru AL
przez niejawny argument1 (wartość rejestru AL
lub AX)
lub AX)
a wynik zapisz w
a wynik zapisz w
rejestrze AL lub AX
rejestrze AL lub AX
Rozkaz ten ma wpływ na następujące znaczniki rejestru flagowego
Rozkaz ten ma wpływ na następujące znaczniki rejestru flagowego
(zależne od wyniku):
(zależne od wyniku):
OF - flaga nadmiaru
OF - flaga nadmiaru
(przepełnienia)
(przepełnienia)
CF - flaga
CF - flaga
przeniesienia
przeniesienia
przy czym jeśli ”górna” połowa wyniku znajdująca się w rejestrach
przy czym jeśli ”górna” połowa wyniku znajdująca się w rejestrach
AH lub DX zawiera same zera to OF i CF ustawiane są na wartość 0, w
AH lub DX zawiera same zera to OF i CF ustawiane są na wartość 0, w
przeciwnym razie na 1.
przeciwnym razie na 1.
MNOŻENIE
MNOŻENIE
Przykład mnożenia liczb całkowitych bez znaku
Przykład mnożenia liczb całkowitych bez znaku
Wynik=6A0
Wynik=6A0
CF=1
CF=1
OF=1
OF=1
CF=1
CF=1
OF=1
OF=1
Wynik=5D4A8
Wynik=5D4A8
0
0
MNOŻENIE
MNOŻENIE
IMUL argument2
IMUL argument2
rejestr (rej)
rejestr (rej)
komórka pamięci (mem)
komórka pamięci (mem)
Pomnóż
Pomnóż
argumentu2
argumentu2
przez niejawny argument1 (wartość rejestru AL
przez niejawny argument1 (wartość rejestru AL
lub AX)
lub AX)
a wynik zapisz w
a wynik zapisz w
rejestrze AL lub AX
rejestrze AL lub AX
Rozkaz ten ma wpływ na znaczniki rejestru flagowego (zależne od
Rozkaz ten ma wpływ na znaczniki rejestru flagowego (zależne od
wyniku): OF i CF
wyniku): OF i CF
Przykład
Przykład
mnożenia liczb całkowitych ze znakiem
mnożenia liczb całkowitych ze znakiem
Wynik=FFFFDB9
Wynik=FFFFDB9
8
8
1234 h * (-2h) =
1234 h * (-2h) =
FFFFDB98
FFFFDB98
4660
4660
D
D
* (-2
* (-2
D
D
) =-
) =-
9320
9320
D
D
=
=
MNOŻENIE LICZB CAŁKOWITYCH ZE
MNOŻENIE LICZB CAŁKOWITYCH ZE
ZNAKIEM
ZNAKIEM
MOV AL,3 ;pierwszy czynnik=003
MOV AL,3 ;pierwszy czynnik=003
MOV BL,2 ;drugi czynnik=002
MOV BL,2 ;drugi czynnik=002
MUL BL
MUL BL
;AX=0006H=0006
;AX=0006H=0006
MOV AL,3 ;pierwszy czynnik=003
MOV AL,3 ;pierwszy czynnik=003
MOV BL,2 ;drugi czynnik=002
MOV BL,2 ;drugi czynnik=002
IMUL BL
IMUL BL
;AX=0006H=0006
;AX=0006H=0006
Obydwa rozkazy dają identyczne wyniki dopóty dopóki liczby ze
Obydwa rozkazy dają identyczne wyniki dopóty dopóki liczby ze
znakiem są zgodne z liczbami bezznakowymi
znakiem są zgodne z liczbami bezznakowymi
MOV AL,FFH ;pierwszy czynnik=255
MOV AL,FFH ;pierwszy czynnik=255
MOV BL,2 ;drugi czynnik=002
MOV BL,2 ;drugi czynnik=002
MUL BL
MUL BL
;AX=01FEH=00510
;AX=01FEH=00510
Obydwa rozkazy wykonują operacje na tych samych liczbach ale wyniki
Obydwa rozkazy wykonują operacje na tych samych liczbach ale wyniki
są inne
są inne
MOV AL,FFH ;pierwszy czynnik=-001
MOV AL,FFH ;pierwszy czynnik=-001
MOV BL,2 ;drugi czynnik=002
MOV BL,2 ;drugi czynnik=002
IMUL BL
IMUL BL
;AX=FFFEH=-00002
;AX=FFFEH=-00002
MUL
MUL
MUL
MUL
IMUL
IMUL
IMUL
IMUL
MOV AX,FFFFH ;pierwszy czynnik=65535
MOV AX,FFFFH ;pierwszy czynnik=65535
MOV BX,2 ;drugi czynnik=0002
MOV BX,2 ;drugi czynnik=0002
MUL BX
MUL BX
;DX:AX=0001H:FFFEH=131070
;DX:AX=0001H:FFFEH=131070
MOV AX,FFFFH ;pierwszy czynnik=-0001
MOV AX,FFFFH ;pierwszy czynnik=-0001
MOV BX,2 ;drugi czynnik=002
MOV BX,2 ;drugi czynnik=002
IMUL BX
IMUL BX
;DX:AX=FFFFH:FFFEH=-00002
;DX:AX=FFFFH:FFFEH=-00002
lub
lub
MNOŻENIE
MNOŻENIE
Dzielenie liczb całkowitych bez znaku dokonujemy za pomocą
Dzielenie liczb całkowitych bez znaku dokonujemy za pomocą
rozkazu DIV
rozkazu DIV
DIV argument2
DIV argument2
rejestr (rej)
rejestr (rej)
komórka pamięci (mem)
komórka pamięci (mem)
Podziel niejawny argument1 (wartość rejestru AL lub AX) przez
Podziel niejawny argument1 (wartość rejestru AL lub AX) przez
argumentu2
argumentu2
a wynik zapisz w
a wynik zapisz w
rejestrze AL lub AX
rejestrze AL lub AX
natomiast resztę
natomiast resztę
z dzielenia w AH lub DX
z dzielenia w AH lub DX
Gdy iloraz nie pomieści się w AL czy AX, czy też nawet w
Gdy iloraz nie pomieści się w AL czy AX, czy też nawet w
przydzielonej mu specjalnej komórce pamięci, procesor
przydzielonej mu specjalnej komórce pamięci, procesor
wygeneruje przerwanie nr 0 (błąd dzielenia przez zero) i
wygeneruje przerwanie nr 0 (błąd dzielenia przez zero) i
poinformuje nas o tym.
poinformuje nas o tym.
DZIELENIE
DZIELENIE
Przykład dzielenia liczb całkowitych bez znaku
Przykład dzielenia liczb całkowitych bez znaku
iloraz
iloraz
reszta
reszta
DZIELENIE
DZIELENIE
IDIV argument2
IDIV argument2
rejestr (rej)
rejestr (rej)
komórka pamięci (mem)
komórka pamięci (mem)
Podziel niejawny argument1 (wartość rejestru AL lub AX) przez
Podziel niejawny argument1 (wartość rejestru AL lub AX) przez
argumentu2
argumentu2
a wynik zapisz w
a wynik zapisz w
rejestrze AL lub AX
rejestrze AL lub AX
natomiast resztę
natomiast resztę
z dzielenia w AH lub DX
z dzielenia w AH lub DX
Podczas dzielenia ze znakiem, może nastąpić zniszczenie bitu znaku
Podczas dzielenia ze znakiem, może nastąpić zniszczenie bitu znaku
(nastąpi przepełnienie) i wówczas generowane jest przerwanie INT 0.
(nastąpi przepełnienie) i wówczas generowane jest przerwanie INT 0.
Dla rozkazu IDIV obowiązują następujące zasady dotyczące znaków
Dla rozkazu IDIV obowiązują następujące zasady dotyczące znaków
argumentów i wyniku rozkazów:
argumentów i wyniku rozkazów:
DZIELENIE LICZB CAŁKOWITYCH ZE
DZIELENIE LICZB CAŁKOWITYCH ZE
ZNAKIEM
ZNAKIEM
ROZKAZY ARYTMETYCZNE
ROZKAZY ARYTMETYCZNE
Zobacz
jak
może
wyglądać
realizacja
rozkazów
arytmetycznych zrealizowana z wykorzystaniem symulatora
procesora SMS32v50
program:
in_arith1.asm
DZIĘKUJĘ ZA UWAGĘ !
DZIĘKUJĘ ZA UWAGĘ !