11.07.2015 Views

Programavimas asembleriu - Kauno technologijos universitetas

Programavimas asembleriu - Kauno technologijos universitetas

Programavimas asembleriu - Kauno technologijos universitetas

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

ktu kompiuterių katedra<strong>Programavimas</strong> <strong>asembleriu</strong>Darius BirvinskasIgnas MartišiusAlgimantas Venčkauskas


skyrius 1Skaičiavimo sistemosĮvairios skaičiavimo sistemos skiriasi skaitmenimis ir jų vartojimo taisyklėmis.Mums įprasta dešimtaine pozicine skaičiavimo sistema.Sistema vadinama dešimtaine, nes joje yra dešimt skaitmenų: 0, 1, 2, 3,4, 5, 6, 7, 8, 9.Skaičius 10 - sistemos pagrindas. Sistema vadinama pozicine, nes daugiaženklioskaičiaus kiekvieno skaitmens reikšmė priklauso nuo jo padėties(pozicijos) skaičiuje. Pavyzdžiui, skaičiuje 457 pirmasis skaitmuo žymi keturisšimtus, antrasis - penkias dešimtis, o paskutinysis – septynis vienetus:400 + 50 + 7 = 457.Šį skaičių galima užrašyti sistemos pagrindo laipsniais, padaugintais iškoeficientų:457 = 4 · 10 2 + 5 · 10 1 + 7 · 10 0Matome, kad einant iš dešinės į kairę, kiekvienos paskesnės pozicijos reikšmėpadidėja tiek kartų, koks yra sistemos pagrindas.Dešimtainės skaičiavimo sistemos trupmenos ir mišrieji skaičiai interpretuojamianalogiškai. Kiekviena pozicija, einant į dešinę, nuo kablelio,atitinka to paties pagrindo laipsnį mažėjančiu neigiamu rodikliu. Pavyzdžiui:436, 576 = 4 · 10 2 + 3 · 10 1 + 6 · 10 0 + 5 · 10 −1 + 7 · 10 −2 + 8 · 10 −3Analogiškai gali būti užrašyti skaičiai ir kitomis skaičiavimo sistemomis.Dešimtainė skaičiavimo sistema yra nepatogi kompiuteriui, nes jo atmintiesįrenginiai gali atsiminti tik vieną iš skaitmenų: 0 arba 1. Todėlkompiuteriuose vartojame ne dešimtainę, o dvejetainę skaičiavimo sistemą.Dvejetainėje skaičiavimo sistemoje yra tik 2 skaitmenys: 0 ir 1. Užrašas10 čia atitinka dešimtainį skaičių 2. Dvejetainiai skaičiai sudaromi tik 0ir 1 deriniu. Skaičiavimo sistemos pagrindą, nurodysime prie skaitmenų.Pavyzdžiui:101101 (2) = 1 · 2 5 + 0 · 2 4 + 1 · 2 3 + 1 · 2 2 + 0 · 2 1 + 1 · 2 0 = 45 (10)3


1.1. Sveikųjų dešimtainių skaičių išreiškimas dvejetaine, aštuntaine arbašešioliktaine sistema 41.1 pav.: Ryšiai tarp skaičiavimo sistemųTrupmeniniai dvejetainiai skaičiai interpretuojami analogiškai:0, 1011 (2) = 1 · 2 −1 + 0 · 2 −2 + 1 · 2 −3 + 1 · 2 −4 = 1116 (10)arba 0, 5 + 0, 125 + 0, 0625 = 0, 6875 (10) .Dažnai dešimtainį skaičių, užrašytą dvejetaine skaičiavimo sistema, sudaroilga nulių ir vienetų seka, kurią sunku greitai suvokti ir nepatogu vartoti.Tokius skaičius trumpiau galima užrašyti aštuntaine arba šešioliktaineskaičiavimo sistema.Analogiškai dešimtainei skaičiavimo sistemai aštuntainė sistema turi 8skaitmenis: 0, 1, 2, 3, 4, 5, 5, 7, o šešioliktainė - 16: pirmi dešimt (0- 9) imami iš dešimtainės sistemos ir atitinka tuos skaitmenis, kiti šeši(10,11,12,13,14,15) užrašomi raidėmis: A, B, C, D, E, F.Kadangi 2 3 = 8 ir 2 4 = 16, tai kiekvienas aštuntainis skaitmuo užrašomas3 dvejetainiais skaitmenimis, o kiekvienas šešioliktainis skaitmuo - 4dvejetainiais skaitmenimis dvejetaine skaičiavimo sistema.Be minėtų skaičiavimo sistemų, gali būti vartojamos ir kitos, todėl reikiamokėti išreikšti vienos skaičiavimo sistemos skaičius kita sistema. Praktikojekartu dažniausiai vartojamos trys skaičiavimo sistemos: dešimtainė,aštuntainė ir dvejetainė arba dešimtainė, šešioliktainė ir dvejetainė. Taigiišreiškiama taip, kaip pavaizduota 1.1 pav.1.1 Sveikųjų dešimtainių skaičių išreiškimas dvejetaine,aštuntaine arba šešioliktaine sistemaDešimtainis sveikasis skaičius išreiškiamas nauja skaičiavimo sistema, nuosekliaidalijant tą skaičių ir gautus dalmenis iš naujos skaičiavimo sistemospagrindo, užrašyto dešimtaine skaičiavimo sistema. Gautos liekanos ir paskutinisdalmuo surašyti atvirkštine tvarka, sudarys naujos sistemos skaičių.Visi veiksmai atliekami dešimtaine sistema.


1.2. Dešimtainių trupmenų išreiškimas dvejetaine, aštuntaine arbašešioliktaine sistema 5Išreiškiant skaičius šešioliktaine sistema gautos liekanos 10, 11, 12, 13,14, 15 keičiamos atitinkamais šešioliktainiais skaitmenimis A, B, C, D, E,F.Pateikiame pavyzdžių, kaip sveikieji dešimtainiai skaičiai išreiškiami dvejetaine,aštuntaine ir šešioliktaine sistema.421 (10) :421⎫(10) :⎫2 421 18 421 5 ⎪⎬2 210 08 52 42 105 18 6 6⎪⎭ = 645 (8)2 52 0 ⎪⎬2 26 0 = 110100101 (2)2 13 12 6 02 3 1⎪⎭2 1 1421 (10) :16 421 516 26 1016 1 1⎫⎪⎬⎪⎭ = 1A5 (16)1.2 Dešimtainių trupmenų išreiškimas dvejetaine,aštuntaine arba šešioliktaine sistemaDešimtainė trupmena išreiškiama nauja skaičiavimo sistema, nuosekliai dauginantją ir gautas trupmenines dalis iš naujos sistemos pagrindo, užrašytodešimtaine sistema. Visi veiksmai atliekami dešimtaine sistema. Gautiskaitmenys vienetų skiltyse sudarys naujos sistemos skaičių.Išreikšdami šešioliktaine sistema sveikojoje skaičiaus dalyje gautus skaičius10, 11, 12, 13, 14, 15, keičiame atitinkamais šešioliktainiais skaitmenimisA, B, C, D, E, F. Pateikiame pavyzdžių kaip dešimtainės trupmenosišreiškiamos dvejetaine, aštuntaine ir šešioliktaine sistema:0,71875× 21,43750× 20,87500× 21,75000× 21,50000× 21,000000,71875× 85,75000× 86,000000,71875× 1611,50000× 168,00000


1.3. Dvejetainių, aštuntainių ir šešioliktainių skaičių dešimtainėskaičiavimo sistema 60, 71875 (10) = 0, 10111 (2) 0, 71875 (10) = 0, 56 (8) 0, 71875 (10) = 0, B8 (16)Pateiktame pavyzdyje dešimtainę trupmeną tiksliai išreiškėme dvejetaine,aštuntaine ir šešioliktaine sistema. Tačiau taip būna ne visuomet. Dažnaidaugybos procesas yra begalinis ir rezultatas būna begalinė periodinėtrupmena. Tuomet skaitmenų skaičius po kablelio imamas toks, koks reikalingastikslumas. Jeigu dešimtainį skaičių sudaro sveikoji ir trupmeninėdalis, tai pagal pirmąją taisyklę išreiškiama sveikoji dalis, o pagal antrąją -trupmeninė dalis.1.3 Dvejetainių, aštuntainių ir šešioliktainių skaičiųdešimtainė skaičiavimo sistemaDvejetainiai, aštuntainiai ar šešioliktainiai skaičiai išreiškiami dešimtainesistema taip: susumuojami visi dvejetainės, aštuntainės ar šešioliktainėssistemos skaitmenys, padauginti iš skaičiavimo sistemos pagrindo, pakeltoatitinkamos pozicijos laipsniu. Atlikus aritmetines operacijas dešimtaineskaičiavimo sistema, gaunamas dešimtainis skaičius.Pateikiame pavyzdį, kaip dvejetainiai, aštuntainiai ir šešioliktainiai skaičiaiišreiškiami dešimtaine skaičiavimo sistema:110100101, 10111 (2) = 1 · 2 8 + 1 · 2 7 + 0 · 2 6 + 1 · 2 5 + 0 · 2 4 + 0 · 2 3 + 1 · 2 2 ++0 · 2 1 + 1 · 2 0 + 1 · 2 −1 + 0 · 2 −2 + 1 · 2 −3 + 1 · 2 −4 + 1 · 2 −5 == 256 + 128 + 0 + 32 + 0 + 0 + 4 + 1 + 1 2 + 0 + 1 8 + 1 16 + 132 = 421, 71875 (10)Pateiktas pavyzdys tuo pačiu parodo, kad veiksmai atlikti teisingai - gavometuos pačius dešimtainius skaičius, kuriuos ankstesniuose pavyzdžiuoseišreiškėme dvejetaine, aštuntaine ir šešioliktaine sistema.1.4 Aštuntainių ir šešioliktainių skaičių išreiškimasskaičiavimo sistemaKiekvienas aštuntainis (šešioliktainis) skaitmuo dvejetaine sistema užrašomastrimis (keturiais) skaitmenimis. 1.1 lentelėje pateikti pirmųjų šešiolikosskaičių dešimtainiai, aštuntainiai ir dvejetainiai ekvivalentai.Pateikiame pavyzdžių, kaip aštuntainiai ir šešioliktainiai skaičiai išreiškiamidvejetaine skaičiavimo sistema:645, 56 (8) = 110100101, 101110 (2)1A5, B8 (16) = 000110100101, 10111000 (2)Kaip ir dešimtainėje skaičiavimo sistemoje, dvejetaine sistemoje užrašytinereikšminiai nuliai neturi įtakos.


1.5. Dvejetainių skaičių išreiškimas aštuntaine (šešioliktaine) skaičiavimosistema 7SkaičiusDešimtainis Aštuntainis Šešioliktainis Dvejetainis0 0 0 00001 1 1 00012 2 2 00103 3 3 00114 4 4 01005 5 5 01016 6 6 01107 7 7 01118 10 8 10009 11 9 100110 12 A 101011 13 B 101112 14 C 110013 15 D 110114 16 E 111015 17 F 11111.1 lentelė: Skaičių ekvivalentai1.5 Dvejetainių skaičių išreiškimas aštuntaine (šešioliktaine)skaičiavimo sistemaNorint dvejetainį skaičių išreikšti aštuntaine (šešioliktaine) skaičiavimo sistema,reikia jį suskaidyti grupėmis (į kairę ir į dešinę nuo kablelio po tris (keturis)dvejetainius skaitmenis ir kiekvieną grupę pakeisti vienu aštuntainiu(šešioliktainiu) skaitmeniu. Jei pirmoji triada (tetrada) iš kairės sveikojojedalyje ir paskutinioji trupmeninėje dalyje nepilnos, jos papildomos nuliais.Pavyzdžiui:110100101, 101110 (2) = 110/100/101/, 101/110 (2) = 654, 56 (8)000110100101, 10111000 (2) = 0001/1010/0101/, 1011/1000 (2) = 1A5, B8 (16)


skyrius 2Duomenų vaizdavimaskompiuterio atmintyjeKompiuterio apdorojamus duomenis galima suskirstyti į 3 grupes:• loginius duomenis;• fiksuoto kablelio skaičius;• slankaus kablelio skaičius.Visą informaciją kompiuteris saugo dvejetaine skaičiavimo sistema, t.y.1 ir 0 deriniais. Mažiausias informacijos vienetas yra bitas. Jame galimasaugoti tik vieną dvejetainį skaitmenį: 0 arba 1. Aštuonių bitu grupė sudarobaitą. Bitai jame numeruojami iš dešinės į kairę nuo 0 iki 7 (2.1 pav.).2.1 pav.: Bitų numeracija baiteViename baite galima saugoti 256 skirtingus 1 ir 0 derinius. Jei mažaivieno - informaciją galima saugoti keliuose baituose. Dviejų baitų grupėsudaro žodį, dviejų žodžių grupė sudaro dvigubą žodį. Kelių baitų grupėdažniausiai vadinama lauku.Nepaisant to, kad visi duomenys kompiuteryje saugomi dvejetainiaisskaitmenimis, kiekviena duomenų grupė turi savą vaizdavimo formatą.2.1 Loginių duomenų vaizdavimasLoginiai duomenys gali būti laikomi baituose, žodžiuose arba laukuose. Šiemsduomenims vaizduoti vartojami visi baito, žodžio arba lauko bitai. Loginiaiskodais vaizduojami:8


2.2. Fiksuoto kablelio skaičių vaizdavimas 9• simboliniai duomenys;• skaičiai be ženklo;• bitų duomenys.Simboliniai duomenys yra visi klaviatūros simboliai :• lotyniška abėcėlė (A - Z);• skaitmenys (0 - 9);• specialūs ženklai bei valdymo klavišai.Kiekvienas simbolis vaizduojamas tam tikru 1 ir 0 deriniu viename baite.Tai ASCII kodas (angl. American Standart Code for Information Intertarchange- Amerikos standartinis kodas informacijos mainams). Pagrindiniųsimbolių ASCII kodai pateikti 2.1 lentelėje. Pavyzdžiui, simboliai “A“ ir“B“ atrodytų taip:0 1 0 0 0 0 0 14 (16) 1 (16)A0 1 0 0 0 0 1 04 (16) 2 (16)BSkaičiai be ženklo baite ar žodyje vaizduojami dvejetaine skaičiavimosistema, todėl baite gali tilpti skaičiai nuo 0 iki 255 (00-FF), o žodyje – nuo0 iki 65535 (0000 – FFFF). Pavyzdžiui skaičius 19 baite ir žodyje atrodytųtaip:0 0 0 1 1 0 0 11 (16) 9 (16)0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 10 (16) 0 (16) 1 (16) 9 (16)Bitų duomenys gali būti pavaizduoti atskiruose baito ar žodžio bituoseyra vartojami loginei informacijai užkoduoti.2.2 Fiksuoto kablelio skaičių vaizdavimasFiksuoto kablelio skaičiai vaizduojami baituose arba žodžiuose. Ši skaičiųvaizdavimo forma taikoma tik sveikiesiems skaičiams, nes kablelis visuometfiksuojamas po nulinio bito.


2.2. Fiksuoto kablelio skaičių vaizdavimas 10Šešioliktainis Simbolis Šešioliktainis Simbolis Šešioliktainis Simbolisskaičiusskaičiusskaičius20 40 @ 60 ‘21 ! 41 A 61 a22 " 42 B 62 b23 # 43 C 63 c24 $ 44 D 64 d25 % 45 E 65 e26 & 46 F 66 f27 ’ 47 G 67 g28 ( 48 H 68 h29 ) 49 I 69 i2A * 4A J 6A j2B + 4B K 6B k2C ’ 4C L 6C l2D - 4D M 6D m2E . 4E N 6E n2F / 4F O 6F o30 0 50 P 70 p31 1 51 Q 71 q32 2 52 R 72 r33 3 53 S 73 s34 4 54 T 74 t35 5 55 U 75 u36 6 56 V 76 v37 7 57 W 77 w38 8 58 X 78 x39 9 59 Y 79 y3A : 5A Z 7A z3B ; 5B [ 7B {3C < 5C \ 7C |3D = 5D ] 7D }3E > 5E ˆ 7E ˜3F ? 5F _ 7F (DEL)2.1 lentelė: ASCII kodų lentelė


2.2. Fiksuoto kablelio skaičių vaizdavimas 112.2 pav.: Ženklo skiltis baite ir žodyjeTeigiami skaičiai vaizduojami tiesioginiu kodu: ženklo bite yra 0, o kituose- skaičiaus reikšmė dvejetainėje skaičiavimo sistemoje.Neigiami skaičiai vaizduojami papildomu kodu su vienetu ženklo bite.Skaičiaus papildomas kodas sudaromas invertuojant skaičiaus modulio tiesioginiokodo skaitmenis (t.y, 1 keičiant 0, 0 keičiant 1) ir pridedant priegauto skaičiaus 1. Taip pat skaičiaus papildomą kodą galima gauti vartojantšešioliktainę skaičiavimo sistemą: šį skaičių reikia atimti iš skaičiausF F F F (16) (kai skaičius saugojamas žodyje) ir prie gauto skaičiaus jauniausiojoskaitmens pridėti 1.Pavaizduokime skaičių −21 baite:1. Skaičiaus modulį verčiame į dvejetainę skaičiavimo sistemą: 21 (10) =1B (16) = 00011011 (2) .2. Invertuojame kiekvieną bitą: 11100100 (2) .3. Prie gauto skaičiaus pridedame vienetą:11100100+ 111100101Norint rasti neigiamo skaičiaus modulį reikia pakartoti ankstesnius veiksmus:invertuoti bitus ir pridėti vienetą.11100101 - neigiamas skaičius00011010 - inversija+ 100011011 - teigiamas skaičiusTaigi skaičius 11100101 (2) , įrašytas baite, vaizduoja −21 (10) . Nulio tiesioginisir papildomas kodai sutampa ir yra lygūs 0. Lentelėje 2.2 pateikiamefiksuoto kablelio skaičių pavyzdžiai. Kaip gauti papildomą kodą vartojant


2.3. Slankaus kablelio skaičių vaizdavimas 12Dešimtainis sk. Turinys dvejetaine ir šesioliktaine sistemaBaitoŽodžio+5 00000101 000000000000010105 0005-5 11111011 0000000011111011FBFFFB-1 11111111 1111111111111111FFFFFF127 01111111 00000000011111117FFF7F128 netelpa 00000000100000000080-128 10000000 111111111000000080 FF8032767 netelpa 01111111111111117FFF2.2 lentelė: Fiksuoto taško skaičių pavyzdžiaišešioliktainę skaičiavimo sistemą, parodysime vėliau, nagrinėdami aritmetiniusveiksmus įvairiomis skaičiavimo sistemomis.Kaip matome iš letelės 2.2 baite galima saugoti skaičius iš diapazono,−2 7 s 2 7 − 1, tai atitinka −128 s 127. Analogiškai žodyje galimasaugoti skaičius iš diapazono −2 15 s 2 15 − 1, tai atitinka −32768 s 32767.2.3 Slankaus kablelio skaičių vaizdavimasSlankaus kablelio skaičių s bet kuria skaičiavimo sistema galima užrašytitaip:čias = n · a pn - taisyklingoji trupmena, vadinama skaičiaus mantise;a - skaičiavimo sistemos pagrindas;p - sveikasis skaičius, vadinamas eile.Kiek vietos skiriama mantisei ir eilei priklauso nuo konkretaus aritmetiniologinio įrenginio (angl. Atrimetic logic unit - ALU), todėl šito čiadetaliau nenagrinėsime.


2.4. Aritmetinės operacijos įvairiomis skaičiavimo sistemomis 132.4 Aritmetinės operacijos įvairiomis skaičiavimosistemomisKadangi kompiuteris informaciją saugo tik dvejetaine skaičiavimo sistema,tai mums įprastą dešimtainę sistemą galima vartoti įvedant pradinius duomenisbei spausdinant apskaičiuotus rezultatus. Kompiuteris ne tik saugoinformaciją dvejetaine forma, bet ir veiksmai atliekami šioje sistemoje. Šiameskyrelyje parodysite, kaip galima atlikti aritmetinius veiksmus kitomisskaičiavimo sistemomis.Jeigu, sudedant du skaitmenis, gautas skaičius w yra lygus ar didesnisuž vartojamos skaičiavimo sistemos pagrindą a, tai į atitinkamą pozicijąrašomas skaitmuo d=w-a, o prie vyresnės pozicijos pridedamas perkėlimovienetas. Kai w < a, tai jis pakeičiamas vartojamos skaičiavimo sistemosskaitmeniu.Ši taisyklė taikoma ne tik dešimtainei, bet ir kitoms skaičiavimo sistemoms.Pateikiame sudėties pavyzdžius įvairiomis skaičiavimo sistemomis:11 1 1 1 113 (10)15(8)1C(16)001101(2)+ 28 (10) + 34 (8) + D (16) + 011100 (2)41 (10) 51 (8) 29 (16) 101001 (2)Atimdami vieną skaitmenį iš kito, elgiamės taip pat, kaip vartodami dešimtainęskaičiavimo sistemą, kai atėminio skaitmuo mažesnis arba lygusturinio skaitmeniui. Kai atėminio skaitmuo yra didesnis už turinio atitinkamąskaitmenį, iš vyresnės pozicijos skolinamas 1 ir atitinkamas turinioskaitmuo padidinamas skaičiavimo sistemos pagrindu, galiausiai iš gautoskaičiaus atimamas atėminio skaitmuo. Ši taisyklė visoms skaičiavimo sistemoms.Pateikiame atimties pavyzdžių įvairiomis skaičiavimo sistemomis:13 1 5 (10)14 1 3 (8)12 1 3 (16)1 1 0 1 0 1 0 1 1 (2)- 2 8 (10) - 3 4 (8) - 1C (16) - 0 1 1 1 0 0 (2)7 (10) 7 (8) 7 (16) 0 0 0 1 1 1 (2)Apie daugybą ir dalybą detaliau nekalbėsime, kadangi šias operacijasgalima pakeisti nuosekliomis sudėties ar atimties operacijomis. Atimties irsudėties veiksmais taip pat apskaičiuojami vykdomieji ar santykiniai adresai.Atimties operaciją galima efektyviai panaudoti skaičiaus papildomamkodui skaičiuoti t.y. versti skaičiaus iš teigiamų į neigiamus, bei atvirkščiai.Prisiminkime, kad aštuonetainė arba šešioliktainė skaičiavimo sistema kompaktiškaiatvaizduoja dvejetaine skaičiavimo sistema pateiktą informaciją.Aštuonetainė skaičiavimo sistema - tris, šešioliktainė keturis kartus trumpiaupavaizduoja žodžių ar baitų turinį. Šiomis skaičiavimo sistemomis taippat galima paprasčiau gauti ir atvaizduoti skaičiaus papildomą kodą. Tereikianorimą skaičių atimti iš didžiausio galimo skaičiaus (šešioliktainėjeskaičiavimo sistemoje: F F (16) arba F F F F (16) , priklausomai nuo to kaipvaizduojamas skaičius). Gautas skirtumas padidinamas vienetu yra skaičiauspapildomas kodas. Sakykime norime gauti skaičių −26 (8) ir −16 (16)


2.5. Informacijos apdorojimo principai kompiuteryje 14papildomą kodą. Papildomas kodas įrašytas baite atrodytų taip:377 (8) − 26 (8) = 351 (8) ; 351 (8) + 1 = 352 (8)F F (16) − 16 (16) = E9 (16) ; E9 (16) + 1 = EA (16)Tie patys skaičiai įrašyti žodyje atrodytų taip:177777 (8) − 26 (8) = 177751 (8) ; 177751 (8) + 1 = 177752 (8)F F F F (16) − 16 (16) = F F E9 (16) ; F F E9 (16) + 1 = F F EA (16)2.5 Informacijos apdorojimo principai kompiuteryjeSvarbiausia kompiuterio dalis - procesorius - gali atlikti aritmetines, logines,palyginimo bei skaičiavimo proceso valdymo operacijas. Norint sudarytiskaičiavimo algoritmą, pirmiausia reikia žinoti, kokias elementarias operacijasgali atlikti procesorius, ir skaičiavimo procesą suskaidyti į tas operacijas,nurodant jų eilės tvarką. Atliekant tokias operacijas programoje reikia nurodytiatitinkamas komandas ir apdorojamus duomenis. Paprastai operacijųduomenys vadinami operandais. Todėl, nurodant komandą, reikia nurodytipenkis elementus: komandos kodą, pagal kurį kompiuteriui nurodomakokią elementarią operaciją reikia atlikti ir keturis adresus. Pirmieji du adresairodo, kur atmintyje yra duomenys, vieno adreso reikia rezultatui ir darvieno adreso - paskesnei komandai. Tokios komandos vadinamos 4 adresųkomandomis. Komandose gali būti nurodomi ne operandų adresai, o patysoperandai. Pavyzdžiui, apskaičiuojant išraišką i = j + k, galima nurodytitokią simbolinę komandą:čia :ADDj, k, i, pADD - simbolinis sudėties komandos kodas;j, k, i - duomenų bei rezultato adresai;p - paskesnės komandos adresas.Matome, kad ši komanda yra ilga, jai užrašyti reikia daug atminties. Todėlpabandykime sutrumpinti komandą. Jeigu programą vykdytume nuosekliaikomandą po komandos, tai paskesnės komandos nereikėtų nurodyti,tuo pačiu sutrumpėtų ir pati komanda. Tada tai pačiai operacijai atliktigalima nurodyti tokią komandą:ADDj, k, i


2.5. Informacijos apdorojimo principai kompiuteryje 15kuri reikštų, kad prie kintamojo j reikia pridėti kintamąjį k ir rezultatąužrašyti kintamajame i. Tokios komandos vadinamos 3 adresų komandomis.Šiuo atveju paskesnės komandos adresą nurodo komandos skaitiklis.Norint dar labiau sutrumpinti komandą, reikia panaikinti dar vieną operandoadresą. Tokiu atveju komandoje paliekami 2 adresai, tačiau dabargautas rezultatas turi būti įrašomas į vieną iš duomenų. Šiuo atveju aišku,komanda atmintyje užima mažiau vietos, tačiau programuoti sudėtingiau.Tai pačiai išraiškai apskaičiuoti dabar reikia dviejų komandų:MOVEADDj, ik, iPirmoji komanda (MOVE) kintamąjį j įrašo į kintamojo i vietą, o antroji- prie jo prideda kintamąjį k ir gautą sumą įrašo į tą pačią vietą, t.y. i.Tokios komandos vadinamos 2 adresų komandomis. Galima dar labiausutrumpinti komandą joje paliekant tik vieno operando adresą, tačiau operacijaatliekama su dviem operandais. Palikus komandoje tik vieną operandą,procesoriuje išskiriama speciali atmintis, vadinama akumuliatoriumi, ir visosoperacijos atliekamos su duomenimis, esančiais šiame akumuliatoriuje iroperande, kurio adresas nurodytas komandoje. Gautas rezultatas taip patpaliekamas akumuliatoriuje. Toks adresavimo būdas sutrumpina komandas,tačiau išauga jų skaičius. Pavyzdžiui, užrašant komandas ankstesneiišraiškai apskaičiuoti, šiuo atveju reikėtų rašyti:LOADADDSTOREjkipirmoji komanda (LOAD) patalpina į akumuliatorių kintąmąjį j, antrojipadidina akumuliatoriaus turinį kintamojo k reikšme, trečioji (STORE) -rezultatą įrašo į kintąmąjį i.Tokios komandos vadinamos vieno adreso komandomis. Kyla klausimas:ar galima sukurti tokį kompiuterį, kurio komandose nereikėtų nurodinėti neivieno adreso? Pasirodo - galima. Tereikia duomenis saugoti steke. Stekas- tai toks informacijos saugojimo būdas, kai galima kreiptis tik į paskutinįjįsteko elementą: rašant į steką gale prirašomas naujas elementas, skaitant- paimamas paskutinysis. Taigi, jeigu būtų steko elemento įrašymo irskaitymo komandos, tai kitoms procesoriaus komandoms nereikėtų adresų.Apskaičiuojant ankstesnę išraišką, gali būti tokios komandos:LOAD jLOAD kADDSTORE i


2.5. Informacijos apdorojimo principai kompiuteryje 16Komanda ADD ir kitos panašios komandos vadinamos neadresuotomis.Matome, kad taikant įvairius adresavimo būdus, keičiasi programavimo stilius,vienur mažiau komandų, kitur tam pačiam skaičiavimui jų reikia daugiau.Pavyzdžiui, apskaičiuodami išraišką i = j + k + l + m, vartokime tikvieno ir trijų adresų komandas.Vieno adreso komandos:LOADADDADDADDSTOREjklmiTrijų adresų komandos:ADDADDADDj, k, ii, l, ii, m, iPasižiūrėkime į sudarytų programų ilgį. Nepaisant to, kad vieno adresokomandų programa šiuo atveju sudaryta iš daugiau komandų negu programaparašyta trijų adresų komandomis, vieno adreso komandų programai reikiamažiau atminties.


skyrius 3Asemblerio kalba irkompiuteris3.1 Programavimo kalbų hierarchijaKompiuterio darbas valdomas programomis, kurios kuriamos naudojantisprogramavimo kalbomis. Kalbos yra įvairaus abstrakcijos lygmens. Kuokalba abstraktesnė, tuo ji yra aukštesnio lygmens. Programavimo kalbųhierarchija parodyta 3.1 pav.3.1 pav.: Programavimo kalbų hierarchija17


3.1. Programavimo kalbų hierarchija 18Mašinos kalba užrašyta programa (mašininis kodas) - tai instrukcijų irduomenų rinkinys, kurį tiesiogiai vykdo mašina. Instrukcijos ir duomenyskoduojami dvejetainiais skaitmenimis. Tai žemiausio lygmens programavimokalba. Vėliau sukurtos kitos programavimo kalbos, kurių tekstą galimaautomatiškai išversti į mašininį kodą (sukompiliuoti).Kiek aukštesnio lygmens programavimo kalba yra asemblerio kalba. Taižemo lygmens programavimo kalba, skirta tam tikros architektūros kompiuteriųmašininėms komandoms užrašyti. Kiekviena kompiuterio architektūraturi savo mašininį kodą ir savo asemblerio kalbą. Asemblerio kalbos skirtumasnuo mašininio kodo yra tas, kad operacijos iš pradžių užrašomos žmoguisuprantamesnėmis ir labiau įsimintinomis simbolinėmis komandomis, o nedvejetainiu kodu. Paprastai, kiekviena asemblerio komanda atitinka mašinosinstrukciją, ir atvirkščiai. Asemblerio kalba parašytų programų transliatoriusį mašininį kodą dažniausiai taip pat vadinamas "<strong>asembleriu</strong>".Aukšto lygmens programavimo kalbų kompiliatoriai transliuoja programasį mašininį kodą. Galimi du variantai: transliuojama tiesiogiai į mašininįkodą, arba iš pradžių į asemblerio kalbą, o po to - į mašininį kodą. Programųtransliavimo būdai parodyti 3.2 pav.3.2 pav.: Programų transliavimo būdaiPavyzdys, kaip atrodo programos fragmentas įvairaus lygmens kalbose,parodytas 3.3 pav. Aukšto lygmens kalbos operatorius paprastai transliuojamasį keletą asemblerio komandų. Kiekviena asemblerio komanda transliuojamaį vieną mašinos instrukciją. Paveiksle mašininės instrukcijos (dvejetainiaikodai) užrašyti šešioliktainiais skaitmenimis.Asemblerio kalba leidžia programuotojui geriau išnaudoti kompiuteriogalimybes, o tai gali būti itin svarbu, kai reikia sudaryti programas, dirbančiasrealiame laike, kai tenka griežtai įvertinti konkrečios programos charakteristikas- jos vykdymo laiką ir apimtį atmintyje,efektyviai valdyti aparatinęįrangą.


3.2. Kompiuterio struktūrinė schema 193.3 pav.: Programos fragmentas įvairaus lygmens kalboseNorint sudaryti programas asemblerio kalboje, reikia išsiaiškinti pagrindineskompiuterio savybes ir galimybes. Būtina pažymėti, kad kiekvienotipo kompiuteris turi savo asemblerio kalbą. Jos operatoriai tiesiogiai aprašokompiuteryje betarpiškai vykdomas komandas.3.2 Kompiuterio struktūrinė schemaKlasikinės architektūros kompiuteriai sudaryti iš trijų pagrindinių komponentų:procesoriaus, dar vadinamo centriniu procesoriumi (CPU), atmintiesir įvedimo / išvedimo įrenginių. Apibendrinta kompiuterio struktūra parodyta3.4 pav.Šie komponentai yra sujungti viena ar keliomis magistralėmis: adresų,duomenų ir valdymo magistralėmis. Procesoriaus pagrindinės dalys yraaritmetikos ir logikos įrenginys (ALĮ), atliekantis šio procesoriaus vykdomasaritmetines (sudėties, atimties, dalybos bei daugybos), logines bei postūmio(IR, ARBA, ...) ir kitas operacijas, taktų generatorius (clock), valdantysisįrenginys (VĮ) ir registrai, vietinė procesoriaus atmintis.Dirbant su kompiuteriu paprastai atliekamos tokios procedūros:1. Programa ir duomenys iš klaviatūros arba papildomo atminties įrenginioįvedami į operatyviąją atmintį.2. Centrinis procesorius iš operatyviosios atminties nuosekliai išrenkaprogramos komandomis užduotą vykdymo tvarką. Iš atminties nuskaitomikomandoje nurodyti duomenys ir atliekami veiksmai.


3.3. x86 architektūros pagrindai 203.4 pav.: Kompiuterio struktūrinė schema3. Gautus skaičiavimo rezultatus procesorius perduoda į atmintį arbavieną iš išvedimo įrenginių - monitorių, išorinę atmintį, spausdinimoįrenginį.3.3 x86 architektūros pagrindaiKompiuterio struktūrinėje schemoje parodytas centrinis procesorius - taispeciali mikroschema - mikroprocesorius, kuris vykdo programoje nurodytaskomandas.Šiuolaikiniuose kompiuteriuose, ypač asmeniniuose kompiuteriuose, nedideliuoseserveriuose, dažniausiai naudojami Intel x86 architektūros procesoriai.Šeima x86 apima ištisą mikroprocesorių, kurie skiriasi apdorojamosinformacijos bitų skaičiumi, registrų dydžiu ir kiekiu, komandų rinkiniais,atminties adresavimo būdais, galingumu ir kitais parametrais, gamą. Pirmasisx86 architektūros procesorius - 8086, sukurtas 1978 metais, buvo 16 bitų,1 MB adresų erdvės procesorius, vėliau buvo sukurti 32 bitų (IA-32) ir 64bitų (EM64T, x86-64)procesoriais. Visi šie procesoriai programiškai suderinamiiš "apačios į viršų", t.y. programos parašytos 16 bitų procesoriams,veiks ir 32 bei 64 bitų procesoriuose. Mikroprocesoriuose 8086 realizuotipagrindiniai x86 architektūros principai, kurie vėliau buvo išplėtoti kituosemikroprocesoriuose.x86 procesoriaus darbo režimaix86 procesorius turi tris pagrindinius darbo režimus: apsaugotasis režimas,realaus adreso režimas ir sistemos valdymas režimas. Taip pat yra specialusapsaugotojo režimo atvejis, pavadintas virtualiuoju-8086 režimu. Trumpaiaprašysime kiekvieną iš jų:


3.3. x86 architektūros pagrindai 21Apsaugotasis režimas. Apsaugotasis režimas yra pagrindinis procesoriausrežimas, kuriame galima naudoti visas instrukcijas ir funkcijas. Programomsyra paskiriamos atskiros atminties sritys, vadinamos segmentais, irprocesorius neleidžia programai kreiptis už jai paskirtų segmentų ribų.Virtualusis-8086 režimas. Nors tai apsaugotas režimas, procesorius galisaugiai tiesiogiai vykdyti realaus adreso režimo programas daugiaprogramioapdorojimo aplinkoje, pvz., MS-DOS programas. Kitaip tariant, jei MS-DOS programa "pakimba" arba bando rašyti duomenis į sistemos ar kitųprogramų atminties sritis, tai yra blokuojama, ir tai neturi įtakos kitų programųveikimui tuo pačiu metu. Windows NT gali tuo pačiu metu vykdytikelias atskiras virtualias 8086 sesijas.Realaus adreso režimas. Realaus adreso režimas įgyvendina 8086 procesoriausprogramavimo aplinką su keletą papildomų funkcijų, pavyzdžiui,galimybe pereiti į kitus režimus. Šis režimas yra galimas Windows 98, irgali būti naudojamas paleisti MS-DOS programas, kurios reikalauja tiesioginėsprieigos prie sistemos atminties ir aparatūros. Programos veikiančiosrealaus adreso režimu gali sutrikdyti operacinės sistemos darbą, sistema galinebereaguoti į komandas.Sistemos valdymas režimas. Sistemos valdymas režimas suteikia operacineisistemai priemones įgyvendinti energijos valdymo, sistemų saugos irkitas funkcijas. Šias funkcijas paprastai naudoja kompiuterių gamintojai,pritaikydami procesoriaus nuostatas tam tikroms sistemoms.Adresų erdvė32-bitų apsaugotame režime, užduotis ar programa gali naudoti tiesinę adresųerdvę iki 4 GB. Pradedant procesoriumi P6, įgyvendinti atminties valdymobūdai leidžia naudoti fizinę atmintį iki 64 GB. Realaus adreso režimoprogramos gali naudoti atmintį tik iki 1 MB. Jei procesorius veikia apsaugoturežimu ir vykdo kelias programas virtualiame 8086 režime, kiekvienaprograma gali turėti savo 1 MB atminties sritis.RegistraiRegistrai yra greitaeigė vidinė procesoriaus atmintis. IA-32 mikroprocesoriausvidinės atminties struktūra, registrai, parodyta 3.5 pav. Yra 8 bendrospaskirties registrai, 6 segmentų registrai, procesoriaus būsenos - vėliavėliųregistras ir komandų rodiklis.


3.3. x86 architektūros pagrindai 223.5 pav.: IA-32 mikroprocesoriaus registraiBendros paskirties registrai. Bendrosios paskirties registrai pirmiausianaudojami aritmetinėse ir duomenų persiuntimo komandose.Kaip parodyta 3.6 pav., į 16 jaunesnių registro eax bitų galima kreiptisvardu ax.3.6 pav.: Bendros paskirties registras EAXKai kurių registrų dalis galima adresuoti kaip 8 bitų registrus. Pvz.,ax registras, turi 8 bitų vyresniąją dalį, vadinamą ah ir 8 bitų jaunesniąjądalį vadinamą al. Tai galioja registrams eax, ebx, ecx, edx, taip, kaipparodyta 3.1 lentelėje.


3.3. x86 architektūros pagrindai 2332 bitų 16 bitų 8 bitų (vyr.) 8 bitų (jaun.)eax ax ah alebx bx bh blecx ax ah aleax ax ah al3.1 lentelė: Bendros paskirties registraiKiti bendrosios paskirties registrai, esi, edi, ebp, esp, gali būti nurodominaudojant 32 bitų ar 16 bitų pavadinimus, taip, kaip parodyta 3.2lentelėje.32 bitų 16 bitųesi siedi diebp bpesp sp3.2 lentelė: Bendros paskirties registrai 32 ir 16 bitųKai kurie bendrosios paskirties registrai yra naudojami specialiems tikslams:• eax registras automatiškai naudojamas daugybos ir dalybos operacijose.Jis vadinamas išplėsto akumuliatoriaus registru.• ecx registrą procesorius naudoja kaip ciklų skaitliuką.• esp registras adresuoja duomenis dėtuvėje, specialioje atminties struktūroje.Jis retai naudojamas įprastose aritmetinėse ar duomenų perdavimokomandose. Jis vadinamas išplėstos steko rodyklės registru.• esi ir edi registrai yra naudojami komandose, skirtose didelės spartosduomenų perdavimui atmintyje . Jie vadinami išplėstu šaltinio indeksoir išplėstu paskirties indekso registrais.• ebp registras naudojamas funkcijos parametrų nuorodoms ir vietiniamskintamiesiems dėtuvėje adresuoti ir saugoti. Jis neturėtų būtinaudojamas įprastose aritmetinėse ar duomenų perdavimo komandose.Jis dažnai vadinamas dėtuvės išplėstos rodyklės registru.Segmentų registrai. Realaus adreso režime 16 bitų segmentų registrai nurodobazinius, iš anksto apibrėžtų atminties sričių, vadinamus segmentais,adresus. Apsaugotame režime segmentų registruose yra nuorodos į segmentųdeskriptorių lentelę. Vienuose segmentuose yra programos instrukcjos


3.3. x86 architektūros pagrindai 24(kodas), kituose kintamieji (duomenys), o dar kituose segmentuose, vadinamuosedėtuvės segmentais, yra funkcijų vietiniai kintamieji ir parametrai.Komandų rodiklis. Registre eip, arba komandų rodiklyje, yra kitos vykdomoskomandos adresas. Kai kurios procesoriaus komandos (nukreipimokomandos) keičia eip turinį, t.y. keičia komandų vykdymo tvarką.Vėliavėlių registras. Vėliavėlių registro bitai valdo procesoriaus darbąarba atspindi kai kurių procesoriaus komandų rezultatus. Kai kurios komandosgali patikrinti arba nustatyti atskiras vėliavėles. IA-32 vėliavėliųregistras parodytas 3.7 pav.3.7 pav.: IA-32 vėliavėlių registrasValdymo vėliavėlės. Valdymo vėliavėlės valdo procesoriaus veikimą. Pavyzdžiui,gali po kiekvienos komandos įvykdymo pertraukti procesoriausdarbą (naudojama programų derinimo priemonėms kurti), nutraukti procesoriausdarbą, įvykus aritmetiniam perpildymui, įjungti virtualųjį-8086 režimą,įjungti apsaugotąjį režimą. Kai kurių vėliavėlių, pavyzdžiui Krypties(DF) ar Pertraukties (IF) vėliavėlių reikšmes galima nustatyti programoje.Būsenos vėliavėlės atspindi procesoriaus atliekamų aritmetinių ir loginiųoperacijų rezultatų požymius. Tai Perpildymo (OF), Ženklo (SF), Nulio(ZF), Pagalbinė perkėlimo (AC), Pariteto (PF), ir Pernešimo (CF) vėliavėlės.Architektūroje AI-32 slankaus taško duomenims apdoroti, multimedijosprogramoms optimizuoti yra specialios operacijos ir registrai: aštuoni 80bitų slankaus taško registrai, aštuoni 64 bitų MMX registrai ir aštuoni 128bitų XMM registrai.x86 atminties valdymasSkirtinguose darbo režimuose x86 procesoriuose atmintis valdoma skirtingai.Apsaugotasis režimas yra patikimiausias ir efektyviausias, tačiau šiamerežime taikomosios programos negali tiesiogiai prieiti prie kompiuterio aparatūros.Realaus adreso režime gali būti adresuojama tik 1 MB atminties, šešioliktainiaiadresai nuo 00000h iki 0FFFFFh. Procesorius gali vykdyti tik vieną


3.3. x86 architektūros pagrindai 25programą vienu metu, bet jos vykdymas gali būti pertrauktas išorinio įrenginioužklausa (vadinama pertrauktimi). Taikomajai programai leidžiamaprieiti prie bet kurios atminties vietos, įskaitant adresus, kurie yra tiesiogiaisusieti su aparatine įranga. MS-DOS operacinė sistema veikia realaus adresorežime.Apsaugotame režime, procesorius gali vykdyti kelias programas tuo pačiumetu. Jis skiria kiekvienam procesui (vykdomai programai) iki 4 GBatminties. Kiekvienai programai paskiriama sava saugomos atminties sritis,ir programos negali gauti prieigą prie viena kitos kodo ir duomenų. MSWindows ir Linux veikia apsaugotame režime.Kai kompiuteris veikia saugaus režimo virtualiame 8086 režime, sukuriamavirtuali 8086 mašina su savo 1 MB adresų erdve, kuri imituoja 80x86kompiuterį, veikiantį realaus adreso režimu. Pvz., Windows NT, kai atidaromaskomandinės eilutės langas Command, sukuria virtualią 8086 mašiną.Galima paleisti daug tokių langų vienu metu, ir kiekvienas iš jų yra apsaugotasnuo kitų veiksmų. Kai kurios MS-DOS programos, kurios tiesiogiainaudojasi kompiuterio aparatine įranga, nebus vykdomos šiame režime WindowsNT sistemoje.Realaus adreso režimasRealaus adreso režime x86 procesorius gali naudotis iki 1.048.576 baitų atminties(1 MB), naudojant 20 bitų adresus intervale nuo 00000H iki 0FFFFFH(šešioliktainiai skaičiai). Konstruojant procesorių, reikėjo išspręsti pagrindinęproblemą: procesoriaus 8086 16 bitų registruose negalėjo būti 20 bitųadresai. Buvo sukurtas segmentinės atminties modelis. Visa atmintis yrapadalinta į 64 kilobaitų (64 KB) segmentai, kaip parodyta 3.8 pav.Kaip matyti 3.8 pav., kiekvienas segmentas prasideda adresu, kurio paskutinisšešioliktainis skaitmuo nulis. Kadangi paskutinis skaitmuo visadalygus nuliui, tai galima jį praleisti formuojant segmentų pradžios adresus.Pvz., C000 reiškia segmentą adresu C0000. Tame pačiame paveiksle parodytassegmento 80000 išplėtimas. Baitui šiame segmente nurodyti reikiapridėkite 16 bitų poslinkį (nuo 0 iki ffffh) prie šio segmento bazinės (pradinioadreso). Pavyzdžiui, adresas 8000:0250 nurodo baitą poslinkiu 250 segmentoviduje, kurio pradžios adresas 80000. Linijinis (fizinis, absoliutinis) adresasbus 80250h.Realaus adreso režime linijinis (fizinis) adresas formuojamas iš dviejųkomponentų: 16 bitų segmento bazinio adreso ir 16 bitų poslinkio segmente.Segmentų baziniai adresai yra segmentų registruose (cs, ds, es, ss, fs irgs), o poslinkis - adresų poslinkių registruose (ip, bx, si, di, bp, sp) arbanurodomas tiesiogiai mašininėje komandoje, žr. 3.9 pav.Procesorius automatiškai iš segmento adreso ir poslinkio formuoja 20bitų fizinį adresą:


3.3. x86 architektūros pagrindai 263.8 pav.: Realaus adreso režimo atminties modelisF izinis adresas = [segmento adresas] × 10h + [poslinkis].Fizinio adreso formavimo schema realaus adreso režime pateikta 3.10 pav.Apsaugotas režimasApsaugotas režimas yra efektyviausias procesoriaus režimas. Kai programavykdoma apsaugotame režime, jos tiesinė (fizinė) adresų erdvė yra 4 GB,adresai 0 iki FFFFFFFF. Šiuo modeliu, vadinamu plokščiuoju atmintiesmodeliu, yra lengva naudotis, nes reikia tik vieno 32 bitų sveikojo skaičiauskomandos ar duomenų adreso nurodymui, 3.11 pav. Procesorius adresusskaičiuoja ir transliuoja fone, visa tai yra nematoma programuotojams. Segmentųregistrai (cs, ds, ss, es, fs, gs) nurodo į segmentų deskriptorių lentelę,kurią operacinė sistema naudoja atskirų programos segmentų valdymui. Tipiškaapsaugoto režimo programa turi tris segmentus: kodo, duomenų irdėtuvės, naudojami cs, ds, ir ss registrai:• cs rodo į kodo segmento deskriptoriaus lentelę,• ds rodo į duomenų segmento deskriptoriaus lentelę,• ss rodo į dėtuvės segmento deskriptoriaus lentelę.


3.4. I8086 architektūros ypatybės 273.9 pav.: Realaus adreso režimo atminties modelis, segmentų registraiIA-32 architektūroje yra dar keli atminties valdymo būdai: plokščiassegmentinis modelis, daugia-segmentinis modelis ir virtualios atminties modelis.3.4 I8086 architektūros ypatybėsToliau mes nagrinėsime taip vadinamą bazinę architektūrą, t.y. 16 bitų 8086mikroprocesorių.Vietinės mikroprocesoriaus 8086 atminties struktūra, registrai, parodyta3.12 pav. Čia išskirtos trys duomenų ir adresų registrų grupės ir du papildomiregistrai - komandos rodiklis ir vėliavėlių (požymių) registras.Duomenų registrai skirti programuoti su 16 skilčių žodžiais, galima disponuoti4 registrais: ax, bx, cx, dx. Dirbant su baitais kiekvienas registraspasidalina į dvi dalis ir tokiu būdu leidžia dirbti su aštuoniais vieno baitoilgio registrais: ah, bh, ch, dh, al, bl, cl, dl. Čia raidė L reiškia jaunesnįjį(angl.- Low) , o H - vyresnįjį (angl. High) žodžio baitą. Reikia įvertinti, kadišvardinti duomenų registrai kai kuriose komandose naudojami, neparodantto tiesiogiai komandos apraše:


3.4. I8086 architektūros ypatybės 283.10 pav.: Realaus adreso režimo atminties modelis fizinio adreso formavimas• ax (angl. Accumulator register) (akumuliatorius) registras naudojamasvykdant žodžių daugybą ir dalybą, įvedimo - išvedimo operacijasir kai kurias operacijas su eilutėmis;• al registras naudojamas atliekant analogiškas operacijas su bitais beiatliekant aritmetines operacijas su skaičiais;• ah registras naudojamas baitų daugyboje ir dalyboje;• bx (angl. Base register) bazinis registras dažnai naudojamas duomenimsadresuoti atmintyje;• cx (angl. Count register) skaitliuko registras naudojamas ciklinėseoperacijose;• cl registras naudojamas postūmio konstantai nurodyti;• dx (angl. Data register) duomenų registras naudojamas daugybosir dalybos operacijose. Įvedimo - išvedimo operacijose naudojamasformuojant atitinkamus įvedimo - išvedimo įrenginių adresus.Segmentų registrai siejasi su tuo, kad programos kodas ir duomenys saugomiatskirose atminties srityse ir kiekvienas tokios srities dydis neturi vir-


3.4. I8086 architektūros ypatybės 293.11 pav.: Apsaugoto režimo plokščias atminties modelisšyti 64 Kbaitų (1 Kilobaitas = 1024 Baitų, 1 Megabaitas = 1024 Kbaitų).Mikroprocesorius vienu metu gali būti susietas su keturiais segmentais.Kiekvieno jų pradiniai adresai yra atitinkamuose segmentų registruose. Šiųregistrų funkcijos tokios:• cs (angl. Code Segment) komandų segmento registras nurodo programoskodo segmento pradžią;• ss (angl. Stack Segment) steko segmento registras nurodo steko pradžią;• ds (angl. Data Segment) duomenų segmento registras nurodo duomenųsegmento pradžią;• es (angl. Extra Segment) papildomo segmento registras nurodo papildomosegmento pradžią;Indeksiniai registrai si (angl. Source index) ir di (angl. Destinationindex) dažniausiai naudojami išrenkant operandus iš atminties, formuojantjų fizinius adresus. Registrai - rodikliai sp (angl. Stack pointer) ir bp (angl.Base pointer) naudojami dirbant su steku.


3.4. I8086 architektūros ypatybės 30Komandų rodiklis ip (angl. Instruction pointer) rodo į sekančios komandosadresą programos segmente. Programos vykdymo metu ip turinyskeičiasi ir visada rodo į sekančią vykdomą komandą.Vėliavėlių registras saugo informaciją apie mikroprocesoriaus padėtį irrezultato požymius. Tai šešiolikos skilčių registras, kurio skilčių paskirstymasparodytas 3.13 pav. Jame realizuotos 6 vieno bito vėliavėlės, nusakančiasaritmetinių ir loginių komandų įvykdymo rezultatus ir 3 papildomosvaldymo vėliavėlės, kurias galima nustatyti programiškai.3.13 pav.: Procesoriaus vėliavėlių registras• CF (angl. Carry flag) perkėlimo vėliavėlė. Nurodo 1 perkėlimą išvyriausios skilties aritmetinių operacijų metu.• PF (angl. Parity flag) Lygiškumo (pariteto) vėliavėlė. Parodo, kadrezultatas turi lyginį vienetų skaičių.• AF (angl. Adjust flag) Pagalbinio perkėlimo vėliavėlė. Naudojamaaritmetinėse operacijose su baitais. Indikuoja perkėlimą iš jaunesnėstetrados į vyresniąją.• ZF (angl. Zero flag) Nulio vėliavėlė. Indikuoja nulinį rezultatą.• SF (angl. Sign flag) Ženklo vėliavėlė. Atitinka rezultato vyriausios(ženklo) skilties turinį.• TF (angl. Trap flag) Vėliavėlė - gaudyklė. Dažniausiai naudojamaorganizuojant žingsninį darbą. Jei TF nustatyta į vienetą, mikroprocesoriuspo kiekvienos komandos įvykdymo stabdomas.


3.4. I8086 architektūros ypatybės 31• IF (angl. Interrupt flag) Pertraukimo leidimo vėliavėlė. Naudojamaprogramose, kur reikia leisti arba drausti pertraukimus. IF = 0 vėliavėlėsreikšmė draudžia pertraukimus. Pertraukimo signalas gali ateitiiš išorinio įrenginio arba gali būti suformuojamas programoje. Jei vėliavėlėIF leidžia, atėjus atitinkamam signalui automatiškai pereinamaį pertraukimo apdorojimo programą, o po to grįžtama vykdyti pertrauktąprogramą. Pvz.: pertraukimo metu gali būti įvestas simbolisiš kompiuterio klaviatūros.• DF (angl. Direction flag) Krypties vėliavėlė. Dažniausiai naudojamakartu su eilučių apdorojimo komanda.• OF (angl. Overflow flag) Perpildymo vėlevėlė. Fiksuoja perpildymoatvejį kai prarandama reikšminė skiltis, dirbant su baitais arbažodžiais.Akivaizdu, kad registrai sudaro tik nedidelę mikroprocesoriaus struktūrosdalį. Tai elementai, kurių turinį gali priimti ir keisti programuotojas.Kitų mikroprocesoriaus mazgų darbą programuotojas valdo netiesiogiai - užduodamasvykdyti konkrečias komandas, kurias įvykdo aritmetinis - loginisįrenginys, informaciją tarp registrų ir išorės perduoda atitinkamos magistralėsir t.t.Programuojant asemblerio kalboje detaliai išsiaiškinti kitų mikroprocesoriausmazgų darbo programuotojas nėra būtina.Mikroprocesoriaus 8086 atminčiai adresuoti reikia 20 bitų magistralės.Komandų registras ip ir visi kiti registrai turi tik 16 bitų, Mikroprocesoriusnegali iš karto tiesiai kreiptis į bet kurią atminties vietą. Todėl visa atmintisyra suskirstyta į segmentus. Vartotojas vienu metu gali dirbti tik su savosegmentais. Kitose atminties dalyse gali būti saugomos įvairios sistemos irkitų vartotojų programos.Kiekvienas atminties segmentas gali apimti iki 64 Kbaitų (65636). Segmentopradinis adresas nustatomas vartotojo programoje ir jis visada prasidedanuo 16 baitų ribos.Mikroprocesorius 8086 realų fizinį adresą formuoja tokiu būdu, kaip taiparodyta 3.14 pav. Taip formuojant adresą adresuojama erdvė yra 1 MB.


3.4. I8086 architektūros ypatybės 323.14 pav.: Fizinio adreso formavimasAtminties segmentas gali užimti nuo 16 B iki 64 KB. Segmentas gali būtišiose ribose bet kokio ilgio. Pradinis segmento adresas būtinai turi dalintisiš 16.Programai ir duomenims skiriami segmentai iki 64 KB ir formuojanttokios apimties programas problemų paprastai neiškyla. Jei programa arduomenys netelpa į 64 KB juos tenka išdėstyti keliuose segmentuose. Tadaprogramos viduje turi būti atitinkama komandos perėjimui iš vieno segmentoį kitą.Mažiausias adresuojamas vienetas atmintyje yra baitas. Duomenysatmintyje talpinami pradedant jaunesniuoju duomenų baitu, t.y.jaunesniuoju adresu - jaunesnis domenų baitas. 16 bitų žodis į atmintįvisada įrašomas taip, kad vyresnysis baitas turi vienetu didesnį adresą,t.y. baitai atmintyje talpinami iš kito galo. Pavyzdžiui, jei šešioliktainisskaičius 0A79H turi būti įrašytas 3100H - 3101H baituose, tai 3100H baitebus 79H, o 3101H - 0AH.


3.4. I8086 architektūros ypatybės 333.12 pav.: Procesoriaus vietinė atmintis


skyrius 4Asemblerio kalbos pagrindaiSąvoka asembleris turi 2 reikšmes: tai programavimo kalba ir šios kalbostransliatorius į mašininę kalbą. Kadangi programuojant galima vartoti netik simbolines asemblerio komandas, bet ir makrokomandas, dažnai asemblerisvadinamas makro<strong>asembleriu</strong>. Pagrindinis šios programavimo kalbosbruožas tas, kad kiekviena simbolinė asemblerio komanda transliuojant pakeičiamamašinine komanda atitinkančia elementarią instrukciją procesoriui.Iš makrokomandų gali būti gauta viena arba kelios simbolinės asemblerio komandos.Asemblerio kalba vartojama tada, kai reikia sudaryti trumpą ir greitaiveikiančią programą bei maksimaliai išnaudoti kompiuterio galimybes.4.1 Operatoriaus struktūraMakroasemblerio kalba parašytą programą sudaro simbolių eilutės, vadinamosoperatoriais. Paprastai operatorių sudaro 4 dalys, atskirtos viena nuokitos specialiais skyrybos ženklais:⎡⎢⎣vardasžymė:kintamasis⎤⎥⎦ operacija [operandas] [; komentaras]Čia laužtiniuose skliaustuose nurodyta informacija kartais gali būti nevartojama.Žymė. Parašyta programa ir duomenys laikomi operatyviojoje atmintyje(OA). Kreipiantis į kurį nors programos operatorių, reikėtų nurodytiatitinkamą OA adresą. Tačiau tai būtų labai sudėtinga. Todėl tiems programosoperatoriams arba duomenims, į kuriuos kreipiamės, vietoje adresųnurodomi simboliniai vardai, užrašyti operatoriaus pradžioje.Kintamasis. Duomenis identifikuojantys simboliniai vardai vadinasikintamaisiais, o asemblerio komandos - žymėmis. Kiekviena žymė baigiasi":" (po kintamųjų ":" nerašomas).34


4.2. Programos struktūra 35Simboliniai vardai gali būti sudaryti iš alfabetinių - skaitmeninių neribotoskaičiaus simbolių bei ženklų " ,","?", "_" eilučių, tačiau reikšminiai yratik pirmi 31. Jeigu kelių simbolinių vardų pirmieji 31 simboliai sutampa, tailaikoma, kad vardai yra vienodi. Nors kiti vardų simboliai ir skirtųsi. Vienodųsimbolinių vardų programoje negali būti, tačiau vieną duomenų laukągali identifikuoti keli kintamieji, taip pat ir vieną asemblerio komandą galiidentifikuoti kelios žymės.Vardai - tai simboliniai žodžiai, apibrėžiami direktyva EQU ir turintyssimbolinę arba skaitinę reikšmę (tai panašu į konstantų aprašymą Pascalkalboje).Operacija. Operacijos lauke gali būti nurodyta simbolinė asembleriokomanda, makrokomanda arba transliatoriaus direktyva. Tarpai (tušti simboliai)prieš šį lauka arba po jo neturi jokios reikšmės.Makrokomandos. Iš asemblerio komandų galima sudaryti kitas (paprastaisudėtingesnes) komandas, vadinamas makrokomandomis, ir vartotijas programavimo palengvinimui. Duomenims, programoms, makrokomandomsaprašyti ir transliavimo procesui valdyti vartojamos transliatoriausdirektyvos.Operandai. Jeigu operacijos lauke nurodoma komanda, tai operandųlauke nurodomi kintamieji, su kuriais reikia atlikti nurodytus veiksmus. Kaioperacijos lauke nurodyta makrokomanda ar transliatoriaus direktyva, taioperandų lauke nurodomi reikiami argumentai. Nurodyti keli operandai,vienas nuo kito atskiriami kableliais.Komentarai visada prasideda kabliataškiu ir užima likusią eilutės dalį.Paaiškinimai gali užimti ir visą eilutę. Komentarai neturi jokios reikšmės neiprogramos vykdymui, nei transliavimo procesui, jie tik paaiškina programą.4.2 Programos struktūraPrograma paprastai (bet ne būtinai) sudaroma iš trijų segmentų: steko, duomenųir kodo. Segmentai aprašomi direktyvomis SEGMENT (segmentopradžia) ir ENDS (segmento pabaiga). Taip pat būtina nurodyti asembleriotransliatoriui kokius segmentus bei registrus vartoti, transliuojant kreipiniusį duomenis ir komandas. Tai nurodoma direktyva ASSUME. Programa užbaigiamadirektyva END. Išraiška, jeigu ji užrašyta, nurodo pirmą vykdomąprogramos komandą. Jei programa sudaryta iš kelių modulių tai tik vienamereikia nurodyti programos pradžią. Programos pavyzdys pateiktas žemiau:stekas SEGMENT stack; atminties rezervavimas stekuistekas ENDSduom SEGMENT; duomen ų apra š ymasduom ENDS


4.3. Duomenų aprašymas ir atminties laukų rezervavimas 36kodas SEGMENTASSUME cs:kodas , ds: duomenys , ss: stekaspradzia : ; programakodasENDSEND pradzia4.3 Duomenų aprašymas ir atminties laukų rezervavimasPrieš apdorojant informaciją, į operatyviąją atmintį įrašomi žinomi dydžiaibei rezervuojama vieta skaičiavimo rezultatams.Asembleryje pradiniai duomenys nurodomi bei atmintis rezervuojamaaprašant kintamuosius. Kintamųjų aprašymo direktyvomis nurodoma duomenųlaukų dydis, turinys, tipas ir vieta programoje. Šiomis direktyvomisgalima aprašyti skaliarinius duomenis, įrašus - bitu rinkinius ir struktūras -baitų sekas, atspindinčias tam tikrą loginę duomenų struktūra. Kintamųjųaprašymui vartojamos ⎧ direktyvos: ⎫DB⎪⎨ DW ⎪⎬[kintamasis] DD reikšmėDQ⎪⎩ ⎪⎭DTKintamųjų aprašymo direktyvos atmintį išskiria elementais, kurių ilgįapibrėžia antroji direktyvos raidė:B apibrėžia baitus (angl. Byte);W apibrėžia 2 baitų ilgio žodžius (angl. Word);D apibrėžia 4 baitų ilgio elementus (dvigubus žodžius) (angl. Double word);Q apibrėžia 8 baitų ilgio elementus (angl. Quad word);Operandų lauke užrašomos kableliais atskirtos viena ar kelios išraiškos,kurios gali būti:• skaitinės išraiškos,• ’?’ simbolis, vartojamas atminties rezervavimui,• adresinės išraiškos (tik DW arba DD),• simbolių eilutės (iki 255 simbolių), simbolių eilutės rašomos tarp apostrofųarba kabučių,


4.4. Paprasčiausi operandų adresavimo būdai 37• kartojama skaitinė išraiška kiekis DUP (reikšmė...). Išraiška priešDUP nurodo operandų, esančių skliaustuose, kartojimo skaičių Skliaustuosegali būti bet kuri išraiška, taip pat ir kita DUP tipo išraiška.Priimta, kad visi įsirašyti skaičiai pateikiami 10-aine skaičiavimo sistema.Norint pakeisti sistemos pagrindą reikia aukščiau užrašyti direktyva.RADIX N, čia N - bet kuris skaičius nuo 2 iki 16 - skaičiavimo sistemospagrindas. Užrašant skaičius, taip pat galima nurodyti skaičiavimo sistemospagrindą. Šiuo atveju skaičiavimo sistemos pagrindas nurodomas raide rašomapo skaičiaus: B - dvejetainis, 0 arba Q aštuntainis, D - dešimtainis, H-šešioliktainis. Šešioliktainis skaičius turi prasidėti dešimtainiu skaitmeniu.Duomenų parašymo pavyzdžiai pateikti žemiau:sb DB ’ EILUTE ’ ; 6 bait ų ilgio; simboli ų eilutes2 DB ’E’,’I’,’L’,’U’,’T’,’E’; ta pati eilut ėn1 DB 55 ; 1 baito ilgio kintamasisn2 DB 37H ; tas pats skai č ius;šeš ioliktain ėje sistemojen3 DW OFH ; 2 bait ų ilgio kintamasisn4 DW 170 ; tas pats skai č ius; aš tuntain ėje sistemojea1 DB 5 ,7 ,23 ,0 ; 4 vienbai čių skai čių masyvasa2 DW 10 DUP (?) ; rezervuojamas 10 žodžių laukasa3 DB 20 - DUP ( OFFH ) ; sukuriamas 20 bait ų; laukas , už pildytas konstantomisn1a DW n1 ; kintamojo n1 adresasn5 DW 55+10 ; kintamojo n5 reik šmė yra 65a4 DB 2( DUP (2 , 3 ( DUP (1))) ; bus sugeneruota; tokia seka : 2 ,1 ,1 ,1 ,2 ,1 ,1 ,14.4 Paprasčiausi operandų adresavimo būdaiAsemblerio komandoje nurodoma ne tik kokią operaciją reikia atlikti, bet irsu kokiais duomenimis ją vykdyti ir kur užrašyti rezultatą. Duomenys arbarezultatai gali būti vietinėje (procesoriaus registruose) arba operatyviojojeatmintyje.Paprasčiausia nurodyti operandus vietinėje atmintyje registru: ax, bx,ah, al ir t.t. Toks adresavimo būdas vadinamas registriniu adresavimu.Šiuo atveju duomenys yra registre. Pavyzdžiui, kad perrašyti informacijąiš registro bx į registrą ax, rašoma komanda MOV, o operandai nurodomitaip:


4.4. Paprasčiausi operandų adresavimo būdai 38MOV ax , bx ; reg. bx turinys; persiun č iamas į reg. axKai operandas yra konstanta, patogu duomenis užrašyti betarpiškai komandoje.Toks adresavimo būdas vadinamas betarpišku adresavimu. Pavyzdžiui:MOV ax , 10 ; konstanta 10 persiun č iama; į reg. axMOV dl , ’=’ ; simbolio ’=’ ASCII kodas; persiun č iamas i reg. dlMOV dx , ’NE ’ ; simboliai ’N’ ir ’E’; užrašomi į reg. dxNurodyti operandams esantiems operatyviojoje atmintyje yra keletas būdų.Paprasčiausia adresuoti žodžius ar baitus operatyviojoje atmintyje, nurodantjų adresus simboliniais vardais. Toks adresavimo būdas vadinamastiesioginiu adresavimu. Pavyzdžiui:a1 DB 1 ; apra š ome kintamuosiusb DW 20 ; ir rezervuojamed DB ? ; atmintiMOV al , a1 ; atminties baito a1 turinys; i reg. alMOV d, bh ; reg. bh turinys; į atminties bait ą dMOV dx , b ; žodžio b turinys; persiun č iamas į registr ą dxDažnai tenka apdoroti indeksuotus duomenis, pavyzdžiui, masyvo elementus.Šiuo atveju patogu vartoti indeksuotą operandą, t.y. nurodytimasyvo pradžios adresą ir elemento indeksą. Indeksui nurodyti vartojamiregistrai si ir di. Pavyzdžiui:mas DB 10 ,20 ,30 ,40 ,50 ; skai čių masyvas..MOV si , 0MOV ah , mas [si] ; į registr ą ah persiun č iamas; 1- sis elementas (10)MOV si , 3MOV dh , mas [si] ; į registr ą dh persiun č iamas; 4- sis elementas (40)


skyrius 5Mikroprocesoriaus I8086komandų sistemaMikroprocesoriaus I8086 komandos skirstomos į tokias grupes:1. duomenų persiuntimo komandos;2. aritmetinių operacijų komandos;3. bitų apdorojimo komandos;4. eilučių apdorojimo komandos;5. nukreipimo komandos;6. procesoriaus valdymo komandos.Komandose nurodoma du, vienas arba nei vieno operando. Jei komandojereikia nurodyti du operandus, tai tik vienas iš jų gali būti atmintiesoperandas ir abiejų operandų ilgiai turi sutapti,5.1 Duomenų persiuntimo komandosDuomenų persiuntimo komandos vėliavėlių registro bitų nekeičia. KomandaMOV yra pagrindinė duomenų persiuntimo komanda. Ji gali persiųstiduomenų baitą arba žodį iš atminties į registrą, iš registro į atmintį arbaiš registro į registrą. Komanda MOV taip pat galima įrašyti į registrą arbaatmintį duomenis, nurodytus komandoje. Komandos MOV duomenųpersiuntimo kryptys parodytos 5.1 pav.Komanda MOV galima persiusti ne tik duomenis, bet ir atminties laukoadresą:MOV bx , OFFSET kint.39


5.1. Duomenų persiuntimo komandos 405.1 pav.: MOV komandos persiuntimo kryptysPrefiksas OFFSET nurodo, kad į registrą reikia užkrauti lauko kintadresą. Komanda LEA persiunčia į registrą atminties lauko adresą,LEA bx , kintJai ekvivalentiška būtų komandaMOV bx , OFFSET kintTačiau komanda LEA yra lankstesnė. Ja galima persiųsti bet kuriolauko adresą. Pavyzdžiui jeigu reg, di yra duomenų masyvo adresas, taikomandaLEA bx , 10[ di]į reg, bx persiųs dešimtojo masyvo elemento adresą.Komanda XCHG sukeičia vietomis dviejų operandų turinius.Pavyzdžiui, komandaXCHG dx , bx


5.2. Aritmetinių operacijų komandos 41analogiška tokiai komandų sekaiMOV ax , bxMOV bx , dxMOV dx , axKomanda PUSH į steką įrašo žodžio ilgio duomenis, nurodytus operande.Vykdant šią komandą, steko rodiklis sp sumažinamas 2 ir į steko viršūnęįrašomi duomenys. Komandos formatas:PUSHoperandasKomanda POP skaito iš steko žodžio ilgio duomenis ir persiunčia juosį operandą. Vykdant šią komandą, iš steko viršūnės skaitomi duomenys irsteko rodiklis sp padidinamas 2. Pavyzdžiui:PUSHPUSH..POPPOPbxcxbxcxĮvykdžius šias komandas, registrų bx ir cx turiniai bus sukeisti vietomis,norint atstatyti senuosius registrų turinius reikėtų įvykdyti tokią komandųseką:POPPOPcxbx5.2 Aritmetinių operacijų komandosMikroprocesoriaus I8086 komandų sistemoje yra tik sveikųjų skaičių aritmetikoskomandos, t.y. aritmetines operacijas galima atlikti tik su fiksuoto taškoskaičiais (su ženklu ir be ženklo). Operacijos su slankaus taško skaičiaisgalima atlikti programiškai arba vartojant koprocesorių I8087. Daugumaaritmetinių komandų keičia vėliavėlių registro bitų reikšmes.Sudėties ir atimties komandosSudėties komanda ADD sudeda du dvejetainius skaičius, nurodytus operanduoseir rezultatą patalpina pirmo operando vietoje:ADD op1 , op2 ; op1 := op1 + op2


5.2. Aritmetinių operacijų komandos 42Galimi tokie operandų deriniai žodžio ilgio operandams sudėti:Galimi tokie operandų deriniai baito ilgio operandams sudėti:Pavyzdžiui:a DW 12..ADD ax , bx ; ax := ax + bxADD dx , a ; dx := dx + 5ADD ah , 5 ; ah := ah + 5Sudėties su perkėlimu komanda ADC sudeda du operanduose nurodytusskaičius ir jei prieš atliekant komandą buvo nustatyta CF:=1, tai dar priesumos pridedamas 1;ADC opl , op2 ; op1 := op1 + op2 + CFŠi komanda vartojama ilgesnių nei 16 bitu skaičių sudėčiai.Atminties komanda SUB iš skaičiaus, nurodyto pirmame operande, atimaskaičių, nurodyta antrame operande, ir rezultatą patalpina pirmo operandovietoje:


5.2. Aritmetinių operacijų komandos 43SUB op1 , op2 ; op1 := op1 - op2Atimties su perkėlimu (skolinimu) komanda SBB atlieka atimties operacijąir jei prieš atliekant komanda buvo nustatyta CF:=1, tai iš rezultatodar atimamas 1:SBB op1 , op2 ; op1 := op1 - op2 - CF ,Ši komanda vartojama ilgesnių nei 16 bitų skaičių atimčiai.Palyginimo komanda CMP atlieka atimties operaciją, bet rezultatasneįsimenamas o tik nustatomos atitinkamos vėliavėlės AF, CF, OF, PF,SF, ZF.CMP op1 , op2 ; op1 - op2.Ši komanda kartu su sąlyginio nukreipimo komandomis vartojama programuojantšakojimus algoritmuose.Komandose ADC, SUB, SBB ir CMP galimi tokie pat operandų deriniaikaip ir komandoje ADD. Neigimo komanda NEG keičia operandoženklą priešingu t,y. operandas atimamas iš 0 ir rezultatas talpinamas operandovietoje:NEG op ; op := 0 - opKomanda INC padidina operandą vienetu:INC op ; op := op + 1.Komanda DEC sumažina operandą vienetu;DEC op ; op := op - 1Daugybos ir dalybos komandosŠios komandos sudarytos taip, kad vienas iš operandų būtinai yra akumuliatoriuje(registrai ax arba al), o komandoje nurodomas tik antrasis operandas(daugiklis arba daliklis). Rezultatas talpinamas registruose ax ir dx. Šiosekomandose betarpišką operandą nurodyti negalima.Sveikų skaičių, be ženklo daugybos komanda MUL:MUL op ; akumuliatorius := akumuliatorius * opSveikų skaičių su ženklu daugybos komanda IMUL:IMUL op ; akumuliatorius := akumuliatorius * op


5.2. Aritmetinių operacijų komandos 44Daugybos komandose galimi tokie operandų deriniai (žodžiams):Daugikliai yra 16 bitų ilgio, o sandauga - 32 bitų. Reg. ax talpinamajaunesnė, o reg. dx - vyresnė sandaugos dalis. Jeigu skaičiai be ženklo irsandauga (65535, tai ji pilnai telpa reg. ax, o jei skaičiai su ženklu, taisandauga reg. ax telpa, jeigu ji yra intervale nuo -32768 iki +32767.Galimi tokie operandų deriniai baito ilgio operandams sudauginti:Daugikliai yra 8 bitų ilgio, o sandauga - 16 bitų. Reg, al talpinama jaunesnė,o reg. ah vyresnė sandaugos dalis. Jeigu skaičiai be ženklo ir sandauga 255,tai ji pilnai telpa reg. al, o jei skaičiai su ženklu, tai sandauga reg. al telpa,jeigu ji yra intervale nuo - 128 iki +127. Sveikų skaičių be ženklo dalyboskomanda DIV:DIV op ; akumuliatorius := akumuliatorius / op.Sveikų skaičių su ženklu dalybos komanda IDIV:IDIV op ; akumuliatorius := akumuliatorius / opOperandų deriniai dalinant žodžius:


5.2. Aritmetinių operacijų komandos 45Operandų deriniai dalinant baitus:Dalmuo turi tilpti reg ax (arba al), priešingu atveju gaunama klaida.Dalyba iš nulioKaip matote dalinys yra dvigubo ilgio: jeigu operandas 1 baito, tai dalinys2 baitų ilgio, o jeigu operandas 2 baitų, tai dalinys 4 baitų ilgio. Reikiamoilgio dalinys gaunamas po daugybos operacijos.Pavyzdys. Apskaičiuoti y = (x ∗ 5)/a.a DW 2x DW -12y DW ?..MOV ax , 5 ; ax := 5IMUL k ; dx:ax:-ax*x (5* x)IDIV a ; ax := dx/cx/a (5* x/a), dx - liekanaMOV y, ax ; y:= ax (y :=5* x/a)Dažniausiai prieš dalybos operaciją neatliekama daugybos operacija irtodėl reikia specialiai suformuoti reikiamo ilgio dalinį. Jeigu operacijos at-


5.2. Aritmetinių operacijų komandos 46Dešimtainis skaičius 1 baito ilgio operandas 2 baitų ilgio operandas(vyriausias bitas - ženklo)+5 0000 0101 0000 0000 0000 0101-5 1111 1011 1111 1111 1111 1011liekamos su skaičiais be ženklo tada į reg. dx (arba ah) reikia įrašyti nulį.Tai galima atlikti pvz. komandomis MOV arba SUB:SUB ah , ahMOV dx , 0Jeigu skaičiai su ženklu, tada vyresnį dalinio reg. dx (arba ah) Reikiaužpildyti jaunesnio dalinio registro ax (arba al) ženklo bitu. Pvz.:Šiai transformacijai atlikti yra specialios komandos. Komanda CBW transformuojabaitą į žodį: registras ah užpildomas vienbaičio skaičiaus reg. alženklo bitu. Komanda CWD transformuoja žodį į dvigubą žodį: registrasdx užpildomas skaičiaus reg. ax ženklo bitu. Komandos CBW ir CWDoperandų neturi. Pavyzdžiui, apskaičiuokime išraiškas x = a/b ir y = c/da DB 25b DB 5x DB ?c DW -25550d DW -25y DW ?..MOV al , a ; al :=aCBW ; ax := ahIDIV b ; al := ax/bMOV x, al ; x:= al..MOV ax , e ; ax:-cCWD ; dx:as := axIDIV d ; ax := dx:ax/dMOV y, axAritmetinių komandų nagrinėjimo pabaigoje pateiksime pavyzdį, demonstruojantįdaugumą aritmetinių komandų. Apskaičiuoti išraišką X =A/C + (A ∗ 2 + B ∗ C)/(D − 3). visi skaičiai žodžio ilgio su ženklu.a DW -255b DW 25


5.3. Nukreipimo komandos 47c DW -250d DW 222x DW ?..MOV ax , a ; ax :=aCWD ; dx:ax := axIDIV c ; ax :=a/cMOV x, ax ; x:=a/cMOV ax , 2 ; ax :=2IMUL a ; dx:ax :=a*2MOV bx , dxMOV cx , ax ; bx:cx :=a*2MOV ax , bIMUL c ; dx:ax :=b*cADD ax , cxADC dx , bx ;dx:ax :=b*c+a*2MOV cx , dSUB cx , 3 ; cx :=d -3IDIV cx ; ax :=( b*c+a *2)/(d -3)ADD x, ax ; x:=a/c+(b*c+a *2)/(d -3)5.3 Nukreipimo komandosKomandos vykdomos programoje užrašyta tvarka. Tačiau atliekant loginiussprendimus, reikia pakeisti komandų vykdymo tvarką vienos komandos vykdomos,kai loginė sąlyga patenkinta, kitos - kai nepatenkinta. Loginė sąlygavisuomet yra įrašyta į vėliavėlių registrą. Komandų vykdymo tvarkos keitimuivartojamos nukreipimų komandos. Jos nukreipia valdymą į komandąsu žyme. Pavyzdžiui:JMP t1 ; valdymas nukreipiamas į komand ą t1..t1: MOV ah , bhNukreipimo komandos yra dviejų tipų:1. besąlyginio nukreipimo komandos,2. sąlyginio nukreipimo komandos.Sąlyginio nukreipimo komandos keičia programos vykdymo tvarką, priklausomainuo ankstesnių komandų rezultatų, kurie atsispindi požymių vėliavėlėse.Nukreipimo komandos keičia komandų rodiklį (registrą ip), o kartais


5.3. Nukreipimo komandos 48ir komandų segmento registrą cs. Šie registrai nurodo kokia komanda busvykdama. Jeigu nukreipimo komanda keičia tik registrą ip, t. y. valdymasperduodamas to pačio segmento viduje, tai - vidinis nukreipimas, jei keičiaabu registrus cs ir ip, t.y. nukreipiama į žyme,kuri yra kitame programossegmente, tai - išorinis arba tarpsegmentinis nukreipimas.5.3.1 Nukreipimo adresavimasKaip ir kitose komandose, nukreipimo komandose galima vartoti įvairiusadresavimo budus: tiesioginį ir santykinį nukreipimų adresavimą. Esanttiesioginiam adresavimui informacija apie nukreipimo adresą yra pačioje komandoje.Nukreipimo komanda su tiesioginiu adresu užrašoma taip:JMPlabelČia label - toliau vykdomos komandos žymė. Nukreipimo komandoje sutiesioginiu adresavimu yra perėjimo žymės poslinkis nukreipimo komandosadreso atžvilgiu. Mašininėje komandoje poslinkiui įrašyti gali būti skiriama1 baitas (nukreipimams per –128 ± 127 baitų), 2 baitai (-32768 ± 32767baitų) ir 4 baitai (nukreipimams virš 64kB, t.y. į kitą segmentą).Užrašant nukreipimo komandą galima nurodyti poslinkio ilgį, vartojantatitinkamus prefiksus:short - 1 baitasshort - 1 baitasnear ptr - 2 baitaifar ptr - 4 baitaiPavyzdžiui:JMP aJMP short bJMP near ptr z1JMP far ptr z2.5.3.2 Sąlyginio nukreipimo komandosVisose sąlyginio nukreipimo komandose poslinkis yra 1 baito ilgio. Jei sąlyginionukreipimo komanda nurodo į žymę, esančią toliau nei 128 baitai,reikia vartoti specialią konstrukciją. Pavyzdžiui, jeigu reikia pereiti į žymeZERO, kuri yra toliau nuo šios komandos nei 128 baitai, kai nustatyta nuliovėliavėlė ZF, Tai galima užrašyti taip:


5.3. Nukreipimo komandos 49..JNZJMPcontinue :..continuezeročia vartojama priešingos sąlygos nukreipimo komanda. Nukreipimo komandostikrina vėliavėlių registro bitų reikšmes ir priklausomai nuo sąlygos,atliekamas arba neatliekamas perėjimas. Nukreipimo komandos vėliavėliųreikšmių nekeičia. Vėliavėles nustato aritmetinės, loginės komandos ir palyginimokomanda CMP. Nukreipimo komanda paprastai rašoma po palyginimo,aritmetinių arba loginių komandų.Visos sąlyginio nukreipimo komandos pateiktos lentelėje 5.1Komandos mnemonika Nukreipimo sąlyga PaaiškinimaiJE/JZ ZF=1 lygu: rezultatas nulinisJP/JPE PF=1 lyginisJO OF=1 esant perpildymuiJG SF=1 esant ženkluiJNE/JNZ ZF=0 nelygu; rezultatas nenulinisJNP/JPO PF=0 nelyginisJNO OF=0 nesant perpildymoJNS SF=0 nesant ženkloJL/JNGE SF=OF jei mažiauJLE/JNG (ZF=1) OR (SF=OF) jei mažiau arba lyguJNL/JGE SF=OF jei daugiau arba lyguJNLE/JG (ZF=0) OR (SF=OF) jei daugiauJB/JNEA/JC CF=1 jei mažiau (be ženklo)arba buvo pernašaJBE/JNA (CF=1) OR (ZF=1) jei mažiau arba lygu(be ženklo)JNB/JAE/JNC CF=0 jei daugiau arba lygu(be ženklo) arba nebuvopernašosJNBE/JA (CF=0) AND (ZF=0) jei daugiau (be ženklo)5.1 lentelė: Sąlyginio nukreipimo komandos.


5.4. Ciklo programavimo komandos 50Kai kurios komandos turi kelias skirtingas mnemonikas, pvz. JE ir JZ,tačiau abi mnemonikos lygiareikšmės ir galima vartoti bet kurią iš jų.Pavyzdys. Duota a, b, c, x. Apskaičiuoti:⎧⎪⎨ x + a , kai b + c > 5;y = x − a , kai b + c = 5;⎪⎩ x + 3 , kai b + c < 5.a DW 20b DW -11c DW 222x DW 255y DW ?..MOV dx , bADD dx , cCMP dx , 5JG a1JE a2MOV ax , xADD ax , 3JMP pa1: MOV ax , xADD ax , xJMP Pa2: MOV ax , xSUB ax , xP: MOV y, ax..5.4 Ciklo programavimo komandosCikle, programavimo komandos priklauso sąlyginio nukreipimo komandųgrupei. Ciklo komandos vartoja reg. cx kaip ciklo iteracijų skaitliuką. KomandaLOOP atima 1 iš registro cx, ir jei gautas rezultatas nelygus O,nukreipia į komandą su žyme, kuri nurodyta ciklo komandoje. Kai registrascx gaunamas 0, vykdoma paskesnė komanda. Pavyzdžiui:..MOV cx , sk ; ciklo iteracij ų skai č ius


5.4. Ciklo programavimo komandos 51c_pr :LOOP; ciklo algoritmasc_pr..Ciklo algoritmas vykdomas tiek kartų, kiek buvo nurodyta registre cx.Bei jeigu programa cikle keičia registrą cx, tai iteracijų skaičius gali neatitiktipradžioje nurodytam skaičiui. Todėl jeigu reikia cikle keisti cx, taireikia išsaugoti cx reikšmę, o po to ją atstatyti. Pavyzdžiui:..MOV cx , 14c_pr : PUSH cx.. ; ciklo algoritmas.POP cxLOOP c_pr..Jeigu pasirodys, kad pradinė cx reikšmė lygi 0, tada ciklas bus vykdamas65536 kartus, nes 0000H − 1 = 0F F F F H ir kadangi dabar cx nelygu 0, taiciklas bus kartojamas. Kad išvengti tokios situacijos vartojama komandaJCXZ - nukreipianti į programos vykdymą jeigu cx = 0. Šią komandąreikia vartoti tada, kai iteracijų skaičius apskaičiuojamas programoje ir joreikšmė iš anksto nežinoma. Pavyzdžiui:c_pr :..MOV cx , skaitliukasJCX c_pab.. ; ciklo algoritmas.LOOP c_prc_pab :..Komanda LOOPE (LOOPZ) atima 1 iš reg. cx ir jei gautas rezultatasnelygus nuliui ir ZF:=1 (nulio vėliavėlė suformuota komanda CMP ar


5.4. Ciklo programavimo komandos 52kita komanda), nukreipia į komandą nurodytą žymę. Komanda LOOPNE(LOOPNZ) atima 1 iš registro cx ir, jei gautas rezultatas nelygus nuliui irZF:=0 nukreipia į komandą nurodytą žymę.Visose ciklo komandose kaip ir sąlyginio nukreipimo komandose poslinkiuiyra skiriamas 1 baitas. Pavyzdys gali būti toks: reikia apskaičiuotimasyvo A(n) elementų sumą. Programos kodas toks:..A DB -10, -8, 2, 4, 5, 7, -11N DW 7S DB ?MOV ah , 0 ; si := 0MOV si , 0MOV cx , NJCXZ pabc_pr : ADD ah , a(si)INC siLOOP c_prpab : MOV s, ah..Komandos LOOPNE vartojimo pavyzdys. Duota masyvai A(10) irB(10). Patikrinti ar yra masyvų elementų pora, kurios suma lygi 100, t.y.a + b = 100. Jei yra nustatyti P = 1, priešingu atveju - P = 0....MOV cx , 10MOV si , offset AMOV di , offset Bpr: MOV al ,( si)ADD al ,( di)INC siINC diCMP al ,100LOOPNE prJE rastaMOV P ,0JMP pabrasta : MOV p ,1pab :.


5.4. Ciklo programavimo komandos 53.Kartotinių ciklų programavimasKadangi ciklo komandos vartoja registrą cx kaip ciklo iteracijų skaitliukątai pragramuojant kartotinius ciklus, išorinio ciklo skaitliuką (registrą cx)reikia išsaugoti, pavyzdžiui steke: Pavyzdys:..MOV cx , skaitliukas_1ck_1 : PUSH cx...MOV cx , skaitliukas_2ck_2 : PUSH cx...MOV cx , skaitliukas_3ck_3 :...LOOP ck_3...POP cxLOOP ck_2...POP cxLOOP ck_1..5.4.1 Loginės ir postūmio komandosPaprastai žodžiuose arba baituose yra skaičiai arba simbolinės informacijoskodai. Be to, bituose gali būti saugojami įvairūs kodai ir požymiai (viename


5.4. Ciklo programavimo komandos 54žodyje gali būti laikoma 16 skirtingų požymių). Loginei informacijai apdorotivartojamas loginės operacijos IR, ARBA, SUMA MODULIU 2, inversijaNE. Šios operacijos atliekamos atskirai su operandų bitais, todėl niekadanebūna perkėlimo į vyresnį bitą.Pateikiame loginių operacijų rezultatus:IRA B A ∨ B0 0 00 1 01 0 01 1 1ARBAA B A ∧ B0 0 00 1 11 0 11 1 1SUMA MODULIU 2A B A ⊕ B0 0 00 1 11 0 11 1 0NEA ¬A0 11 0Šias logines operacijas atlieka tokios komandos:Loginė operacija IR:AND op1 , op2Loginė operacija ARBAOR op1 , op2Loginė operacija SUMA MODULIU 2


5.4. Ciklo programavimo komandos 55XOR op1 , op2Inversija NE:NOTopvisais atvejais komandos rezultatas saugoma pirmajame operande.Patikrinimo komanda TEST logiškai sudaugina operandus neužrašydamarezultato. Įvykdžius šią komandą operandų turiniai nesikeičia, tiknustatomos atitinkamos vėliavėlių reikšmės.TEST op1 , op2Loginės informacijos apdorojimo komandoms priskiriamos postūmio komandos,Baito arba žodžio bitus galima pastumti vienu ar keliais bitais įdešinę ar kairę. Bitų skaičius, per kurį atliekamas postūmis, nurodomaspostūmio skaitliuke. Dažniausiai vartojamas postūmis - vienas bitas. Komandojetaip pat galima nurodyti, bet kurį bitų skaičių, jis užrašomas registrecl. Postūmio komandos paskutinį išstumtą bitą patalpina perkėlimovėliavėlėje ah. Mikroprocesoriaus I8086 komandų sistemoje yra 8 postūmiokomandos.Aritmetinio postūmio į kairę komanda SAL visus operando bitus pastumiaį kairę. Jauniausieji bitai užpildomi nuliais.SAL op , 1; arbaSAL op , CLJei komandos SAL vykdymo metu keičiasi operando ženklas, tai vėliavėlėOF:=1. Postūmį iliustruoja 5.4 pav. pavaizduota schema:Pavyzdys:SAL bx , 1MOV cl , 4SAL x, cl5.2 pav.: SAL poslinkio schemaAritmetinio postūmio į dešinę komanda SAR visus operando bitus pastumiaį dešinę. Vyriausieji bitai užpildomi ženklo bitu.SAR Op , 1


5.4. Ciklo programavimo komandos 56; arbaSAR Op , clPostūmį iliustruoja 5.3 pav. pavaizduota schema.5.3 pav.: SAR poslinkio schemaPavyzdys: pradinė operando reikšmė - 10011100. Atlikus komandą:SAR Op , 1gausime 11001110 ir CF=0.Loginio postūmio į kairę komanda SHL visus operando bitus pastumiaį kairę. Jauniausieji bitai užpildomi nuliais. Komanda SHL analogiškakomandai SAL. Loginio postūmio į dešinę komanda SHR visus operandobitus pastumia į dešinę. Vyriausieji bitai užpildomi nuliais.SHR Op , 1; arbaSHR Op , clPostūmį iliustruoja 5.8 pav. pavaizduota schema.5.4 pav.: SHR poslinkio schemaAritmetinio ir loginio postūmio komandos vartojamos realizuojant daugybosir dalybos operacijas. Vartojant postūmio į kairę komandą realizuojantdaugybos operacija:postūmis per 1 bitą atitinka daugybai iš 2,postūmis per 2 bitus atitinka daugybai iš 4,postūmis per 3 bitus atitinka daugybai iš 8 ir t.t.Vartojant postūmio į dešinę komandas realizuojama dalybos operacija. Pavyzdžiui:MOV cl , 2SHL ax , cl ; padauginti skai čių be ž enklo iš 4SAL ax , cl ; padauginti skai čių su ž enklo iš 4


5.4. Ciklo programavimo komandos 57SHR ax , cl ; padalinti skai čių be ž enklo iš 4SAR ax , cl ; padalinti skai čių su ž enklo iš 4Postūmio komandomis atliekama daugyba ir skaičiaus dalyba iš skaičiaus2 laipsnių (2, 4, 8, 16, ...) Bet postūmio komandas galima vartoti ir skaičiųdaugybai bei dalybai ir iš kitokių skaičių. Pavyzdžiui, padauginkime registroax turinį iš 10:MOV bx , axSHL ax , 1SHL ax , 1 ; padauginome iš 4ADD ax , bx ; padauginome iš 5SHL ax , 1 ; padauginome iš 10.Ši komandų seka vykdoma apie 11 kartu greičiau, nei atitinkama komandaMUL.Ciklinio postūmio į kairę komandą ROL visus operando bitus nustumiaį kairę. Išstumti bitai patalpinami į atsilaisvinusių bitų vietą:ROL Op , 1; arbaROL Op , clPostūmį iliustruoja 5.5 pav. pavaizduota schema.5.5 pav.: ROL poslinkio schemaPavyzdys. Pradinė operando reikšmė 10011000. Atlikus komandąROL Op , 1gausime 00110001 ir CF=1.Ciklinio postūmio į dešinę komanda ROR:ROR Op , 1; arbaROR Op , cl.Postūmį iliustruoja 5.6 pav. pavaizduota schema.5.6 pav.: ROR poslinkio schema


5.4. Ciklo programavimo komandos 58Pavyzdys: Pradinė operando reikšsė 10011100, atlikus komandąROR Op , 1gausime 01001110 ir CF=0.Ciklinio postūmio į kairę kartu su perkėlimo vėliavėle CF komandaRCL:RCL Op , 1; arbaRCL Op , clPostūmį iliustruoja 5.7 pav. pavaizduota schema.5.7 pav.: RCL poslinkio schemaPavyzdys. Pradinė operando reikšmė 10011100 ir CF=1. Atlikus RCLkomandą, gausime 00111001 ir CF=1. Ciklinio postūsio į dešine kartu superkėliau vėliavėle CF komanda RCR:RCR Op , 1; arbaRCR Op , clPostūmį iliustruoja 5.8 pav. pavaizduota schema.5.8 pav.: RCL poslinkio schemaPavyzdys: Pradinė operando reikšmė 10011100 ir CF:=1. Atlikus komandągausime 11001110 ir CF:=0.5.4.2 Procedūrų iškvietimo ir grįžimo iš jų komandosIškvietimo komanda CALL perduoda valdymą procedūrai, kuri yra bet kuriojeprogramos vietoje. Paskutinė procedūros komanda paprastai yra RET,kuri grąžina valdymą komandai užrašytai už iškvietimo komandos CALL.Iškvietimo ir grįžimo komandos iš tikrųjų atlieka duomenų išsaugojimo ir atstatymosteke bei nukreipimo komandų veiksmus. Vykdant komandą CALLDAD, valdymas perduodamas komandai su žyme DAD ir į steką įrašomasadresas komandos, esančios po komandos CALL DAD. Vykdant komandą


5.4. Ciklo programavimo komandos 59RET, į registrą ip užrašomas komandos adresas iš steko viršūnės, t.y. programosvykdymas tęsiamas nuo komandos esančios už komandos CALL, kurįį steką įrašė šį adresą. Gali būti iškviečiamas to paties (vidinis iškvietimas)arba kito (išorinis iškvietimas) programos segmento procedūros. Vykdantvidinio iškvietimo komandos į steką įrašoma tik reg. ip turinys, o vykdantišorinio iškvietimo komandą - registrus cs ir ip turiniai. Vidinio ir išorinioiškvietimo komandos užrašomos vienodai. Informacija apie iškvietimo tipąnurodoma procedūros aprašyme. Operandas NEAR nurodo, kad procedūravidine, o FAR - išorinė. Pavyzdys 1. Vidinis iškvietimas:csega SEGMENT...CALL vdad..vdad PROC NEAR ; proced ūra tame pač iame segmente.RETvdad ENDPcsega ENDSPavyzdys 2. Išorinis iškvietimas:csega SEGMENT...CALL...csega ENDScsegb SEGMENTIDAD PROC FAR...RETIDAD ENDPcsegb..ENDSIDAD


5.4. Ciklo programavimo komandos 60Jeigu procedūros aprašyme tipas nenurodytas, tai suprantame, kad procedūra- vidinė.Pastaba. Steką vartoja komandos CALL, RET, o taip pat PUSH irPOP. Todėl pats programuotojas turi rūpintis, kad kiek kartų buvo rašomaį steką, tiek pat kartų būtų ir skaitoma iš jo, t. y. kad vykdant komandąRET, steko viršūnėje būtų grįžimo adresas įrašytos atitinkama komandaCALL. Programos procedūras galima apjungti į vieną ir transliuoti kartu.Šiuo atveju asemblerio transliatorius turi pilną informaciją apie procedūrųtipą ir pradžios adresus ir jokios papildomos informacijos nurodyti nereikia.Tačiau dažnai būna patogu, ypač didelių programų atveju, procedūrassaugoti atskiruose moduliuose ir jas transliuoti atskirai. Šiuo atveju transliatoriuireikia nurodyti, kokios procedūros yra, arba bus, vartojamos kituosemoduliuose. Tai atliekama asemblerio direktyvomis PUBLIC ir EXTRNDirektyva PUBLIC aprašoma taip:PUBLIC vardas , ...Direktyvoje PUBLIC nurodyti vardai, žymės arba absoliutūs vardai tampabendrais, t.y. šiuos vardus galima vartoti visuose programos moduliuose.Kiekvienas vardų, nurodytų sąraše, turi būti apibrėžtas šiame faile. DirektyvaEXTRN aprašoma taip:EXTRN vardas : tipas , ...EXTRN nurodomi vardai, kurie yra apibrėžti kitame modulyje direktyvaPUBLIC. Tipas turi sutapti su vardo tikruoju tipu ir koduojamas tokiaisraktiniais žodžiais:NEAR - vidinis vardas, procedūra tame pačiame segmente;FAR - išorinis vardas, procedūra kitame segmente;Programos, sudarytos iš 2-jų procedūrų pavyzdysValdanti procedūra išveda pranešimą pr1, po to kreipiasi į vidinę procedūrą"antra", kuri išveda pranešimą pr2, o sugrįžus - vėl išveda pranešimą pr1.stek SEGMENT STACKDB 256 DUP (?)stek ENDS; --- Duomen ų segmentas ---duom SEGMENTpr1 DB ’ pranesimas is 1-os proceduros ’, cr , lf , ’$’pr2 DB ’ pranesimas is 2-os proceduros ’, cr , lf , ’$’duom ENDS


5.4. Ciklo programavimo komandos 61; --- Programos segmentas ---prog1 SEGMENTASSUME cs:prog1 , ds:duom , ss: stekcr EQU 13lf EQU 10pagr PROC FAR ; į šią proced ūrą kreipiamasi iš DOS aplinkosPUSH dxSUB ax , axPUSH axMOV bx , duomMOV ds ,bx; prane š imo pr1 iš vedimasMOV ah , 09hMOV dx , OFFSET pr1INT 21hCALL antra ; kadangi pati proc. š iame segmente; prane š imo pr1 iš vedimasMOV ah , 09hMOV dx , OFFSET pr1INT 21hRETpagr ENDP; vidin ės proced ū ros tekstasantra PROC ; kadangi vidin ė proced ūra; prane š imo pr2 iš vedimasMOV ah , 09hMOV dx , OFFSET pr2INT 21hRETantraprog1ENDPENDSEND pagrProgramos, sudarytos iš 2-jų to paties pavadinimo programiniųsegmentų, pavyzdysValdanti procedūra išveda pranešimą pr1, po to kreipiasi į vidinę procedūrą"antra", kuri išveda pranešimą pr2, o sugrįžus - vėl išveda pranešimą pr1.Procedūra "antra" pateikta kitame tokiu pat vardu pavadintame segmente.; --- Steko segmentas ---


5.4. Ciklo programavimo komandos 62stek SEGMENT STACKDB 256 DUP (?)stek ENDS; --- Duomen ų segmentas ---duom SEGMENTpr1 DB ’ pranesimas is 1-o segmento ’, cr , lf , ’$’pr2 DB ’ pranesimas is 2-o segmento ’, cr , lf , ’$’duom ENDS; --- Programos 1- asis segmentas ---prog1 SEGMENTASSUME cs:prog1 , ds:duom , ss: stekcr EQU 13lf EQU 10pagr PROC FAR ; į šią proced ūrą kreipiamasi iš DOS aplinkosPUSH dxSUB ax , axPUSH axMOV bx , duomMOV ds ,bx; prane š imo pr1 iš vedimasMOV ah , 09hMOV dx , OFFSET pr1INT 21hCALL FAR PTR antra ; kadangi pati proc. kitame segmente; prane š imo pr1 iš vedimasMOV ah , 09hMOV dx , OFFSET pr1INT 21hRETpagr ENDPprog1 ENDS; --- Programos tę sinys ---prog1 SEGMENTantra PROC ; kadangi į ją kreipiamasi iš tokio pat seg.; prane š imo pr2 iš vedimasMOV ah , 09hMOV dx , OFFSET pr2INT 21hRETantra ENDPprog1 ENDS


5.4. Ciklo programavimo komandos 63ENDpagrProgramos, sudarytos iš 2-jų skirtingų programinių segmentų, pavyzdysValdanti procedūra, esanti viename segmente, išveda pranešimą pr1, po tokreipiasi į procedūrą "antra", kuri išveda pranešimą pr2, o sugrįžus - vėlišveda pranešimą pr1. Procedūra "antra" pateikta kitame programiniamesegmente.; --- Steko segmentas ---stek SEGMENT STACKDB 256 DUP (?)stek ENDS; --- Duomen ų segmentas ---duom SEGMENTpr1 DB ’ pranesimas is 1-o segmento ’, cr , lf , ’$’pr2 DB ’ pranesimas is 2-o segmento ’, cr , lf , ’$’duom ENDS; --- Programos 1- asis segmentas ---prog1 SEGMENTASSUME cs:prog1 , ds:duom , ss: stekcr EQU 13lf EQU 10pagr PROC FAR ; į šią proced ūrą kreipiamasi iš DOS aplinkosPUSH dxSUB ax , axPUSH axMOV bx , duomMOV ds ,bx; prane š imo pr1 iš vedimasMOV ah , 09hMOV dx , OFFSET pr1INT 21hCALL FAR PTR antra ; kadangi pati proc. kitame segmente; prane š imo pr1 iš vedimasMOV ah , 09hMOV dx , OFFSET pr1INT 21hRETpagr ENDP


5.4. Ciklo programavimo komandos 64prog1ENDS; --- Programos 2- asis segmentas ---prog2 SEGMENTASSUME cs: prog2antra PROC FAR ; kadangi vidin ė proced ūra; prane š imo pr2 iš vedimasMOV ah , 09hMOV dx , OFFSET pr2INT 21hRETantra ENDPprog2 ENDSEND pagr5.4.3 Duomenų perdavimas iškviečiant procedūrasPanagrinėkime duomenų perdavimą procedūrai vartojant steką. Perduodantduomenis iškviečiamai procedūrai, patogu vartoti tiesioginį kreipimąsiį steką. Vartojant tokį būdą, į steką užrašomi perduodami duomenys, poto iškviečiama procedūra duomenis iš steko išrenkanti tiesioginiu kreipimusi.Grįžtant iš procedūros, vartojama speciali komandos RET forma, kuriautomatiškai išbraukia iš steko perduodamus duomenis:RET sk ; sk - iš braukiam ų iš steko bait ų skai č iusPavyzdys. Į procedūrą perduodami 4 simboliai, kurie procedūroje persiunčiamiį registrus.SSEG SEGMENT STACKDB 256 DUP (?)SSEG ENDSDSEG SEGMENTDB 0DSEG ENDSCSEG SEGMENTASSUME cs:CSEG , ds:DSEG , ss: SSEGSTART PROC FARPUSH dsPUSH AMOV bx , DSEGMOV ds , bx


5.4. Ciklo programavimo komandos 65CALL MAINRETSTART ENDPMAIN PROC NEARMOV ax , ’ab ’PUSH axMOV ax ,’cd ’PUSH axCfiLL PADMAIN ENDPPAD PROCMOV bp , spMOV ah , [bp +5] ; tiesioginisMOV al , [bp +4] ; kreipimasis i stekaMOV dh , [bp +3]MOV dl , [bp +2]RET 4PAD ENDPCSEG ENDSEND START5.4.4 Pertraukimų programavimo komandosŠios grupės komandomis galima programose vartoti servisines funkcijas, kuriasrealizuojamos kaip programiniai pertraukimai. Komanda INT iškviečiaprocedūrą, kuri apdoroja pertraukiamą su nurodytu numeriu:INTpertraukimo_numerisVykdant šią komandą į steką užrašoma registrų di, cs ir vėliavėlių registroturiniai. Vėliavėlės IF ir ip nustatomos lygios 0 (uždraudžiamas žingsninisprocesoriaus darbo režimas ir maskuojami pertraukimai). Pertraukimoapdorojimo procedūros adreso rodiklis apskaičiuojamas dauginant pertraukimonumerį iš 4: šiuo rodikliu esantys 2 žodžiai užrašomi į reg. ip ir cs.Komanda INTO generuoja ketvirtą programinį pertraukimą, jei nustatytavėliavėlė OF = 1, priešingu atveju vykdoma sekanti komanda neišsikviečiantpertraukimo apdorojimo procedūros. Ši komanda vartojama po aritmetiniųir loginių komandų galimų perpildymų apdorojimui. Komanda INT3 generuojatrečią programinį pertraukimą. Asembleris generuoja trumpą vienbaitęmašininę komandą. Komanda IRET grąžina valdymą į pertraukimotašką, atstatant iš steko registrus IP, CS ir vėliavėlių registro turinius, kurieten buvo užrašyti kilus pertraukimui. Ši komanda vartojama grįžimui išpaprogramių ir aparatinių pertraukimų apdorojimo procedūrų.


5.5. Procesoriaus valdymo komandos 665.5 Procesoriaus valdymo komandosProcesoriaus valdymo komandas galima suskirstyti į 3 grupes: vėliavėlių nustatymokomandos, išorinės sinchronizacijos komandos ir tuščios operacijoskomandą.Vėliavėlių nustatymo komandos keičia perkėlimo (CF), krypties (DF) irpertraukimo leidimo (IF) vėliavėles. Šios komandos neturi operandų.STC - nustatyti CF:=1;CLC - nustatyti CF:=0;CMC - invertuoti CF, t.y. CF ¬ CF.Šios komandos vartojamos norint nustatyti reikiamą CF reikšmę priešatliekant ciklinio postūmio su pernešimu komandas RCL ir RCR.STD - nustatyti DF:=1;CLD - nustatyti DF:=0.Šios komandos vartojamos su eilučių apdorojimo komandomis.STI - nustatyti IF:=1;CLI - nustatyti IF:=0.Išorinės sinchronizacijos komandos vartojamos mikroprocesoriaus veiksmųsinchronizacijai su išoriniais įvykiais.HLT - sustoti. Mikroprocesorius sustoja, ir stovi tol, kol neįvyksta vienasiš šių įvykių:1. inicijuojamas procesorius (signalas RESET) ;2. atsiranda nemaskuojamas pertraukimas (signalas NMI) ;3. atsiranda maskuojamas pertraukiamas (signalas INTR) ir IF:=1.Komandą HLT gali būti vartojama pervedant procesorių į pertraukimolaukimo būseną (pvz. kol bus nuspaustas klaviatūros klavišas). WAIT- laukti. Mikroprocesorius pereina į laukimo būseną kol neatsiras signalasTEST, Šioje būsenoje mikroprocesorius aptarnauja pertraukimus, betbaigus pertraukimo aptarnavimą vėl grįžta į šią būseną. Komanda WAITvartojama norint sustabdyti mikroprocesoriaus darbą kol išorinis įrenginysnebaigs darbo ir neaktyvuos signalo TEST. Duomenų perdavimui kitiemskompiuterio procesoriams (pvz. koprocssoriui 8087) vartojama komandaESC, Prieš kiekvieną komanda.galima nurodyti vienbaitį prefiksą LOCK,šiuo atveju, kol bus vykdoma komanda joks procesorius negalės naudotismagistrale. Tuščios operacijos komanda NOP neatlieka jokių veiksmų. Jivartojama programų derinimui ir kitiems tikslams.


5.5. Procesoriaus valdymo komandos 675.5.1 Įvedimo/išvedimo komandosKas tas portas?Įvedimo/išvedimo komandos vartojamos duomenų perdavimui į išoriniusįrenginius ir duomenų priėmimui iš jų. Komandų formatas:IN akumuliatorius , portasOUT portas , akumuliatoriusAkumuliatorius - tai registras al, jei perduodami (priimami) baitai arbaax -jei žodžiai. Operando portas reikšmė gali būti nuo 0 iki 255. Operandoportas vietoje galima nurodytas registras dx, kuriame įrašytas porto adresas.Šiuo atveju galima nurodyti iki 65536 adresų. Pavyzdžiai.IN al , 200 ; į vesti bait ą iš porto 200IN al , PORT_VA ; arba porto , nurodyto konstantaOUT 30H, ax ; iš vesti žodį i port ą 30HOUT dx , ax ; arba port ą, nurodyta reg. dx5.5.2 Vėliavėlių persiuntimo komandosKomanda PUSHF įrašo, o POPF atstato vėliavėlių registrą iš steko, šioskomandos paprastai vartojamos poroje. Pavyzdžiui:PUSHPUSHPUSHFCALLPOPFPOPPOPaxsiSORTsiax


skyrius 6Sudėtingesni operandųadresavimo būdai irprogramų pavyzdžiai6.1 Netiesioginis operandų adresavimasĮprasčiausi operandų adresavimo būdai aprašyti skyrelyje 4.4. Čia panagrinėsimenetiesioginio operandų adresavimo būdus. Šiuo atveju operandenurodomas duomenų atmintyje adreso adresas. Priklausomai nuo to, koksregistras vartojamas operande, išskiriami tokie adresavimo būdai:bazuotas operandas,indeksuotas operandas,bazinis indeksuotas operandas.Bazuotas operandas:poslinkisposiinkis[bp][bx]Poslinkis - tai betarpiška reikšmė arba tiesioginis atminties operandas.Duomenų adresas gaunamas sudedant registro turinį su poslinkiu. Jei poslinkisnenurodytas, laikoma, kad jis lygus nuliui. Jei nurodytas registro bp,tai adresas apskaičiuojamas steko segamento reg. ss atžvilgiu, jei bx - dsatžvilgiu. Galimi ir kiti bazuoto operando užrašymo būdai:[ poslinkis ][ bx][bx+ poslinkis ][bx] poslinkis[bx ]+ poslinkis68


6.1. Netiesioginis operandų adresavimas 69Pavyzdys:A DB 2 ,4 ,10 ,11 ,12MOV bx , OFFSET A ; bx A lauko adresasMOV ah , [bx] ; ah :=2MOV ah , 3[ bx] ; ah :=11MOV bx , 4MOV ah , A[bx] ; ah :=12Indeksuotas operandas:Poslinkis [si]Poslinkis [di]Šis adresavimo būdas panašus į bazuoto operando adresavimo būdą tik čiavartojami registrai si arba di, o ne bx ar bp. Absoliutus adresas apskaičiuojamasduomenų segmento DS atžvilgiu. Pavyzdys. Apskaičiuoti masyvo Aelementų sumą S.A DB 2, 4, 10 , 11 , 12S DB ?MOV si , 0MOV cx , 5MOV al , 0C: ADD al , A [si]INC siLOOP CMOV s, alBazinis indeksuotas operandas:poslinkis [bp ][ si]poslinkis [bx ][ si]poslinkis [bp ][ di]poslinkis [bx ][ di]Duomenų adresas gaunamas, sudedant poslinkį ir bazinio bei indeksinio registrųturinius. Jei nurodytas registre bx adresas apskaičiuojamas registrods atžvilgiu, jei bp - registro ss atžvilgiu. Pavyzdys:ST DB ’ AIJKORZ ’, 0 FFH...MOV bx , OFFSET ST


6.1. Netiesioginis operandų adresavimas 70..MOV si , 0MOV al , [bx+si] ; al := ’A’MOV bx , 4MOV ah , ST [bx ][ si] ; ah := ’0 ’Standartinį segmento registrą, kurio atžvilgiu apskaičiuojamas duomenųadresas, galima pakeisti, nurodant komandoje segmento registrą: segreg:adresinė-išraiška.Pavyzdys:..ST DB ’ ABCDEF ’..MOV bp , OFFSET STMOV ah ,ds :[ bp] ; ah := ’A’Komandoje apdorojamų duomenų ilgis (1 baitas ar 2 baitai) nustatomaspagal operandų atributų tipą. Jei nurodomi registrai - pagal registro ilgį, jeikintamieji - pagal tai, kaip jie buvo aprašyti: direktyva DB ar DW. Jeigupagal operandus neįmanoma nustatyti apdorojamų duomenų ilgio, būtinanurodyti duomenų ilgį, vartojant prefiksą PTR:BYTE PTR - 1 baitasWORD PTR - 2 baitai ir tt.Pavyzdys:B db 10 dup (?)..MOV bx , offset BMOV [bx], BYTE PTR ’A’INC bx..MOV [bx], WORD PTR ’BC ’Pirmuose 3 lauko B baituose bus įrašyta ’ABC’Informacijos, esančios skirtinguose segmentuose, adresavimo pavyzdys


6.1. Netiesioginis operandų adresavimas 71cr EQU 13lf EQU 10;; ------- steko segmentas ---------;stekas SEGMENT STACKDB 256 DUP (?)stekas ENDS;; ------ duomen ų segmentas --------;duomSEGMENTpr4 DB ’ ’, cr , lf , ’$’kond DB ’K1 ’duom ENDS; -- kitas duomen ų segmentas ------duom1duom1SEGMENTkon1 DB ’:’ENDS; ---- papildomas segmentas -------papspapsSEGMENTkonp DB ’T2 ’ENDS; ----- programos segmentas -------programa SEGMENTASSUME cs: programa , ds:duom , es:paps , ss: stekasproced PROC FARPUSH dsSUB ax , axPUSH ax; į duomen ų segmento registr ą ds įrašome bazin į adres ąMOV ax , duomMOV ds , ax; į papildomo segmento registr ą es įrašome bazin į adres ąMOV ax , papsMOV es , axJMP short apeiti_duomenis


6.1. Netiesioginis operandų adresavimas 72; duomenis talpiname programos segmentekonpr DB ’U3 ’s1 DB ’5’apeiti_duomenis :; į lauk ą pr4 perra š ome 2-ą simbol į iš duomen ų segmentoLEA bx , kondMOV al , 1[ bx] ; pagal nutyl ė jim ą vartojamas ds registrasMOV pr4 , al; į lauk ą pr4 +1 perra š ome 1-ą simbol į iš duomen ų segmentoLEA bp , kondMOV al , ds :[ bp] ; nenurod ž ius ds , vartot ų ss registr ąMOV pr4 +1 , al; į lauk ą pr4 +2 perra š ome 1-a simbol į iš papildomo segmentoMOV al , konp ; perra š omas baitas iš papildomo segmentoMOV pr4 +2 , al ; laukas konp yra papildomame segmente; į lauk ą pr4 +3 perra š ome 2-a simboli iš programos segmentoLEA bx , konpr +1 ; poslinkis užraš omas iš programos segmentoMOV al , cs :[ bx] ; cs: nurodyti būtina , kitaip bait ą perra š ytu; iš ds segmento , nes vartoja ds registr ąMOV pr4 +3 , al; į lauka pr4 +4 perra š ome simboli iš kito; duomen ų segmentoPUSH dsMOV dx , duom1 ; įrašome naujo segmento bazin į adres ąMOV ds , dxASSUME ds: duom1 ; nes naudojamas kita duomen ų segment ąMOV al , kon1POP ds ; atstatome ankstesn į duomen ų segment ąASSUME ds: duom ; toliau naudoti šį duomen ų segment ąMOV pr4 +4 , alINC s1 ; padidinamas baito turinysMOV al , s1 ; perra š omas iš programos segmentoMOV pr4 +5 , al; iš vedame lauk ą pr4LEA dx , pr4MOV ah , 09hINT 21hRET


6.1. Netiesioginis operandų adresavimas 73proced endpprograma endsend procedSimbolių eilutėje apskaičiuoja kitos simbolių eilutės pasikartojimųskaičių;; ------- steko segmentas ---------;stekas SEGMENT stackDB 256 DUP (?)stekas ends;; ------ duomen ų segmentas --------;duomenys SEGMENTzodis DB ’KTU ’zod_ilg = $- zodiseil DB ’<strong>Kauno</strong> Technologijos Universitetas ( KTU )’eil_ilg = $-eils DB ?duomenys ends;; ----- programos segmentas -------;programa SEGMENTASSUME cs: programa , ds: duomenys , ss: stekas; paruo šia dsstart :MOV ax , duomenysMOV ds , axMOV s, 0; užrašome ciklo kartojimo skai čiųMOV cx , eil_ilg - zod_ilgMOV di , 0kit_eil_simb :PUSH cx; užrašome ieš komo žodžio ilg įMOV cx , zod_ilgMOV bx , 0sutampa :MOV ah , zodis [bx]


6.2. Duomenų transformavimo algoritmai 74; lyginame žodžio simbol į su eilut ės simboliuCMP ah , eil [bx+di]JNE nesutampa; jei vienodi , tikrinami kiti simboliaiINC bxLOOP sutampa; ž odis surastasINC snesutampa :INC diPOP cxLOOP kit_eil_simb; iš eina iš programosMOV ah , 4chINT 21hprograma endsend start6.2 Duomenų transformavimo algoritmaiBazinė įvedimo - išvedimo sistema klaviatūroje surinktus simbolius verčiaį ASCII kodus. Jeigu šie simboliai vaizduoja skaičius, tai prieš atliekantaritmetines operacijas, juos iš ASCII kodų reikia pervesti į vidinį skaičiųvaizdavimo formatą - dvejetainę skaičiavimo sistemą. Kad gauti apskaičiuotusrezultatus dešimtaine, dvejetaine ar šešioliktaine sistema, dvejetainiusskaičius vėl tenka versti į ASCII kodus, tuomet juos galima išvesti į ekranąarba atspausdinti. Parodysime įvairius skaičių transformavimo algoritmus.Dvejetainio skaičiaus vertimas į dešimtainį skaičiųPrieš išduodant skaičiavimo rezultatus į ekraną arba juos atspausdinant,tenka dvejetainį skaičių versti į dešimtainę, skaičiavimo sistemą ir gautusskaitmenis vaizduoti ASCII kodais, Jeigu dvejetainis skaičius yra registre, taijo reikšmei -32768(S (38767 užrašyti pakaks 6 baitų. Žinoma, kad kiekvienąskaičių galima užrašyti kaip 10000, 1000, 100, 10 ir i kiekiu suma, t. y.32767 = 3 ∗ 10 4 + 2 ∗ 10 3 + 7 ∗ 10 2 + 6 ∗ 10 1 + 7 ∗ 10 0 . Šia taisykle galimapasinaudoti verčiant dvejetainį skaičių į dešimtainį. 10000, 1000, 100, 10 ir1 kiekį galima apskaičiuoti nuosekliai dalinant dvejetainį skaičių iš 10000, ogautas liekanas iš 1000, 100 ir 10. Dalinimo metu gautos sveikosios dalys irsudarys dešimtainį skaičių. Pademonstruosime šį algoritmą tokia programa:..d DW 10000 , 1000 , 100 , 10 ; dalikliai


6.2. Duomenų transformavimo algoritmai 75sk DW 32767 ; ver č iamas skai č iusrez DB 5 dup (?) ; rezultato laukas; indeksavimo registru paruo š imasMOV si , 0MOV di , 0; nuoseklia dalyba atliksime 4 kartusMOV cx , 4; paruo š iame skai čių dalybaiMOV ax , skdal_ras :MOV bx , d[si]MOV dx , 0DIV bx; sveik ąją dal į ver č iame į ASCII kod ąADD al , ’0’; skaitmen į įrašome į lauk ąMOV rez [di], al; paruo š iame liekan ą dalybaiMOV ax , dx; padidiname indeksavimo registrusINC diADD si ,2LOOP dal_ras; vienetus ver č iame i ASCII kod ąADD al , ’0’MOV rez [di],al..Dvejetainį skaičių į dešimtainę sistemą galima versti naudojant nuosekliąduoto skaičiaus ir gautų sveikųjų dalių dalybą iš 10. Šiuo atveju gautosliekanos, užrašytos atvirkščia tvarka, sudarys dešimtainį skaičių (šia taisyklenaudojomės versdami dešimtainius skaičius į šešioliktainę, aštuonetainęir dvejetainę skaičiavimo sistemas). Tokiam algoritmui pateiksime procedūrądvejetainio skaičiaus, esančio registre ax, vertimui į dešimtainį skaičiųASCII kodų eilute, kurios adresas yra registre bx. Ši procedūra įvertina irskaičiaus ženklą.BIN_ASCII PROC; naudojam ų registr ų iš saugojimasPUSH dxPUSH si


6.2. Duomenų transformavimo algoritmai 76PUSH ax; rezultato eilut ę už pildome tarpaisMOV cx , 6t_p : MOV byte ptr [bx], ’ ’INC bxLOOP t_p; skai č iaus paruo š imas dalybai iš 10MOV si , 10OR ax , axJNZ val; ver č iamas skai č ius yra neigiamasNEG ax ; imame papildom ą kod ąval : SUB dx , dxDIV si; gauta liekana ver č iame į ASCII kod ąacd dx , ’0’; įrašome skaitmen į į eilut ės pabaig ąDEC bxMOV [bx], dl; skai č iuojame pervest ų simboli ų kiek ųINC cx; ar dar reikia kartoti dalyba ?OR ax , axJNS val; gautas rezultatas , užraš ysim ž enkl ąPOP axOR ax , axJNS tg; buvo neigiamas skai čius , užrašome ’-’DEC bxMOV byte ptr [bx],’-’INC cx; registru atstatytastg: POP siPOP dxRETBIN_ASCII endp.6.2.1 Dešimtainio skaičiaus vertimas i dvejetainę skaičiavimosistemą.Tegul dešimtainis skaičius yra įrašytas ASCII kodais eilutėje. Kad gautidvejetainį skaičių m, reikia paeiliui imti kiekvieną dešimtainio skaičiaus


6.2. Duomenų transformavimo algoritmai 77skaitmenį n ir atlikti tokį veiksmą: m = m ∗ 10 + n, tiek kartu, kiek yradešimtainių skaitmenų. Suprantama, kad prieš atliekant sumavimo operacijąpradinė kintamojo reikšmė prilyginama 0. Tokiam algoritmui pateiksimeprogramos fragmentą, penkiaženklio dešimtainio skaičiaus transformavimuiį dvejetainę skaičiavimo sistemą:..eil db ’255 ’rez dw ?..MOV si , 10 ; daugiklio "10" įraš ymasMOV ax , 0 ; m :=0; transformuojamas skai č ius gali būti iš 5 skaitmen ųMOV cx , 5MOV di , 0; eilinio skaitmens skaitymas iš eilut ėskit_sk :MOV bl , eil [di]; tikrinama skai č iaus pabaigaCMP bl ,’ ’JE pabaiga; reik š minis skai č ius. Ver č iame jį; iš ASCII kodo i dvejetain įMUL si ; m:=m*10AND bx , OFHADD ax , bx ; m:=i *10+ nINC diLOOP kit_skpabaiga :MOV rez , ax.Šešioliktainio skaičiaus vertimas į dvejetainę skaičiavimo sistemąAnalogiškai galime versti ir šešioliktainį skaičių. Šešioliktainį skaičių 5ABF hgalima užrašyti taip: 5ABF h = 5∗16 3 +10∗16 2 +11∗16 1 +15∗16 0 = 23231.Pateiksime programos fragmentą šiam skaičiui išreikšti į dvejetainę sistemą...eil DB ’5 ABF ’ ; duotas skai č iusrez DW ? ; rezultatas.


6.2. Duomenų transformavimo algoritmai 78.MOV ax , 0 ; registre ax kaupsime rezultat ąMOV cx , 16 ; daugiklis "16"MOV si , 0; eilinio skaitmens skaitymas iš eilut ėssek_sk :MOV bl , eil [si]; tikriname ar skaitmuo tarp 0 ir 9CMP bl , ’0’JB ne_skCMP bl , ’9’JBE skaic; tikriname ar skaitmuo tarp A ir Fne_sk : CMP bl , ’a’JB ne_raidCMP bl , ’f’JAE ne_raid; skaitmuo tarp a ir f, apskai č iuojame deš imtain į sk.SUB bl , ’a’ -10JMP sudskaic : SUB bl , ’0’sud : MUL cx ; m:=m*16ADD bx , OFHADD ax , bx ; m:=m *16+ nINC siJMP sek_skne_raid :MOV rez ,ax


skyrius 7Informacijos įvedimo -išvedimo programavimas7.1 Klaviatūros valdymasKlaviatūra - tai pagrindinis informacijos įvedimo - išvedimo į kompiuterįįrenginys. Jos pagalba vartotojas gali surinkti komandas, įvesti duomenis,atsakyti į programų užklausas. Asmeninių kompiuterių klaviatūra dažniausiaituri 83 arba 101 klavišą. Kai kurių modelių klaviatūros gali šiek tiekskirtis nuo standartinių, tačiau daugelyje klaviatūrų visus klavišus galimasuskirstyti į šias grupes:• Simbolių klavišai: tai raidės, skaitmenys, specialūs ženklai pvz. , . ;+ - = ir pan., taip pat Esc, Tab, Backspace, Enter;• Valdymo klavišai: tai rodyklės, Ins, Del, End, Home, PgUp, PgDn;• Funkciniai klavišai: F1- F10;• Pagalbiniai klavišai: Shift, Ctrl, Alt, Caps Lock, Num Lock, Scroll,Lock.Paspaudus klavišą arba keletą klavišų iš karto, į kompiuterį siunčiamasspecialus kodas, pagal kurį nustatomas paspaustasis klavišas. Šis kodas vadinamasskankodu (angl. Scan-Code), tai klavišo eilės numeris. Skankodąnagrinėja BIOS programos ir priklausomai nuo kitų klavišų (pvz, Shift) padėtiessuformuoja reikiamą reikšmę. Priklausomai nuo klavišo tipo, reikšmėgali būti formuojama keletu būdų:• Negeneruojama jokia reikšmė. Klavišai Shift, Ctrl, Alt, Num Lock,Scroll Lock gali pakeisti kitų klavišų reikšmes, bet jie vieni jokios reikšmėsnegeneruoja.79


7.1. Klaviatūros valdymas 80• Generuojamas simbolis ASCII kode t.y. vieno baito kodas. Simbolisgeneruojamas, nuspaudus simbolio klavišą.• Generuojamas išplėstinis t.y. dviejų baitų kodas (extended ASCII code).Tokio kodo pirmojo baito reikšmė 0, o antrojo - kodas. Išplėstinįkodą generuoja funkciniai bei valdymo klavišai ir dauguma klavišųkombinacijų su Ctrl ir Alt.• atliekamas specialus veiksmas. Tai:1. Ctrl/Alt/Del - perkraunama operacinė sistema ;2. Ctrl/C(Ctrl/Break) - pertraukiama programa ;3. Ctrl/S(Ctrl/Num Lock) - pristabdoma programa ;4. Shift/Print Screen - spausdinama ekrano kopija.Klavišų skankodai (83 klavišų klaviatūra) pateikti lentelėje:Išplėstinis kodas (šešioliktainis) Klavišai3 Ctrl/@FEnter10-19 Alt/Q, W, E, R, T, Y, U, I, O, P1E-26 Alt/A, S, D, F, G, H, J, K, L2C-32 Alt/Z, X, C, V, B, N, M3B-44 F1-F1047 Home48 ↑49 PgUp4B←4C→4FEnd50 ↓51 PgDn52 Ins53 Del54-5D Shift/F1-F105E-67 Ctrl/F1-F1068-71 Alt/F1-F1072 Ctrl/Print Screen73 Ctrl/←74 Ctrl/→75 Ctrl/End76 Ctrl/PgDn77 Ctrl/Home78-83 Alt/1,2,3,4,5,6,7,8,9,0,-,=784 Ctrl/PgUp


7.1. Klaviatūros valdymas 817.1.1 Klaviatūros valdymas MS-DOS priemonėmisMS-DOS priemonės klaviatūros valdymui turi pakankamai daug galimybių,todėl daugeliu atveju jų visiškai pakanka. MS-DOS priemonėmis galima:• įvesti simbolį;• tikrinti ar nuspaustas klavišas;• atvaizduoti arba neatvaizduoti įvestą simbolį ekrane;• įvesti simbolių eilutę;• ignoruoti arba neignoruoti Ctrl/C.MS-DOS funkcijos darbui su klaviatūra iškviečiamos, kreipiantis į 33(21h)pertraukimą. Prieš tai funkcijos kodas įrašomas į registrą ah. Norint įvestįišplėstinį kodą, sugeneruotą klavišų kombinacijos, reikia įvesti du simbolius,pirmasis tuomet visada lygus 0.Simbolio įvedimas laukiant ir atvaizduojant jį ekranePradiniai duomenys :ah =1Rezultatai :al=į vestas simbolisLaukia kol bus paspaustas koks nors klavišas. Paspaudus klavišą įvedamasvienas simbolis ir įrašomas ASCII kode į registrą al. Įvestas simbolis atvaizduojamasekrane. Jei nuspausta Ctrl/C, programa pertraukiama.Simbolio įvedimas be laukimo ir atvaizdavimo ekranePradiniai duomenys :ah =6DL - FFhRezultatai :al= simbolis , jei ZF =/0Bandoma įvesti eilinį simbolį. Jei buvo nuspaustas klavišas, tai nuliopožymiui ZF priskiriama reikšmė 1, o simbolis įrašomas į registrą al. Jeisimbolio nėra, tai ZF=0. Į Ctrl/C nuspaudimą nereaguojama ir ekranesimbolis neatvaizduojamas.


7.1. Klaviatūros valdymas 82Simbolis įvedamas laukiant, be atvaizdavimo ekranePradiniai duomenys :ah =7Rezultatai :al= simbolisLaukia, kol bus paspaustas koks nors klavišas. Paspaudus klavišą įvedamassimbolis ir įrašomas į registrą al. Įvestas simbolis ekrane neatvaizduojamasir į Ctrl/C nereaguojama.Simbolio įvedimas laukiant be atvaizdavimo ekranePradiniai duomenys :ah =8Rezultatai :al= simbolisLaukia, kol bus paspaustas koks nors klavišas. Paspaudus klavišą įvedamassimbolis ir įrašomas į registrą al. Įvestas simbolis ekrane neatvaizduojamas.Jei nuspaudžiama Ctrl/C, programa pertraukiama.Simbolių eilutės įvedimasPradiniai duomenys :ds:dx= buferio adresasPrieš kreipiantis į šią funkciją, reikia paruošti buferį. Buferis turi būti (n+2)baitų ilgio, jei maksimalus įvedamos eilutės ilgis yra n. Pirmame buferio baiteturi būti įrašytas ilgis t.y. n. Į buferį, pradedant trečiu baitu, bus surašytivisi simboliai iki klavišo Enter nuspaudimo. Eilutės pabaigos simbolis taippat bus įrašytas buferyje. Antrame buferio baite bus įrašytas įvestos eilutėsilgis. Nuspaudus Ctrl/C, programa bus pertraukta.Klaviatūros būsenos nustatymasPradiniai duomenys :ah =11Rezultatai :al =0 FFh , jei nėra simbolio į vedimuial =0 , jei yra bent vienas simbolis.Tikrinama klaviatūros būsena. Jei yra simbolis, paruoštas įvedimui t.y.buvo nuspaustas koks nors klavišas, tai į registrą al įrašoma reikšmė 255(0FFh). Priešingu atveju, į registrą al įrašomas 0.


7.1. Klaviatūros valdymas 83Klaviatūros buferio valymas ir kitos funkcijos iškvietimasPradiniai duomenys :ah =12al= funkcijos numerisRezultatai priklauso nuo funkcijos numerio. Išvalomas klaviatūros buferis,t.y, panaikinami visi iki tol surinkti simboliai. Po to iškviečiama viena išklaviatūros valdymo funkcijų 1, 6, 7, 8, 10.Dešimtainio skaičiaus įvedimo ir vertimo į dvejetainę sistemą pavyzdysPrograma įveda teigiamą skaičių, verčia jį į ASCII kodo dvejetainę sistemą,jį išveda ekrane, po to į dešimtainį ASCII sistemos kodą ir vėl jį išveda.; --- Steko segmentas ---stek SEGMENT STACKDB 256 DUP (?)stek ENDS; --- Duomen ų segmentas ---duom SEGMENTpr1 DB ’į veskite skai čių ’, cr , lf , ’$’buf DB 50 ,? ,50 DUP (’ ’),’$’ ; vieta įv. eiluteisk DB 8 DUP (’ ’), ’$’duom ENDS; --- Programos segmentas ---prog SEGMENTASSUME cs:prog , ds:duom , ss: stekcr EQU 13lf EQU 10pr PROC FARPUSH dsSUB ax , axPUSH axMOV bx , duomMOV ds ,bx; prane š imo iš vedimasMOV ah , 09hMOV dx , OFFSET pr1INT 21h; skai č iaus į vedimasMOV ah , 0ah


7.1. Klaviatūros valdymas 84MOV dx , OFFSET bufINT 21hSUB ax , axSUB cx , cxMOV c1 , buf +1 ; simboli ų kiekis eilut ėjeMOV bp , OFFSET buf +2 ; simboli ų eil. prad žiaMOV si , 10cpr : MUL siMOV bl , ds :[ bp] ; ASCII simbolio paė mimasAND bx , 0fh ; ir jaunesni ų bit ų iš skyrimasADD ax , bx ; suma su 2- niu skai č iumiINC bpLOOP cpr; skai č iaus vertimas į deš imtain ę sistem ąMOV bx , OFFSET sk +7CALL skvertMOV dx , OFFSET skMOV ah , 9INT 21hRETpr ENDP; teigiamo sk. vertimas į 10 -nės sistemos ASCII kod ąskvert PROCPUSH dxPUSH siPUSH si , 10dal : SUB dx , dxDIV siADD dx , ’0’MOV [bx], diDEC bxOR ax , axJNZ dalPOP siPOP dxRETskvert ENDPprogr ENDSEND pr


skyrius 8MakropriemonėsMakropriemonės skirtos palengvinti programavimą taip, kad rašant programostekste vieną operatorių - makrokomandą, transliuojant būtų gaunamakeletas operatorių. Todėl į makrokomandą galima žiūrėti kaip į pseudokomandą,vykdančią numatytą algoritmą, sudarytą iš vienos ar kelių asembleriokomandų ar direktyvų. Makropriemonės apima makroaprašų (makroalgoritmų),makrokomandų, pakartojimo ir sąlyginės transliacijos direktyvųsąvokas.8.1 Makroaprašai ir makrokomandosMakrokomandas tikslinga vartoti tada, kai programoje reikia atlikti kokiasnors pasikartojančias operatorių sekas. Tada tokia seka vieną kartį užrašomaprogramos pradžioje ir vadinama makroaprašu, o tose vietose kurreikia sekos, rašosi kreipiniai į makroaprašą - vadinami makrokomandomis.Makrokomandos vietoje transliavimo metu iš makroaprašo sugeneruojamaoperatorių seka, vadinama makroplėtiniu. Taigi transliavimo metu makrokomandapakeičiama makroplėtiniu. Kaip asesblerio komandos turi operandus,tai makrokomandos turi faktinius parametrus, kuriais transliavimometu pakeičiami formalūs makroaprašo parametrai. Todėl, priklausomainuo faktinių parametrų, iš to paties makroaprašo galima gauti skirtingusasemblerio komandų operandus, skirtingas komandas ir net komandų sekas.Pavyzdžiui, sudarykime makroaprašą dauginti skaičių X iš 4, pastumiant jįį kaire per 2 bitus:; -- makroapra šas --mul4 MACRO xSAL x, 1SAL x, 1ENDM85


8.1. Makroaprašai ir makrokomandos 86Norint padauginti, pavyzdžiui, registro AX turinį iš 4, rašoma makrokomandamul4 ax kurios makroplėtinysSAL ax , 1SAL ax , 1dauginant lauko mas[bx] turinį, rašoma makrokomanda mas[BX] ir gaunamasmakroplėtinysSAL mas [bx], 1SAL mas [bx], 1Makroaprašai sudaromi pagal tam tikrus reikalavimus ir gali būti pateiktibet kur, tačiau jie visuomet turi būti aprašyti anksčiau negu rašomamakrokomanda. Paprastai makroaprašai pateikiami programos pradžioje iružrašomi taip:vardas MACRO [ formuli ų parametr ų sąrašas]; makro algoritmasENDMČia vardas - makroaprašo (makrokomandos) vardas. Jei jis sutampa suasemblerio komandos ar direktyvos vardu, tai vartojama ne asemblerio komanda,o makroaprašas. Formalių parametrų sąraše nurodomi formalūsparametrai, atskirti kableliais, Formalūs parametrai, tai vardai kurie galibūti makroalgoritme žymės, operacijos ar operandų laukuose.Pavyzdžiui, sudarykime makroaprašą dviejų skaičių sumai apskaičiuoti:s = d1 + d2.; --- makroapra šas sumai s=d1+d2 apskai č iuotisuma MACRO s, d1 , d2MOV ax , d1ADD ax , d2MOV s, axENDMNorint pasinaudoti sudarytu makroaprašu, programos teksto atitinkamojevietoje rašoma makrokomanda taip: [žymė:] vardas [faktiniu parametru sąrašas].Todėl apskaičiuojant išraišką z = x+y, galima rašyti makrokomandąSUMA z, x, y o asemblerio translaitorius šio operatoriaus vietoje įterpstokias asemblerio komandas:MOV ax , xADD ax , yMOV s, axJeigu kitoje vietoje registre dx reiktų gauti bx ir cx registrų sumą, tairašytume makrokomandą SUMA dx, bx, cx ir gautume tokį makroplėtinį:


8.1. Makroaprašai ir makrokomandos 87MOV ax , bxADD ax , cxMOV dx , axJeigu formalūs parametrai makroalgoritme neišsiskiria leistinais skyrikliaistai formalus parametras nuo teksto ar tekstas nuo formalaus parametroskiriamas prefiksu “&”. Šiuo simboliu galima modifikuoti žymes ir operandus.Pavyzdžiui rezervuojant atmintį kintamuosius galima aprašyti taip :kint_apr MACRO NR , ilgislent &NR DB ilgis DUP (?)ENDMTada makrokomanda kint_apr A, 5 rezervuos tokį laukąlentA db 5 DUP (?)Formuojant skirtingą operandą makroapraše galima pateikti tokį pavyzdį:m1 MACRO p1..JMP P1&TA..ENDMMakrokomanda M1 TT suformuos makroplėtinyje tokią komandą:JMPTTTAKai makroalgorime reikia perkoduoti simbolį į skaičių, vartojamas prefiksas% Jis vartojamas tik makrokomandos parametruose. Pateiksime tokįpavyzdį:klaid_pran MACRO txtcntr = cntr +lpran %cntr , txtENDMpran MACRO NR , eilutepran &NR DB eiluteENDM..cntr =0.


8.1. Makroaprašai ir makrokomandos 88.klaid_pran ’ sintaksine klaida ’pran1 DB ’ sintaksine klaida ’...klaid_pran ’ klaidingas operandas ’pran2 DB ’ klaidingas operandas ’...Kai makroapraše rašome komentarus ir nenorime, kad jie būtu makraplėtinyje,tai komentarai pradedami simboliais ;;.Kai makroplėtinyje reikia reikšmių sąrašą perduoti kaip vieną parametrą,tai šį sąrašą reikia apskliausti laužtiniais skliaustais (….) , o sąrašo elementusskirti kableliais pavyzdžiui:M1 (1 ,2 ,3 ,4)Rašant makroalgoritmą dažnai tenka kreiptis į kurį nors vidinį makroaprašooperatorių. Tai atliekama nurodant žymę. Tačiau reikia nepamiršti,kad kreipiantis į makroaprašą pakartotinai, o taip dažnai būna, gausimepasikartojančias žymes. Kad išvengti žymių dubliavimosi makroaprašuosevartojamos lokalinės žymės. Lokalinės žymės turi būti išvardintos makroalgoritmopradžioje taip:LOCALlokalini ų ž ymi ų sąrašasVietoj lokalinių žymių makroaprašo transliavimo metu generuojami unikalūsvardai ??0000 - ??FFFF. Pavyzdžiui sudarykite makroaprašą minimaliamdydžiui surasti: r = min(a, b).pab :MIN MACRO r, a, bLOCAL pabMOV r, aCMP a, bJL pabMOV r, bENDMtokiu atveju iš makrokomandų sekosMIN ax , bx , cxMIN maz , ax , bx


8.2. Kartojimo direktyvos 89gausime plėtiniusMIN ax , bx , cxMOV ax , bxCMP bx , cxJL ??0000MOV ax , cx??0000:MIN maz , ax , bxMOV maz , axCMP ax , bxJL ??0000MOV maz , bx??0001:..Makroplėtinių generavimo listingą transliavimo metu valdo asembleriodirektyvos:.LALL - generuojamas visas makroplėtinių listingas;.SALL - negeneruojamas makroplėtinių listingas;.XALL - generuojamas makroplėtinių listingas tik tiems operatoriams, kurieturi mašinines komandas. Listine makroplėtinių eilutės papildomaižymimos skaitmenimis, nurodančiais makrokomandos gylį.8.2 Kartojimo direktyvosKartais kai kurias komandų ar operandų grupes reikia kartoti. Šiam tiksluitaikomos kartojimo direktyvos. Jas galima vartoti makroaprašuose, o taippat ir bet kurioje programos vietoje. Kartojimui yra 3 direktyvos:REPTIRPIRPCDirektyvaDirektyva REPT taikoma kai reikia kartoti tą patį operatorių bloką. Jirašoma taip:REPTiš raiska.. ; kartojimo blokas


8.2. Kartojimo direktyvos 90ENDM.Blokas kartojamas tiek kartų, kiek nurodo išraiška. Pavyzdžiui užrašas:REPT 4SAL ax , lENDMekvivalentiškas komandų sekai:SAL ax , 1SAL ax , 1SAL ax , 1SAL ax , 1Direktyva IRP kartoja grupę operatorių, keisdama formalų parametrąnurodytu iš faktinių parametrų sąrašo. Ši direktyva užrašoma taip:IRP formalus parametras ( fakt. parametr ų sąrašas).. ; kartojama grup ė.ENDMPavyzdžiui užrašas:IRP K, (1 ,5 ,7 ,13 ,60)DB K+lENDMekvivalentiškas direktyvų sekai:DB 2DB 6DB 8DB 14DB 61Kai faktinių parametrų sąrašas tuščias grupė kartojama 1 kartą, o formalusparametras pakeičiamas tuščia reikšme.Direktyva IRPC kartoja grupę operatorių, keisdama formalų parametrąnurodytu simboliu iš simbolių eilutės. Ši direktyva užrašoma taip:IRPC formalus parametras , simboli ų eilut ė.. ; kartojama grup ė.ENDM


8.2. Kartojimo direktyvos 91Pavyzdžiui užrašasIRPC K, 15736DB KENDMekvivalentiškas direktyvų sekai:DB 1DB 5DB 7DB 3DB 6Kartojimo direktyvas patogu vartoti ir makroaprašuose. Pateikiame makroaprašusišsaugoti bei atstatyti registrams:pushreg MACRO aaIRP reg , (aa)PUSH regENDMENDMpopreg MACRO aaIRP reg , (aa)POP regENDMENDMMakrokomanda:pushreg(ax ,bx)generuos tokį makroplėtinįPUSHPUSHaxbxO makrokomanda:popreg(bx ,ax)atveju gausime tokį makroplėtinįPOPPOPbxax


8.3. Makroaprašų sudarymas ir vartojimas 928.3 Makroaprašų sudarymas ir vartojimasSudaryti makroaprašai gali būti vartojami daugelyje programų ir daugelioprogramuotojų, todėl juos sudaryti reikia taip, kad galėtų pasinaudoti, betkurioje programoje t.y., kad makroaprąšas atliktų nurodytas funkcijas ir nesukeltųpašalinių klaidų vartotojo programoje. Jums verta žinoti ir stengtis:1. Kruopščiai dokumentuoti makroaprašus. Komentarai turi būti aiškūsne tik makroaprašo autoriui, bet ir vartotojui.2. Rašant komentarus vartoti simbolius ;;, o atskirti operatorių laukamsvartoti tabuliavimo klavišą (vietoj tarpo simbolių).3. Rašyti universalų makroalgoritmą ir vartoti kitas makrokomandas.4. Visas vidines žymes išvardinti direktyvoje LOCAL.5. Makroaprašo pradžioje išsaugoti, o pabaigoje atstatyti visus (išskyrusrezultatą) makroapraše vartojamus registrus.Sudarytus makroaprašus galima saugoti dviem būdais: programos failearba makrobibliotekoje. Makrobiblioteka - tai atskiras tekstinis failas,kuriame saugomi visi makroaprašai. Šiuo atveju makroaprašais gali pasinaudotibet kuris programuotojas,naudodamas direktyvą makroaprašų failoprijungimui.INCLUDE makroapra šų failo vardas


skyrius 9Darbas I8086 emuliatoriumiEMU8086 yra I8086 mikroprocesoriaus emuliatorius. Emuliatorius turi integruotąAsemblerio kalbos kompiliatorių ir derintuvą, leidžiantį pažingsniuivykdyti programą ir stebėti duomenis procesoriaus registruose ir RAM atmintyje.9.1 Darbo eigaPaleidus programą matomas naujo dokumento kūrimo langas, pavaizduotas9.1 pav. Kuriant naują programą reikia pasirinkti .EXE template (vykdomosiosprogramos) ruošinį.Prieš pradedant darbą būtina nustatyti darbinį programos katalogą, kursaugomas programos kodas ir sukompiliuota programa. Tai padaroma pasirenkantpagrindinio meniu punktą assembler ⇒ set output directory irnurodant kelią.93


9.1. Darbo eiga 949.1 pav.: Programos langasSugeneruojamas programos ruošinys (9.2 pav.), kuriame yra pagrindiniaiasemblerio programos elementai.9.2 pav.: Programos ruošinysRuošinį papildome kodu, kuris realizuoja programos algoritmą. Programos


9.1. Darbo eiga 95pavyzdys pateiktas 3 skyriuje.Programos kompiliavimui spaudžiame Emulate mygtuką. Šis mygtukasatlieka programos kompiliavimą ir paleidžia emuliatorių. Jei kompiliavimasįvyko be klaidų, Atidaromas emuliatoriaus langas, pavaizduotas 9.3 pav.9.3 pav.: Emuliatoriaus langasProgramos kodo ir emuliatoriaus languose paryškinamos tuo metu vykdomosinstrukcijos. Registers skiltyje rodomos procesoriaus registrų reikšmės.Emuliatoriaus lange esantys mygtukaireloadiš naujo paleidžia emuliuojamą programą.step backgrįžta viena instrukcija atgal.single stepįvykdo vieną instrukciją.runpaleidžia visą programą nuo nurodytos vietos.screenAtidaro programos išvedimo langą.


9.2. Programų pavyzdžiai 96sourceatidaro programos kodo langą.resetperkrauna emuliatorių (perkrauna programą, uždaro failus, išvalo ekraną).auxatidaro pagalbinius įrankius.resetperkrauna emuliatorių (perkrauna programą, uždaro failus, išvalo ekraną).varskintamųjų langas.debugišveda registrų reikšmes į tekstinį failą.stacksteko langas.flagsprocesoriaus vėlevėlių langas.Programos derinimui reikalingi šie įrankiai: atminties (memory) langas, steko(stack) langas bei single step mygtukas. Spaudžiant Single step mygtukąvykdome programą po vieną instrukciją ir stebime, kaip keičiasi procesoriausregistrų bei RAM atminties reikšmės. Atminties lange (9.4 pav.)rodomasRAM atminties turinys pasirinktu adresu. Norint jame matyti programosduomenis, nurodomas DS:0 adresas.9.4 pav.: Atminties langas9.2 Programų pavyzdžiai9.2.1 "Labas pasauli!" išvedimo programa


9.2. Programų pavyzdžiai 97duomendsSEGMENThello_msg DB ’Labas , pasauli !$’stack SEGMENTDW 128 dup (0)endscode SEGMENTstart :MOV ax , duomMOV ds , ax ; įraš omas duomen ų segmento adresasMOV ah , 9MOV dx , OFFSET hello_msgINT 21h ; iš vedimo pertraukimasMOV ah , 4chINT 21h ; programos pabaigaendsend start9.2.2 Atminties valdymo programastekas SEGMENT stackDB 16 dup (22 h)endsduom1endsSEGMENTMOV ax , duom1MOV ds , axd3 DB 44h ,22h ,33h ,11 hd4 DB 00hd5 DB 22h ,44h ,66h ,88 hd11 DW 9999h ,7777h ,5555h ,3333h ,1111 hd13 DW 6666 hduom2 SEGMENTa DB 11h ,33h ,55 hb DW 3333h ,2222h ,3333 hends


9.2. Programų pavyzdžiai 98prr SEGMENTpradzia :MOV ax , duom1MOV ds ,ax ; įraš omas duomen ų segmento adresasMOV ax , duom2MOV es ,ax ; įraš omas papildomo duomen ų seg. adr.MOV ax , d13MOV al , d4MOV ch , d3 +2MOV cl , BYTE PTR d11MOV dx , d11 +6MOV bx , WORD PTR d5 +1MOV bx , OFFSET d11 +1MOV ax , 3[ bx]MOV al , 3[ bx]MOV ax , 0 ff00hADD ax , d13MOV ah , 6MOV al , d4SUB al , 56hSBB ah , 2LEA si , d5DEC siCWDMOV ax , [si]XOR bp , bpINC bpMOV cx , 6[ bp]MOV cx , ds :6[ bp]MOV bx , OFFSET bMOV cx , 5[ bx]MOV cx , es :6[ bx]PUSH ds :2[ bp]ADD bp , 8MOV al , 22h[bp]POP axLEA bx , d5MOV al , 88hPUSH axMOV cl , 08 ahCBWendsEND pradzia


9.2. Programų pavyzdžiai 99


Priedas AUžduočių variantaiA.1 Duomenų formataiUžd. nr. A B C X Y1 b b w w w2 b w b w w3 b w w b w4 b w w w b5 w b b w w6 w b w b w7 w b w w b8 w w b b w9 w w b w b10 w w w b b11 b b b w w12 b w b b w13 b w w b b14 w b b b w15 w w b b b16 b b w b wA.2 Aritmetinės išraiškos1.⎧⎪⎨y =⎪⎩] [ a+2ba−x, jei a − x > 0a 2 − 3b , jei a − x = 0|c + x| , jei a − x < 0100


A.2. Aritmetinės išraiškos 1012.3.4.5.6.7.8.9.10.⎧⎪⎨ a + c 2 , jei c = 2xy = |b − 2x|[, jei c < 2x⎪⎩ , jei c > 2x⎧⎪⎨y = ] ⎪⎩] 3c+xc−2xa 2 + x2b − a[c+5b|x|−(c+a), jei |x| < c + a, jei |x| = c + a, jei |x| > c + a⎧⎪⎨ |x| + 2a , jei x + c < 0y = 4b − c 2 [, jei x + c = 0⎪⎩ , jei x + c > 0] c+bx+c⎧⎪⎨ |x + b| , jei c = a · xy = a 2 − 3b[, jei c < a · x⎪⎩ , jei c > a · x] 2c−ac+ax⎧⎪⎨ x 2 + 3c , jei b − x = 0y = 4a − |c|[, jei b − x < 0⎪⎩ , jei b − x > 0] c−bb−x⎧ ] [ b+c 2⎪⎨ x−by = 7a − x ⎪⎩|c| + 2a, jei x > b, jei x = b, jei x < b{ 3b + x2, jei 3b > xy =[, jei 3b = x⎧⎪⎨y =⎪⎩] |x|−4ac 3 −bb 2 + a|x| − 2b[] c−3a(b+a)−x, jei b + a > x, jei b + a = x, jei b + a < x⎧⎪⎨ 2c + |x| , jei c + x = 0y = 2x − c 2 [, jei c + x > 0⎪⎩ , jei c + x < 0] b+ac+x


A.3. Pavyzdys 102A.3 Pavyzdys; Funkcija 7, skai č iai su ž enklu; Duomenys a - w, b - b, c - w, x - w, y - bstekas SEGMENT STACKDB 256 DUP (0)stekas ENDSduomduomSEGMENTa DW 2b DB -2c DW 8x DW -1, -2, -4kiek = $-xc_k DW kiek /2y DB kiek /2 dup (0 AAh )isvb DB ’y=’ ,6 dup (?) , 0Dh , 0Ah , ’$’perp DB ’ Perpildymas ’, 0Dh , 0Ah , ’$’daln DB ’ Dalyba is nulio ’, 0Dh , 0Ah , ’$’netb DB ’ Netelpa i baita ’, 0Dh , 0Ah , ’$’ENDSprog SEGMENTassume ss:stekas , ds:duom , cs: progpr: MOV ax , duomMOV ds , axXOR si , siXOR di , diCMP c_k , 0JA c_prJMP pabc_pr : MOV cx , c_kcikl :MOV al , bCBWCMP x[si], axJE f2JL f3f1: MOV ax , cIMUL c ; ax=c^2


A.3. Pavyzdys 103CMP dx , 0JNE kl1XCHG ax , dxMOV al , bCBWADD dx , ax ; c ^2+ bJO kl1MOV bx , x[si]SUB bx , ax ; x-bJO kl1CMP bx , 0JE kl2 ; dalyba iš 0MOV ax , dxXOR dx , dxIDIV bx ; ax=rezJMP ref2: MOV ax , 7IMUL aCMP dx , 0JNE kl1 ; perpildaSUB ax , x[si] ;7a-xJO kl1JMP ref3: MOV ax , 2IMUL aCMP dx , 0JNE kl1 ; perpildaMOV bx , cCMP bx , 0JG mod ; jei c < 0 padaro prie š ing ąNEG bxmod : ADD ax , bx ;2a+|c|JO kl1JMP rere: CMP ah ,0JE gerJMP kl3ger : MOV y[di], alINC siINC siINC diDEC cx; rezultat ų iš vedimas į ekran ą


A.3. Pavyzdys 104; ============================CBW ; iš vedamas skai č ius yra ax reg.PUSH axMOV bx , offset isvb +2PUSH bxCALL binascMOV dx , offset isvbMOV ah , 9hINT 21h; ============================CMP cx , 0JZ pabJMP ciklpab : MOV ah , 4ChINT 21hkl1 : LEA dx , perpMOV ah , 9INT 21hXOR al , alJMP gerkl2 : LEA dx , dalnMOV ah , 9INT 21hXOR al , alJMP gerkl3 : LEA dx , netbMOV ah , 9INT 21hXOR al , alJMP ger; skai čių ver čia į deš imtain ę sist. ir iš saugo; ASCII kode. Parametrai perduodami per stek ą; Pirmasis parametras ([ bp +6]) - ver č iamas skai č ius; Antrasis parametras ([ bp +4]) - vieta rezultatuibinasc PROC NEARPUSH bpMOV bp , sp; naudojam ų registr ų iš saugojimasPUSHA; rezultato eilut ę už pildome tarpaisMOV cx , 6MOV bx , [bp +4]


A.3. Pavyzdys 105tarp : MOV byte ptr [bx], ’ ’INC bxLOOP tarp; skai č ius paruo š iamas dalybai iš 10MOV ax , [bp +6]MOV si , 10OR ax , axJNS val; ver č iamas skai č ius yra neigiamasNEG axval : XOR dx , dxDIV si; gaut ą liekan ą ver č iame į ASCII kod ąADD dx , ’0’ ; galima --> ADD dx , 30h; įrašome skaitmen į į eilut ės pabaig ąDEC bxMOV [bx], dl; skai č iuojame pervest ų simboli ų kiek įINC cx; ar dar reikia kartoti dalyba?OR ax , axJNZ val; gautas rezultatas. Užrašome ž enkl ą; pop axMOV ax , [bp +6]OR ax ,axJNS teig; buvo neigiamas skai čius , užrašome -DEC bxMOV byte ptr [bx], ’-’INC cxJMP vepab; buvo teigiamas skai čius , užrašau +teig : DEC bxMOV byte ptr [bx], ’+’INC cxvepab :POPAPOP bpRETbinasc ENDPprog ENDSEND pr


Priedas BKomandų sąrašas106


107PERSIUNTIMO VĖLEVĖLĖSPavad. Komentaras Kodas Operacija O D I T S Z A P CMOV Perkelti (kopijuoti) MOV Op1, Op2 Op1:=Op2XCHG Sukeisti XCHG Op1, Op2 Op1:=Op2 , Op2:=Op1STC Nust. Carry STC CF:=1 1CLC Išval. Carry CLC CF:=0 0CMC NE Carry CMC CF:=¬ CF ±STD Nust. Kryptį STD DF:=1 1CLD Išval. Kryptį CLD DF:=0 0STI Nust. Pertraukimus STI IF:=1 1CLI Atš. Pertraukimus CLI IF:=0 0PUSH Įstumti į steką PUSH Op DEC SP, [SP]:=OpPUSHF Įstumti į FLAGS PUSHF O,D,I,T,S,Z,A,P,CPUSHA Įstumti visus reg. PUSHA AX,CX,DX,BX,SP,BP,SI,DIPOP Ištraukti iš steko POP Op1 Op1:= [SP], INC SPPOPF Ištraukti FLAGS PUSHF O,D,I,T,S,Z,A,P,C ± ± ± ± ± ± ± ± ±POPA Ištraukti visus reg. POPA DI,SI,BP,SP,BX,DX,CX,AXCBW Baitas ↦→ žod. CBW AX:=AL (su ženklu)CWD Žod. ↦→ dvigubas CWD DX:AX:=AX (su ženklu) ± ± ± ± ± ±CWDE Žod. ↦→ išpl. dvig. CWDE EAX:=AX (su ženklu)IN i Įvedimas IN Op1, Prievadas AL,AX,EAX:=PrievadasOUT i Išvedimas OUT Prievadas, Op1 Prievadas:=AL,AX,EAXi-skaityti aprašą. Vėlevėlės: ± = pakeičiamos šia instrukcija ? = nežinomos po šios instrukcijos vykdymo


108ARITMETINĖS VĖLEVĖLĖSPavad. Komentaras Kodas Operacija O D I T S Z A P CADD sudėtis ADD Op1, Op2 Op1:=Op1+Op2 ± ± ± ± ± ±ADC sudėtis su pernaša ADC Op1, Op2 Op1:=Op1+Op2+CF ± ± ± ± ± ±SUB atimtis SUB Op1, Op2 Op1:=Op1-Op2 ± ± ± ± ± ±SBB atimtis su pernaša SBB Op1, Op2 Op1:=Op1-(Op2+CF) ± ± ± ± ± ±DIV dalyba (be ženklo) DIV Op Op=baitas: AL:=AX/Op AH:=liek. ? ? ? ? ? ?DIV dalyba (be ženklo) DIV Op Op=žodis: AX:=DX:AX/Op DX:=liek. ? ? ? ? ? ?IDIV dalyba (su ženklu) IDIV Op Op=baitas: AL:=AX/Op AH:=liek. ? ? ? ? ? ?IDIV dalyba (su ženklu) IDIV Op Op=žodis: AX:=DX:AX/Op DX:=liek. ? ? ? ? ? ?MUL daugyba (be ženklo) MUL Op Op=baitas: AX:=AL*Op jei AH=0 • ± ? ? ? ? ?MUL daugyba (be ženklo) MUL Op Op=žodis: DX:AX:=AX*Op jei DX=0 • ± ? ? ? ? ?IMULi daugyba (su ženklu) IMUL Op Op=baitas: AX:=AL*Op • ± ? ? ? ? ?IMUL daugyba (su ženklu) IMUL Op Op=žodis: DX:AX:=AX*Op • ± ? ? ? ? ?INC padidinti INC Op Op:=Op + 1 (CF nesikeičia!) ± ± ± ± ±DEC sumažinti DEC Op Op:=Op - 1 (CF nesikeičia!) ± ± ± ± ±CMP palyginti CMP Op1, Op2 Op1-Op2 ± ± ± ± ± ±SAL aritm. p. į kairę SAL Op, dydis i ± ± ? ± ±SAR arimt. p. į dešinę SAR Op, dydis i ± ± ? ± ±RCL cikl. p. į kairę su C RCL Op, dydis i ±RCR cikl. p. į dešinę su C RCR Op, dydis i ±ROL cikl. p. į kairę be C SAL Op, dydis i ±ROR cikl. p. į dešinę be C SAR Op, dydis i ±i-skaityti aprašą. • Tuomet CF:=0, OF:=0 kitu atveju CF:=1, OF:=1


109LOGINĖS VĖLEVĖLĖSPavad. Komentaras Kodas Operacija O D I T S Z A P CNEG neigimas (pap.k) NEG Op Op:=0-Op, jei Op=0, CF:=0 ± ± ± ± ± ±NOT bitų inversija NOT Op Op:=¬Op (invertuoti bitai)AND loginis IR AND Op1, Op2 Op1:=Op1∨Op2 0 ± ± ? ± 0OR loginis ARBA OR Op1, Op2 Op1:=Op1∧Op2 0 ± ± ? ± 0XOR suma moduliu 2 XOR Op1, Op2 Op1:=Op1⊕Op2 0 ± ± ? ± 0SHL p. į kairę SHL Op, dydis i ± ± ? ± ±SHR p. į dešinę SHR Op, dydis i ± ± ? ± ±ĮVAIRIOS VĖLEVĖLĖSPavad. Komentaras Kodas Operacija O D I T S Z A P CNOP nėra operacijos NOP Nėra operacijosLEA užkrauti adresą LEA Op1, Op2 Op1:= Op2 adresasINT petraukimas INT Nr pertraukia programą 0 0ŠUOLIAI (vėlevėlės nesikeičia)Pavad. Komentaras Kodas Operacija Pavad. Komentaras Kodas OperacijaCALL kviesti proc. CALL Proc RET Grįžti iš proc.s RETJMP besąlyginis JMP tikslasJE jei lygu JE tikslas (≡JZ) JNE jei ne lygu JNE tikslas (≡JNZ)JZ jei nulis JZ tikslas (≡JE) JNZ jei ne nulis JNZ tikslas (≡JNE)JCXZ jei CX nulis JCXZ tikslasJP jei paritetas lyg. JP tikslas (≡JPE) JNP jei paritetas nelyg. JNP tikslas (≡JPO)JPE jei paritetas lyg. JPE tikslas (≡JP) JPO jei paritetas nelyg. JPO tikslas (≡JNP)


110ŠUOLIAI be ženklo ŠUOLIAI su ženkluPavad. Komentaras Kodas Ekviv. Pavad. Komentaras Kodas Ekviv.JA jei daugiau JA tikslas (≡JNBE) JG jei daugiau JG tikslas (≡JNLE)JAE jei daugiau ar lygu JAE tikslas (≡JNB≡JNC) JGE jei daugiau ar lygu JGE tikslas (≡JNL)JB jei mažiau JB tikslas (≡JNAE≡JC) JL jei mažiau JL tikslas (≡JNGE)JBE jei mažiau ar lygu JBE tikslas (≡JNA) JLE jei mažiau ar lygu JLE tikslas (≡JNG)JNA jei ne daugiau JNA tikslas (≡JBE) JNG jei ne daugiau JNG tikslas (≡JLE)JNAE jei mažiau ar lygu JNAE tikslas (≡JB≡JC) JNGE jei mažiau ar lygu JNGE tikslas (≡JL)JNB jei ne mažiau JNB tikslas (≡JAE≡JNC) JNL jei ne mažiau JNL tikslas (≡JGE)JNBE jei daugiau JNBE tikslas (≡JA) JNLE jei daugiau JNLE tikslas (≡JG)JC jei pernaša JC tikslas JO jei perpilda JO tikslasJNC jei nėra pernašos JNC tikslas JNO jei nėra perpildos JNO tikslasJS jei yra ženklas (-) JS tikslasJNS jei nėra ženklo (+) JNS tikslas

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!