Mikroprogramavimo kalba (MPL)
-48, -42, -8, -6, -3, -2, 0, 34, 16382, 16383, beslyginis valdymas
Nusisti -48 MBR 2 komandom
1) X = 15; D = LEFT_SHIFT (COM (1) + COM (1)); // X = 15, D = -8
2) MBR = LEFT_SHIFT (COM (X) + D); // COM (X) = 16, MBR = (-8 + (-16))*2 = -48
Ats.:
1) X = 15; D = LEFT_SHIFT (COM (1) + COM (1));
2) MBR = LEFT_SHIFT (COM (X) + D);.
Dviem komandomis ra?yti de?imtain skaii -42 registr MBR.
1) X = 15; D = LEFT_SHIFT(1 + 1); // X = 15, D = -4
2) MBR = LEFT_SHIFT(COM(X) + COM(D)); // COM (15) = -16, COM (4) = -5
Ats.:
1) X = 15; D = LEFT_SHIFT(1 + 1);
2) MBR = LEFT_SHIFT(COM(X) + COM(D));
ra?yti -8 MBR per vien komand
1) MBR = LEFT_SHIFT (COM (1) + COM (1)); // COM (1) = -2, -2 + (-2) = -4, -4 * 2 = -8
Ats.:
MBR = LEFT_SHIFT (COM (1) + COM (1));
ra?yti -6 MBR per vien komand
-6 =..111010
COM(1)
...11110
+...11111
=...11101
LEFT_SHIFT(...11101) ->...111010
Ats.:
MBR = LEFT_SHIFT (COM (1) + (-1));
Parasyti mikrokomanda, kuri registre MBR suformuoja reiksme -3, nenaudojant skaitymo is
atminties
11
-3(dec) = 11111101(bin)
COM(1): 11111110
LEFT_SHIFT: 11111100
+1: 11111101
Ats.:
MBR = LEFT_SHIFT (COM (1)) + 1;
Para?yti mikrokomand MPL kalba be konstant ir registr, kuri MBR ra?o -2.
COM(REG) invertuoja registro REG bitus (0 pakeiia 1, ir atvirk?iai). Taigi MBR + COM(MBR),
kad ir kokia pradin MBR reik?m bebt, gr?ins 1111111111111111 (registras MBR yra
?e?iolikos bit). Paslink ?i reik?m kair per vien bit gausime 1111111111111110. Tai ir yra
skaiius -2 (papildomu kodu), nes 1111111111111110 + 0000000000000010 = 0 (16-oje bit).
Pra?om si?irti "ms" Mikroprograminio lygio architektr (doc. A. Mita?ino "Kompiuteri
architektra", 16 psl.), u?ra?as MBR = LEFT_SHIFT(MBR + COM(MBR)); MPL kalba reik? 6-os,
15-os, 29-os, 30-os ir 36-os magistrali atidarym atitinkamais pocikliais.
COM - complement (pakeisti, invertuoti).
Ats.:
MBR = LEFT_SHIFT (COM (MBR) + MBR);
Nesinaudojant konstantiniais registrais irasyti i MBR 0
Sprendimas
MBR =COM (MBR) + MBR;
MBR =COM (MBR) + COM (MBR);
Cia naudojame dvi gudrybes: COM (MBR) + MBR = -1 ir COM (MBR) = 0.
Kadangi nera antro tokio registro susieto su dviejais sumatoriaus iejimais, rezultata ishsaugome
MBR.
Ats.:
1) MBR = COM (MBR) + MBR;
2) MBR = COM (MBR) + COM (MBR);
ra?yti 34 MBR dviem komandomis
Vis pirma, reikia suprasti, k rei?kia pasakymas "dviem komandomis". MPL kalba u?ra?yta viena
eilut rei?kia vien komand. Ta viena komanda turi bt vykdoma per vien cikl. Pvz. negalima
komanda MBR = A + D; MBR = MBR + C; nes tam reikia dviej cikl (reikt ra?yti dviejose
eilutse - dviem komandomis).
O ra?yti 34 MBR galima taip:
X = 15; D = 1 + 1;
MBR = LEFT_SHIFT(X + D);
Pastaba: vietoje registro D negaljome naudoti jokio kito registro, nes:
1) registras X yra sujungtas tik su kairiuoju sumatoriaus jimu, taigi kitas dmuo turi bti sujungtas
su de?iniuoju (?irti schem 16 psl.), o tokie registrai yra tik C, D, MBR ir konstantiniai.
12
2) taiau nra magistrals jungianios registr C su sumatoriaus I?JIMU, taigi jam nieko negalima
tiesiogiai priskirti (negaltume u?ra?yti C = 1 + 1)
Tiems, kas dar nesuprato: perstumti bitus kair - tai tas pats, kas reik?m dauginti i? 2, nes visi
bitai perstumiami "per vien dvejeto laipsn". Perstumti bitus de?in - tas pats, kas reik?m dalinti
i? dviej be liekanos.
Ats.:
1) X = 15; D = 1 + 1;
2) MBR = LEFT_SHIFT (X + D);
U?ra?yti MPL komand, ra?ani de?imtain skaii 16382 registr MBR.
Vis pirma, kadangi reikia ra?yti didel skaii, tai jau ai?ku, kad ka?kas bus daroma su
konstantiniu registru SIGN :)
SIGN = 1000000000000000 = -32768
COM(SIGN) = 0111111111111111 = 32767
COM(1) = -2
COM(SIGN) + COM(1) = 32765
Visa tai padalinus i? dviej (be liekanos), gausime tai, ko reikia. RIGHT_SHIFT btent ir veikia
kaip dalyba i? dviej be liekanos.
Taigi pilna komanda: MBR = RIGHT_SHIFT(COM(SIGN) + COM(1))
Ats.:
MBR = RIGHT_SHIFT (COM (SIGN) + COM(1));
Para?yti mikrokomand, kuri skaii 16383 nusiunia i registr MBR.
Ats.: MBR = RIGHT_SHIFT (SIGN + (-1)) arba MBR = RIGHT_SHIFT (COM (SIGN) + 0)
7. Parasyti mikrokomanda, kuri skaiciu 16383 nusiuncia i registra MBR.
Ideja tokia siunciame i kairiji sumatoriu SIGN(1000000000000000) ir ji
invertuojame (0111111111111111(bin)=32767(dec)) ir gauta rezultata
pastumiame i desine, t.y div 2 (0011111111111111111(bin) = 16383). Tai butu
MBR = RIGHT_SHIFT(COM(SIGN) + 0).
7. Para?yti mikrokomanda, kuri skaiciu 16383 nusiuncia i registra MBR.
(abiem variantam tas pats?)
Ats:
MBR = RIGHT_SHIFT (SIGN + (-1));
arba
MBR = RIGHT_SHIFT (COM (SIGN) + 0);
13
Para?yti beslyginio valdymo perdavimo mikrokomand.
Ats.:
GOTO label;
7. Parasyti mikrokomanda, kuri i registrus A ir D nusiuncia
sesioliktaine reiksme 8001.
Mano versija:
D = (SIGN + 1); A = D;
14
Po?ymi registras SF (Status Flag)
Registras SF = 0000. Sudties komanda prie de?imtains reik?ms 222 pridedama de?imtain
reik?m 98. U?ra?yti nauj SF reik?m.
Ats.:
SF = 0011h.
Registras SF = 0000. Atimties komanda i? de?imtains reik?ms 99 atimama de?imtain reik?m -
33. U?ra?yti nauj SF reik?m.
Ats.:
SF = 0895h.
Registras SF = 0000. Duotos dvi de?imtains reik?ms: 99 ir -33. Atliekama operacija CMP.
U?ra?yti nauj SF reik?m.
Ats.:
SF = 0895h.
// Nustatant SF, atminties komanda ekvivalenti CMP.
Registras SF=0000.
Baitu sudties komanda prie 10-taines reik?ms 247 yra prideda 10-aine reik?m 137. Pagal
rezultat suformuoti SF
Sprendimas
Sk.bezenklo - sk.suzenklu - binary
247 = -9 - 11110111
137 = -119 - 10001001
1) Ziurime skaiciu be zenklo suma: 247+137=384 - iseina uz ribu (ribos sk.be zenklo yra 0..256),
rejshkias CF=1;
2) Ziurime sk. su zenklu suma: -9 + -119=-128 - neiseina uz ribu (ribos sk. su zenklu yra -128..127),
rejshkias OF=0;
3) Sudedam binary mode kad nustatyti likusius flagus:
1111 0111
+ 1000 1001
=11000 0000 -> SF =1(zenklo bitas =1), ZF=0(atsakymas 0) ; AF=1 (perne?imas i? jaunesnio
pusbaiio buvo), PF=0 (nes vienetu skaicius atsakyme nelyginis).
Prisimename SF format
F E D C B A 9 8 7 6 5 4 3 2 1 0
x x x x OF DF IF TF SF ZF x AF x PF x CF
15
i? salygos ir sprendimo
SF= 0000 0000 1001 0001 ~ 0091h
Ats.:
0091h
U?duotys:
a) Registras SF=0000. Sudties komanda prie de?imtains reik?ms 69 pridedama de?imtain
reik?m 99. U?ra?yti nauj SF reik?m.
b) Registras SF=0000. Sudties komanda prie de?imtains reik?ms 103 pridedama de?imtain
reik?m 111. U?ra?yti nauj SF reik?m.
c) Registras SF=0000. Sudties komanda prie de?imtains reik?ms 236 pridedama de?imtain
reik?m 138. U?ra?yti nauj SF reik?m.
d) Registras SF=0000. Sudties komanda prie de?imtains reik?ms 249 pridedama de?imtain
reik?m 138. U?ra?yti nauj SF reik?m.
e) Registras SF=0000. Sudties komanda prie de?imtains reik?ms 88 pridedama de?imtain
reik?m -44. U?ra?yti nauj SF reik?m.
f) Registras SF=FFFF. Sudties komanda prie de?imtains reik?ms -138 pridedama de?imtain
reik?m -145. U?ra?yti nauj SF reik?m.
g) Registras SF=0000. Sudties komanda prie de?imtains reik?ms -119 pridedama de?imtain
reik?m 122. U?ra?yti nauj SF reik?m.
h) Registras SF=0000. Atimties komanda i? de?imtains reik?ms 99 atimama de?imtain
reik?m -33. U?ra?yti nauj SF reik?m.
16
JMP
AX = 0003, BX = 0000, CX = 0001, DX = 0000.
FFFA EB A1 JMP number
valdymo perdavimo adresas?
Sprendimas
FFFCh - IP reik?m(nes kadangi komanda 2 bait ilgio, o IP rodo i sekancia komanda), EBA1h -
opkodas su operandais (2 baitai).
EBh - JMP NEAR (vidinis artimas) su 1 baito poslinkiu.
IP lygus IP + poslinkis i?plstas iki 2 bait. A1h 1 baite (-95) -> FFA1h 2 baituose.
FFFCh
+FFA1h
______
1FF9Dh
Suma?iname iki IP registro dyd?io (2 baitai)
Ats.:
FF9Dh
AX = 0003, BX = 0002, CX = 0001, DX = 0000.
B901 EB80 jmp number.
koks sekancios komandos adresas?
Sprendimas
B901 - IP registro reik?m, EB80 - opkodas ir operandai.
n?n ar "jmp number" yra nurodyta slygoje, todl nagrinju opkoda. EB tai JMP NEAR (vidinis
artimas) su vieno baito poslinkiu. Todl 80 yra poslinkis.
Dmesio!!! 80h u?ra?ius viename baite, gauname skaii su ?enklu papildomu kodu. IP yra 2 bait
dyd?io. I?pliame 80h (-128) iki 2 bait, gauname FF80h (-128).
Valdymo perdavimo adresas bus IP +FF80h.
Kita nuomone/papildymas: IP +FF80h yra teisinga, bet reikia tureti omeny, kad vykdant komanda
IP rodo i sekancia komanda (musu komanda 2B ilgio), todel IP + FF80h = B901h + 2h + FF80h =
B883
Ats.:
B883h
17
8EDC E9 12 34 jmp SKIP
Ats.: 8EDC + 1234 + 3 = (ATS: A113)
9854 EB EC90 jmp poslinkis
EB yra jmp vidinis artimas, t.y poslinkis 1 baitas.
Tada adresas bus perduodamas: 9856(prie esamo adreso pridedame du,nes IP
yra ne einamoji komanda, o kitos skaitomos komandos adresas t.y.
9856)+FFEC(priekyje prirasome FF, nes EC yra neigiamas, ne vyriausiame bite
yra vienetas, o poslinkis traktuojamas kaip -128 - 127)=9842
Ats.:
9842h
b.8EDC E9 12 34 jmp SKIP (ATS: A113)
18
LOOP
vykd?ius nurodyt komand apskaiiuoti sekanios komandos efektyv adres, kai
AX=0003, BX=0002, CX=0001, DX=0000.
FFFE E2 F2 90 loop number (FFFE yra poslinkis kodo segmente)
Sprendimas
FFFEh yra poslinkis kodo segmente - IP reik?m prie? komandos vykdym. IP po loop number yra
IP=0000 (1 baito opkodas, 1 baito poslinkis).
loop suma?ina cx vienetu ir tada tikrina ar jis nelygus 0. jei nelygus tai vykdomas valdymo
perdavimas. cx=1 todl sekanios komandos EA yra IP reik?m
Ats.:
0000h
Nesutvarkyta informacija:
Duotos registr reik?ms:
AX = 0002, BX = 0001, CX = 0000, DX = 0003 ir tokia komanda
FFFD E2 FD loop cikl1(pastaba:FFFD yra ip dabartine reiksme).
Klausimas: rasti registru ax, bx, cx, dx, ip suma ivykdzius nurodyta komanda.
3. vykd?ius nurodyta komanda apskaiiuot sekanios komandos efektyvu adres, kai AX=0003,
BX=0002, CX=0001, DX=0000:
FFFE E2 F2 90 loop number (FFFE yra poslinkis kodo segmente)
3.Pateikti valdymo perdavimo adreso apskaiciavima:
a.E71F E2 FA loop INIT (ATS: E71D)
4. Duotos registru reiksmes ax=0002, bx=0001, cx=0000, dx=0003 ir
tokia komanda FFFD E2 FD loop cikl1(pastaba:FFFD yra ip dabartine
reiksme).Klausimas: rasti registru ax, bx, cx, dx, ip suma ivykdzius
nurodyta komanda.
CALL
4. Skaicia netikslus bet minti galima pagauti:
duota:
71C0 87 78 91 call number
(ATS: 033B)
19
pasakyti kokiu adresu bus perduotas valdymas. Vel atsakymas sesioliktainis.
Autoriaus pastaba: Cia pirmas skaiciu sreiskia dabartini ip. Del to paskutiniai tyrs baitai - komandos
kodas, na tu paskutiniai baitai poslinksi kuriuo reikia perduoti valdyma. Tai su dedam 71C3 + 9178
ir gauname nauja reiksme. Jei tai 5 bitai, pirma bita pamirshtame.
Pateikti valdymo perdavimo adreso apskaiiavim:
3. Pateikti valdymo perdavimo adreso apskaiciavima;
07FD 75 F1 90 jne ABC
004C 75 14 90 90 90 jne ABC
0F01 E8 FF00 call DEF
005D E8 FFBC call DEF
4. Apskaiciuoti valdymo perdavimo adresa:
71E0 E8 D1A2 call number
E8 yra call vidinis tiesioginis, t.y. poslinkis 2 baitai. tada adresas bus
perduodamas
71E0+A2D1(sukeista vietomis, nes pirmiau masininiame kode eina jaunesnysi
po to vyresnysis)=14B1
20
Stekas
Duota AX=0100, BX=0001, DX=0002, CX=0015, SP=0000, SS=0522.
Vykdomas toks programos fragmentas:
PUSH SP
Kokia reik?m bus dta stek?
Sprendimas
Procesorius vis pirma suma?ins 2 SP registro reik?m (nes steke operuojame ?od?iais), o tik po to ds stek.
Tai yra "ypatinga" 8086 (8088) procesori svyb, tarkim Pentium i vlesni ds SP nesuma?inta...
Ats.:
FFFE
Raskite steko vir?ns reik?m vykd?ius komand 3410 9A EBFE 1234 (call text)
SS = ABCD
SP = 0002
BP = AF00
CX = 0010
Ats.:
3415
9. Registru AX ir BX reiksmes yra CCCC, registru IP ir SP reiksmes yra desimtainis skaicius 256.
Steko virsunes reiksme yra 1234. Vykdant fragmenta:
a. pop ss
mov sp, bx
b. pop ss
mov sp, bx
pirmaja komanda kyla pertraukimo signalas. Kokia sekanti reiksma bus irasyta i steka.
1. Registr AX ir BX reik?ms yra DC5C, registr IP ir SP reik?ms yra de?imtainis skaiius
1024. steko vir?ns reik?m yra 128. Vykdant fragment:
a. mov ss, ax
mov sp, bx
b. mov si, ax
mov sp, bx
pirmj komand kyla pertraukimo signalas. Kokia sekanti reik?m bus ra?yta
stek?
21
9. Duotos registru SS ir SP reiksmes. Klausimas: kokia bus registro
SP reiksme ivykdzius komanda int 3
9. Registru AX ir BX reiksmes yra CCCC, registru IP ir SP reiksmes yra desimtainis skaicius 256.
Steko virsunes reiksme yra 1234. Vykdant fragmenta:
a. pop ss
mov sp, bx
b. pop ss
mov sp, bx
pirmaja komanda kyla pertraukimo signalas. Kokia sekanti reiksma bus irasyta i steka.
Registr AX ir BX reik?ms yra DC5C, registr IP ir SP reik?ms yra de?imtainis skaiius 1024.
steko vir?ns reik?m yra 128. Vykdant fragment:
mov ss, ax
mov sp, bx
mov si, ax
mov sp, bx
pirmj komand kyla pertraukimo signalas. Kokia sekanti reik?m bus ra?yta
stek?
9. Duotos registru SS ir SP reiksmes. Klausimas: kokia bus registro
SP reiksme ivykdzius komanda int 3
9. Registras SS=ABCD, SP=00F2, BP=AF00, CX=0010. Kokia registro SP reik?m 16-aineje
sistemoje vykd?ius gr?imo i? tolimos procedros komanda: CACBCC.
SS=ABCD SP=00F2 BP=AF00 CX=0010
SP po sugrizhimo ish proceduros su komanda CACBCC?
Dieve gelbk! Dieve gelbk!
Sprendimas
Pagal ideja zhodis "sugrizhimo" duoda mums suzhinoti kad komanda RET buvo
panaudota -> ir tiksliai pirmosios dvi raides "CA" = 1100 1010 tai komandos
RET binary code
Taigi toliau komanda RET daro sekancius veiksmus ->
IP talpinamas i steka
SP didinamas 2
CS talpinamas i steka
SP didinamas 2
SP = SP + betarpishkas operandas
o operanda mes turime - tai tie "CBCC"
taigi SP = SP + 2 + 2 + CCCB (nes CC vyresnysis baitas operando)
SP = CDC1
Sprende Werri bet nzn ar tai teisinga
Atsakymas
22
CDC1
23
AAD, AAM, AAA (AAS), DAA (DAS)
AAD
Algoritmas:
AL = AH * 10 + AL
AH = 0
Registras AL = 07, BX = AF00, CX = 0002. Kokia bus registro AX reik?m, vykd?ius komand
AAD?
Ats.:
AX = 0007h
AX = 0C05. Kokia bus registro AX reik?m, vykd?ius komand AAD?
Ats.:
AX = 007Dh
Registras AL = 07, AH = 05, BX = AF00, CX = 0001. Kokia bus registro AX reik?m
?e?ioliktainje sistemoje vykd?ius komand AAD?
Komanda AAD atlieka tokius pertvarkimus:
AL := AH * 10 + AL;
AH := 0;
AL reik?m bus 57 = 39h
AH = 0
Tai AX reik?m bus 0039h
Ats.:
AX = 0039h
1. AL=FC AH=07 CX=0000 vykdoma komanda AAD. AX=?
AL = FC, AH = 07, CX = 0. Para?ykite AX reik?m po AAD.
AAD (ASCII Adjust AX before Division) operacija:
AL = AH * 10 + AL
AH = 0,
24
aigi:
AL = 07h * 0Ah + FCh = (1)42h
AH = 0
AX = 0042h
Ats.:
AX = 0042h
AL = FF, AH = 06, CX = 0000. Koks AX po AAD?
Vis pirma pervedame nesupakuot de?imtaini format. Tai darome pagal AAS algoritm, bet
neatsi?velgdami AF (taip reikia:). Gauname 0509h (2 baituose). Tai de?imtainis skaiius 59.
Pervedame 59 skaiiaus be ?enklo format 2 baituose (AX registre) ir gauname AX=3Bh
karoe ?inau paprastesn bd (pagal AAD vykdymo algoritma):
AL = AH x 10 + AL;
AH = 0;
taigi pirmiausia AH padauginam i? 10 (de?imtainio):
06h x 10 = 3Ch
pridedam AL:
FF + 3C = 13B
Taigi: AL = 3B, AH = 00, bendrai AX = 003B
Ats.:
AX = 003Bh
AAM
Algoritmas:
AH = AL div 10
AL = AL mod 10
Duotos registr reik?ms: AH = 09, AL = 89, CX = 0002. Kokia bus registro AX reik?m vykd?ius komand AAM?
Ats.:
25
AX = 0D07h
AX = 0713. Vykdoma komanda AAM. AX = ?
Ats.:
AX = 0109h
AAA (AAS)
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
2. Duota registro AX reiksme ax=000B ir AF = 1.Klausimas: Kokia bus
registro AX reiksme ivykdzius komanda AAS.
DAA (DAS)
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
kitam variantui lygtais buvo: rasti SF reiksme
26
po komandos DAA.
2. AL=FB AF=1 vykdoma komanda DAA. AL=?
3. AL=FF AF=0;
AL po DAA
Sprendimas
Vykdome DAA konspekte apra?yta algoritm.
AL and 0Fh lygu F. F yra daugiau u? 9, todl pridedame (operacija Decimal Adjust for Addition)
prie AL 6 ir nustatome AF, gauname 5 (i? ties 105h bet AL tai tik 1 baitas).
AL (05) nra daugiau u? 9Fh, bet kai prie al pridejome 6, uzsidejo cf=1, todl dar pridedame 60h.
AL =65, AF =1, CF=1
IMHO, ats. turi but 05h. I CF neatsizvelgiame, nes jis uzsidejo veiksmo metu.@
Atsakymas
65
27
REP
Registr SI ir DI reik?ms yra 0004, registras CX=0003, registrasSF=0600. kokios bus registr SI ir
DI reik?ms vykd?ius komand: rep scasw?
Ats.:
DI = FFFE, SI = 0004
Duota: SI = 000E, DI = 000E, Cx = 0002 SF = 0C00 (cia a varianto reiksmes). Kokia bus SI ir DI
suma atlikus: rep stosw.
Atsakymas 000C, DF = 1 (atrodo).
Registru SI ir DI reik?ms yra 000A; CX=0010(CX=0011), SF=FFFF. Kokia bus registru SI ir DI
reik?mi suma, vykd?ius komanda: rep lodsw.
10. Registru SI ir DI reiksmes yra 001A, regist. CX=0002, reg. SF=0C00.
Kokio bus registru SI ir DI reiksmiu suma, ivykdzius komanda: rep stosw?
Cia reikia zinoti eilutiniu komandu vykdimo schema ir SF registro sudeti.
Is SF nustatome, kad DF = 1. O stosw (raide w rodo, kad bus operuojama su
zodziais).
Tai vadinasi SI ir DI reiksmes bus mazinamos 2. (is DF=1 ir tai kad
operuojama su zodziais).
Komanda STOS modifikuoja tik DI registro reiksme.
Pirma karta vykdoma komanda
rep stosw (atliekami tokie veiksmai tikrina ar CX = 0(jei lygu baigia
pakartojimo kpmanda), jei CX <> 0, tai CX <- CX - 1 (musu atveju CX = CX -
1 = 0001), tada DI = DI - 2 + 0018)
Antra karta vykdoma komanda
rep stosw (CX <> 0, tai CX <- CX - 1 (musu atveju CX = CX - 1 = 0000), tada
DI = DI - 2 + 0016)
Trecia karta vykdoma komanda
rep stosw (CX = 0, baigiama vykdyti pakartojimo komanda)
SI reiksme nepakito. Isliko 001A. O DI tapo 0016.
Tada DI+SI=0016+001A=0030.
(Reikia atkreipti demesi, kad pakartojimo komandos nutraukiamos ir dar kai
Z=ZF, t.y. specifiniai atvejai).
10. Duota: SI = 000E, DI = 000E, Cx = 0002 SF = 0C00 (cia a varianto reiksmes). Kokia bus SI ir
DI suma atlikus: rep stosw.
28
Atsakymas 000C, DF = 1 (atrodo).
9. Registr SI ir DI reik?ms yra 0004, registras CX=0003, registrasSF=0600. kokios bus registr
SI ir DI reik?ms vykd?ius komand: rep scasw? (ATS: DI=FFFE, SI=0004)
10. SI=E587 DI=fff8 CX=0011 SF=0000 Kokia SI ir DI suma ivykdzius komanda rep stosb?
Duotos registr reik?ms:
SI=EE8B
DI=12CD
CX=0029
SF=0000
Vykdoma REP lodsw.
Reikia rasti SI + DI po komandos vykdymo.
Sprendimas
Vis pirm patikriname kokia yra DF po?ymio reik?m, ji yra 0 (naudojams
duota SF registro reik?me).
Dl prefikso bus didinama SI ir DI reik?m. LODSW (man atrodo, kad ?i
komanda didina tik SI registro reik?m, nes ?i komanda AX pakrauna i?
DS:SI)komanda bus kartojama 29h kart (CX registras nurodo kartojim
kiek).
Kadangi pakraunamas ?odis, o ne baitas, todl bus pridedama po 2, t.y.
SI=EE8Bh +2*29h =EE8Bh +52h =EEDDh.
Suma:
SI+DI
EEDDh
+12CDh
-----
101AAh
Pagal slyga, neduota ar mes kur nors ra?ome t reik?m, todl neai?ku ar
ra?yti 101AAh, ar 01AAh. T.y. nra pasakyta ar t sum turi suskaiiuoti
procesorius ar studentas, studentas "nepersipildo" (jo skaii diapazonas nra
ribotas kaip procesoriaus), tad reikia ra?yti 101AAh, bet jeigu tarkim bus
para?yta add si, di, tai ia perne?imas bus.
Atsakymas
SI + DI = 101AAh
29
Load byte at DS:[SI] into AL. Update SI.
Algorithm: AL = DS:[SI] if DF = 0 then
o SI = SI + 1
else
o SI = SI - 1
Example:
LODSB No operands
ORG 100h
LEA SI, a1
MOV CX, 5
MOV AH, 0Eh
m: LODSB
INT 10h
LOOP m
RET
a1 DB 'H', 'e', 'l', 'l', 'o'
C Z S O P A
unchanged
Load word at DS:[SI] into AX. Update SI.
Algorithm: AX = DS:[SI] if DF = 0 then
o SI = SI + 2
else
LODSW No operands
o SI = SI - 2
Example:
ORG 100h
LEA SI, a1
MOV CX, 5
REP LODSW ; finally there will be 555h in AX.
RET
30
a1 dw 111h, 222h, 333h, 444h, 555h
C Z S O P A
unchanged
Copy byte at DS:[SI] to ES:[DI]. Update SI and DI.
Algorithm: ES:[DI] = DS:[SI] if DF = 0 then
o SI = SI + 1
o DI = DI + 1
else
o SI = SI - 1
o DI = DI - 1
MOVSB No operands
Example:
ORG 100h
CLD
LEA SI, a1
LEA DI, a2
MOV CX, 5
REP MOVSB
RET
a1 DB 1,2,3,4,5
a2 DB 5 DUP(0)
C Z S O P A
unchanged
Copy word at DS:[SI] to ES:[DI]. Update SI and DI.
Algorithm: ES:[DI] = DS:[SI] if DF = 0 then
MOVSW No operands
o SI = SI + 2
o DI = DI + 2
else
o SI = SI - 2
31
o DI = DI - 2
Example:
ORG 100h
CLD
LEA SI, a1
LEA DI, a2
MOV CX, 5
REP MOVSW
RET
a1 DW 1,2,3,4,5
a2 DW 5 DUP(0)
C Z S O P A
unchanged
Compare bytes: AL from ES:[DI].
Algorithm: ES:[DI] - AL set flags according to result:
OF, SF, ZF, AF, PF, CF if DF = 0 then
SCASB No operands
o DI = DI + 1
else
o DI = DI - 1
C Z S O P A
r r r r r r
Compare words: AX from ES:[DI].
Algorithm: ES:[DI] - AX set flags according to result:
SCASW No operands
OF, SF, ZF, AF, PF, CF if DF = 0 then
o DI = DI + 2
else
32
o DI = DI - 2
C Z S O P A
r r r r r r
Store byte in AL into ES:[DI]. Update DI.
Algorithm: ES:[DI] = AL if DF = 0 then
o DI = DI + 1
else
o DI = DI - 1
Example:
STOSB No operands
ORG 100h
LEA DI, a1
MOV AL, 12h
MOV CX, 5
REP STOSB
RET
a1 DB 5 dup(0)
C Z S O P A
unchanged
Store word in AX into ES:[DI]. Update DI.
Algorithm: ES:[DI] = AX if DF = 0 then
o DI = DI + 2
STOSW No operands
else
o DI = DI - 2
Example:
ORG 100h
33
LEA DI, a1
MOV AX, 1234h
MOV CX, 5
REP STOSW
RET
a1 DW 5 dup(0)
C Z S O P A
unchanged
34