Welcome, guest. You are not logged in.
Language / Choose language
 
Username Password  
Today: What you want? · More of this
    Search
 

   

Veiksmai su de?imtainio formato skaiiais
5.3. Veiksmai su de?imtainio formato skaiiais

Tai yra veiksm, atlikt bendrosiomos komandomis patikslinimas, kad rezultatas bt
korekti?kas.



Pastaba.
Po?ymis AF fiksuoja perne?im i? jaunesnio pusbaiio, o po?ymis CF
fiksuoja perne?im i? baito.

AAA – Ascii Adjust for Addition
0011 0111

ASCII tai yra simbolinis kodavimas, kuriam yra ekvivalents de?imtainio
nesupakuoto formato skaiiai, nes vienas toks skaiius u?ima vien bait.

Komanda yra koreguojama reik?m, esanti registre AL, kuri pertvarkoma teising
de?imtain nesupakuot skaii, kurios vyresnis pusbaitis yra 0h, o jaunesniajame
pusbaityje yra skaiiai i? diapazono 0h – 9h.


75

Jeigu korekcijos rezultatas yra didesnis u? 9h, nra kaip to u?fiksuoti de?imtainiu
nesupakuotu skaiiumi, todl komanda AAA suformuoja po?ym CF = 1 ir registre
AH esani reik?m padidina vienetu.

Komandos AAA veikimas priklauso nuo registro SF po?ymio AF.
Komandos AAA veikimo algoritmas:

if ( (AL and 0Fh) > 9 or (AF = 1) ) then
AL := AL + 6
AH := AH + 1
AF := 1
CF := 1
else
AF := 0
CF := 0
endif
AL := AL and 0Fh


Pavyzd?iai:

1. 3 + 7 = 0A 10 00
Komandos AAA veikimo rezultate, skaiiaus A reik?m yra padidinama ?e?iais dl
pagrind skirtumo: sudedant pozicijos svoris yra 16, o norime gauti reik?m, kurios
pozicijos svoris yra 10.
Taiau teisingas de?imtainis nesupakuotas skaiius vyresniame pusbaityje turi turti
nul, todl rezultatas yra dar koreguojamas iki 00. Gautas rezultatas buvo didesnis u?
9, todl nustatomas po?ymis CF = 1, ir registre AH esanti reik?m padidinama
vienetu.

2. 8 + 9 = 11 17 07
1-ame pavyzdyje koregavome rezultat 0A, po?ymis AF buvo lygus 0. Tarkime, kad
po sudties gavome 11, tada papildomo perne?imo po?ymis AF nustatomas lygus 1.
Skaii 11 padidiname ?e?iais ir gauname 17. Kadangi vyresniame pusbaityje turi bti
0, tai ?i reik?m pakoreguojama 07. Nustatomas po?ymis CF = 1, registre AH esanti
reik?m padidinama vienetu, nustatomas po?ymis AF=1.



DAA – Decimal Adjust for Addition
0010 0111

Komanda yra koreguojama reik?m, esanti registre AL, kuri pertvarkoma teising
de?imtain supakuot skaii diapazone. Jeigu po korekcijos rezultatas vir?ija 99, tai
nustatomas po?ymis CF = 1




Komandos DAA veikimo algoritmas:


if ( (AL and 0Fh) > 9 or (AF = 1) then
AL := AL + 6
AF := 1
endif

76

if ( (AL > 9Fh) or (CF = 1) ) then
AL := AL + 60h
CF := 1
endif


Pavyzd?iai:

1. 24 + 27 = 4B 51
Sudties rezultat 4B gauname naudodami esam sudties komand. Komanda DAA
prideda 6, ir turime korekti?k de?imtain supakuot skaii-rezultat: 51.

2. 29 + 28 = 51 57
51 bt teisingas de?imtainis supakuotas skaiius, bet atliekant sudt buvo fiksuotas
perne?imas vyresn pusbait: po?ymis AF = 1, todl yra pritaikoma komanda DAA.

3. 62 + 64 = C6 26
Koreguojant sudties rezultat C6, gauname 126, o tai yra daugiau u? 99 ir vir?ija
de?imtaini supakuot skaii diapazon. Todl yra nustatomas po?ymis CF = 1.

4. 66 + 65 = CB D1 31
Koreguojant sudties rezultat CB, gauname D1, o tai irgi yra neteisingas de?imtainis
skaiius, todl komanda DAA koreguoja dar kart, taip gaunamas 131, o tai yra
daugiau u? 99 ir vir?ija de?imtaini supakuot skaii diapazon
. Todl yra
nustatomas po?ymis CF = 1.

5. 46 + 55 = 9B A1 01
Koreguojant sudties rezultat 9B, gauname A1, o tai yra vis dar neteisingas
de?imtainis skaiius, todl komanda DAA koreguoja dar kart, taip gaunamas 101, o
tai yra daugiau u? 99 ir vir?ija de?imtaini supakuot skaii diapazon. Todl yra
nustatomas po?ymis CF = 1.


AAS – Ascii Adjust for Substraction
0011 1111

Komanda yra koreguojama reik?m, esanti registre AL, kuri pertvarkoma teising
de?imtain nesupakuot skaii, kurios vyresnis pusbaitis yra 0h, o jaunesniajame
pusbaityje yra skaiiai i? diapazono 0h – 9h. Jeigu korekcijos rezultatas yra daugiau
u? 9, tai komanda AAS registro AH reik?m suma?ina vienetu ir nustato po?ym CF =
1, prie?ingu atveju, CF = 0.

Atimties, kurios rezultat koreguojame komanda AAS, operandai yra i? diapazono 0 –
9, todl po atimties turime :
1. rezultatas >= 0: 0 <= rezultatas <= 9
Korekcija nereikalinga.
2. rezultatas < 0 : -9 <= rezultatas < 0
-9 = F7 <= rezultatas <= FF = -1

F7 <= rezultatas <= FF
-6

F1 <= rezultatas <= F9, AH suma?inama vienetu.

77


KOMPIUTERI ARCHITEKTRA


Komandos AAS veikimo algoritmas:
if ( (AL and 0Fh) > 9 or (AF = 1) ) then
AL := AL - 6
AH := AH - 1
AF := 1
CF := 1
else
AF := 0
CF := 0
endif
AL := AL and 0Fh


Pavyzdys:
5 - 8
(5)
= (101) ,
10 2
(8)
= (1000)
10 2
0001 0000


1110 1111
+
1
1111 1000 = (-8)
10

0000 0101
+

1111 1000
1111 1101 = (FD)
16
(1)5 - 8 = 7
FD F7 07
Rezultatui FD reikalinga korekcija, atimama 6. Nesupakuoto de?imtainio skaiiaus
vyresiame pusbaityje turi bti nulis, todl F7 koreguojame ir turime rezultat 7.
Tokios korekcijos eigoje komanda AAS vienetu suma?ino registre AH esani
reik?m.


DAS – Decimal Adjust for Subtraction
0010 1111

Komanda yra koreguojama reik?m, esanti registre AL, kuri pertvarkoma teising
de?imtain supakuot skaii diapazone. Jeigu po korekcijos rezultatas vir?ija 99, tai
komanda DAS nustato po?ym CF = 1, prie?ingu atveju, CF = 0.

Atimties, kurios rezultat koreguojame komanda DAS, operandai yra i? diapazono 0 –
99. Po atimties gauname reik?m xy ir tikriname:
1. Ar AF = 1?
2. Ar CF = 1?
3. Ar x yra teisingas de?imtainis skaitmuo?
4. Ar y yra teisingas de?imtainis skaitmuo?
Tada elgiamasi taip:
1. Jeigu AF = 1 arba y yra neteisingas de?imtainis skaitmuo, tai xy = xy - 6.
2. Jeigu CF = 1 arba x yra neteisingas de?imtainis skaitmuo, tai xy = xy - 60.





78

Pavyzdys:
?i kart atlikime skaiiavimus ?e?ioliktainje sistemoje:
11
-

19
F8
-

6
F2
-
60
92
(1)11 – 19 = 92
F8 F2 92
Skaiiuojant rezultat F8 nustatytas po?ymis AF = 1, todl j koreguojame atimdami
6, gauname F2. F yra neteisingas de?imtainis skaiius, o ir CF nustatytas lygus
vienam, todl atimame 60, gauname 92.


Komandos DAS veikimo algoritmas:


if ( (AL and 0Fh) > 9 or (AF = 1) then
AL := AL - 6
AF := 1
endif
if ( (AL > 9Fh) or (CF = 1) ) then
AL := AL – 60h
CF := 1
endif



AAM – Ascii Adjust for Multiplication
1101 0100 0000 1010

Komanda yra taikoma po dviej de?imtaini nesupakuot skaii baitins daugybos,
kai sandauga yra registre AX, o ?iuo atveju, t.y., kai yra dauginami du de?imtainiai
nesupakuoti skaiiai, rezultatas telpa registre AL (maksimalus rezultatas yra 9 · 9 =
81).

Komanda AAM padalina registre AL esani reik?m i? 10, tada dalmen u?ra?o
registr AH, o liekan – registr AL:

AH := AL div 10
AL := AL mod 10

Taip du skaiiai yra atskiriami, ir registruose AH ir AL turime teisingus de?imtainius
nesupakuotus skaiius, kai vyresniame pusbaityje yra nulis, o jaunesniame pusbaityje
yra skaitmuo i? diapazono: 0h – 9h.

Pavyzdys: jeigu dalybos rezultate gauname 79, tai po komandos AAM suveikimo,
registre AH yra 7, o registre AL yra 9.

Pastaba.
Supakuotiems de?imtainiams skaiiams nra daugybos korekcijos komandos.



79


KOMPIUTERI ARCHITEKTRA

AAD – Ascii Adjust for Division
1101 0101 0000 1010

Komanda atlieka dalybos rezultato korekcij de?imtainiams nesupakuotiems
skaiiams. ?i korekcijos komanda skiriasi nuo kit korekcijos komand tuo, kad ji yra
taikoma ne rezultatui, o paruo?ia duomenis de?imtaini nesupakuot skaii dalybai.

De?imtaini nesupakuot skaii dalybos korekcijos komanda taria, kad dalinys yra
registre AX kaip dviej bait de?imtainis nesupakuotas skaiius, kurio vyresnis
skaitmuo yra registre AH, kurio vyresnis pusbaitis yra nulis.

Komanda atlieka tokius veiksmus:
AL := AH * 10 + AL
AH := 0
Tada yra atliekama dalybos komanda DIV.

Pastaba.
Supakuotiems de?imtainiams skaiiams nra dalybos korekcijos komandos.



5.4. Konvertavimas

CBW – Convert Byte to Word
1001 1000

?i komanda yra taikoma skaiiams su ?enklu, tokiems kurie yra baito diapazone, t.y.,
-128 – 127. Registro AL vyriausiasis bitas yra i?skleid?iamas registr AH. Taip
reik?m baite yra pervedama reik?m ?odyje.


CWD – Convert Word to Double word
1001 1001
?i komanda yra taikoma skaiiams su ?enklu, tokiems, kurie yra dviej bait – ?od?io
diapazone, t.y., -32768 – 32767. Registro AX vyriausiasis bitas yra i?skleid?iamas
registr DX. Taip reik?m baite yra pervedama reik?m ?odyje.

Komanda gali bti naudojama, pvz., dalybos veiksmo IDIV paruo?imui, nes ?odyje
esani reik?mi dalyba reikalauja, kad pirmas operandas bt keturiuose baituose,
t.y., registruose [DX, AX].

80

5.5. Logins komandos

NOT – loginis paneigimas.
1111 011w mod 010 r/m [poslinkis]

Vykdant komand, lauko bitai yra invertuojami.

SHL / SAL – SHift logical Left / Shift Arithmetic Left – loginis postmis kair /
aritmetinis postmis kair.
1101 00vw mod 100 r/m [poslinkis]

Jeigu v = 0, tai pastumiama kair per vien pozicij.
Jeigu v = 1, tai postmio skaitliukas yra registro CL reik?m.

De?inieji (jaunesnieji) atsilaisvin bitai yra u?pildomi nuliais.

Jeigu postmyje per vien bit ?enklo bitas nekeiia reik?ms, tai OF = 0, prie?ingu
atveju, OF = 1.
Jeigu postmis yra per kelis bitus, tada po?ymis OF yra neapibr?tas.


SHR – SHift logical Right – loginis postmis de?in.
1101 00vw mod 101 r/m [polinkis]

Jeigu v = 0, tai pastumiama de?in per vien pozicij.
Jeigu v = 1, tai postmio skaitliukas yra registro CL reik?m.

Vyresnieji atsilaisvin bitai yra u?pildomi nuliais, kiekvienam i?stumtam bitui.

Jeigu postmyje per vien bit vyriausias bitas nekeiia reik?ms, tai OF = 0,
prie?ingu atveju, OF = 1.
Jeigu postmis yra per kelis bitus, tada po?ymis OF yra neapibr?tas.


SAR – Shift Arithmetic Right – aritmetinis post
mis de?in.
1101 00vw mod 111 r/m [poslinkis]

Jeigu v = 0, tai pastumiama de?in per vien pozicij.
Jeigu v = 1, tai postmio skaitliukas yra registro CL reik?m.

Vyresnieji atsilaisvin bitai yra u?pildomi nuliais arba vienetais, taip, kad bt
i?saugotas ?enklas.


Pastaba.
Postmyje de?in loginis ir aritmetinis postmis nra tas pats, nes
loginiame atsilaisvin, atsirad i?stumtj vietoje, bitai yra u?pildomi nuliais, o
aritmetiniame postmyje atsilaisvin bitai yra u?pildomi ?enklo bitais.


81


KOMPIUTERI ARCHITEKTRA


ROL – ROtate Left – ciklinis postmis kair.
1101 00vw mod 000 r/m [poslinkis]

Jeigu v = 0, tai pastumiama de?in per vien pozicij.
Jeigu v = 1, tai postmio skaitliukas yra registro CL reik?m.
Stumiant per vien bit kair, vyriausias bitas u?pildo jauniausio bito reik?m. Jeigu
postmis yra daugiau nei per vien pozicij, tai atitinkamai daugiau vyresnij bit
perne?ama jaunesnius.

Jeigu postmyje per vien bit vyriausias bitas nekeiia reik?ms, tai OF = 0,
prie?ingu atveju, OF = 1.

Vyriausias bitas u?ra?omas i po?ym CF.


ROR – ROtate Right – ciklinis postmis de?in.
1101 00vw mod 001 r/m [poslinkis]

Jeigu v = 0, tai pastumiama de?in per vien pozicij.
Jeigu v = 1, tai postmio skaitliukas yra registro CL reik?m.

Stumiant per vien bit de?in, jauniausias bitas u?pildo vyriausio bito reik?m.
Jeigu postmis yra daugiau nei per vien pozicij, tai atitinkamai daugiau jaunesnij
bit perne?ama vyresnius.

Jeigu postmyje per vien bit vyriausias bitas nekeiia reik?ms, tai OF = 0,
prie?ingu atveju, OF = 1.

Jauniausias bitas u?ra?omas i po?ym CF.


RCL – Rotate Left through Carry – perstumti cikli?kai kair, panaudojant perne?imo
bit CF.
1101 00vw mod 010 r/m [poslinkis]

Jeigu v = 0, tai pastumiama de?in per vien pozicij.
Jeigu v = 1, tai postmio skaitliukas yra registro CL reik?m.



CF










82

RCR – Rotate Right through Carry – perstumti cikli?kai de?in, panaudojant
perne?imo bit CF.
1101 00vw mod 011 r/m [poslinkis]

Jeigu v = 0, tai pastumiama de?in per vien pozicij.
Jeigu v = 1, tai postmio skaitliukas yra registro CL reik?m.




CF





AND – loginis “ir”.
Komanda naudojama formuoti nuliniams laukams.

1. registras / atmintis registras
0010 00dw mod reg r/m [poslinkis]

2. betarpi?kas operandas registras / atmintis
1000 00sw mod 100 r/m [poslinkis] bet.op.j.b [bet.op.v.b.]

Jeigu s:w = 01, tada betarpi?kas operandas yra imamas i? 16 komandos bit.

Jeigu s:w = 11, tada betarpi?kas operandas yra imamas i? 8 komandos bit ir
i?pleiamas iki 16 bit – ?od?io, pagal ?enklo pltimo taisykl.

3. betarpi?kas operandas akumuliatorius
0010 010w bet.op.j.b. [bet.op.v.b., jei w = 1]


OR – loginis “arba”.
Komanda naudojama formuoti vienetiniams laukams.

1. registras / atmintis registras
0000 10dw mod reg r/m [poslinkis]

2. betarpi?kas operandas registras / atmintis
1000 00sw mod 001 r/m [poslinkis] bet.op.j.b [bet.op.v.b.]

Jeigu s:w = 01, tada betarpi?kas operandas yra imamas i? 16 komandos bit.

Jeigu s:w = 11, tada betarpi?kas operandas yra imamas i? 8 komandos bit ir
i?pleiamas iki 16 bit – ?od?io.

3. betarpi?kas operandas akululiatorius
0000 110w bet.op.j.b. [bet.op.v.b., jei w = 1]


83


KOMPIUTERI ARCHITEKTRA

XOR – eXclusive OR – i?imtinis “arba”
Operacijoje su vienetiniu lauku, komanda operando bitus keiia prie?ingus.
Operacijoje su nuliniu lauku, operando lauko bitai yra i?saugomi.

1. registras / atmintis
^ registras
0011 00dw mod reg r/m [poslinkis]


2. betarpi?kas operandas
^ registras / atmintis
1000 00sw mod 110 r/m [poslinkis] bet.op.j.b [bet.op.v.b.]

Jeigu s:w = 01, tada betarpi?kas operandas yra imamas i? 16 komandos bit.

Jeigu s:w = 11, tada betarpi?kas operandas yra imamas i? 8 komandos bit ir
i?pleiamas iki 16 bit – ?od?io.

3. betarpi?kas operandas
^ akumuliatorius
0011 010w bet.op.j.b. [bet.op.v.b., jei w = 1]


TEST – patikrinimas
Atliekama operacija, analogi?ka operacijai AND, taiau rezultatas nra i??saugomas,
o formuojami po?ymi bitai:
1. CF = 0 ir OF = 0;
2. AF – neapibr?tas;
3. PF, SF, ZF – j reik?ms keiiamos pagal rezultato reik?m.
Komanda yra naudojamas su valdymo prie? valdymo perdavimo komandas

1. registras / atmintis
~~ registras
1000 010w mod reg r/m [poslinkis]

2. betarpi?kas operandas
~~ registras / atmintis
1111 011w mod 000 r/m [poslinkis] bet.op.j.b [bet.op.v.b., jei w = 1]

3. betarpi?kas operandas
~~ akumuliatorius
1010 100w bet.op.j.b. [bet.op.v.b., jei w = 1]


5.6. Eilutins komandos


REP – REPeate – pakartoti (pakartojimo prefiksas, priedas prie eilutins komandos).
Pakartojimo prefiksas slygoja sekanios komandos pakartojim, jeigu ZF = 1 (t.y.,
yra nulis arba lygu, pagal situacij) ir registre CX esanti reik?m nelygi nuliui.

Sinonimai: REP / REPZ / REPE – REPeate / REPeate if Zero / REPeate if Equal –
pakartoti / pakartoti, jei yra nulis / pakartoti, jei lygu.
1111 0011
z bitas, kuris yra lygus 1, ZF = z

84

Registro CX reik?m keiia eilutin komanda.

Komanda su pakartojimo prefiksu, kuris i??aukia ciklin vykdym: REP komanda .

REP komanda vykdymas gali bti pertrauktas. Pertraukimas simena tik vien
prefiks ir j atstato. Prefiksas REP turi bti betarpi?kai prie? komand, kuri yra
kartojama. Jeigu yra panaudoti papildomai vienas arba du prefiksai (segmento
keitimo, magistrals blokavimo), tai po pertraukimo ?ie prefiksai nebeatstatomi, ir
pratsus vykdym rezultatai gali bti nekorekti?ki. Todl prie? tok prefiksin veiksm
su pakartojimu reikia u?drausti pertraukimus, o atlikus veiksma vl juos leisti. Kita
vertus, gali gautis neleistinai ilgas laiko tarpas, kai pertraukimai neleid?iami.

Pastaba.
Prefikso bitas z neturi takos eilutinms komandoms MOVS, LODS, STOS.
Neturi takos ir neeilutinms komandoms, formaliai prie? jas pritaikius pakartojimo
prefiks, taiau tos komandos nema?ina registre CX esanios reik?ms, todl tokia
pora – pakartojimo prefiksas ir neeilutin komanda, ma?a turi prasms.

REPNZ / REPNE – REPeate if Not Zero / REPeate if Not Equal – pakartoti, jei yra
ne nulis / pakartoti, jei nelygu .

Pakartojimo prefiksas slygoja sekanios komandos pakartojim, jeigu ZF = 0 (t.y.,
yra ne nulis arba nelygu, pagal situacij) ir registre CX esanti reik?m nelygi nuliui.

1111 0010

z bitas, kuris yra lygus 0, ZF = z

Registro CX reik?m keiia eilutin komanda.

Pastaba.
Pakartojimo prefikso bitas z neturi reik?ms komandoms MOVS, LODS,
STOS, o tik toms eilutinms komandoms, kuriomis atliekamas lyginimas arba
skanavimas.
Eilutins komandos su pakartojimo prefiksu vykdymo schema:
Pastaba.
Veiksm: CX CX - 1 atlieka eilutin komanda, jeigu ji yra su pakartojimo
prefiksu.
Pastaba.
Pakartojimo prefiksas gali bti prie? bet koki komand.


DF DELTA
Baitas 0 + 1
Baitas 1 - 1
?odis 0 + 2
?odis 1 - 2
Prefiksas z
REP / REPE / REPZ 1
REPNE / REPNZ 0



85


KOMPIUTERI ARCHITEKTRA


vykdyta ankstesn komanda



ne
Ar yra

prefiksas?

taip

taip
CX = 0 ?



ne

Pertraukimo
Pertrau-
taip
kimas ?
apdorojimas


ne

CX CX - 1


vykdyti operacij

panaudojant SI ir DI



Pakoreguoti SI ir DI pagal

DELTA



taip ne
CMPS arba
ZF = z ?
SCAS ?


ne taip


taip
Pakartojimo
prefiksas?


ne


Sekanti komanda







86

MOVS – MOVe String – eiluts persiuntimas.
1010 010w

Komanda yra persiuniamas baitas arba ?odis.

Jeigu DF = 0, tai indeksiniai registrai SI ir DI yra padidinami baitu (padidinama
vienetu) arba ?od?iu (padidinama dviem).

Jeigu DF = 1, tai indeksiniai registrai SI ir DI yra suma?inami baitu (suma?inama
vienetu) arba ?od?iu (suma?inama dviem).

?altinio lauko adres nurodo registras SI, rezultato lauko adres nurodo registras DI.
Adresai yra segmento viduje (ribose).

Absoliutus rezultato lauko adresas suformuojamas naudojant registrus ES ir DI.
Absoliutus ?altinio adresas gali bti formuojamas pasirinktinai naudojant registrus:
DS, CS, SS arba ES, ir SI.

CMPS – CoMPare String – eilui palyginimas.
1010 011w

Vienu palyginimo veiksmu yra lyginami baitai arba ?od?iai, i? ?altinio lauko atimant
rezultato lauk. Suformuojami slygos po?ymiai, operandai nra keiiami, taiau
modifikuojamos registr SI ir DI reik?ms, pagal indeksini registr modifikavimo
taisykl – priklausomai nuo po?ymio DF (apra?yta prie komandos MOVS).


SCAS – SCAn String – simboli paie?ka eilutje.
1010 111w

Paie?ka yra atliekama palyginimu atmimo bdu:
akumuliatorius - laukas, adresuojamas DI
Akumuliatorius – registras AL arba registras AX.
Laukas, adresuojamas DI – atitinkamai baito arba ?od?io laukas, kurio adresas
segmente yra nurodytas registre DI.

Atliekant komand, atmimo rezultate, yra suformuojami po?ymiai ir modifikuojamas
registras DI, pagal indeksini registr modifikavimo taisykl – priklausomai nuo
po?ymio DF (apra?yta prie komandos MOVS).
.


LODS – LOaD String – eiluts u?ra?ymas akumuliatori.
1010 110w

Baito laukas, nurodytas registru SI, u?ra?omas akumuliatori – registr AL. ?od?io
lauk, nurodytas registru SI, u?ra?omas akumuliatori – registr AX.

Registras SI yra modifikuojamas pagal pagal indeksini registr modifikavimo
taisykl – priklausomai nuo po?ymio DF (apra?yta prie komandos MOVS).

87


KOMPIUTERI ARCHITEKTRA

STOS – STOre String – registro siminimas eilutje.
1010 101w

Priklausomai nuo to, ar bitas w yra 0 ar 1, registre AL arba AX esanti reik?m yra simenama eilutje, nurodytoje registru DI. Po to registras DI yra modifikuojamas,
pagal indeksini registr modifikavimo taisykl – priklausomai nuo po?ymio DF
(apra?yta prie komandos MOVS).


Pastaba.
?iai komandai segmento registras visada yra ES, o nurod?ius segmento
keitimo prefiks, jis yra ignoruojamas.

5.7. Valdymo perdavimo komandos

CALL – paprograms (programos) i?kvietimas
Komanda perduoda valdym nurodytu adresu ir steke simena gr?imo adres.
Valdymo perdavimo adresas nurodomas operandu. Procedr i?kvietimas skirstomas
pagal segmentin atminties organizacij:
1. I?kvietimas segmento viduje (NEAR);
2. I?kvietimas kitame segmente (FAR).

Priklausomai nuo procedros i?kvietimo bdo, gr?imo adresas simenamas steke
dvejopai: pirmu atveju kaip IP, antru – kaip IP : CS .

1. Vidinis tiesioginis (segmento viduje).
1110 1000 adr.j.b. adr.v.b.

Dviej bait adresu galima nurodyti bet kuri viet segmente, bet komandoje
nurodomas tiesioginis adresas at?vilgiu einamosios IP reik?ms.

Veiksmai:
1. SP SP - 2.
2. Steko vir?n IP. steko vir?n ra?ome IP reik?m, taip i?saugomas gr?imo adresas – komandos,
einanios po CALL, adresas.
3. IP tiesioginis adresas, nurodytas komandoje kaip operandas + IP.
Tiesioginis adresas yra skaiius su ?enklu ?odyje, adres diapazonas: -32768 –
32767. Valdymo perdavimo adresas apskaiiuojamas sudedant IP ir tiesiogin
adres.



IP X – vieta, kur norim perduoti valdym
C – poslinkis

X = IP + C
Segmentas
C

X

88

X – vieta, kur norim perduoti valdym
C – poslinkis

X = IP + (-C)
Segmentas
C

IP





2. Vidinis netiesioginis (segmento viduje)
1111 1111 mod 010 r/m posl.j.b. [posl.v.b.]

Valdymo perdavimo adreso reik?m yra imama i? registro arba atminties, kuri yra
nurodyta komandoje.

Jeigu mod nelygu 11, tada:
Atmintis


adresas
CALL



Kita komanda




IP





RET


Pagal adres, nurodyt komandoje, i? atminties lauko yra paimama reik?m ir ji yra
traktuojama kaip adresas, kuriuo reikia perduoti valdym (adresas yra ?odis).

Jeigu mod = 11, tada registre esanti reik?m nusiuniama registr IP, ir tokiu bdu ji
yra traktuojama kaip adresas, kuriuo reikia perduoti valdym.


3. I?orinis tiesioginis (u? segmento rib).
1001 1010 adr.j.b. adr.v.b. seg.reg.j.b. seg.reg.v.b.

Laukas seg.reg.j.b. seg.reg.v.b. yra nusiuniamas registr CS.
Laukas adr.j.b. adr.v.b. yra nusiuniamas registr IP (tokiu bdu yra traktuojamas
kaip poslinkis segmente).

Veiksmai:
1. SP SP - 2.
2. Stekas CS.
3. SP SP - 2.

89


KOMPIUTERI ARCHITEKTRA

4. Stekas IP.
5. CS segmento registro reik?m. kuriame yra kvieiamoji procedra.
6. IP poslinkio segmente reik?m, kur yra kvieiamoji procedra.

Kvieiama procedra gali bti bet kurioje operatyvios atminties vietoje.


4. I?orinis netiesioginis.
1111 1111 mod 011 r/m [poslinkis]

Operandu nurodomas dviej ?od?i laukas atmintyje.

Komandos laukas mod negali bti lygus 11.








Operandu nurodomas
dviej bait laukas

atmintyje
Stekas



CSIP










Vykdant komand, nurodyto lauko vyresnysis ?odis nusiuniamas registr CS, o
jaunesnysis ?odis nusiuniamas registr IP. Taip yra atliekamas valdymo
perdavimas. stek padedamos einamosios, prie? valdymo perdavim buvusios,
registr CS ir IP reik?ms (einamoji IP registro reik?m rodo komand, esani po
tuo metu vykdomos, ?iuo atveju po CALL), todl i? procedros gr?tama teisingai.

RET – RETurn – gr?imas i? paprograms.
Tai yra beadresin komanda, yra skirtingi atvejai gr?imo segmento viduje ir i?orje.


1.Vidin be steko i?lyginimo.
1100 0011

Veiksmai:

90

1. IP Stekas.
2. SP SP + 2.


2. Vidin su steko i?lyginimu.
1100 0010 bet.op.j.b. bet.op.v.b.

Veiksmai:
1. IP Stekas.
2. SP SP + 2.
3. SP SP + betarpi?kas operandas.

Pastaba.
Betarpi?kas operandas yra ?odis.


3. I?orinis be steko i?lyginimo.
1100 1011

Veiksmai:
1. IP Stekas.
2. SP SP + 2.
3. CS Stekas.
4. SP SP + 2.


4. I?orinis su steko i?lyginimu.
1100 1010 bet.op.j.b. bet.op.v.b.

Veiksmai:
1. IP Stekas.
2. SP SP + 2.
3. CS Stekas.
4. SP SP + 2.
5. SP SP + betarpi?kas operandas.



JMP – JuMP – beslyginis perjimas.
Kaip ir paprograms i?kvietimo komanda, JMP komandos skiriasi priklausomai nuo
to, ar perjimas yra segmento viduje ar i?orje. Skirtumas yra tas, kad nra
i?saugomas gr?imo adresas. Be to yra galimas valdymo perdavimas baito su ?enklu
ribose.

1. Vidinis artimas.
1110 1011 poslinkis

Poslinkis traktuojamas kaip skaiius su ?enklu baite, diapazone: -128 – 127.

Skaiiuojant valdymo perdavimo adres, baitas yra i?pleiamas iki ?od?io ir
sudedamas su registre IP esania reik?me.

91


KOMPIUTERI ARCHITEKTRA


2. Vidinis tiesioginis.
1110 1001 posl.j.b. posl.v.b.

Poslinkis traktuojamas kaip skaiius su ?enklu ?odyje, diapazone: -32768 – 32767.

Skaiiuojant valdymo perdavimo adres, poslinkis yra sudedamas su registre IP
esania reik?me. Valdymo perdavimas atliekamas pridedant arba atimant atitinkam
reik?m, kurios diapazonas: -32768 – 32767, yra pakankamas perduoti valdym bet
kuri viet segmente.

3. Vidinis netiesioginis.
1111 1111 mod 100 r/m [poslinkis]

Tiesiogin adresacija komandoje JMP yra i?rei?kiama poslinkiu, o netiesioginje
adresacijoje valdymo perdavimo adresas yra imamas i? registro arba atminties ?od?io
ir nra sudedamas su registre IP esania reik?me.

Valdymo perdavimo adresas traktuojamas kaip skaiius be ?enklo ?odyje, todl
valdymo perdavimas galimas bet kuri viet segmente.

4. I?orinis tiesioginis.
1110 1010 adr.j.b. adr.v.b. seg.reg.j.b. seg.reg.v.b.

Laukas seg.reg.j.b. seg.reg.v.b. yra nusiuniamas registr CS.
Laukas adr.j.b. adr.v.b. yra nusiuniamas registr IP (tokiu bdu yra traktuojamas
kaip poslinkis segmente).

Adresas ia yra traktuojamas kaip skaiius be ?enklo ir jis yra siuniamas registr
IP, neatliekant sudjimo su buvusia registro IP reik?me, kaip vidinio tiesioginio
valdymo perdavimo atveju.


5. I?orinis netiesioginis.
1111 1111 mod 101 r/m [poslinkis]

Operandu nurodomas dviej bait laukas atmintyje.

Komandos laukas mod negali bti lygus 11.

Vykdant komand
, nurodyto lauko vyresnysis ?odis nusiuniamas registr CS, o
jaunesnysis ?odis nusiuniamas registr IP.




5.8. Slyginis valdymo perdavimas



92

Yra 17 slyginio valdymo perdavimo komand. T komand formatas:



OPK poslinkis


1 baitas 1 baitas

Vykdant komand yra tikrinami po?ymiai arba registro CX reik?m ir, priklausomai
nuo to tikrinimo rezultat, jei slyga yra patenkinta, tai prie registre IP esanios
reik?ms yra pridedamas poslinkio baitas, kuris yra traktuojamas kaip skaiius su
?enklu ir prapleiamas iki ?od?io.

Komanda I?plstinis Paai?kinimas Operacijos Tikrinama
pavadinimas kodas slyga
JA Jump if Above Pereiti, jeigu
77 CF = 0 ir
vir?ija
ZF = 0
JNBE Jump if Not Pereiti, jeigu ne
Below nor Equal ma?iau ir ne lygu
JAE Jump if Above or Pereiti, jei vir?ija
73 CF = 0
Equal arba lygu
JNB Jump if Not Pereiti, jei ne
Below ma?iau
JNC Jump if Not Pereiti, jeigu nra
Carry perne?imo
JB Jump if Below Pereiti, jeigu
72 CF = 1
ma?iau
JNAE Jump if Not Pereiti, jeigu
Above nor Equal nevir?ija ir
nelygu
JC Jump if Carry Pereiti, jeigu
perne?imas
JBE Jump if Below or Pereiti, jeigu
76 CF = 1 arba
Equal ma?iau arba lygu
ZF = 1
JNA Jump if Not Pereiti, jeigu
Above nevir?ija
JE Jump if Equal Pereiti, jeigu lygu
74 ZF = 1
JZ Jump if Zero Pereiti, jeigu
nulis
JCXZ Jump if CX is Pereiti, jeigu E3 CX = 0
Zero CX = 0
JG Jump if Greater Pereiti, jeigu
7F ZF = 0 ir
daugiau
SF = OF
JNLE Jump if Not Less Pereiti, jeigu ne
nor Equal ma?iau ir nelygu
JGE Jump if Greater Pereiti, jeigu
7D SF = OF
or Equal daugiau arba
lygu
JNL Jump if Not Less Pereiti, jeigu ne
ma?iau

93


KOMPIUTERI ARCHITEKTRA

7C SF nelygu OF
JL Jump if Less Pereiti, jeigu
ma?iau
JNGE Jump if Not
Pereiti, jeigu ne
Greater nor
daugiau ir nelygu
Equal
JLE Jump if Less or Pereiti, jeigu
7E ZF = 1 arba
Equal ma?iau arba lygu
SF nelygu OF
JNG Jump if Not Pereiti, jeigu ne
Greater daugiau
JNE Jump if Not Pereiti, jeigu
75 ZF = 0
Equal nelygu
JNZ Jump if Not Zero Pereiti, jeigu ne
nulis
JNO Jump if Not Pereiti, jeigu ne 71 OF = 0
Overflow perpildymas
JNP Jump if Not Pereiti, jeigu nra
7B PF = 0
Parity lyginumo
JPO Jump if Parity Pereiti, jeigu bit
Odd suma nelyginin
JP Jump if Parity Pereiti, jeigu yra
7A PF = 1
lyginumas
JPE Jump if Parity Pereiti, jeigu bit
Even suma lygin
JO Jump if Overflow Pereiti, jeigu 70 OF = 1
perpildymas
JNS Jump if No Sign Pereiti, jeigu
79 SF = 0
?enklo bitas yra
nulis
JS Jump if Sign Pereiti, jeigu
78 SF = 1
?enklo bitas yra
vienetas



5.9. Cikl komandos


LOOP – ciklas.
E2 poslinkis

Poslinkis yra vieno baito.
Pakartojimas vykdomas tiek kart, kokia yra registro CX reik?m.
Vykdant yra ma?inama registro CX reik?m: CX CX - 1.

Jeigu registre CX esanti reik?m nelygi nuliui, tai sekanti komanda nustatoma taip:
einamasis IP + poslinkis, paimtas i? komandos : IP IP + poslinkis.

Jeigu registre CX esanti reik?m lygi nuliui, tai vykdoma kita, toliau esanti, komanda.

Ciklo komanda valdymas gali perduodamas per -128 – 127 baitus.

94

Maksimalus ciklo pakartojimo skaiius yra 65 536.
LOOPE – LOOP if Equal – pakartoti jeigu lygu.
E1 poslinkis

Poslinkis yra vieno baito.
Pakartojimas vykdomas tiek kart, kokia yra registro CX reik?m.
Vykdant yra ma?inama registro CX reik?m: CX CX - 1.

Jeigu registre CX esanti reik?m nelygi nuliui ir po?ymis ZF = 1, tai sekanti komanda
nustatoma taip: einamasis IP + poslinkis, paimtas i? komandos : IP IP + poslinkis.

Jeigu registre CX esanti reik?m lygi nuliui, tai vykdoma kita, toliau esanti, komanda.

Ciklo komanda valdymas gali perduodamas per -128 – 127 baitus.

Maksimalus ciklo pakartojimo skaiius yra 65 536.

Alternatyvi ?ios komandos mnemonika – LOOPZ – LOOP if Zero – pakartoti, jeigu
nulis.


LOOPNE – LOOP if Not Equal – pakartoti jeigu nelygu.
E0 poslinkis

Poslinkis yra vieno baito.
Pakartojimas vykdomas tiek kart, kokia yra registro CX reik?m.
Vykdant yra ma?inama registro CX reik?m: CX CX - 1.

Jeigu registre CX esanti reik?m nelygi nuliui ir po?ymis ZF = 0, tai sekanti komanda
nustatoma taip: einamasis IP + poslinkis, paimtas i? komandos : IP IP + poslinkis.

Jeigu registre CX esanti reik?m lygi nuliui, tai vykdoma kita, toliau esanti, komanda.

Ciklo komanda valdymas gali perduodamas per -128 – 127 baitus.

Maksimalus ciklo pakartojimo skaiius yra 65 536.

Alternatyvi ?ios komandos mnemonika – LOOPNZ – LOOP if Not Zero – pakartoti,
jeigu ne nulis.

5.10. Pertraukim komandos

INT – INTerrupt – programinis pertraukimas.

CD tipas
Atliekami veiksmai:
1. SP SP - 2
2. Stekas SF

95


KOMPIUTERI ARCHITEKTRA

3. SP SP - 2
4. Stekas CS
5. SP SP - 2
6. Stekas IP
7. IF 0
8. TF 0
9. CS tipas · 4 + 2
10. IP tipas · 4

9-tu ir 10-tu veiksmais yra perduodamas valdymas pertraukimo apdorojimo
program.

CD 3 – sustojimo ta?ko pertraukimas yra ekvivalentus specialiai pertraukimo
komandai i? vieno baito – CC. Komanda asembleriu u?ra?oma INT 3, o ma?ininiai
kodai CD 3 ir CC yra ekvivalents:
CS 3 · 4 + 2 = CC + 2
IP 3 · 4 = CC

Komanda INT 4, kurios kodas yra CD 4, ekvivalenti komandai INTO – INTerrupt if
Overflow – pertraukimas jeigu yra perpildymas. Pertraukimas vyksta, jeigu OF = 1,
ir :
CS 4 · 4 + 2 = 10h + 2
IP 4 · 4 = 10h



IRET – INTerrupt Return – gr?imas i? pertraukimo apdorojimo programos.
CF

Atliekami veiksmai:
1. IP Stekas
2. SP SP + 2
3.
CS Stekas
4. SP SP + 2
5. SF Stekas
6. SP SP + 2















96

5.11. Procesoriaus bsenos valdymas ir
sinchronizavimas


Yra septynios komandos po?ymi CF, DF ir IF valdymui.

CLC – CLear Carry flag – i?valyti perne?imo po?ym: CF 0
1111 1000

STC – SeT Carry flag – nustatyti perne?imo po?ym: CF 1
1111 1001

CMC – CoMplement Carry flag – invertuoti po?ym CF
1111 0101

CLD – CLear Direction flag – i?valyti krypties po?ym: DF 0
1111 1100

STD – SeT Direction flag – nustatyti krypties po?ym: DF 1
1111 1101

CLI – CLear Interrupt flag – i?valyti pertraukimo po?ym: IF 0
1111 1010

STI – SeT Interrupt flag – nustatyti pertraukimo po?ym: IF 1
1111 1011


HLT – HaLT – sustabdyti.
1111 0100

Komanda perveda procesori sustojimo bsen, i? kurios procesorius gali i?eiti ?iais
atvejais:
1. RESET signalas CLR.
2. Operatorinis pertraukimas NMI.
3. I?orinis pertraukimas, jeigu jis neu?draustas, t.y., IF = 1.

Komanda HLT yra perjimas pertraukimo laukimo bsen.


WAIT – laukti.
1001 1011

Procesorius, vykdydamas komanda WAIT, kas penki taktai tikrina signal TEST.
Procesorius, sulauks signalo TEST, pradeda vykdyti kit komand, esani po WAIT
komandos.


97


KOMPIUTERI ARCHITEKTRA

WAIT komandos paskirtis yra procesoriaus pristabdymas, kol i?orinis renginys baigs
darb. Jeigu TEST = 1, tada komanda WAIT yra nurodytas laukimas, o jeigu TEST =
0, tai vykdoma kita komanda. Signal TEST valdo i?oriniai renginiai, tame tarpe ir
koprocesorius 8087. Mikroprocesorius laukimo metu gali sureaguoti pertraukimus,
kuriuos vykds vl gr?ta laukimo bsen.


LOCK – LOCK the bus – u?daryti magistral.
1111 0000

?itas prefiksas gali bti panaudotas prie? bet koki komand. Jis priveria procesori
Intel 8088 blokuoti magistral tos komandos vykdymo metu, kad joks kitas
procesorius negalt naudoti magistrals.

Magistral sujungia procesori 8088 su i?ore: tai yra multikpleksin adreso/duomen
magistral. Bendra magistral gali bti valdoma savu kontroleriu. Procesorius Intel
8088 gali dirbti dviem re?imais:
1. Valdaniosios magistrals signalus generuoja pats 8088 procesorius.
2. Magistral valdo magistrals kontroleris – speciali mikroschema.

Komanda LOCK monopolizuoja prijim prie atminties, tam kad netrukdyt kiti
sistemos procesoriai.

ESC – ESCape – nubgti.
1101 1xxx mod yyy r/m [poslinkis]

?ios komandos pagalba koprocesorius 8087 gauna savo komandas ir operandus
procesoriaus 8088 darbo metu. Pats procesorius 8088 tuo metu nieko nedaro, tik i?
atminties paima operand ir j nusiunia magistral.

Procesoriaus 8088 komandos skaitymo i? atminties metu, koprocesorius 8087 nuolat
stebi magistral ir „pasigauna” komand ESC. Po to koprocesorius 8087 kontroliuoja
magistral ir „pasigauna” adresavimo bait. Bitai xxx ir yyy i? komandos ESC pirm
dviej bait traktuojami kaip koprocesoriaus operacijos kodas. Kuomet procesorius
8088 nusiunia operando adres magistral (jeigu komandos operandas buvo
atmintis), koprocesorius t operando adres “pagauna” ir pratsia pradtos komandos
vykdym. procesoriaus Intel 8088 registrus tada niekas nepatenka. Jeigu laukas mod
= 11, tai operandas yra registre, todl procesorius 8088 nieko nedaro.

Pavyzdys.

DED9 1101 1110 1101 1001


ESC xxx mod yyy r / m

Procesori 8088 ir 8087 registrai vienas kitam nra prieinami, ir informacij jie gali
perduotit tik per atmint. Jeigu laukas mod = 11, tada komanda ESC
mikroprocesoriuje veikia kaip NOP. Komandos ESC prasminis operandas yra
operandas atmintyje, o komand su operandu registre mikroprocesorius vykdo kaip
NOP.
Ar operandas yra baitas ar ?odis, priklauso nuo koprocesoriaus operacijos xxx yyy.

98


   
 Top


Advertise on our site! Click here

 powered by Peperoni.de Users online right now: 21696   Help/FAQ   Terms   Imprint