You are on page 1of 65

ASSEMBLERINIS PROGRAMAVIMAS.J.

Galkauskait

KOMPIUTERIO ARCHITEKTRA................................................................................. 3 Operatyvin atmintis RAM............................................................................................. 4 Procesorius...................................................................................................................... 4 vedimo ivedimo renginiai ........................................................................................... 4 Pagalbiniai atminties vienetai ......................................................................................... 4 OPERATYVINS ATMINTIES ORGANIZAVIMAS ..................................................... 4 PROCESORIAUS REGISTRAI......................................................................................... 5 Duomen registrai........................................................................................................... 5 Registrai nuorodos ....................................................................................................... 5 Segmentiniai registrai ..................................................................................................... 6 Kiti registrai .................................................................................................................... 6 KOMAND FORMATAI.................................................................................................. 7 Registras registras ........................................................................................................ 7 Registras atmintis......................................................................................................... 7 Registras tiesioginiai duomenys .................................................................................. 8 Atmintis tiesioginiai duomenys ................................................................................... 8 Sakiniai ........................................................................................................................... 9 Komentarai...................................................................................................................... 9 Direktyvos................................................................................................................... 9 Operandas-vardas...................................................................................................... 11 Operandas-konstantin iraika ................................................................................ 11 Iraikos .................................................................................................................... 11 Konstantins iraikos............................................................................................... 11 Adresin iraika....................................................................................................... 11 SEGMENTINIS ADRESAVIMAS .................................................................................. 12 Adres segmentavimas ................................................................................................. 13 Adres segmentavimo ypatumai................................................................................... 14 Programiniai Segmentai................................................................................................ 17 Direktyva ASSUME ..................................................................................................... 18 ASSUME ypatybs ....................................................................................................... 18 Pradinis segmentini registr ukrovimas .................................................................... 19 PROGRAMOS STRUKTRA......................................................................................... 20 Stekas ir steko segmentas.............................................................................................. 22 Steko komandos:........................................................................................................... 23 Prijimas prie steko element ....................................................................................... 25 Duomen segmentas ..................................................................................................... 25 Komand segmentas ..................................................................................................... 25 Paprograms Procedros............................................................................................. 25 procedur ikvietimas ir grimas i j ..................................................................... 26 Parametr perdavimas............................................................................................... 27 KOMAND SISTEMA IR J KLASIFIKAVIMAS ...................................................... 30 Duomen persiuntimo komandos ................................................................................. 30 Aritmetins komandos .................................................................................................. 31 Skaii be enklo sudtis ir atimtis........................................................................... 31 Sudtis ir atimtis skaii su enklu........................................................................... 32 Daugybos komandos................................................................................................. 33

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Dalybos komandos.................................................................................................... 34 Lyginimo komanda ir slyginis valdymo perdavimas .................................................. 35 Valdymo perdavimo komandos .................................................................................... 35 Cikl organizavimo komandos ..................................................................................... 36 ADRESAVIMO BDAI .................................................................................................. 37 alutinis adresavimas.................................................................................................... 37 Tiesioginis adresavimas ................................................................................................ 38 VALDYMO PERDAVIMAS ........................................................................................... 40 MASYVAI, STRUKTROS............................................................................................ 42 Kintamj su indeksu realizacija .................................................................................. 42 Adres modifikacija...................................................................................................... 43 Netiesioginiai kreipiniai................................................................................................ 44 Modifikacija naudojant kelet registr ......................................................................... 45 VEDIMO / IVEDIMO KOMANDOS .......................................................................... 46 Ekrano ir Klaviatros operacijos per DOS ................................................................... 47 Kursoriaus nustatymas .............................................................................................. 47 Ekrano valymas......................................................................................................... 48 Informacijos ivedimas ekran ............................................................................... 48 Duome vedimas i klaviatros............................................................................... 49 Darbas su diskiniais renginiais .................................................................................... 50 Fail deskriptoriai ..................................................................................................... 50 Grinam klaid kodai............................................................................................ 51 Failiniai nurodymai................................................................................................... 51 Fail krimas ............................................................................................................ 51 Failo skaitymas i disko ............................................................................................ 53 DARBAS SU REALIAIS SKAIIAIS ............................................................................ 55 Reali skaii apraymas.............................................................................................. 55 Koprocesoriaus architektra ......................................................................................... 55 Valdantys registrai ........................................................................................................ 56 Koprocesoriaus Komand formatai .............................................................................. 56 Koprocesoriaus komand operandai............................................................................. 57 Klasikinis stekas............................................................................................................ 57 Reals ir sveiki operandai atmintyje............................................................................. 57 Koprocesoriaus registrai ............................................................................................... 57 Imimas i registr ...................................................................................................... 58

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Assemblerinis programavimas
Kurso mediaga parengta moduliui FMITB05044 Assemblerinis programavimas. Jam yra skirta 3.5 kedito. Mediaga pagal mokymo program skirta Ininerins informatikos studentams ir skirta personalinio kompiuterio vartotojams, kuriems reikia artimiau susipainti su Intel kompanijos mikroprocesori architektrinmis savybmis ir imokti sudarinti programas iems kompiuteriams assemblerio kalboje. Vertinant student inias, atsiskaitymui studentai turi pateikti parayt program assemberio kalboje, mokti paaikinti j. Kadangi programos komandos faktikai atitinka mainines komandas, studentas turi mokti vykdyti program derinimo reime, kad galt parodyti kaip keiiasi kintamj reikms operatyvinje atmintyje ir procesoriaus registruose, vykdant programos komandas. KOMPIUTERIO ARCHITEKTRA Kas aprao kompiuterio architektr: Tai abstraktus PK supratimas, kuris atspindi jo struktrin, schematin ir login organizacij. Tai struktrin PK schema Prijimo prie struktrins schemos element priemons ir bdai Interfeis organizacija ir j laipsnikumas Registr rinkinys ir j panaudojimas Atminties organizavimas ir adresavimo bdai Duomen formatai ir j atvaizdavimo bdai Mainini komand rinkinys Mainini komand formatai Pertraukim apdorojimas Kompiuterio architektros supratimas programuotojui duoda vis btin informacij apie kompiuter. Visi kompiuteriai turi tam tikras bendras ir taip pat individualias architektros savybes. Bendros architektrins savybs apsprendiamos tuom, kad dauguma kompiuteri yra 4-5 klass. Tos bendros savybs yra: Saugomos programos principas. Tai reikia, kad programa ir jos duomenys yra vienoje OA adresinje erdvje. Mikroprogramavimo principas. Procesoriaus sudtyje yra mikroprograminis valdymo blokas. Toks blokas kiekvienai komandai turi rinkin signal, kuriuos reikia sugeneruoti, kad atlikti mainin komand. Itisin atminties erdv - tai OA lsteli rinkinys, kurioms nuosekliai yra priskiriami numeriai Programos vykdymo nuoseklumas. Procesorius irenka i atminties komandas grietai nuosekliai. Nuoseklumui pakeisti galima panaudoti specialias komandas. I procesoriaus puss nra principinio skirtumo tarp komand ir duomen. Duomenys ir mainins komandos uima t pai OA erdv ir yra nuliuk ir vienetuk rinkinys. Procesorius irinkt informacij visada stengiasi traktuoti kaip komand, o jei yra ne taip 3

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

tai vyksta avarinis programos darbo pabaigimas. Todl programoje svarbu tiksliai atskirti duomenis nuo komand. Visikai abejingas kompiuteris duomenims. Jam visikai nesvarbu koki logik saugo patys duomenys. Operatyvin atmintis RAM Tai lasteli rinkinys, naudojamas centrinio procesoriaus vykdom program ir informacijos saugojimui. Kiekviena i t lasteli gali saugoti skaitmenin reikm ir yra numeruojamos . Tai reikia, kad jos viena nuo kitos skiriasi savo adresu. RAM savyb yra ta, kad ijungiant maitinim, visi duomenys yra panaikinami. Dl tos prieasties reikjo sukurti rengin nuolatiniam informacijos saugojimui. Taip atsirado ROM. Procesorius Procesorius yra kompiuterio smegenys. Dar kitaipjis vadinamas centrinis procesorinis renginys . Yra vairi procesori. Jie skiriasi pagal savo greitaeigikum, inoos ir registr skirsnikumu, adresuojamos operatyvins atminties kiekiu ir kitais parametrais. vedimo ivedimo renginiai Per atatinkamas ssajas yra galimyb pateikti informacij OA arba ivesti i jos. vedimo renginiai yra klaviatra, skaneris, ir kiti. Ivedimo renginiai yra spausdintuvas, vaizduoklis, ir kiti. Pagalbiniai atminties vienetai Antrin atmintis yra magnetiniai diskai, juostoas ir kiti. Informacija juose saugoma vardintuose failuose. OPERATYVINS ATMINTIES ORGANIZAVIMAS Tai lasteli rinkinys kur galima rayti arba i jos pasiimti informacij. Lastel (baitas) sudaryta i 8 bit. Bitai numeruojami nuo 0 iki 7 i deins puss, o baitai numeruojami i kairs puss. Baitas maiausia OA vieta, kuriai galima priskirti adres. 7 6 5 4 3 2 1 0 7 6 5 0 1 4 3 2 1 0

Kiekviename bite gali bti raytas skaiius 0 arba 1. Visa informacija saugoma dvejetainje sistemoje. 0 0 0 1 0 0 1 1 =13h=19 1 3 odis- du gretimai einantys baitai. odio adresas yra kairiojo baito adresas. odio dydis yra 16 bit. 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 1

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Dvigubas odis yra du gretimai einantys odiai. A A+1 A+2 A+3

Klausimai savikontrolei 1. Koks yra pats maiausias kompiuterio atminties vienetas? Pasirinkite teising atsakymipateikt. a) Baitas b) Bitas c) odis

PROCESORIAUS REGISTRAI Bet kokia vykdoma programa turi savo inioje tam tikrus mikropracesoriaus resursus. T resurs rinkinys atspindi mikroprocesoriaus programin model. Tai yra: Bendros paskirties registrai Registrai darbui su plaukiojaniu kableliu (kooprosesorius) Bsenos ir valdymo registras (vlevli) Segmentiniai registrai Komandos nuorodos registras Sisteminiai registrai 32 skirsni procesoriuose yra padidintos kompiuterio galimybs, bet emesnieji registrai sutampa ir pagal pavadinimus ir pagal paskirt su 16 skirsni procesoriaus registrais. Yra 12 registr, kurie dar kitaip gali bti skirstomi tris grupes: duomen registrus, registrus nuorodas, segmentinius registrus. Jie visi vadinami bendro naudojimo registrais. Duomen registrai Nnaudojami bet kokiam laikinam duomen isaugojimui. Su tais duomenimis galima atlikti bet kokius veiksmus. Tai yra registrai: AX AH+AL akumuliatorius BX BH+BL bazinis registras CX CH+CL skaitliuko registras DX DH+DL duomenu registras Yra galimyb kreiptis vis registr ar jo dal. Kai kurios komandos savo vykdymui naudoja konkreius registrus. Tai dalybos ir daugybos komandos. Registrai nuorodos SI altinio registras DI primjo registras BP bazs nuoroda SP steko nuoroda

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

SI ir DI yra ekvivalents vienas kitam, taiau j paskirtis yra saugoti duomenis tam tikros bazs atvilgiu, irenkant duomenis i operatyvins atminties arba juos uraant operatyvin atmint.. Bazs adresas nurodomas registere BP arba BX. BP gali bti naudojamas kaip nuoroda dirbant su duomenimis steke, taip pat daugelyje aritmetini ir logini komand laikinam duomen saugojimui. SP naudojamas tik darbui su steku ir visada nurodo steko virn. Segmentiniai registrai Jie saugo pradinius programos segment adresus ir leidia kreiptis juos CS komand segmento registras SS steko segmento registras DS duomen segmento registras ES papildomo duomenu segmento registras. Kiti registrai IP is registras vadinamas komand nuoroda. Jis saugo komandos, kuri turi bti atlikta, adres. Programikai is registras neprieinamas. Jo reikm keiia procesorius, atsivelgdamas vykdomos komandos ilg. FLAGS -veliavli registras, atspindintis procesoriaus bsen po komandos vykdymo. Daugiausia gali bti 16 veliavli kiekvienam bitui po vien.Vliavls bsen atspindi bito reikm. Jei bito reikm 0- vliavl nejungta, o jei 1 tai vliavl jungta. 0 bitas-CF perneimo veliavl. Ji sijungia, jei yra duomen perneimas (j takoja aritmetins operacijos, arba jei yra klaida, kreipiantis sistemines funkcijas). 2 bitasPF pariteto veliavl. sijungia, jei 8 skirsni rezultate yra lyginis vienetuk skaiius. 4 bitasAF papildomo perneimo veliavl. sijungia, jei dirbame su supakuotais duomenimis. 6 bitasZF nulio veliavl. sijungia, jei po operacijos vykdymo rezultatas yra 0. 7 bitasSF enklo vliavl. sijungia, jei rezultato enklas yra neigiamas. 8 bitasTF naudojama derinimo programose, kai jas norime atlikti ingsniais. Jei ji jungta, procesorius po kiekvienos komandos vykdymo leidia sustabdyti porgramos vykdym, norint analizuoti programos darb. 9 bitasIF leidia arba draudia procesoriui reaguoti pertraukimus nuo iorini rengini. 10 bitasDF naudojama programose, dirbanioms su eilutemis, ir nurodo, kuria kryptimi turi bti peririmi duomenys eiluteje. 11 bitasOF sijungia tuo atveju, jei yra perpildymas. Klausimai 1. 2. 3. 4. Kokia yra registr CS,DS,SS ir Espaskirtis? Kas tai yra registrai nuorodos? Kas tai yra vlevli registras? Kokia yra registro IP reikm vykdant programas

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

5. Ar gali programuotojas keisti programikai registro IP reikm? Pasirink atsakym a) Taip b) Ne

KOMAND FORMATAI Registras registras Kiekviena komanda sudaryt i dviej dali opreaciojos kodo ir operand. Pagal operand pateikim yra keletas komandos format. Nuo to priklauso komandos ilgis. OK d w 11 reg1 reg2 Komanda uima du baitus, atlieka veiksmus su duomenimis, patalpintais registruose. Po operacijos rezltatas yra formuojamas registre: Reg1:=reg1*reg2 Reg2:=reg2*reg1 OK skaiius, kuris nusako, koks veiksmas turi bti atliktas. W nustato operand dyd: w=1, kai operandas yra odis, w=0, kai operandas yra baitas. d=0, kai rezultatas saugomas Reg2, d=1, kai rezultatas saugomas Reg1. Atatinkamai i lentels matome kokios formuojamos reikms komandos laukuose, kai programose naudojame atatinkamus registrus Reg w=1 w=0 Reg w=1 w=0 Reg 000 001 010 011 W=1 AX CX DX BX W=0 AL CL DL BL Reg 100 101 110 111 W=1 SP BP SI DI W=0 AH CH DH BH

Registras atmintis OK d w mod reg mem adr(0-2) Komandos ilgis nuo 2 iki 4 bait. Reg:=reg*adr adr=adr*reg Vl w nustato operand dyd: w=1, kai odis, w=0, kai baitas. d=0, kai rezultatas saugomas atmintyje, d=1, kai rezultatas saugomas registre. Mod nusako, kiek bait uima operandas adresas (jei mod=00, adr uima 0 bait, jei mod=01, tai adr uima 1 bait, jei mod=10, adr uima 2 baitus). Mem nurodo adres modifikavimo bd:

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

a8 adresas telpa 1 baite, a16 adresas telpa dviejuose baituose. Jei komandoje adresas nenurodytas, jis skaitomas lygiu 0. jei mod=11, komanda pavirsta komanda registras registras tipo. Registras tiesioginiai duomenys Komanda uima nuo 3 iki 4 bait. OK S W 11 OK1 reg im(1-2) OK1 nurodo koki komand turim atlikti, rezultatas saugomas registre, w nurodo operando dyd. OK1 nurodo grup komand, kuriai priklauso i komanda, OK patikslina komand. Tiesioginiai duomenys im gali uimti 1 arba 2 baitus. Atmintis tiesioginiai duomenys Komandos ilgis nuo 3 iki 6 bait OK S W 11 OK1 mem adr(0-2) im(1-2) Adr:=adr*im OK patikslina pai komand. Klausmai 1. Nuo ko priklauso komandos ilgis? Pasirinkite atsakym. a) Nuo duomen iilgio b) Nuo duomen adresavimo bdo c) Nuo komandos formato d) Dalinai nuo vis ivardint prieasi 2. Koks yra didiausias irmaiausias komandos ilgis? ASSEMBLERIO KALBOS PAGRINDAI Programa komand rinkinys, kurios kompiuteryje gali atlikti nurodytus veiksmus. Assembleris simbolin programavimo kalba, leidianti urayti program. Assembleris beveik maininio lygio kalba, atliekanti aukto lygio veiksmus. Tai programavimo kalba, leidianti urayti program ir j transliuoti mainin kod. Programa daniausiai sudaryta i trij segment. Pirmas duomen apraymo segmentas, antras- komand apraymo segmentas, treias steko segmentas. Duomen apraymo segmente tam tikr operatori pagalba apraome duomenis, su kuriais dirbs programa. Komand segmentas visada naudojamas aprayti veiksmus, kuriuos turi atlikti programa. Komand pagalba apraome programos algoritm, kur turime realizuoti. Steko segmentas pagalbin atmintis, naudojama tarpini rezultat, adres saugojimui. Kiekvienas segmentas prasideda specialiu operatoriumi SEGMENT ir baigiasi operatoriumi ENDS. Visi jie turi savo vardus. Vsi ie segmentai sudro programos ieities tekst.

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Sakiniai Programos tekstas uzraomas sakiniais, kuriais apraoma komanda, operandas arba komentaras.Sakinio struktra yra pateikta emiau ir skiriasi dl duomen apraymo segmento ir dl komand segmento. [vardas] direktyva apraymo segmentas [yme:] komanda segmentas operandas1 [,operandas2] [;komentaras] ;duomen operandas1 [,operandas2] [;komentaras] ;komand

[vardas] eina kartu su direktyva. Transliavimo metu, vardui gali bti priskirtos tam tikros charakteristikos. Vliau vardas programoje gali bti panaudotas nurodant duomen viet. [vardas] atskiria vien direktyv nuo kitos, taiau direktyva gali bti ir be jo. [yme:]nurodo pirmo komandos baito, kuriai ji yra priskirta, adres. Komanda / direktyva yra kodai, kurie atitinka tam tikra mainin komand arba transliatorius i tos direktyvos suformuoja atatinkamus duomenis. Komandos ar /direktyvos operandai aprao objektus, su kuriais atliekami veiksmai. Jais gali bti skaiiai, iraikos, adresai, simboliniai adresai, registr numeriai. Iraikose gali bti skaiiai, iraikos, adresai, simboliniai adresai, registr numeriai (vardai). Iraikose gali bti naudojami aritmetini operacij simboliai. I sakini formuojamas programos ieities kodas ir atatinkamai paskirstomas tarp programos segment. Sakiniams taikomos raymo taisykls: Negalima sakinio perkelti kit eilut. Negalima vienoje eiluteje rayti keli sakini. Sakinys ne ilgesnis nei 131 simbolis. Komentarai Jie gali bti raomi bet kurioje programos vietoje ir prasideda kabliatakiu. Tuia eilut taip pat suprantama kaip komentaras. Uraant komand, operacijos kodas yra btinas atributas. Tai kodas, nurodantis koks veiksmas turi bti atliktas. Esant ne vienam operandui, vienas nuo kito jie skiriami kableliais. Bent vienas operandas komandoje yra btinas. Direktyvos Direktyva yra skirta duomen apraymui programose. Jei ji turi vard, vliau is vardas gali bti panaudotas komandose. Direktyvos vardas nurodo pirmojo aprayto baito adres segmento pradios atvilgiu. Direktyvos yra tarnybiniai odiai, kuriuos supranta transliatorius. Direktyva DB aprao duomenis, kurie operatyvineje atmintyje yra formuojami viename baite. Kintamojo tipas yra BYTE, o ilgis 1 baitas. [vardas] DB operandai [;komentaras] Operandai nurodo reikmes, kurios formuojamos opreatyveneje atmintyje. Esant keletui operand, jie nurodomi per kalbel. Pirmajam i j pirskiriamas nurodytas

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

[vardas] - suteikiamas adresas. Yra 2 bdai formuoti baito reiksm. Su ? arba nurodant konkrei reikm. Operatyvineje atmintyje nuo to paties adreso gali prasideti skirtingo dydio duomenys: baito, odio, dvigubo odio arba eilut. Operandas kosntanta su reikmmis nuo 128 iki 255. Bet kuriuo atveju atmintyje iskiriamas 1b. Direktyva su keliais operandais- vienas i bd naudojamas aprayti masyv. Masyvuose vardas paparstai suteikiamas pirmam elementui Jei yra keli operandai, simboliais aparomi operatyvineje atmintyje greta vienas kito, juos galima aprayti kaip eilut. Direktyva su keliais operandais pateikta emiau. X DB 10,15,A kur X-yra direktyvos vardas Operatyvinje atmintyje duomenys isidsto sekaniai: 10 A kodas A raid yra keiiama jos eioliktainiu ASSCI kodu. T pat efekt gautume apraydami X DB 10 DB 15 DB A Pasikartojimo Operatorius DUP. Jis naudojamas sutrumtinti duomen apraym, kai reikia apraryti kelet vienod reikmi greta viena kitos. A DB 5 DUP(*) Operatyvinje atmintyje susiformuos penki baitai su ta paia reikme *. Taip pat galima naudoti masyv apraymui. A DB *,*,*,*,* tas pats kas bt aprayta su pasikartojimo operatoriumi B DB 10 DUP(10 DUP(?)) Simbolius galima urayti dvejopai: nurodant juos tarp kabui arba nurodant to simbolio skaitmenin kod i ASSCI lentels. Direktyva DW Galima aprayti odio ilgio duomenis. A DW ? bus iskirtas odis. Kintamojo tipas WORD, ilgis 2 baitai ? ? od galima rayti skaii nuo 32768 iki 65535 . A DW 1234 Atmintyje odis saugomas sukeistam pavidale. 34 12 B 31h DW 01 30h 15

10

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Informacija saugoma eioliktainje sistemoje. Direktyva DD Galma formuoti duomenis dvigubame odyje. Kintamojo tipas DWORD, kintamojo ilgis 4 baitai. dvigub od galima rayti skaii nuo -2 31 2 31-1. Konstantas galima urayti ir su direktyva EQU. Direktyva EQU [vardas] EQU operandas Su EQU galima urayti tik vien konstant,t.y. galime parayti tik vien operand. Star EQU * T DB * atitikt Star EQU * Su direktyva EQU sufrmuot duomen pakeisti negalima. Jie formuojasi tarp segment ir nepriskiriam jokiam segmentui. Operandas-vardas EQU pagalba galima formuoti vard sinonimus SUM EQU AX. Registrui AX yra suformuojamas vardas SUM. Vliau programoje registr AX galima kreitis kaip kintamj SUM, ir tai yra aikiau. Operandas-konstantin iraika N EQU 100 N yra konstantos vardas K EQU N*2-1 atitikt reikm 199 X DB N DUP(?) bt apraytas masyvas X DB Su EQU galima aprayti bet kok tekst S EQU Sveiki

100 DUP(?)

Iraikos Jos naudojamos patogiai urayti direktyv ir komand operandus. Konstantins iraikos J rezultatas yra sveiki skaiiai. Paprasiausios iraikos yra skaiiai, simboliai, eilut i dviej simboli, konstantos vardas. Adresin iraika Ji visada uima 16 bit. Jos reikm yra adresas. Tai kintamojo vardas, apraytas su direktyvomis DB,DW,DD, arba yms vardas, arba skaitliukas. C DB ? D DW C atmint bus uraomas C adresas. Adresin iraika formuoja absoliutin adres. Adresin iraika gali bti naudojama, kai reikia kreiptis lasteles,kurios nra vardintos. Transliavimo metu sakiniai peririmi vienas paskui kit ir nustatomos reikms yra

11

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

formuojamos OA viena paskui kit, kartu simenant ir j adresus. Be to, pagal apraym, assembleris simena ir kiek bait uima kintamasis. Tai vadinamas kintamojo tipas. Reikm ir tipas aprao lastel su nurodytu vardu. Nuo to paties adreso OA gali prasidti skirtingo tipo duomenys- baito, odio,dvigubo odio. Kad galtume dirbti su skirtingo tipo duomenimis, naudojamas duomen tranformavimo operatorius. <tipas> PTR <iraika> Tipas gali bti BYTE, WORD, DWORD pvz.: MOV BYTE PTR [SI], 0 atminties viet pagal adres , esant registre SI, nusisime baito ilgio nul. Kadngi nuo tos vietos gali bti baitas ar odis ar netgi eilut, tai reikia patikslinti su kokio dydio duomenimis mes noime dirbti. Klausimai 1. Kas tai yra direktyva? 2. Kuos skiriasi duomenys aprayti su direktyva DB ir ir EQU? 3. Nurodykite koks ilgis baitais operatvinje atmintyje formuojamas su skirtingo tipo direktyvomis. 4. Kas tai ra duomen transformaimo operatorius? SEGMENTINIS ADRESAVIMAS Pagrindin procesoriaus charakteristika registr skirsnikumas (bit skaiius registre), taip pat iorini adres ir duomen in(linij) kiekis. Maksimalus sveikas skaiius, su kuriuo gali dirbti mikroprocesorius 216 -1=65kb. Adresin atmintis turi 20 linij (220 - 1=1Mb). Tam kad su 16 skirsni adresais bt galima kreiptis bet kur 20 skirsni atminties tak, procesoriuje numatytas segmentinis atminties adresavimas, kuris realizuotas keturi segmentini registr pagalba. Segmento adreso esm yra ta, kad 20 skirsni adresas iskaiiuojamas sudedant 20 skirsni segmento pradios adres, kuriame yra minta lastel su 16 skirsni poslinkiu nuo segmento pradios. Pradinis segmento adresas be 4 emiausi bit yra saugomas viename i segmento registr. i reikme vadinama segmentiniu adresu. Kiekvien kart vidin registr ukraunant segmento adres, procesorius automatikai j padalija i16 ir tokiu bdu bazinis adresas saugomas viename i vidini registr. Esant reikalui kreiptis tam tikr lastel, procesorius prideda prie bazinio adreso lastels poslink nuo segmento pradios ir taip gaunamas fizinis lasteles adresas. Daugyba i 16 padidina adresuojam lasteli diapazon iki 1Mb. Taigi kreipinys bet kuri lastel vykdomas tik per segmentus, t.y. logikas erdves udedamas ant reikiam fizini erdvi operatyvineje atmintyje. Segmento dydis negali buti didesnis nei 64 Kb. Pradinis segmento adresas yra dalintinas i 16, t.y. be jaunesniojo 16-nio skirsnio

12

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

uraomas vien i segmentini registr. Adresuojamos lastels poslinkis, kreipiantis j per kakoki komand, nurodomas naudojant tam tikrus adresavimo bdus. Visi segmentai operatyvineje atmintyje yra idstomi tokiu pat bdu, kaip jie aprayti programos pradiniame tekste. Prie komand segment sistema patalpina papildom (sistemin) segment, t.y.programos prefix, kur patalpinta sistemine informacija, reikalinga programos vykdymui. Ukraunant program operatyvin atmint abu, ES ir DS registrai, iguana ta pai reikm ir rodo programos prefixo pradia. Tai reikia, kad i programos yra galimybe kreiptis t papildom srit operatyvineje atmintyje. Komand segmento adresas patalpinamas CS ir daniausiai registro IP reikm tampa lygi 0, nes programa pradeda darb nuo 1 komandos segmente. IP pradin reikm formuojama i programos yms, kuri pateikiama paskutiniame programos sakinyje. Registro SS reikm formuojama sistemai uzkraunant program atmint ir lygiagreiai formuojama registro SP reikm, kuris yra nuoroda steko virun. SP reikm priklauso nuo steko dydio ir visada lygi steko dydiui programos ukrovimo metu. Visi programos segmentai prasideda nuo paragrafo ribos (adresai dalinami i16). Kadangi segmento ilgis danai nra kartotinas 16, todl tarp segment operatyvineje atmintyje atsiranda tarpai. Paprastai paskutin komandos adresas INT 21h (grimas DOS) ir programos ilgis nra kartotinas 16, tas tarpas iki sekanio segmento upildomas 0, kurie deasembliuojant virsta komanda Add. Adres segmentavimas PK priskiriamas prie skaiiavimo main, kur dl komand sutrumpinimo naudojamas bazinis atminties adresavimas. Kas tai yra? Jei OA yra 2k lasteli, tai nuorodai tas lasteles reikalingi k- skirsni adresai. Tokius adresus vadiname absoliutiniais arba kitaip tariant fiziniais adresais. Kuo didesn atmintis tuo daugiau skirsni reikia adresui nurodyti. Tai i karto ilgina komand ir tuo paiu ilgina program. Reikia sutrumpinti komandos ilg, kad sutrumpinti program. Tam tikslui atmintis dalinama gabalus, kurie vadinami segmentais. Pradiniai segment adresai gali bti bet kokie, taiau yra apribojamas segmento ilgis. Segmento ilgis negali bti didesnis negu 2m bait, kur m<k. Tomis slygomis absoliutin bet kurios lastels adres A galima pateikti kaip sum A=B+ofset, kur B segmento baz, kuriam priklauso lastel A, o ofset yra lastels poslinkis nuo bazs pradios arba slyginis adresas iskaiiuotas nuo segmento pradios t.y. nuo adreso B. baz B ofset A Segmentas Segmento dydio apribojimas reikia, kad 0<=ofset<=2m -1, ir todl poslinkiui urayti utenka m skirsni. Vadinasi sumoje A=B+ofset didioji adreso dalis tenka bazei B, o ofset tai tik nedidel adreso dalis. Atsivelgiant tai elgiams sekaniai:

13

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

jei komandoje reikia nurodyti absoliutin adres A, tai didioji dalis sudiets t.y. B paslepiama tam tikrame registre R, o komandoje nurodomas tik tas registras ir maoji dalis ofset, t.y. vietoj komandos OK A .. naudojame komand OK.R ofset. K tas duoda? Kadangi komanda dirba su vykdomuoju adresu, o jis iskaiiuojamas pagal formul A=[R]+ofset=B+ofset, tai komanda dirbs su reikiamu adresu A. I kitos puss laukai R ir ofset uima maai vietos komandoje, todl komandos dydis sumaja palyginus su tuo atveju, kai komandoje nurodomas absoliutinis adresas. Pakeliui pakomentuosime, kad vien kart uraius registr R segmento baz, toliau mes galime nekeisdami to registro reikms, panaudoti j kreipiantis bet kuri io segmento lastel. Jei programos duomenys patalpinti atmintyje kompaktikai, tai persiuntim registr bus nedaug. Registrai, kuriuose saugomas bazs adresas, vadinami baziniais registrais, o uraymas komand ne absoliutini adres, o bazini adres ir poslinkio, vadinamas baziniu adresavimu. Adres segmentavimo ypatumai Pirmiausia pastebsime, kad PK vietoj termino bazinis adresavimas naudojamas adres segmentavimas, o baziniai registrai vadinami segmentiniais registrais. Be to, atminties dydis PK lygus 1 Mb, t.y 220 bait (k=20) , todl absoliutiniai adresai ia uima 20 skirsni , o segmento dydiai neturi viryti 64 Kb. t.y. 216 bait (m=16), todl poslinkis ia yra 16 skirsni adresai. Pirmoji segmentini adres ypatyb yra ta, kad segmentiniais registrais gali bti ne bet kokie registrai, bet tik CS, DS, SS, ES. inoma pradiniai segment adresai gali bti saugomi ir kituose registruose, taiau naudoti tuos kitus registrus segmentavimui negalima. Kadangi PK viso tik keturi segmentiniai registrai, tai vienu metu dirbti galima su keturiais segmentais atmintyje. Nustatome kiekvieno segmento pradiai sav registr ir toliau visas to segmento lasteles segmentuojame pagal j. Taiau jei reikia daugiau segment, tuomet kai reikia kreiptis pvz. penkto segmento lasteles, pasirenkame vien i segmentini registr ir kur nors simename jo turin. O po to registr raome penktojo segmento pradi ir toliau naudojame t registr prijimui prie penktojo segmento lasteli. Vliau, jei reikia, galima atstatyti ankstesn to registro reikm, kad jis vl rodyt vien i 4 segment. Tokiu bdu, keisdami segmentini registr reikm, galime dirbti su bet kokiu segment skaiiumi atmintyje. Pastebsime, kad segment tarpusavio isidstymas atmintyje gali bti bet koks. Jie gali nepersikloti, dalinai persikloti ar net pilnai sutapti, t.y. segmentiniai registrai gali rodyti to paties segmento pradi. Segment dydis nustatomas programos autoriaus, tik svarbu kad j dydis neviryt 64 Kb. Nustaius segmentin registr segmento pradiai, potencialiai galima segmentuoti 64 kb, o kiek realiai bus inaudota, t.y koks bus segmento dydis, jau nustato pats programos autorius. Antroji adres segmentavimo savyb yra, kad uraant komand asemblerio kalboje, kreipinys segmentin registr nurodomas per standartin konstrukcij: <segmentinis registras>:<adresin iraika>, kuri vadinama adresine pora, kuri sako, kad adresas adresinje iraikoje turi bti segmentuotas pagal nurodyt registr.

14

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Pvz. komandoje MOV AX,ES:X kintamojo X adresas bus segmentuojamas, naudojant ES registr. Uraus CS:, DS:, SS: ar ES: priimta vadinti segmentinio registro prefiksais. Asemblerio kalboje prefiksas visada uraomas prie adres, kuris turi bti segmentuotas. Taiau maininj kalboje situacija iek tiek skiriasi: ia prefiksas statomas prie vis komand. Pvz. komanda MOV AX,ES:X i tikrj uraoma dviej mainini komand pagalba: ES: MOV AX,X ES: - tai speciali komanda (be operand), kuri ir vadinama prefiksu. Viso toki komandprefiks yra keturios, po vien kiekvienam segmentiniam registrui. Pati savaime i komanda-prefiksas nieko nedaro, bet ji veikia sekani u jos komand: prefiksas sako, kad adresinis operandas sekanioj komandoj turi bti segmentuotas pagal atatinkam registr. Jei prefiksas pastatytas prie komand, kur nra adresinio operando, tai jis suprantamas kaip tuia komanda. Taigi, maininse komandose segmentiniai registrai nurodomi ne viduje komandos, o prie j. Taiau asemblerio kalboje prefikso rayti atskirai negalima , pvz. ES:MOV AX,X skaitoma klaidinga irint i asemblerio puss. Prefiksas btinai turi bti komandos viduje ir prie adres. Treia adres segmentavimo ypatybe susijusi su segmentini registr dydiu. Bendra adres bazavimo schema supranta, kad bazini registr dydis pakankamai didelis ir juose gali bti patalpintas bet koks absoliutinis adresas, bet kokia baz. Taiau PK i savyb nevykdoma. PK absoliutiniai adresai 20-skirsni, o visi registrai, tame tarpe ir segmentiniai, 16- skirsni. Natralu, kyla klausimas : kaip 16 skirsni segmentiniuose registruose sekasi patalpinti 20 skirsni bazinius adresus? PK i problema isprsta sekaniu bdu. Iki iol mes skaitme, kad bazs adresas yra bet koks. PK pradiniams segment adresams taikomi apribojimai: kaip baz galima naudoti bet kok adres, bet kartotin 16. i adres ypatyb ta, kad juose 4 paskutiniai bitai yra nuliai, arba k reikia eioliktainje i adres formoje paskutiniai skaiiai visada nuliai, t.y. jie turi XXXX0h form, kur X- bet koks skaiius. Jei taip , tai t nulin skaii galima tiesiogiai nenurodyti, o tik sivaizduoti. Taip ir daroma: segmentiniuose registruose saugomi tik segmento pradinio adreso pirmieji 16 bit, t.y. pirmieji keturi eioliktainiai skaitmenys. Pvz. Jei segmento pradia yra adresas 12340h, tai segmentiniame registre bus saugoma 1234h. Pradinis segmento adresas be paskutinio eioliktainio 0 vadinamas segmento numeriu ir ymimas kaip seg. Procesorius, natralu, vertina i segmentini registr savyb ir segmentuojant pirmiausia prie segmentinio registro prirao i deins puss t nenurodyt nul ir tik tada prideda poslink, nurodyt komandoje. Slyginai tai galima atvaizduoti CP=xxxx OK.CP:YYYY == xxxx0 YYYY ZZZZZ baz poslinkis absoliutinis adresas

Kadangi nulio priraymas i deins atitinka daugybai i 16, tai absoliutinio adreso formul pagal adresin por CP:ofset galima ireikti taip: Aabs=16*[CP]+ofset

15

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Pvz, jeigu ES=1234h, tai adresin pora ES:53h uduoda absoliutin adres 16*1234h+53h=12340h+53h=12387h. Dar patikslinsim. Kaip inia, adresus komandoje galima modifikuoti per registrus BX, BP, SI, DI. Pirmiausia atliekama adreso modifikacija per registrus-modifikatorius, k rezultate gauname adres, kur vadiname vykdomuoju. Tuo pat metu primename, kad skaiiavimas vyksta pagal modul 216 , t.y. vykdomasis adresas visada 16 skirsni adresas. Po to adresas suprantamas kaip poslinkis ir btent jis segmentuojamas, t.y. prie jo pridedamas segmentinio registro turinys padaugintas i 16.Toks sumavimas atliekamas pagal 216 modul, kad neviryti maksimalaus galimo adreso. Tokiu bdu tikslesn formul iskaiiuojamam absoliutiniam adresui yra Aabs=(Avykd+16*[CP]) mod 220. Taigi jei laikytis nuostatos apie segmentinius registrus, tai program tekstas asemblerio kalboje bus trumpesnis ir mainins programos ilgis bus maesnis. Jei tokios nuostatos nebus laikomasi, tai reiks komandose rayti adresus pilnai per adresines poras. Pvz., jei duomen segmento pradiai naudosime ne registr DS, o SS, tai norint X nusisti nul reiks rayti komand MOV SS:X,0, nes negalima bus rayti komandos MOV X,0, nes ji bus suprantama kaip MOV DS:X,0. Yra vienas atvejis, kurio negalima paeisti niekada, tai kad registras CS, visada turi bti naudojamas komand segmento pradiai nustatyti. Tai aikinama tuo, kad PK komandos adresas, kuri turi bti vykdoma, visada nurodoma CS ir IP pora, kur komand nuorodos registras IP saugo tos komandos poslink nuo komand segmento pradios. Todl jei registras CS rodys ne komand segmento pradi, tai kompiuterio elgesys bus neprognozuojamas. Dl tos prieasties prie perjimo adres negalima rayti prefiks skirting nuo CS. Yra du atvejai kai mes turime tiksliai nurodyti segmentin registr. Pirmas atvejis kai mes, prisilaikydami vis susitarim, tam tikrais atvejais norime turti iimt. Pvz. Jei registr AX norime pakrauti lastels L turin, kai ji yra komand segmente. Tokiu atveju MOV AX,L netinka, nes ji suprantama kaip MOV AX,DS:L ir registr bus patalpinta visai kitos lastels reikm. Todl mums reikia nurodyti segmentin registr, kuriame yra komandinio segmento pradios adresas t.y. registr CS. Todl komand reikia rayti MOV AX,CS:L Antras atvejis kai mums reikia dirbti su atminties segmentu, kuris nra nei komand, nei duomen nei steko segmentas. Tuo atveju segmento pradi nustatome per registr ES ir kreipiantis to segmento lastel naudojame btent t registr. Pvz. INC ES:Y. ia prefikso ES praleisti negalima, nes jis ia nesuprantamas pagal nutyljim. ES registras skirtas darbui su papildomais atminties segmentais. Taigi yra atvej, kai reikia tiksliai nurodyti segmentinius registrus, bet tai yra reti atvejai. Daugumoje komand reikia nurodyti ne piln adresin por o tik pat poslink.

16

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Programiniai Segmentai Segmentini registr naudojimas veria mus organizuoti program sekaniu bdu: viename segmente reikia talpinti visas programos komandas ir io segmento pradios adres patalpinti registr CS. Kitame segmente reikia talpinti visus programai reikalingus duomenis ir io segmento pradios adres reikia patalpinti registre DS, o treias segmentas skiriamas stekui ir jo pradios adresas talpinamas registre SS. Taiau ms sakinius asemblerio kalboje atmintyje nustatome ne mes o pats assembleris. Kaip assembleris nustato kokius sakinius kokiame segmente talpinti? Apie tai mes turime informuoti j per segmentus. Mes nustatome kokius sakinius kokiame segmente talpinti ir segmentas asembleryje apraomas pagal tam tikr struktr: <Segmento vardas> SEGMENT <parametrai> sakinys 1 sakinys n <Segmento vardas> ENDS Programiniam segmentui suteikiamas vardas, kuris turi bti pakartotas du kartus direktyvoje SEGMENT, kuri atidaro segment ir direktyvoje ENDS, kuri udaro segment. Tarp t dviej direktyv gali bti nurodytas bet koks sakini kiekis. Tos konstrukcijos esm yra ta, kad mes praneame assembleriui, kad visi sakiniai tarp i direktyv turi bti patalpinti viename atminties segmente. Bet tuo paiu reikia prisiminti, kad segmento dydis neturi bti didesnis nei 64 kb, todl sakini turi bti tiek, kad j bendras ilgis uimt ne daugiau nei 64 kb, kitaip bus fiksuojama klaida. Pastebsime, jog programoje gali bti keletas segment su tuo paiu vardu. Skaitoma, kad tas pats segmentas dl tam tikr prieasi yra apraomas dalimis. Assembleris visus tuos sakinius apjungs vien visum. Parametrai SEGMENT direktyvoje reikalingi tada, kai programa didel ir saugoma keliuose failuose, ir parametrai nurodo kaip tuos failus apjungti. Jei programa nedidel ir telpa viename faile tai parametrai nereikalingi. A SEGMENT A1 db 400h DUP(?) A2 dw 8 A ENDS B SEGMENT B1 dw A2 B2 dd A2 B ENDS C SEGMENT ASSUME ES: A,DS:B,CS:C L: MOV AX,A2 MOV BX,B2

17

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

C ENDS Direktyva ASSUME Jei mes apjungiame sakinius segment, tai assembleris patalpins juos viename atminties segmente. Tai reikia, kad visas to segmento lasteles galima segmentuoti per t pat segmentin registr. Koks tai registras? Tai nustato programos autorius. Tarkime ms pavyzdyje galime segmentui A pasirinkti registr ES, o segmentui B registr DS. Apie savo pasirinkim mes praneame assembleriui, kad jis galt transliuoti komandas sutinkamai su ms pasirinkimu. Esm ta, kad jei komandoje prie operand yra nurodytas prefiksas, tai su tokiu prefiksu assembleris suformuos atatinkam mainin komand. Taiau rayti kaskart prefiks nemalonu, nortsi kad assembleris u mus tai padaryt pats. Todl, kad assembleris galt tai padaryti, jis turi inoti koks segmentinis registras yra pasirinktas konkreiam segmentui. Informacija apie segment ir segmentini registr atitikim praneama per direktyv ASSUME. ASSUME <adresin pora>{,<adresin pora>{,} Arba ASSUME NOTHING, kur <adresin pora> tai <segmentinis registras>:<segmento vardas> arba <segmentinis registras>:NOTHING. Taip ms pavyzdyje su direktyva ASSUME ES:A,DS:B,CS:C mes praneame, kad segmentui A mes pasirinkome registr ES, B-DS, o C-CS. Reikalaujam i assemblerio, kad komandose, kur prefiksas nenurodytas, jis visus vardus i segmento A transliuot su prefiksu ES, o i segmento B su prefiksu DS, o i C su CS atatinkamai. Tokiu bdu komanda MOV AX,A2 bus suprantama kaip MOV AX,ES:A2, nes A2 yra segmente A, o jam pagal direktyv ASSUME nurodytas registras ES. Komanda MOV AX,B2 bus suprantama kaip MOV AX,DS:B2 dl tos paios prieasties. Taigi ASSUME direktyvos dka mes praneame assembleriui apie atitikim tarp segmentini registr ir segment, ir gaunam teis nenurodyti komandose prefikso. Praleisti prefiksai bus keiiami savarankikai. ASSUME ypatybs Pirmiausia pastebsime, kad direktyva ASSUME neukrauna segmentinius registrus segment pradios adres. ios direktyvos pagalba programuotojas tik pranea, kad bus toks segmentavimas ir adres ukrovimas. Direktyv ASSUME galima patalpinti bet kurioje programos vietoje, bet paprastai tai daroma komand segmento pradioje. Esm ta, kad informacija i tos direktyvos reikalinga tik komand transliavimo metu, todl iki komand segmento i informacija nereikalinga, o pirmos komandos transliasvimo metu, kur nurodomas koks nors vardas, i informacija jau reikalinga. Todl komand segmento pradia kaip tik ta vieta kur yra prasm patalpinti i direktyv. Direktyvoje btinai turi bti nurodytas ryys tarp registro CS ir to segmento, kitaip pirmos yms atveju assembleris i kart fiksuos klaid. Jei direktyvoje ASSUME nurodytos kelios adresins poros su tuo paiu segmentiniu registru, tai paskutin i t por ataukia prie tai einani, kadangi kiekvienam

18

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

segmentiniam registrui galima priskirti tik vien segment. Pvz ASSUME ES:A,ES:B assembleris supras kad registras ES nurodo segment B. Tuo paiu vien ir t pat segment gali bti nurodyti keli segmentiniai registrai. Pvz. ASSUME ES:A,DS:A skaitosi, kad segment A nurodo ir registras ES ir registras DS. Assembleris turi teis rinktis prefiks pats su kuriuo jis dirbs. Paprastai assembleris pasirenka t prefiks kuris yra numatytas pagal nutyljim. Jei ASSUME direktyvoje vietoj antro elemento adresinje poroje yra paraytas NOTHING (ASSUME ES:NOTHING), tai tas reikia, kad nuo to momento segmentinis registras nenurodo jok segment, kad assembleris neturi naudoti io registro ir kad programuotojas ima sau atsakomyb tiksliai nurodyti registr kai reikia. Programoje ASSUME gali bti nurodyta kelis kartus. ASSUME ES:a ASSUME DS:B,CS:C Toks uraymas ekvivalentus ASSUME ES:A,DS:B,CS:C Kai tarp direktyv yra kit komand, ne visada galima apjungti tas direktyvas. Segmentini registr pasirinkimas transliavimo metu. Yra taisykls, kuri laikosi assembleris komand transliavimo metu, kaip turi bti parenkamas prefiksas prie adres komandoje. Jei operande nra vardo pagal kur assembleris galt nustatyti kokiame atminties segmente yra patalpintas operandas, tai assembleris irenka t segmentin registr, kuris toje komandoje numatytas pagal nutyljim. Pvz. Komandoje MOV AX,[BX] bus irinktas prefiksas DS:, o komandoje MOV AX,[BP] prefiksas SS:. Jeigu operande nurodytas kintamojo vardas arba ym, tai assembleris iri ar buvo tas vardas jau apraytas programoje. Jei ne, jei tai nuoroda pirmyn, tai assembleris skaito, kad tas vardas turi bti segmentuojamas pagal registr, kuris ia komandoje suprantamas pagal nutyljim. Pvz. Jei X nuoroda pirmyn , tai komandoje INC X[SI] bus suprantamas prefiksas DS, o komandoje INC X[BP+1] prefiksas SS: Pradinis segmentini registr ukrovimas Direktyva ASSUME mes praneame kad visi vardai i tam tikr programini segment turi susigeneruoti pagal nurodytus segmentinius registrus ir reikalaujame, kad assembleris formuot mainines komandas su atatinkamais prefiksais. Tai dar nereikia kad programa veiks teisingai. Tarkime pas mus pagal komand MOV AX,A2 bus suformuota komanda MOV AX,ES:A2, bet jei registras ES nerodys segmento A pradios, tai tokia komanda veiks neteisingai. Reikia, kad segmentiniuose registruose bt teisingos reikmsatatinkam segment numeriai atmintyje. Programos pradioje ten nieko nra. Todl programos darbas turi prasidti nuo komand, kurios segmentinius registrus ukraut atatinkam segment numerius atmintyje. Taigi registras DS turi bti nustatytas segmento B pradi. Primename kad assembleryje segmento vardui priskiriama reikm pirmi 16 bit to segmento pradinio adreso, o tai ir yra tas, kas turi bti patalpinta segmentin registr, todl reikia atlikti priskyrim DS:=B. Taiau tai atlikti su komanda MOV DS,B negalima, nes segmento vardas, tai konstantin iraika, t.y. tiesioginis operandas, o su komanda MOV udraustas persiuntimas

19

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

tiesiogini duomen segmentin registr. Todl tok persiuntim reikia atlikti per kit nesegmentin registr, pvz. AX. MOV AX,B MOV DS,AX ;DS=B Analogikai ukraunamas ir registras ES. Kas lieia registr CS, tai jo ukrauti nereikia. Tai dl to, kad programos vykdymo pradiai tas registras jau bus upildytas ir rodys komand segmento pradi. Tok ukrovim atlieka operacin sistema, prie perduodama valdym programai, todl ukrauti CS paioje programoje nereikia. Registras SS naudojamas steko segmento nustatymui . Ukrauti registr galima dvejopai. Pirma - j galima ukrauti paioje programoje- taip kaip tai daroma su registru DS arba ES. Antra - tok ukrovim galima pavesti operacinei sistemai. Dl to direktyvoje SEGMENT, kuri atidaro steko segment, reikia nurodyti special parametr STACK, pvz. S SEGMENT STACK. Tuo atveju S ukraunamas registr SS automatikai iki programos vykdymo pradios. is variantas yra tinkamesnis. Klausimai 1. Kas tai yra ASSUME ir kokia jos paskirtis programos darbe? 2. Ar komanda ASSUME takoja programos ilg? Taip Ne 3. Kas tai yra prefiksas ir koks yra jo vaidmuo programos darbe? 4. Kas yra atsakingas u segmentini registr formavim? Sistema Programuotojas Programos vartotojas 5. Kokius inote programinius segmentus? PROGRAMOS STRUKTRA Pilna programa assemblerio kalboje neturi grietos struktros, taiau nedidelm programom naudojami trys segmentai- komand, duomen ir steko. Tipin schema STACK SEGMENT STACK ;steko segmentas DB 128 DUP(?) STACK ENDS DATA SEGMENT ;duomen segmentas KINTAMJ IR KONSTANT APRAYMAS DATA ENDS CODE SEGMENT ;komand segmentas ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX ;DS registro ukrovimas Kitos programos komandos CODE ENDS END START programos pabaiga, jimo takas

20

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Segment tarpusavio idstymas programoje gali bti bet koks, taiau kad sutrumpinti komandose kreipinius pirmyn ir ivengti problem dl prefiks raymo, rekomenduojama komand segment talpinti programos gale. Steko segmentas programoje apraytas su parametru STACK , todl paioje programoje jau nebereikia ukrauti registro SS. Kaip inia nereikia ukrauti ir registro CS. Todl lieka tik vienas registras kur reikia ukrauti - tai registras DS. Neirint tai, kad programoje mes nevartojame Steko segmento, j vis tiek reikia aprayti, nes j naudoja operacin sistema, kai yra atliekami pertraukimai. Programos pabaigoje reikia nurodyti END direktyv. Ji naudojama kad parodyti jog tai jau visi programos sakiniai ir visi kiti pasitaikantys u jos sakiniai nebepriklauso programai. Joje nurodomas taip vadinamas jimo takas, t.y. ym komandos nuo kurios turi pradti dirbti programa. Visi sakiniai programoje turi priklausyti kuriam nors segmentui. Tarp segment galima nurodyti tik koki nors informacij. Iki iol kalbta apie darb su vienu komand segmentu, kas bdinga maoms programoms. Bendru atveju gali bti tiek komand, kad netelpame viename segmente. Tuo atveju programoje apraome kelet komand segment. Pvz. C1 SEGMENT ASSUME CS:C1. START: MOV AX,0 JMP FAR PTR L C1 ENDS C2 SEGMENT ASSUME CS:C2 L: INC BX C2 ENDS Kiekvieno komand segmento pradioje turi bti nurodyta direktyva ASSUME kur segmentiniam registrui CS nustatomas reikiamas segmento adresas. PK komandos, kuri turi bti vykdoma, adresas nustatomas per CS ir IP adresin por . CS nurodo segmento pradi, o registre IP yra komandos poslinkis to segmento atvilgiu. Bet kokio registro reikms pakeitimas keiia ir viso adreso pakeitim. Jei keiiama tik IP reikm, tai reikia kad perjimas vyksta tame pat segmente. Tokie perjimai vadinami artimais. Jei programoje yra keletas komand segment tai reikia nurodyti perjimus i vieno segmento kit. Tokie perjimai vadinami tolimais. Esant tokiems perjimams keiiasi registr CS ir IP reikms. CS nurodo segmento pradi, o IP uraomas poslinkis segmento viduje.

21

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Stekas ir steko segmentas Stekas tai programos sritis laikinam bet koki duomen saugojimui. Stekas - tai saugykla, darbas su kuriuo atliekamas pagal princip: paskutinis elementas, uraytas stek yra nuskaitomas i steko pirmas. Tokiai saugyklai OA galima iskirti bet koki viet, bet jai yra taikomi du kriterijai: Sritis neturi viryti 64 kb. Pradinis adresas turi bti kartotinis 16. Kitaip sakant, ta sritis turi bti atminties segmentu. Ji ir vadinama steko segmentu. Jo pradia uduodama segmentiniam registre SS. Stekas upildomas i viraus emyn. Pirmas elementas uraomas paiam dugbe, sekantis uraomas ant jo ir t.t. Skaitant i steko gaunasi, kad steko apaia (dugnas) yra fiksuota, o steko virn vis laik kinta. Kad inoti tos virns padt bet kuriuo metu, yra naudojamas dar vienas registras SP (nuoroda-takas steke). Jame saugomas adresas tos lastels, kurioje yra elementas, raytas stek paskutinis. Dar tiksliau, SP yra tos lastels poslinkis, t.y. jos adresas atskaiiuotas nuo steko segmento pradios. Todl absoliutinis steko virns adresas uduodamas regisrt poros SS:SP. Pagrindin steko ypatyb yra savotikas duomen irinkimas, t.y. bet kuriuo metu steke yra prieinamas tik virutinis elementas, toks kuris stek pakliuvo paskutinis. Tik ikrovus i steko virutini element galime prieiti prie sekanio. Steko elementai idstyti operatyvinje atminty, skirtoje stekui, pradedant nuo steko dugno, t.y. nuo jo max adreso, ir upildoma nuosekliai majant steko virns adresui. Virutinis prieinamo elemento adresas saugomas steko virns registre SP. Patalpinti bet koki reikm stek ar paimti bet koki reikm i steko galima su specialiomis komandomis. Padedant stek yra sumainama registro SP reikm per 2 ir patalpinamas operandas nurodytu adresu, kuris saugomas registre SP. Imus i steko duomenis jis neisivalo, bet jame esantys elementai neprieinami, nes pasikeite SP reikm ji padidja per 2, o stekas laikomas tuiu. Steko elementai gali bti bet kokio dydio: tai gali bti baitai, odiai, dvigubi odiai ir kt. Taiau PK turimos raymo stek ir nuskaitymo i steko komandos dirba tik su odiais. Paprastai derinamasi prie komand ir skaitoma, kad steko elementai yra vieno odio. Reikia iskirti termin steko segmentas ir stekas (t.y. jo turinys) steko segmentas- reikia atminties srit, kuri potencialiai gali uimti steko duomenys, o steaks- reikia duomenis, kurie duotu metu yra steke, t.y. baitai, pradedant nuo adreso SP iki steko segmento pabaigos. Visi duomenys, kurie yra vir adreso i SP nesiskaito kaip steko duomenys. Kad rezervuoti stekui viet OA, programoje reikia aprayti atitinkam programin segment : S SEGMENT STACK is programos fragmentas iskiria db k dup(?) k bait OA stekui, S ENDS t.y. steko segmentas Vard steko lastelms nenurodome, nes prijimas prie j vis tiek vyks ne pagal vardus, o netiesiogiai per registr SP. Daniausiai neuduodamos ir t lasteli pradins reikms. Todl apraant steko segment, nurodome tik kiek bait skiriame segmentui. Prie pradedant dirbti su steku, btina ukrauti registrus SP ir SS: t.y. registras SS turi rodyti steko segmento pradi, o SP turi rodyti steko virn. Tai galima padaryti :jei apraant steko segment su direktyva SEGMENT nurodysime parametr STACK, tai

22

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

pradedant vykdyti program abu ie registrai bus ukrauti automatikai t.y SS registre bus patalpintas segmento pradios adresas, o registre SP bus uraytas steko dydis baitais k (kiek jam iskirta apraymo metu) - t. y. todl, kad pradedant programai dirbti stekas turi bti tuias, o k reikm ir nurodo tui stek, t.y. SP nurodo tui lastel u steko. Net jei mes nenaudojame programikai steko, vis tiek jam btina iskirti maiausia 256 baitus. Jei mes naudojam programikai stek, tai jam iskiriam vietos tie kiek reikia ir plius dar tuo 256 baitus. Steko komandos: raymas stek (vieno odio) PUSH op galimos op reikms yra registras r16, OA m16 sr bet koks segmentinis registras Negalima nurodyti tiesiogins reikms. Tai galima atlikti naudojant tarpin registr. SP PUSH op _______ POP op SP

Komanda PUSH veikia sekaniai: pirmiausia registro SP reim sumainama 2, t.y SP pastumiama vir ir dabar jau rodo laisv steko srit, ir tada jau j rao operando reikm: SP:=(SP-2) i komanda vlevli reikmi nekeiia Dvigubam odiui urayti reiks atlikti komand du kartus, o urayti vien bait, reikia prie tai j iplsti iki odio nesvarbu kokiu bdu. Skaitymas i steko (vieno odio) POP op galimos op reikms yra: registras r16, OA m16 sr bet koks segmentinis registras (iskyrus CS) i komanda istumia i steko virns od ir patalpina j nurodyt operande viet. i komanda veikia sekaniai: I lastels, kurios adresas iskaiiuojamas i registr SS:SP poros, reikms ersiuniama operand, ir tuo pat metu registro SP reikm padidinama per 2, t.y. virn steko nustumiama emyn t.y. SP:=(SP+2) Stekas gali bti naudojamas :

23

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Registr isaugojimui - kai reikia atsiminti registr reikmes, kai tie registrai laikinai turi bti panaudojami kitiems tikslams, tai galim jo reikm laikinai isaugoti steke, o po registro atlaisvinimo, jo reikm atstatyti nuskaitant i steko. Pvz. Reikia isaugoti registr CX PUSH CX POP CX Persisti duomenis per stek Danai jis naudojamas, kai reikia persisti duomenis i vienos lastels kit (kaip prisimenat to daryti tiesiogiai negalima, paprastai tam naudojamas tarpinis registras) PUSH Y POP X tolygu X=Y

24

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Prijimas prie steko element Komandos PUSH ir POP leidia prieti prie duomen steko virnje, bet kartais reikalingas prijimas ir prie kit steko element, kurie yra emiau. Tarkim steke rayta trij odi reikms w1,w2,w3 Reikia paimti w3 reikm (pai apatin) ir j rayti registr AX. Jo adresas yra virns adresas +4 Tai mes galime padaryti steko virns adres patalpindami registr BP, o po to jau imti reikiam element nrodant poslink 4 t.y pagal adres (BP+4) MOV BP,SP MOV AX,[BP+4] Registr BP naudojame kaip registr modifikatori, nes SP negali bti kaip modifikatorius. Tuo atveju jei nenurodytas joks segmentinis registras, pagal nutyljim jis priimamas kaip SS, o tai reikia kad yra skaitomi duomenys i steko segmento. Taiau jei vietoj BP naudotume kit registr, pvz. BX, tai pagal nutyljim bt imamas kaip segmento registras, registras DS, o tai reikia, kad duomenys bt skaitomi i duomen segmento. Duomen segmentas Kaip ir bet kuris kitas programini segmentas jis turi savo vard ir apiforminamas specialiasi operatoriais. Duomen segmente yra apraomi kintamieji ir kiti duomenys,kurie bus naudojami programos viduje. Duomen apraymui duomen segmente yra naudojami operandai, kurie leidia formuoti operatyvinje atmintyje skirtingo tipo r skirtingo ilgio duomenis. U j panaudojim programoje atsakingas programuotojas. Komand segmentas Tai yra vieta, kur realizuojamas programos algoritmas, naudojant reikiamas komandas. io segmentoviduje taip pat apraomos paprograms, jei jos naudojamos programoje. Paprograms Procedros Danai programose, ypa dideliuose, reikia kelet kart sprsti t pi uduot ir todl reikia daug kart aprayti toki pai komand sek, sprendiani i uduot. Kad ivengti pasikartojani komand grupi, tokias komand grupes aprao vien kart ir apiformina atatinkamu bdu, o po to reikiamose vietose tiesiog perduoda valdym tas komandas, ir kai jos atidirba, grina valdym atgal. Tokia komand grup, kuri sprendia tam tikr uduot ir kuri organizuota tokiu bdu, kad j galima bt naudoti neribot skaii kartu ir j bt galima kreiptis i bet kurios programos vietos, vadinama paprograme. Jos atvilgiu kita programos dalis vadinama pagrindine programa. Lengva suprasti, kad paprogrames tai procedr analogas aukto lygio programavimo kalbose. Pati paprogram tai analogas procedros apraymo, o kreipinys paprogram yra analogas procedros operatoriaus. Realizacija paprogrames assembleryje yra sudtingesn nei procedros apraymas. Esm ia, kad aukto lygio kalbose u mus tai daro transliatoriai, o programuojant assembleryje mums niekas nepadeda, todel ia reikia atlikti visk paiam programuotojui.

25

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

kur talpinti paprogrames? Bendru atveju kalbant jas galima talpinti bet kur. Bet reikia prisiminti, kad pati savaime paprogram neturi bti vykdoma, o turi bti vykdoma tik tada, kai yra j kreipinys. Todel talpinti j reikia taip, kad j atsitiktinai nebt galima pakliti. Jei yra keletas paprogrami , tai jas galima sudti greta. Paprastai paprograms dedamos arba gale komand segmento u paskutines komandos, arba komand segmento pradioje prie komand nuo kurios programa turi pradti veikti. Didelse programose kartais paprograms ikeliamos atskir segment. kaip apiforminti paprogrames? Bendru atveju komand grup, kuri bus kaip paprogram, galima niekaip neiskirti. Taiau asembleryje priimta paprogrames apiforminti ypatingu bdukaip procedr. Tai yra tam tikru bdu naudinga. Paprograms kaip procedros apiforminimas atrodo taip: <proceduros vardas> PROC <parametrai> Procedros knas <procedros vardas> ENDP Kaip matome, procedros knas eina po direktyvos PROC, o po jos eina direktyva ENDP. Tose abiejose direktyvose nurodomas tas pats vardas- vardas, kur mes davme paprogramei. Reikia atkreipti dmes, kad direktyvoje PROC po vardo nededame dvitakio, bet is vardas skaitomas yme, kuri turi pirmoji procedros komanda. vard galima naudoti perdavimo komandoje ir perdavimas bus vykdomas i komand. Direktyvoje PROC yra parametras tai gali bti NEAR (artimas) arba FAR (tolimas). Parametro gali ir nebti, tada priimama kad jis yra NEAR. Esant parametrui NEAR arba nesant jokiam parametrui, procedra yra vadinama artima, o esant FAR parametruitolima. artim procedr galima kreiptis tik i to paties komand segmento kuriame ji aprayta, ir negalima kreiptis i kit komandini segment, o tolim procedr galima kreiptis i bet koki komandini segment. Assembleryje vardai ir ymes, aprayti proceduroje, nra lokalizuojami jos viduje, todl jie turi bti unikals ir negali sutapti su kitais vardais, naudojamais programoje. procedur ikvietimas ir grimas i j Kaip ikviesti procedras ir griti i j? Programuojant aukto lygio kalbomis, procedr vykdymui pakanka tik parayti procedros vard ir faktinius parametrus. Tada ms nejaudina kaip procedra prads dirbti ir kaip ji gri pagrindin program. Assembleryje visus valdymo perdavimus i programos procedr ir atvirkiai reikia realizuoti patiems. ia yra dvi problemos: kaip i pagrindines programos perduoti valdym procedrai ir kaip i jos griti pagrindin program. Pirmoji problema sprendiama paprastai. Pakanka tik perduoti valdym pirm procedros komand, t.y. nurodyti perdavimo komandoje proceduros vard. Sunkiau yra realizuoti griim. Esme ta, kad procedur galima kreiptis i ivairi programos viet, vadinasi griti reikia skirtingas vietas. Pati procedra neino kur ji turi perduoti valdym, kai baigs savo darb.

26

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Parametr perdavimas parametr perdavimas per registrus Aukto lygio kalbose kad perduoti parametrus paprogramei utenka juos tik urayti operatori, kuris kvieia procedur. Asembleryje parametrai ir procedros rezultato perdavimas yra kitas. Asembleryje nera fomalaus dalinimo procedras ir funkcijas, taiau pagal turin yra dalinama procedras ir funkcijas. Perduodami faktiki parametrai skirtingai. Paprasiausias bdas yra registrai. Pagrindineje programoje faktiniai parametrai yra uraomi kokius nors registrus, o procedra toliau jais naudojasi. Analogikai galima pasielgti ir su rezultatais, jei tokie yra. Procedra urao rezultatus, o programa vel naudojasi. Kokie bus tam naudojami registrai priklauso nuo paties programuotojo. parametr perdavimas per reikmes Pvz. Reikia iskaiiuoti c=max(a,b)+max(5,a-1), kur visi skaiiai skaiiai su enklu ir yra odio tipo. Iskaiiavim max(x,y) apraysim kaip procedur funkcij, tuo paiu susitarsime apie sekant: pirmas parametras (x) programai perduodamas per AX registr, o kit (y) per registr BX, o rezultat (max) procedra turi grinti per registr AX. Esant tokioms slygoms procedura ir pagrindines programos fragmentas atrodys taip: ; procedura : AX=max(AX,BX) ;PAGRINDINe PROGRAMA MAX PROC FAR MOV AX,a ;AX:=a CMP AX,BX MOV BX,b ;bx:=b JGE MAX1 CALL MAX ;AX:=MAX(a,b) MOV AX,BX MOV c,AX ;Isaugome AX MAX1: RET MOV AX,5 ;AX:=5 MAX ENDP MOV BX,a DEC BX ;BX:=a-1 CALL MAX ;AX:=MAX(5,a-1) ADD c,AX ;c:=max(a,b)+max(5,a-1) parametr perdavimas persiuntimo bdu Tegu programoje yra kreipinys, kai kintamieji A ir B (kurie yra teigiami skaiiai) ir reikia priskirti jiems kokias tai reikmes, tai yra persisti duomenis. Kad kak rayti i lastel reikia inoti tos lasteles adres. Todl jei priskyrimas numatytas atlikti procedroje, procedrai reikia nurodyti t lasteli adres ir tai turi atlikti pagrindin programa. Tokiu bdu parametro perdavimas persiuntimo bdu reikia adreso perdavim, kuris atitinka faktin parametr. Kaip perduoti t adres Per registr: pagrindin programa urao kok nors registr adres faktinio parametro, o procedra j i ten pasiima. Koks tai registras? Bendru atveju bet koks, bet geriau jei tai bus registras modifikatorius, t.y. BX, BP, SI, DI kadangi procedrai reiks atlikti adres modifikacij. Tegu ms procedrai D mes pasirinkome registr BX. Tai reikia kad iki jos darbo pradios registre BX bus tos lasteles adresas (A arba B) , kurios turin procedra turi pakeisti. Tokioje situacijoje pasiekti i lastel galima naudojant konstrukcij [BX]. ; Pagrindine programa ;Procedura D PROC LEA BX,a ;;BX:=Adresas a PUSH CX ;isaugom CX CALL D ; procedura D MOV CL,4

27

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

LEA BX,b ;;BX:=Adresas b SHR WORD PTR [BX], CL CALL D POP CX ;atstatom registr CX RET D ENDP registr isaugojimas procedroje Kaip matome, procedroje D bus naudojamas registras CL, kuriame procedra patalpina poslinkio dyd. Ar gali procedra keisti registro turin? PK ne taip jau daug registr, o jie yra naudojami daugelyje komand. Didel tikimyb, kad procedroje ir programoje gali bti reikalinga naudoti tuos paius registrus. Todl reikia , kad procedra prie naudodama registrus simint j turin. Tai galima atlikti kai procedros pradioje j turinys saugojimui uraomas steke, ir po to procedra registrus gali naudoti savo nuoira. Prie grtant pagrindin program tuos registrus reika atstatyti perraant juos reikmes i steko. Yra viena ypatyb, netgi jei mums reikia isaugoti tik vien registro bait mes turime siminti viso registro turin, nes stekas gali skaityti ir rayti duomenis tik odiais. Yra specialios komandos PUSHA ir POPA, kurios simena ir atstato visus bendro naudojimo registrus. sudetingo tipo parametr perdavimas Tai gali bti masyvai ar struktros. Tuo atveju geriau perduoti ne paius duomenis, o adres kur tie duomenys yra. Tada bus galima prieiti i procedros prie bet kuri nurodyt duomen. Tai atliekama netgi tada kai nereikia t duomen keisti. Pvz. X DB 100 Dup(?) Y DB 25 Dup(?) Reikia DL urayti sum maksimali reikmi i masyv X ir Y atatinkamai, t.y. DL=max(X[I])+max(Y[I]) iuo atveju du kartus reikia irinkti maksimali reikm i masyv X ir Y atatinkamai. Tam sudarysime procedr MAX. Pradinis masyvo adresas perduodamas per registr BX, o element kiekis masyve per registr CX, o rezultatas grinamas per registr AL. ;procedura MAX MAX PROC PUSH BX PUSH CX MOV AL,0 MAX1: CMP [BX],AL JLE MAX2 MOV AL,[BX] MAX2: INC BX LOOP MAX1 POP CX POP BX RET MAX ENDP ; Pagrindin programa LEA BX,X ;masyvo X adresas MOV CX,100 ;CX yra masyvo element skaiius CALL MAX ;AX=max(X[I])

28

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

MOV DL,AL ;isimenam AL LEA BX,Y ;masyvo Y adresas MOV CX,25 ;elementu kiekis masyve CALL MAX ;AX=max(Y[I]) ADD DL,AL parametr perdavimas per stek Parametr peradvimas per registrus yra patogus metodas ir danai naudojamas. Taiau tai yra patogu, jei nra daug parametr. Jei parametr daug, tai registr gali ir neutekti. Tuo atveju naudojame kit parametr perdavimo bd t.y. jie gali bti perduoti per stek. Pagrindin programa patalpina parametrus stek, o procedra juos i ten nuskaito. Tai atlikti galima vairiai. Taigi procedra P naudoja k parametr. Sutarsime, kad prie kreipiantis procedr parametrai uraomi stek. Kokia tvarka? Tai nustato programuotojas. Mes manysime, kad parametrai stek uraomi i kairs dein. Pradioje uraomas 1-as elementas, po to kitas ir t.t. Jei kiekvienas parametras yra odis, tai pagrindins programos komandos, realizuojanios kreipimsi procedur , bus sekanios: ; kreipinys procedur push a1 push a2 push ak call p Kai pradeda dirbti procedra i kart kyla problema kaip jai pasiimti parametrus. Tai yra problema, kai reikia pasiekti steko elementus j neiimant i steko. Tai galima realizuoti naudojant registr BP, t.y. nusisti registr steko viruns adres (registro SP reikm), o vliau naudoti iraik [BP+I]. iuo atveju mes gadiname registro BP reikm. Todl pradioje j reikia isaugoti ir tik po to j persisti SP reikm. Taigi procedra turi prasidti nuo pagrindini komand. ; pradiniai proceduros veiksmai P Proc Push BP MOV BP,SP tolimesns procedros komandos Reikia atsiminti tvark, kokia parametrai buvo padeti stek. Procedros pabaigoje turi eiti galins komandos. Tai komandos, kurios atstato registro BP reikm ir dar reikia ivalyti stek nuo parametr. Steko valym gali atlikti ir pagrindin programa. Tam po komandos CALL P reikia ivykdyti komand ADD SP,2*k. Bet geriau jei tai atliekama procedroje dl to, kad procedr galima kreiptis i ivairi programos viet ir del to komand ADD reikt atlikti keliose pagrindins programos vietose. Taigi procedra turi ivalyti stek nuo parametr ir tik tada grinti valdym pagrindinei programai. Tam yra numatytas komandos RET variantas, kur operando pagalba galime nurodyti kiek bait steke reikia ivalyti. Operando reikm traktuojama kaip skaiius be enklo. i komanda pirmiausia i steko pasiima griimo pagrindin program adres, tada steke ivaloma tiek bait kiek yra nurodoma ir tik po to valdymas perduodamas pagrindin program. I esms paprasta RET yra RET 0. (valymo sritis nurodoma baitais o ne odiais).

29

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

KOMAND SISTEMA IR J KLASIFIKAVIMAS Persiuntimo komandos Aritmetins komandos Lyginimo komandos Ciklo organizavimo komandos Duomen persiuntimo komandos Bendros paskirties Darbui su steku Perkodavimo MOV op1,op2 Komanda persiunia baito ar odio ilgio duomenis i op2 op1.(registr arba OA). Negalima persisti duomen i OA OA tiesiogiai. Taip pat negalima persisti duomen i vieno segmentinio regitro kit segmentin registr. Taip pat nealimakeisti registro CS reikms. To prieastis yra ta, kad CS ir IP reikms apsprendia adres komandos, kuri turi bti vykdoma sekanti, tai reikia kad pakeitus kurio nors registro reikm mes jau atliekam valdymo perdavim. Kartais i operand neina nustayti kiek reikia persisti bait. Pvz. MOV [SI],0 neaiku ar 0 yra baitas arodis. Todl neaiku, kiek bait ivalys nuo adreso, urayto register SI. Todl tokiu atveju reikia patikslinimo komadoje. Tam galime panaudti operatori PTR <Tipas> PTR <Tipas> gali bti <iraika> BYTE WORD DWORD MOV MOV MOV MOV PTR PTR PTR <iraika> BYTE nustato bait WORD nustato od DWORD nustato dvigub od konstanta PTR nustato kas tai yra baitasar odis Adresin konstanta 0 0 0 0 traktuojamas kaip baitas 0 traktuojamas kip odis 0 traktuojamas kaip dvigubas odis

BYTE PTR[SI],0 [SI],BYTE PTR 0 WORD PTR[SI],0 [SI],WORD PTR 0

Su PTR galime ne tik patikslinti bet ir pakeisti duomen tip

30

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

PVZ. Z DW 1234 3412 Z Z+1 Reikia tik dal odio ivalyti MOV BYTE PTR Z,0 Bus ivalomas tik pirmas baitas Prie persiuntimo komand galima priskirti ir adreso persiuntim. LEA r16,A nurodyt registr raomas adresas nurodytos yms

X DW 88 Y DW X Reikia X adres patalpinti registre. Jei MOV BX,X, tai BX=88 MOV BX,Y Tai bus X adresas. Bet galima ir kitaip

LEA BX,X Danai naudojama formuojant ivedimo adres. LEA komanda pati paskaiiuoja adres. Vlevli nekeiia. Antras operandas gal bti ir baitas ir odis, nes imama ne jo reikm, o adresas,bet negali bti konstanta arbakitas registras. Vietoj LEA galima naudoti komand MOV SI,OFFSET Kintamasis LEA SI,Kintamasis

Aritmetins komandos Skaii be enklo sudtis ir atimtis Skaiiavimai atliekami dvejetainje sistemoje. Je rezultatas didesnis nei jam numatytas operando dydis gali sutalpinti, kai kuriuose kompiuteriuose fiksuojama klaida ir programos darbas nutraukiamas. Personaliniuose kompiuteriuose klaida nefiksuojama, o perneimo vienetas atmetamas ir rezultate gauname ikreiptus duomenis, taiau tuo patmetu fiksuojama perneimo vliavls reikm CF=1. Analizuojant vliavls reikm galima keisti programos darb. Toks sumavimas vadinamas sumavimu pagal modul 2k, kai atmetamas perpildymo vienetas. Skaii be enklo atveju Suma(x,y)=x+y

31

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Mod 2k =x+y jei X+Y<2k CF=0 k =X+Y+2 jei X+Y>=2k CF=1 Tokia pat problema yra ir skaii be enklo atimties atveju. K daryti X-Y jei X<Y Tuo atveju gunamas neigiamas skaiius, o tai jau skaiius su enklu. X>=Y vyksta paprasta atimtis X<Y X pasiskolinamas vienetas, t .y. prie X pridedamas 2k , o po to atliekama atimtis. Gautas rezultatas paskelbiamas rezultatu papildomam kode (256+1) 1-2=(28+1)-2=255 (papildomam kode) = (-1) CF=1 klaida nefisuojama. Tai yar atimtis pagal modul 2k . Skirtumas (x,y)=(x-y) mod 2k=x-y =(2k+x)-y x>y x<y CF=0 CF=1

Sudtis iratimtis skaii be enklo yra atliekamas pagal modul 2k . K nusako OA lastels dyd .Klaida fiksuojamaCF vliavlje. Sudtis ir atimtis skaii su enklu Vykdoma papildomam kode.Tada jie sudedamiir atimami kaip skaiiai be enklo. Po to rezultatas nagrinjamas kaip papldomas kodas skaiiaus su enklu. 3+(-1) = (3)+(256-1)=3=255(mod 256)=258(mod 256)=2 Komandos: ADC op1,op2 Op1=op1+op2+F sudedami du skaiiai ir CF vliavls reikm.

SBB op1,op2 atimami du skaiiai Op1=op1 -op2-CF reikm pasiskolinimui i komand pagalbagalima sudti arba atimti vairi dydi skaiius. ADD op1,op2 SUB op1,op2 op1:=op1+op2 op1:=op1-op2 skaii sudtis skaii atimtis

OP1 OP2 ________________ R8 M8 R16 M16 i8,r8,m8 i8,r8 i16,r16,m16 r16

Bendrai komandos veiksmus galima aprayti

32

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Op1:=op1*op2 operand tipas turi btivienodas Skaiiai gali ti su enklu arba be enlo. Keiiasi vliavls CF OF SF ZF perneimo perpildymo enklo nulio

Analogikai veikia komandos INC op prideda vienet DEC op atima vienet Jos taip pat dirba su baitu arba su odiu., be to OP gali bti registras arba OA lastel. NEG op supranta operand kaip skaii su enklu ir keiia jo enkl prieing.

Daugybos komandos Skaii be enklo daugyba MUL op Skaii su enklu daugyba IMUL op Vieno i operand vieta yra fiksuota,t.y AL skaiiams viename baite AX skaiiams odyje Baito dydio skaii daugyba AX:=AL*op op:r8,m8 odio dydio skaii daugyba (DX,AX)=AX*op op:r16,m16 Op gali bti registre ar operatyvinje atmintyje, bet negali bti kaip duomenys komandoje. Rezultatui skiriama dvigubai daugiau vietos, nei uima dauginamasis. N enkl daugybos rezultatas yra 2n.. Sudauginus baitus, rezultatas talpinamas odyje. Sudauginus odius, rezultatas talpinamas dvigubame odyje. PVZ. N*2 MOV AL,2 MUL N MOV AX,2

33

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

MOV BX,-1 IMUL BX Kartais rezultatui formuoti utenka tokio paties dydio lasteli kaip ir dauginamieji.Kartais tai inoma i anksto, bet gali bti ir neinoma.Tuo atvejunustatyti ar rezultatui reikiato paties ilgio ar dvigubo ilgio, galima nustatyti nalizuojant vliavles. CF=OF=1 CF=OF=0 CF=0 atatinkama. CF=1 odio. jei reikia dvigubo formato jei uenka to paties formato jei rezultatas yra tik register AL, arba AX dl baito ar dl odio tai rezultatui reikia dvigubo formato,t.y. AX dl baito, (DX,AX) dl

Dalybos komandos Skaii be enklo dalyba DIV op Skaii su enklu dalyba IDIV op Dalinant skaii i baito ar odio daliklis gali bti registre arba operatyvinje atmintyje. Dalijamojo vieta fiksuota ir priklauso nuo operando dydio.Rezultatas yra sudarytas i dviej dali: sveikasis skaiius ir liekana.J vieta priklauso nuodalijamojo ir daliklio, betyra fiksuota ir jo nurodyti nereikia. levls nesikeiia, bet yra ypatingas atvejis, jei daliklis yra 0, t.y. dalyba i nulio. Dalijant od i baito Dalijamasis turi bti AX, o daliklis uimti vien bait Dalijant dvigub od i odio , dalijamasis turibtiuraytas per du registrus DX ir AX. DX vyresnieji skaiiai, AX jaunesnieji skaiiai. Dalijamais odis AX DIV op Daliklis Baitas registre Arba OA AH AL Liekana odis registre Arba OA DX Liekana AX Sveikoji Dalis Baitas registre AL sveikoji dalis Liekana Baitas registre AH

Dvigubas odis (DX,AX) DIV op

odis registre AX sveikoji dalis

odis registre AL

34

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Lyginimo komanda ir slyginis valdymo perdavimas Jei valdymas perduodamas komandai tik esant tam tikrai patenkintai slygai, o prieingu atveju ne, tai vadinama slyginiu valdymo perdavimu. Valdymo perdavimas vykdomas per d etapus: Lyginamos reikms ir kaip rezultatas formuojamos vlevli reikms Priklausomainuo vlevli reikmi valdymas perduodamas arba ne. Lyginimui naudojama speciali komanda. Lyginimo komanda CMP op1,op2 i komanda ekvivalenti komandai SUB, t.y. i op1 atimamas op2. Skirtumas tiktoks, kad nei op1 nei op2 nesike2ia,o tik formuojama vlevli reikm ir taip formuojamas rezultatas. C=0 jei op1>op2 skaiiai be enklo C=1 jei op1<op2 O=0 jei op1>op2 O=1 jei op1<op2 Z=1 jei op1=op2 Valdymo perdavimo komandos Valdymo perdavimo komand yra labia daug. Bendra forma yra Jxx ym komandos adresa kuriai perduodamas darbas Komanda Jxx nustato vldym perdavimo slygas Perdavimo komandos skirstomos tris grupes Komandos raomos i karto po lyginimo komandos. Komandos kodas nustato slyg, kuriai esant patenkintai, vykdomas valdymo perdavimas. xx kodai komandoje yra sekantys: E equal(lygu) N not(nelygu,neigimas) G grater(daugiau) L less(maiau) A above(daugiau, aukiau) B below(emiau,maiau) Ta pati slyga gali btisuformuota skirtingais bdais. Pvz. Maiau atatinka Ne daugiau ir panas dariniai. Slygos formavio bd renkasi programuotojas. JE JNE op1=op2 op1<>op2 ZF=1 bet kokiems skaiiams ZF=0 skaiiai su enklu

Skaiiams su enklu

35

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

JL/JNGE JLE/JNG JG/JNLE JGE/JNL

op1<op2 op1<=op2 op1>op2 p1>=op2

SF<>OF SF<>OF SF=OF SF=OF

Z=1 Z=0

Skaiiai be enklo JB/JNAE op1<op2 C=1 JBE/JNA op1<=op2 C=1 Z=1 JA/JNBE op1>op2 C=0 Z=0 JAE/JNB p1>=op2 C=0 Komandos raomos po kit komand, kurios reaguoja vlevli reikmes, bet ne po lyginimo komand. Nekeiiamos vlevli reikms. Komandoje nurodoma vlevls raid, jei valdymas turi bti perduotas, kai vlevl jungta ir su N kai vliavl turi bti ijungta: JZ JS JC JO JP Z=1 S=1 C=1 O=1 P=1 JNZ JNS JNC JNO JNP Z=0 S=0 C=0 O=0 P=0

iai grupei priklauso kmandos, kurios tikrina registro CX reikm JCXZ ym Valdymas perduodamas, kai CX=0 Visos valdymo perdavimo komandos atlieka trump perdavim. Tai madaug 30-40 komand diapazonas. Jei reiki ilgo perdavimo, tai kombinuojam su beslyginiu valdymoperdavimu: CMP AX,BX JNE L JMP M L: Cikl organizavimo komandos Tai tam tikr kart atliekam komand seka. Ijimas i ciklo gali bti slyginis ar beslyginis., t.y. gali bti nustatytasgrietas cikl skaiius arba jis gali pasibaigti susidarius tam tikroms slygoms. LOOP LOOPE LOOPNE LOOP slyginiam ir beslyginiam ciklui organizuoti ym kur bus grinamas valdymas, t.y. ciklo pradios adresas.

36

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Instrukcija pagal nutyljim maina registro CX eikm vienetu ir tuoj pat lygina su nuliu. Jei CX<>0 tai valdymas perduodamas nurodytai ymei, jei CX=0 tai ieinama i ciklo. Pvz. MOV CX,10 MOV CX,10 L: L: LOOP L DEC CX Tos trys komandos CMP CX,0 atitinka komand LOOP JNE L bet LOOP dirba greiau LOOP komandos trkumai Atlieka tiktrump perjim Ciklui organizuoti reikalingas konkretus registras CX Bent kart ciklas turi prasisukti, nes LOOP visada raoma gale ciklo Galima cikl ubaigti ir anksiau LOOPE kai dar CX nelygus nuliui, bet cikle pasitaik komanda, kuri vykdoma nustat ZF reikm 1. Yra numatytas konkretus cikl skaiius, bet taippat galimas iankstinis ijimas i ciklo. Ijimas i ciklo dviem atvejais:kai CX=0 arba ZF=0. Tai galima nustatyti po ciklo. ADRESAVIMO BDAI Komandose operandai gali bti pateikiami vairiai: Operandai gali bti pateikti paioje komandoje Jie yra komandos dalis. Tiesioginiai duomenys gali bti tik antras operandas. Pirmu operandu gali bti lastel OAarba registras. Tiesioginis perandas gali bti baito,odio arba dvigubo odio. Jis gali bti uraomas per konstant ar iraik. Operandai yra patalpini registruose. Komandoje nurododmas registro vardas. Registr vardai yra bendros paskirties registr vardai arba segmentiniai regisrai. Operandai yra OA lastelje. Sunkiausiai apraomas bet lanksiausias bdas. Yra du adresavimo bdai: Tiesioginis alutinis alutinis adresavimas Bazinis adresavimas (kitaip sakant registrinis bazinis adresavimas) Bazinis adresavimas su poslinkiu Indeksinis adresavimas su poslinkiu Bazinis indeksinis adresavimas Bazinis indeksinis adresavimas su poslinkiu

37

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Operandu taip pat gali bti : vedimo-ivedimo portas dl iorini rengini. Adresin erdv iuo atveju iki 64kb. Kiekvinam renginiui ioje erdvje skirtas adresas. Konkreti io adreso reikm vadinasi portu. Fizikzi vedimo-ivedimo portui atitinka aparatinis registras. Prijimas prie i registr yra vykdomas per komandas IN ir OUT. Operandas gali bti steke. Komandos gali turti vien ar du operandus. Daugumaikomand reikia dviej operand. Vienas i j yra altinis,o antras primjas. Svarbu kad vienas operandas gali bti registre arba OA, o kitas btinai registre arba paioje komandoje. Tiesioginis operandas gali bti tik altinis. Dviej operand komandose gali bti sekantys deriniai: Registras-registras Registras-OA Tiesioginiai duomenys- registras Tiesioginiai duomenys-OA Iimt sudaro komandos Darbui su stku Daugybos ir dalyos komandoms Darbui sueilutmis Tiesioginis adresavimas Tai yra pats pprasiausias OA adresavimo bdas. Adresas imamas tiesiai i laukokomandoje. is laukas yra baito, odio ar dvigubo odio. i reikmaprao bait, od ar dvigub od duomen segmente. Santykinis tiesioginis adresavimas Naudojamas slyginio valdymo perdavimokomandose, nurodant slygin perjimo adres. Pvz. JE M1- perdavimo adresas MOV AL,2 M1: Komanda, kuriai perduodamas valdymas

Absoliutinis tiesioginis adresavimas Data Segment Per1 DW 5 Data Ends Program Segment MOV AX,Per1 Program Ends tiesioginisadresavimas

alutinis bazinis adresavimas

38

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

39

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

VALDYMO PERDAVIMAS Tolimi perejimai Iki iol dirbome su vienu programiniu segmentu. Tai yra bdinga trumpom programom. Bendru atveju programoje gali bti tiek daug komand, kad jos netelpa viename segmente. Tuo atveju programoje apraome kelis komandinius segmentus. C1 Segment Assume CS:C1 Start: Mov ax,0 Jmp Far Ptr L C1 ENDS C2 SEGMENT ASSUME CS:C2 L: INC BX C2 ENDS Kiekvieno segmento pradioje turi buti nurodyta komanda ASSUME, kurioje segmentiniam registrui CS priskiriamas konkretus io segmento atitikmuo. Prieingu atveju sutiks pirmj ym transliatorius fiksuos klaid. Priminsime, kad PK komandos (kuri turi bti vykdoma) adresas uduodamas registr CS ir IP pora . CS nurodo atminties pradi kur yra komanda, o registre IP yra poslinkis iki tos komandos, atskaitytas nuo segmento pradios. Bet kurio i t regisrt turinio pasikeitimas yra ne kas kitas kaip perejimas, nes keiiasi vykdomos komandos adresas. Jei keiiasi tik IP, tai reikia kad perdavimas yra tame paiame segmente. Tokie perjimai vadinami artimais arba vidiniais. Jei programa nedidele ir visos jos komandos telpa viename segmente, tai kitokie perejimai ir reikalingi. Bet jei programoje yra keletas komand segment, tai atsiranda poreikis organizuoti perejimus i vieno segmento kit. Tokie perejimai vadinami tolimaisiais arba tarpsegmentiniais. Esant tokiems perdavimams keiiasi registro CS reikm ir registro IP reikme. CS nustatomas i segmento C2 pradi, o i IP uraomas poslinkis iki ymes iame segmente. PK numatytos komandos, realizuojanios tokius tolimus perjiimus, taiau jos visos yra beslyginio perdavimo komandos. Slyginio perdavimo komandos visada yra artimos. Asembleryje tokio perdavimo tolimo perdavimo komandose kaip mnemokodas visada naudojamas tas pats JMP, kaip ir esant artimam perdavimui, bet naudojami kiti operand tipai. Tolimo perdavimo komandos veleveli nekeiia. Tiesioginis tolimas perdavimas JMP FAR PTR <yme> ia FAR nurodo asembleriui, kad ym tolima, kad ji yra kitame komandiniame segmente. Pagal i komand registras CS nustatomas segmento pradi, kuriame yra ym, o registr IP uraomas poslinkis nuo segmento pradios iki tos yms. CS:=seg<yme>; IP=offset <yme> Taip ankstesniam pavyzdyje nurodytas tplimas perejimas komand, kurios ym yra L.

40

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

alutinis tolimas perejimas JMP m32 ioje komandoje nurodomas adresas dvigubo odio, kuriame turi bti absoliutinis perejimo adresas uduotas kaip pora seg:ofs, ir uraytas perverstam pavidale: t.y. ofs turi buti uraytas adresu m32, o segmento numeris adresu m32+2. Komanda perduoda valdym pagal absoliutin adres, t.y. urao registr CS dyd seg, o registr IP ofs reikm: CS:=[m32+2]; IP:=[m32] Pvz. X dd L; X: offset L, X+2 :seg L JMP X; per4jimas 5 L (CS:=seg L, IP:=offset L) Uraant alutinio perdavimo komandas reikia elgtis atsargiai. Jeigu komandoje nurodytas vardas X , kuris apraytas iki ios komandos, tai sutiks j, assembleris jau ino kad X reikia dvigub od ir vadinasi teisingai supras kad ioje komandoje turima omenyje tolimas alutinis perdavimas. Bet jei X bus apraytas vliau, tada assembleris, sutiks perdavimo komand, neinos iuo atveju kokio pobdio turimas omenyje perdavimas- ar tai artimas perdavimas pagal ym ar tai artimas alutinis perdavimas, ar tai tolimas alutinis perdavimas. Tokioje situacijoje assembleris itaria, kad nurodytas vardas tai esamo komand segmento ym ir formuoja artimo perdavimo mainin komand. Vliau, kai bus nustatyta, kad iame segmente nra tokios yms, assembleris fiksuos klaid. Kad to ivengti, reikia valdymo perdavimo priek atveju aikiai nurodyti, kad vardas nurodo dvigubo odio kntamji. Tam naudojame operatori PTR. JMP DWORD PTR X Kaip buvo pastebta, tokio pobdio patikslinimus reikia naudoti ir esant artimam perdavimui. Jei visk apibudinsime visk kas susij su beslyginio perdavimo priek komandomis, tai gausime toki taisykl: jei X yra nuoroda priek, tai beslyginio perdavimo komand reikia urayti sekaniai: JMP X artimas tiesioginis ilgas perdavimas JMP SHORT X artimas tiesioginis trumpas perdavimas JMP FAR PTR X tiesioginis tolimas perdavimas JMP WORD PTR X artimas alutinis perdavimas JMP DWORD PTR X tolimas alutinis perdavimas Analoginio pobdio patikslinimus reikia daryti ir tada, kai komandoje JMP nurodytas alutinis kreipinys , pvz. JMP [BX]; pagal nutylejim assembleris nagrineja tokio pobudio komandas kaip artim alutin perdavim. Kas lieia atvej, kai X nuoroda atgal, tai perdavimo tip reikia btinai nurodyti tik vienu atveju- esant tolimam tiesioginiam perdavimui: assembleris netgi inodamas, kad X yra ym i kito komandinio segmeno, vis tiek nenagrins tos komandos JMP X kaip tolimo perjimo. Esm tame, kad sutikdamas bet koki ym, assembleris automatikai priskiria jai tip NEAR (artimas) ir toliau vadovaujasi iuo tipu. ( assemblerio kalboje yra direktyva LABEL, kurios pagalba galima ymei priskirt tip FAR ). Pakeisti i tip galima tik su operatoriumi PTR.

41

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

MASYVAI, STRUKTROS Asembleryje masyvai apraomi su direktyv, kurios aprao duomenis, pagalba, naudojant DUP. Taiau reikia tam tikr paaikinim. Pvz. Masyvas X i 30 element -odi apraomas X DW 30 dup(?) Apraant masyv nurodomas element kiekis ir j tipas, bet nenurodoma kaip jie numeruojami. Todl tokiam apraymui gali atitikti ir masyvas, kuriame elementai numeruojami nuo 0 iki 29 X(0,29), ir masyvas, kur numeruojami elementai nuo 1 iki 30 t.y. X(1,30) , ir masyvas su bet kuriuo kitu pradiniu indeksu k, t.y. X(k,k+29). Tokiu bdu programos autorius gali udti masyvui skirtingus indeks kitim diapazonus. Kok diapason pasirinkti? Kartais indekso kitimo ribos gali bti grietai apibrtos udavinio slygoje (pvz. udavinyje aikiai pasakyta, kad elementai numeruojami nuo 1). Bet jeigu nenurodyta kaip tai turi bti daroma, tai geriau numeruoti nuo 0. Kodl? Pradsime nuo to. kaip priklauso elemento adresas nuo to elemento indekso masyve. Tarkime mes nutarme, kad elementai masyve numeruojami nuo k. X db 30 DUP(?) ; X(k,29+k) Tuomet teisinga yra, kad adresas (X(i))=X+2*(i-k) arba dar bendresniam lygyje, kai yra aikus element ilgis (2), adresas (X(i))=X+(type X)*(i-k) Ta priklausomyb tampa daug paprastesn, kai k=0 adresas (X(i))=X+(type X)*I Todl paprastai ir skaiiuojama programuojant assemblerio kalboje, kad elementai masyve numeruojami nuo 0. X dw 30 DUP(?) ; X(k,29+k) Ateityje taip ir darysime. Daugiamaiams masyvams situacija analogika. Tegu turime dvimatmasyv (matric) A, kuriame yra N eikui ir M stulpeli (N ir M konstantos) ir visi elementai - dvigubi odiai, o eiluts numeruojamos nuo k1, o stulpeliai nuo k2: A DD N dup(M dup(?)) ; A [k1N+(k1-1), k2M+(k2-1)] ia mes manome, kad matricos elementai talpinami atmintyje eilutmis: pirmosios M lasteli (dvigub odi) uima pirmos matricos eiluts elementai, sekantys M lasteli matricos antros eiluts elementai ir t.t. inoma matrisos elementus galima talpinti ir stulpeliais, bet tradicikai priimta eilutinis element idstymas. Mes j ir panagrinsime. Tuo atveju matricos elemento adreso priklausomyb priklausomyb atrodys sekaniai: adresas (A (I,j))=A+N*(type A)*(I-k1)+(type A)*(j-k2) ir ia paprasiausi vaizd i priklausomyb gauna kai numeruojama nuo 0, t.y. k1=0,ir k2=0. (A (i,j))=A+N*(type A)*i+(type A)*j Kintamj su indeksu realizacija Kitas klausimas , kuris ikyla dirbant su masyvais - tai kaip atliekamas prijimas prie masyvo element, kaip organizuojami kintamieji su indeksu. Tam ir yra naudojama adres modifikacija.

42

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Adres modifikacija Iki iol mes nagrinjome komandas, kuri operand adresai buvo nurodomi tiksliai, pvz MOV CX,A Taiau bendru atveju komandoje kartu su adresu gali bti nurodytas ir kakoks registras tarp kvadratini skliaust, pvz, MOV CX,A[BX] Tuomet komanda dirbs ne su nurodytu adresu A, o su taip vadinamu vykdomuoju adresu, kuris iskaiiuojamas pagal formul: Vykd. A=(A+[BX]) pagal mod 216, kur [BX] nurodo registro BX reikm. Kitaip sakant, prie vykdant komand, procesorius prids prie adreso A, nurodyto komandoje, esam registro BX reikm, gaus nauj adres ir btent i lastels su tuo nauju adresu paims operand. (Pati komanda tuo atveju nesikeiia, adres iskaiiavimas atliekamas paiam procesoriuje). Jei iskaiiuojant adres gaunama per didel suma, tai i jos imami tik paskutiniai 16 bit, k ir rodo operacija pagal mod, nurodytoje formulje. (Jei komandoje nenurodomas registras, tai Vykd. A laikomas lygiu adresui paioje komandoje). Adreso pakeitimas komandoje Vykdomj adres vadinamas adreso modifikavimu, o registras , dalyvaujantis adres modifikavime, vadinamas registru-modifikatoriumi. Modifikatoriumi gali bti ne visi registrai, o tik vienas i keturi: BX, BP, SI, DI. Pvz. ADD A(SI),5 Modifikatorius ioje komandoje yra registras SI. Tegu dabar yra skaiius 100. Tada Vykd. A=A+(SI)=A+100. Vadinasi , pagal duot komand, skaiius 5 bus pridtas prie lastels, kurios adresas yra =A+100, o ne prie lastels, kurios adresas yra A. Jeigu SI yra reikm -2 (0FFFEh), tada Vykd. A =A-2 ir todl skaiius 5 bus sudedamas su skaiiumi lastelje, kurios adresas yra A-2. Tai rodo, kad viena ir ta pati komanda gali dirbti su skirtingais adresais. Tai labai svarbu, dl to ir yra adres modifikacija. Vienas atvejas, kur yra naudojamas adres modifikavimas, yra indeksavimas, naudojamas kintamj su indeksu realizavimui. Indeksavimas Inagrinsim pavyzd: Tegu turim masyv X dw 100 dup(?) ; (0,99) ir reikia urayti registr AX jo element sum. Tam mums reikia pradioje AX urayti 0, o po to cikle atlikti operacij AX:=AX+X(i), kai I keiiasi nuo 0 iki 99. Kadangi elemento X(I) adresas yra X+2*I, tai komanda, atitinkanti t operacij turi bti: ADD AX,X+2*I, bet tokiakomanda negalima ir assembleryje ir maininj kalboj. Bet kokioj komandoj visi jos elementai, taip pat ir adresai, turi bti fiksuoti. Ms atveju adresas keiiasi priklausomai nuo I reikms. Vadinasi susidrme su problema: pagal algoritm ms komanda turi dirbti su skirtingais adresais, o mainins kalbos programavimo taisykls leidia tik fiksuot adres. Dl tokio konflikto ir naudojamas adres modifikavimas. Iskaidysime kintam adres X+2*I du : pastovi dal X, kuris nepriklauso nuo indekso I ir yra pastovus kintam dal 2*I, kuri priklauso nuo indekso i.

43

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Pastovi dalis uraoma paioje komandoje, o kintama dalis uraoma kok nors registr modifikatori (pvz. SI), o jo pavadinim taip pat uraome komand, kaip modifikatori: ADD AX,X(SI), kur SI=2*I, o Vykd.A yra X+2*I Kadangi registras modifikatoris yra vienas ir tas pats, tai tokiu bdu i komanda turi fiksuot vaizd, t.y. patenkina mainins kalbos taisykles. I kitos puss, komanda dirba su Vykd.A, o jis gaunamas sudedant adres X su registro SI reikme (2*i), kuri gali keistis. Todl , keisdami SI , mes priveriam komand dirbti su skirtingais adresais. Mums tik reikia pasirpinti, kad registro SI reikm bt teisingai keiiama. O tai jau yra visai paprasta: Praioje SI ukraunam 0, o po to didinam jo ingsnio reikm per du, rezultate ms komanda dirbs su adresais X, X+2, X+4 ir t.t. Kadangi iuo atveju modifikatorius naudojamas indekso saugojimui, tai toks registras vadinamas indeksiniu registru, o toks kintamojo su indeksu adreso iskaiiavimo bdas vadinamas indeksavimu. Programos fragmentas atrodyt: MOV AX,0 ;pradin suma Mov CX,100 ;ciklo skaitliukas Mov SI,0 ;pradin indekso reikm L: ADD AX,X(SI) ;AX:=AX+X(I) ADD SI,2 ;sekantis indeksas LOOP L ;ciklo tsinys Netiesioginiai kreipiniai Inagrinsime dar vien uduot su adres modifikavimu: Tegu mums reikia atlikti uduot: Turim lastel (vienas odis), kurios adresas mums neinomas, bet inome, kad tas adresas yra uduotas registre BX, ir mums reikia urayti sakykim reikm 300 t lastel. BX x

Jei mes i anksto inotume tos lastels x adres, tai ms uduotis bt paprastai isprendiama t.y. MOV x,300. Bet programos krimo metu mums tas adresas neinomas, ir jo mes negalime nurodyti komandoje. Mums reikia vl prisiminti, kad komandos dirba su Vykd.A , todl mums reikia paimti tok adres ir tok modifikatori, kad sumoje jie mums duot i anksto neinom adres. Lengva suprasti, kad ms atveju reikia paimti nulin adres ir registr BX, kadangi tada Vykd.A =0+[BX]=0+x=x. Ms uduotis vykdoma MOV [BX],300 Tokio adreso modifikavimo bdo ypatyb yra ta, kad kaip ir prie tai, adres pristatome kaip sum dviej komponent, vienas i kuri uraomas komandoje, o kitas registr, bet jei prie tai abu komponentai buvo ne nuliai, tai dabar vienas komponentas, kuri yra talpinamas komandoje, nulinis ir todl visas adresas yra paslptas registre. Gaunasi, kad

44

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

komandoje mes nurodom tik viet (registr), kur yra adresas. Toks adreso udavimo bdas per tarpin grand, vadinamas netiesioginis adresavimas. Taip pat pastebsime, kad prie netiesioginio adresavimo, tenka patikslinti lastels, kuri kreipiamasi, ilg. Pvz, MOV [BX],0 yra neteisinga, nes negalime nustatyti operand dydio, nes nulis gali bti 1 baitas, 2 baitai, o adresas uduotas registre BX gali bti adresas baito ar odio. Patikslinam tai per operatori PTR MOV Byte PTR [BX],0 ;baito ilgio MOV Word PTR [BX],0 ;odis persiuniamas Modifikacija naudojant kelet registr Inagrinjom atvejus, kai adres modifikacija atliekama naudojant vien registrmodifikatori. Taiau modifikavimo idj lengva apibendrinti keli modifikatori atveju. Tam reikia komandose kartu su adresu nurodyti kelet toki registr. Leidiama nurodyti i kart du modifikatorius, kai vienas i j btinai turi bti BX arba BP, o kitas SI arba DI( poromis modifikuoti BX iBP arba SI ir DI negalima). Galimas pavyzdys: MOV AX,A[BX][SI] Tuo atveju Vykd.A bus iskaiiuojamas naudojant formul Vykd.A=(A+[BX]+[SI]) pagal mod 216 Modifikacija per du registruspaprastai naudojama, kai dirbame su dvimaiu masyvu. Pvz. Turime matric A 10*20. A DB 10 DUP(20 DUP(?)) ;A(0 9,019) ir reikia registr AL urayti skaii toki eilui, kurioje pradinis eiluts elemntas sutinkamas toje eiluteje dar kart. Idsius matricos elementus OA eilutmis (pirmieji 20 bait -pradin matricos eilut, sekantys 20- antra matricos eilut ir t.t.) elemento A(i,j) adresas bus A+20+i+j Reikms 20*isaugojimui iskirsime registr BX, o dl reikms j - registr SI. Tada A[BX]- tai pradinis i-tosios matricos eiluts adresas, o A[BX][SI]- tai j-ojo elemento toje eilutje adresas. MOV AL,0 ;iekom element kiekis ;iorinis ciklas MOV CX,10 ;Iorinio ciklo skaiius (eilui sk.) MOV BX,0 ;poslinkis nuo A iki 20+i L: MOV AH,A[BX] ;pirmojo eiluts elemento reikm MOV DX,CX ;isaugojam skaitliuko turin ;VIDINIS CIKLAS ; MOV CX,19 ; vidinis ciklas (pirmas elementas jau perimtas) MOV SI,0 ;elemento indeksas viduje eiluts L1: INC SI ;j:=j+1 CMP A[BX][SI],AH ;lyginam (I,j) elem. su pirmuoju el. eilutje LOOPNE L1 ;ciklas tsiasi, kol yra nelygu, ir ne daugiau 19 JNE L2 ;jei nerandame pasikartojani element eilutje

45

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

INC AL ;jei radom pasikartojant element eilutje ; VIDINIO CIKLO PABAIGA L2: MOV CX,DX ;atstatome registro CX reikm dl iorinio ciklo ADD BX,20 ;pereinam prie kitos eiluts LOOP L ; kartojam cikl 10 kart Modifikuojam adres uraymas assemblerio programose Patikslinsim adres uraymo taisykles: Tegu A yra adresin iraika, o E bet kokia iraika, tuomet assembleryje galimi trys adres uraymo formos komandose, kurie nurodo Vykd.A iskaiiavimo bd: A: Vykd.A=A E[M]: Vykd.A=(E+[M]) (M: BX,BP,SI,DI) MOD 216 E[M1][M2] Vykd.A=(E+[M1]+[M2]) (M1: BX,BP M2:SI,DI) Jei E=0, tai j galima praleisti Verta priminti kad modifikatoriais gali bti tik nurodyti keturi registrai (vienas i j), o jei modifikuojame ne pagal vien modifikatori, tai reikia nurodyti registrus poromis kaip parodyta anksiau. Registras BP naudojamas darbui su steku. Taip pat reikia priminti, kad adres modifikacija nekeiia adreso tipo. Aptarsime kvadratini skliaust naudojim apraant komandos operandus: 1)

VEDIMO / IVEDIMO KOMANDOS Tai darbas su vedimo ivedimo irenginiais. renginiai skirstomi vidinius: -Vidin atmintis, procesorius; iorinius: visi kiti like. vedimas ir ivedimas yra suprantami kaip apsikeitimas informacija tarp procesoriaus ir bet kurio kito renginio. Atskaitos takas yra procesorius. vedimas yra procesas, kai duomenys i iorinio renginio perduodami procesoriui. Ivedimas kai duomenys i procesoriaus perduodami ioriniams renginiams. Informacija tarp procesoriaus ir iorini rengini perduodami per portus specialius registrus. Visi portai yra vienbaiiai, du gretimai esantys portai gali bti nagrinejami kaip portas, kurio dydis yra odis. Potencialiai portai numeruojami nuo 0 iki ffff. Su kievienu ioriniu renginiu yra susijs konkretuas portas. J numeriai i anksto inomi. Ironis renginys gali urayti infomracij arba nuskaityti j i porto. vedim atitikt komandos IN AL,n arba IN AX,n. Ivedimui yra komanda OUT n,AL arba OUT n,AX Pagal komand IN infomacija persiuniame i porto registr. Porto numeris ali bti uduotas skaiiais arba registre DX. vedimo/ ivedimo scenarijus panaus visiems renginiams ir vyksta per 2 portus. Vienas skirtas duomenims ir vadinamas duomen

46

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

portu, kitas vairiai valdymo iniformacjai ir vadinmas valdymo portu. Norint organizuoti vedim/ ivedim reikia inoti port numerius, valdaniuoiuos ir atsakaniuosius signalus ir kitas detales. Skirtingiems renginiams i informacija skirtinga, kiekvienoje programoje reikia i naujo aprayti. Kai centrinis procesorius nori pradti informacijos apsikeitim su /I renginiais, tai jis valdymo port rao tam tikr bit kombinacij, kuri yra traktuojama kaip pakvietimas ryiui nustatyti. Jei renginys yra paruotas darbui ir neuimtas, tai kaip atsakymas yra tame paiame porte formuojama kita bit kombinacija, kuri signalizuoja, kad renginys yra pasiruos apsikeitimui. Centrinis procesorius ilaukus tam tikr laik nuskaito informacij i minto porto ir jei tai buvo informacija apie signalo nustatym dl apsikeitimo, pradeda informacijos skaitym. CP Portas 1 ivesti informacij CP Portas 2 urao ivedam informacij Ivedimo renginys Portas 1 Ivedimo renginys Portas 2 siunia signal, kad uimtas renginys ir pradeda ivedim. Centrinis procesorius tuo pat metu pereina arba laukimo bsen vis apklausdamas valdymo port arba usiima kitu darbu kol signalas uimta pasikeis iki bus baigtas ivedimas, tai iorinis renginys nusis valdymo port signal apie skming darbo pabaig arba apie klaid. Tai aprayti programose yra sudtinga. Daugumoje program naudojamos tos paios vedimo/ ivedimo operacijos. Tai vertinant vien kart apraomos danai naudojamos operacijos ir jos jungiamos operacin sistem, kuri vis laik yra OA, kad jomis galt naudotis bet kokia kompiuteryje vykdoma programa,. Tai palengvina programuotojo darb. Su portais tiesiogiai dirbame kai reikia kokios nors neprastos operacijos. Yra suprogramuota pertraukimo sistema, leidianti apdoroti pertraukimus kiekvienam renginiui. Pertraukiant programos darb turi bti simenami registrai CS ir IP. Jie simenami steke, tai pat iaugomos visos veliavli reikms. Ekrano ir Klaviatros operacijos per DOS Paprastai programos turi praneti apie savo darbo pabaig, ivesdamos praneim ekrane. Taip pat programa gali ivesti vairius informacinius praneimus, praneimus apie klaidas, gauti informacij savo programai ir t.t. vedimo ir ivedimo operacijoms atlikti naudojama komanda INT. Jos pagalba sistemai nurodome, kokias operacijas ir su kokiu renginiu reikia atlikti. Yra dvi INT komandos. Su komanda INT 10h valdymas perduodamas BIOS. Su komanda INT 21h valdymas perduodamas pertraukim aptarnavimo mechanizmui per DOS. Komanda INT nutraukia programos darb ir perduoda valdym DOS, kad nustatyti kok veiksm reikia atlikti, j atlieka ir po to vl grina valdym program. Labai danai tas pertraukimas vykdomas norint atlikti vedimo ar ivedimo operacijas. Bazins DOS operacijos vekia bet kurioj aplinkoj. Kursoriaus nustatymas Ekran galima sivaizduoti kaip erdv su koordinatmis, kuri galima nustatyti kursori. Paprastas videoterminalas turi 25 eilutes (0-24) ir 80 stulpeli (0-79) .

47

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Ekrano vieta Kairys virutinis kamp. Deinys virutinis kamp. Kairys apatinis kamp. Deinys apatinis k. kamp Ekrano centras

koordinats deimtainj sistemoj Kolon. Stulpelis 00 00 00 79 24 00 24 79 12 39/40 `

eioliktainj sist. Kolon. Stulpelis 00 00 00 4Fh 18 00 18 4Fh 00 27/28h

Su komanda INT 10h galime kursori pastatyti bet kurioje ekrano vietoje, o taip pat ivalyti ekran. Kursoriaus nustatymui naudojamas komandos kodas 2, kur reikia patalpinti registr AH. Ekrano eiluts numeris nurodomas registre DH, Ekrano stulpelio numeris nurodomas registre DL, Ekrano numeris nurodomas registre BH. Paprastai tai yra 0 Pvz. Kursoriaus nustatymas 5 eilut ir 12 kolonl atliekamas per komand sek: Mov AH,02 Mov BH,00 Mov DH,05 Mov DL,12 INT 10h Ekrano valymas Dl aikumo pradedant vykdyti program , kad bt aiks uklausimai ir rezultato formavimai, galima ivalyti ekran. Ekrano sritis gali bti ivaloma nuo bet kurios pozicijos ir apimti bet koki srit. Pradinis adresas turi bti maesnis, negu antrasis adresas. Pradins ekrano srities adresas uduodamas registre CX, antras adresas nurodomas registre DX, BH turi bti reikm 07 AX turi bti reikm 0600h MOV AX,0600h MOV BH,07 MOV CX,0000 MOV DX,184Fh INT 10h operacijos kodas- ekrano valymas eilut ir stulpelis eilut ir stulpelis

Informacijos ivedimas ekran turi bti suformuotas praneimas duomen segmente, kuris turi baigtis $ enklu. Registro AH reikm=09h naudojama komanda INT 21h Registre DX turi bti nurodytas praneimo adresas (LEA DX,pran).

48

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Jei netyia bus pamirtas $ enklas, tai ekran bus ivedami visi simboliai nuo nurodyto adreso, kol bus sutiktas is $ enklas OA. Ekrano valdymui priskiriamos komandos taip pat ir kursoriaus pervedimas kit eilut LF kursoriaus nustatymas eiluts pradi CR 10 13 0Ah 0Dh

Paprastai tie du kodai eina greta, kad tvarkingai atspausdinti praneimus ekrane. Juos galima aprayti bet kurioj programos dalyje naudojant direktyv EQU. Kaip inia ji nekeiia nei ilgio programos nei struktros. CR EQU 13 LF EQU 10 Duome vedimas i klaviatros Duomen vedimo procedra i klaviatros yra paprastesn, nei ivedimas ekran. Reikia tam tikr paramert, apraani vedimo procedr, naudojant komand INT: turi bti nustatytas maksimalus vedam simboli skaiius. Tai btina, kad bt galima perspti vartotoj apie per ilg praneim. Kiti nenumatyti simboliai, vedami vir limito, tiesiog ignoruojami. Maksimalus vedam simboli skaiius vienos komandos metu yra 255 simboliai. turi bti iskirtas laukas, kur komanda baigusi duomen vedim, rays tikrj vest simboli skaii reikia nurodyti lauko adres, kur turi bti talpinami vedami simboliai. Tas laukas turi bti apraytas duomen segmente. Duomen vedimui naudojame operacij, kurios kodas 0Ah, ir jis nurodomas registre AH o parametr lauko adresas turi bti uduotas registre DX, t.y. atlikti vedim galime tokiu bdu: MOV AH,0Ah operacijos kodas LEA DX,IVSRIT parametr ir vedimo sritis. INT 21h vedimo vykdymas Parametr ir duomen ivedimo sritis turi bti aprayta duomen segmente, tiksliai nurodant pirm bait, kuris naudojamas maksimaliai galim vedam simboli skaiiui nustatyti, pvz. IVSRIT DB 25 ;Maksimaliai galima bus vesti 25 simbolius DB ? ;ia gausime realiai vest simboli skaii DB 25 DUP ( ) ;ia paklius vesti i klaviatros simboliai. vedimas visada baigiamas paspaudus klavi ENTER- jo kodas 0Dh. is kodas taip pat formuojamas duomen vedimo srityje, taiau jis neskaitomas vest simboli skaii. Kadangi is simbolis yra formuojamas vedimo srityje, tai programuotojas turi inoti, kad realiai vedam simboli skaiius bus 1 maesnis u nurodyt parametr srityje. vesti simboliai keiia vedimo srities turin duomen segmente. Dirbant cikle, dl duomen korektikumo, reikia prie vedant naujus duomenis, t srit ivalyti. MOV CX,25 LEA BX,ivsrit+2 cikl: MOV [BX],20h

49

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

INC BX LOOP cikl PVZ. Parayti program, kuri atspausdint ekrane programos autoriaus vard. Autorius savo vard veda i klaviatros. Pradedant darb ekranas turi bti ivalytas. Autorius savo vard spausdina toje ekrano eilutje, kuri atitinka jo vest simboli skaiiui eiluts viduryje. Programa Operacija 08H leidia vesti vien simbol, kuris formauojamas registre AL. iuo atveju vestas simbolis nerodomas ekrane. Darbas su diskiniais renginiais raymui diskus ir skaitymui i j naudojami kodai: 3Ch sukurti fail 3Dh Atidaryti fail 3Eh Udaryti fail 3Fh perskaityti fail 40h Urayti ra fail 2H Perstumti failo nuorod Dirbant su vairiomis diskinmis funkcijomis, reikia sistemai i anksto praneti eiluts, kuriame yra failo adresas: t.y. disk, keli iki to failo diske ir piln failo vard, adres.Bet kur i t duomen galima praleisti, apraant ten 0. Eilut uraoma tarp apostraf. Tos eiluts pabaiga nurodoma per 00h. Maksimalus eiluts ilgis yra 128 baitai. Pvz. Pran1 Db C:A17RAND.ASM,00h Pran2 Db iki failo. C:\UTILITY\A17RANDM.ASM,00h papildomai nurodome ir keli

Fail deskriptoriai Kai kuriuos deskriptorius galima panaudoti tiesiogiai. Tai standartini rengini deskriptoriai: vedimas Ivedimas praneim apie klaidas ivedimas pagalbinis renginys printeris Kiti vedimo/ivedimo renginiai, dirbantys su failais, reikalauja fail deskriptoriaus. Tai reikia paprayti tokio deskriptoriaus i sistemos. Todl failas diske pirmiausia turi bti atidarytas. Skirtingai nuo duomen perdavimo displjui ir primimo i klaviatros,

50

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

duomen apsikeitimui su diskais, sistema turi kreiptis FAT ir direktorij struktr, kad gauti prijim prie failo.. raai FAT ir direktyv struktroje turi atsinaujinti sutinkamai su pasikeitimais file. Kiekvienam failui kur kreipiasi programa darbo metu, turi bti sukurtas unikalus deskriptorius. Sistema priskiria failui deskriptori jo atidarymo metu failo skaitymui arba naujo failo sukrimui dl informacijos ivedimo. . ias operacijas naudoja funkcijos 3Ch ir 3Dh per pertraukim INT 21h. Failo deskriptorius tai unikalus eioliktainis skaiius, kuris grinamas registr AX ir saugomas atmintyje odio formate. Deskriptorius naudojamas visose vlesnse vedimo/ivedimo operacijose, dirbant su failu. Paprastai pirmas atidaromas failas turi deskriptori 05, antras 06 ir t.t. Programos segmento prefiksas saugo deskriptori lentel, kuri pristatoma pagal nutyljim ir saugo joje 20 deskriptori- vienu metu galim atidaryt fail skaii. . Galima t srit praplsti, naudojant funkcij 67h ir pertraukim INT 21h Grinam klaid kodai Operacijos, kurios naudoja deskriptorius, grina veiksmo vykdymo bsen per vlevl CF ir registr AX. Operacijai pasibaigus gerai, CF reikm yra 0 ir yra atliekama usakyta operacija. Esant neskmei, CF nustatoma 1 , o AX talpinamas klaidos kodas, priklausantis nuo operacijos. Tai yra kodai intervale tarp 01 ir 36. Failiniai nurodymai Sistema palaiko atskir failin nuorod kiekvienam failui su kuriuo dirba programa. Sukrimo ir atidarymo operacijos inicializuoja failin nuorod, nustatydama j ir jis rodo failo pradi. Bendrai jis rodo pozicij faile su atatinkamu poslinkiu jame. Kiekviena skaitymo/raymo operacija priveria sistem padidinti nuorodos reikm per skaii, sutinkamai su perduot bait skaiiumi. Tuomet failin nuoroda rodo viet faile, nuo kurios turi bti pradtas raymas (kito rao). Nuorodos naudojamos nuosekliam prijimui ir laisvam prijimui prie failo. Laisvam prijimui prie norimo rao faile galima naudoti komand 42H per pertraukim sistem INT 21h Fail krimas Jiems kurti naudojama procedra, sudroma i ingsni: Panaudoti elut, kad i sistemos gauti failo deskriptori Ikviesti funkcij 3CH per pertraukimo procedr INT 21h, kad sukurti ra apie fail direktorij struktroje. Ikviesti funkcij 40H per INT 21h kad urayti fail atskirus raus. Baigus darb su failais ikviest funkcij 3EH per INT 21h kad udaryti fail.

51

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Funkcija 3CH i funkcija skirta naujam failui sukurti arba perrayti sen fail su tuo paiu vardu. Tam reikia registr CX urayti kuriamo failo atributus, o registr DX reikia urayti eiluts adres. ioje eilutje yra nurodomas kelias kuriamam failui sistemoje. PVZ. Reikia diske C sukurti nauj fail be atribut PATHNAME1 FILHAND1 DB DW C:\ACCOUNTS.FIL,00h ? ;failo deskriptorius

MOV AH,3CH ; paprayti sukurti fail MOV CX,00 ;nenaudojame atribut LEA DX,PATHNAM1 ;kelio eiluts adresas INT 21h ; pertraukimas operacijai vykdyti JC klaida ; jei vyko klaida MOV FILHAND1,AX ;siminti failo deskriptori Esant teigiamam rezultatui, sistema sukurs ra direktyv struktroje su uduotais atributais , nustatys vlevls reikm CF 0 ir AX patalpins failo deskriptori. is deskriptorius bus naudojamas programos darbe dirbant su failu.. Atidaromas failas ir jo nuoroda tampa lygi 0. Dabar jau galima rayti fail. Jei failas su nurodytu vardu jau yra sukurtas, tai nuoroda bus nustatoma lygi 0, ir nauji duomenys bus raomi ant senj viraus. Jei pasitaikys klaida , jungiama vlevl CF ir AX yra patalpinamas klaidos kodas. Funkcija 40H Ji naudojama kai reikia isaugoti raus diskiniam faile. registr BX reikia patalpinti failo deskriptori ( kur mums reikia rayti duomenis), registr CX raom bait kiek, o DX ivedam duomen adres. PVZ. fail ACCOUNTS.FIL uraome 256 baitus i srities DSKAREA: FILHAND1 DSKAREA DW DB ? failo deskriptorius 256 Dup (*) ;ivedimo sritis ; paprayti urayti duomenis fail ;rayti failo deskriptori ;patalpinti raomo fragmento ilg ;patalpinti ivedimo srities adres ;vykdyti pertaukimo operacij duomen raymui Jei buvo raymo klaida ; Ar visi baitai rayti ;Jei ne visi baitai rayti, eiti klaidos apdorojim.

MOV AH,40H MOV BX,FILHAND1 MOV CX,100h LEA DX,DSKAREA INT 21h JC klaida ; CMP AX,100h JNE klaida1

52

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Korektikai, operacija urao visus nurodytus baitus, padidina failo nuorod, nustato CF vlevls reikm 0 ir AX urao tikrai rayt bait skaii. Disko perpildymas gali iaukti klaid, kad ne visi baitai bus urayti, todlprogramoje reikia numatyti klaidos galimyb. Nekorektikai atlikta operacija nustato CF reikm 1ir AX patalpina klaidos kod Funkcija 3EH i funkcija skirta failo udarymui. Baigus raym, reikia fail udaryti per i funkcij, vykdant atatinkam pertraukim. Tam BX reikia nurodyti udaromo failo deskriptori ir ikviesti pertaukimo program. MOV AH,3EH ;Paprayti udaryti fail MOV BX,FILHAND1 ;Urayti failo deskriptori INT 21h ;vykdyti pertraukim JC klaida ;perduoti valdym klaidos apdorojimui. Paruoti program vesti i klaviatros duomenis ir juos urayti fail. Failo skaitymas i disko is procesas apima procedras Eiluts panaudojimas failo deskriptoriaus gavimui i sistemos Funkcijos 3DH panaudojimas failo atidarymui Funkcijos 3FH panaudojimas duomen nuskaitymui i disko Funkcijos 3EH panauojimas failo udarymui Funkcija 3DH Kad gauti duomenis i failo, programa turi atidaryti fail. Tam naudojame funkcij 3DH ir jos pagalba per INT 21h atidarome fail. Funkcija tikrina ar toks failas yra, ir jei jis yra, nustato jam deskriptori. Ukraukite eiluts adres registre DX, o registre AL patalpinkite 8 bit prijimo prie duomen kod. Bitai paklausimas Bitai paklausimas 000. tik skaitymui 1Rezervuota 001 tik raymui 4-6 Reimas 010 skaitymui ir raymui 7 Palikimas Prie skaitym i failo programa turi panaudoti funkcij 3Dh dl failo atdarymo, o ne 3EH dl jo sukrimo. PATHNAM1 DB FILEHAND DW C:\ACCOUNTS.FIL00H ? ;failo deskriptorius

MOV AH,3DH MOV AL,00

53

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

LEA DX,PATHNAM1 INT 21h JC klaida MOV FILEHAND,AX Jei failas su nurodytu vardu yra, tai operacija nustato rao ilg 1, priima esamus failo atributus, nustato failo nuorod 0, nustato CF reikm 0 ir AX patalpia atidaryto failo deskriptori.Jis bus naudojamas programoje vis laik iki pat failo udarymo. Jei failo nra, tai CF nustatomas 1 ir AX patalpinamas klaidos kodas 02, 03, 04, 05 arba 12 . Btina tikrinti vlevls CF kod. Pvz. atidarant fail jam gali bti priskirtas deskriptorius 05 ir j lengva supainioti su klaidos kodu 05 kas reikia prijimas prie failo negalimas. Funkcija 3FH Ji skirta informacijos skaitymui i failo diske. Reikia failo deskriptori patalpinti registre BX,bait skaii, kur reikia perskaityti, patalpinti CX, o vedimo srities adres registr DX. FILEHAND INAREA MOV MOV MOV LEA JC CMP JE DW ? DB 512 DUP(?) AH,3FH BX,FILEHAND CX,200h DX,INAREA klaida AX,00 pabaiga ; failo deskriptorius ;vedimo sritis ;paprayti skaityti fail ;patalpinti failo deskriptori ;Patalpinti skaitom bait kiek ; patalpinti vedimo srities adres ;Ar visi baitai nuskaityti ;Jei failas perskaitytas.

Jei operacija atlikta korektikai, tai programai perduodami duomenys, nustatoma CF reikm 0 ir AX patalpina tikr nuskaityt bait kiek. Pavyzdyje AX reikm 0 reikia kad buvo bandymas skaityti i jau perskaityto failo. Tai perspjimas o ne klaida. Nekorektikas operacijos atlikimas nustato CF 1, o AX patalpina klaidos kod 05 arba 06. Kadangi atidaryt vienu metu fail kiekis yra ribotas, programa paeiliui kreipdamasi eil fail turi udaryti bet kur i j , kai tik darbas su juo baigtas.

54

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

DARBAS SU REALIAIS SKAIIAIS Reali skaii apraymas Assemblerio programoje deimtainius skaiius galime pateikti specialiu reali skaii formatu, kur paysta koprocesorius. Tai yra skaiius sudarytas i mantiss ir laipsnio. Mantis yra enklas, sveikoji dalis ir trupmenin dalis. Pvz 234.56E+02 turs mantis 234.56, o laipsnis bus +02 Pvz. 2.5 +0.4646 1.024E+04; 1.042*104 Duomenis galima aprayti direktyvos DD pagalba- t.y. dvigubas odis, kuris nurodo assembleriui, kad duomenims saugoti yra skirta 32 skirsniai. Realus skaiius, saugomas kaip dvigubas odis, vadinamas trumpu realiu skaiiumi. Skaii galima aprayti kaip eioliktain ar kaip deimtain. Deimtainiai skaiiai gali turti tikslum iki 8 enkl po kablelio. Pvz. DD 12345.678 DD 1.5E+02 1.500 DD 2.56E+38 ir tt Direktyva DQ aprao keturgub sodis ir skiria viet 8 bait kintamajam. i direktyva analogika direktyvai DD. Naudojama C,C++ ir Visual Basic kalbose. Float1 DQ 1.5E+10 Float2 DQ 2.56E+307 DT darbiniai skaiiai. Uima 10 bait. Duomenys gali bti saugomi kaip supakuoti reals skaiiai, sveiki deimtainiai skaiiai, supakuoti deimtainiai skaiiai arba dvejetainiai skaaiiai. Pats skaiius gali bti teigiamas arba neigiamas ir sudarytas i 18 skaitmen. PAK-1 DT 012345678912345678 Assembleris traktuoja, kad laipsnio rodiklis ireiktas eioliktainiu skaiiumi arba gali bti panaudotas indikatoriaus deimtains reikms. Laikini reals skaiiai gali bti deimtainiai ar eioliktainiai skaiiai. eioliktainis skaiius gali bti sudarytas i 20 skirsni. FLOAT1 DT 1.5 Koprocesorius yra kaip antras procesorius, dirbantis lygiagreiai pagrindiniam procesoriui. Matematinis koprocesorius8087 skirtas 8088 efektyvumui padidinti. Koprocesorius kartais keiiamas bloku darbui su duomenimis su plaukiojaniu kableliu. Yra komand sistema darbui su koprocesorium. Ji leidia dirbti su sveikais skaiiais ir su realiais skaiiais. Visa darbo logika realizuota aparatrikai. Koprocesoriaus architektra Yra atuoni atskirai adresuojami registrai. Jie surikiuoti kaip stekas ir turi vardus. Steko virn yra ST Registrai yra ST(0), ST(1), ST(2), ST(3), ST(4), ST(5), ST(6), ST(7), Atatinkamai tai yra R0-R7. registr ST(0) daniausiai kreipiamasi kaip ST ir jis yra steko virnje.

55

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Skaiiai saugomi registruose yra naudojami skaiiavimams ir turi laikin reali skaii format, kuri ilgis yra 10 bait. Kai koprocesorius saugo rezultat po aritmetini operacij atmintyje, jis perveda skaiius i laikino formato vien i nustatyt: sveik , skaiius, trumpo realaus , ilgo realaus. Skaiiaus perdavimas i koprocesoriaus vyksta per atmint, todl pirmiausia kol kviesime koprocesori, reikia isaugoti reikiamus operandus atmintyje. Tada koprocesorius paima operandus i atminties ir saugo juos steko registruose. Atlikus skaiiavimus, koprocesorius patalpina rezultat atmintyje ir signalizuoja pagrindiniam procesoriui, kad uduotis vykdyta. Valdantys registrai Yra penki koprocesoriaus valdantys registrai. Trys i j 16 skirsni. Tai valdantis odis, bsenos odis, antrats odis, t.y. control word, status word ir tag word. Kiti du registrai yra 32 skirsni. Tai yra komand nuorodos ir operand nuorodos. Valdantys registrai turi savo vardus SR bsenos odis CR Valdantis odis TW antrats odis FIP saugo paskutins vykdytos komandos adres FDP saugo paskutins vykdytos komandos operando adres. Koprocesoriaus Komand formatai Visos koprocesoriaus komandos prasideda raide F. pagal tai koprocesorius atpaysta kad tai jo komanda. Antra raid komandoje gali bti B arba I ir nustato operand format. Rid B nurodo kad tai yra dvejetainis deimtainis skaiius Raid I nurodo sveik skaii. Jei nurodyt raidi komandoje nra, tai skaitoma, kad operandas yra realus skaiius. FBLD yra dvejetainis deimtainis skaiius FILD yra sveiki skaiiai FMUL reali skaii daugyba Yra ei komand formatai, pateikti lentelje. Komandos formatas Klasikinis stekas Klasikinis stekas imjas Registrai Registrai imjas Reali atmintis Sveikoji atmintis Komandos kodas Fop Fop Fop FopP Fop Flop Operandai (primjas / altinis) {ST(1),ST} {ST(1),ST} ST(n),ST ST,ST(n) ST(n),ST {ST},memReal {ST},memInt Pavyzdiai FADD FSUBP FMUL ST(1)ST FDIV ST,ST(3)

Operanduose n nurodo registro numer.

56

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

MemReal nurodo 16 skirsni sveik skaii.memReal gali bti trumpas realus skaiius (4baitai) ilgas realus skaiius (8baitai()ir supakuoti BCD(10bait) ir darbiniai reals(10bait) MemInt gali bti odis (2baitai), trumpas sveikas skaiius (4 baitai), ilgas sveikas skaiius (8baitai). Op nurodo aritmetin operacij. Operandai figriniuose skliaustuose yra operandai ir tiksliai nekoduojami, bet laikomi dalimi operacijos. Op gali bti ADD sudti operand altin su operandu primju SUB Atimti operand altin i operando primjo SUBR Atimti operand primj i operando altinio MUL sudauginti operand altin su operandu primju DIV padalinti operand primj i operando altinio DIVR padalinti operand altin i operando primjo Koprocesoriaus komand operandai Koprocesoriaus komandos gali turti iki dviej operand, bet vienas I j turi bti koprocesoriaus registras.Negalima naudoti registr AX ir BX. Taip pat negalima atlikti operacij su duomenimis atmintis- atmintis. Klasikinis stekas Komandos valdo registrus steko vitnje. Nereikia joki operand. Pagal nutyljim ST yra siuntjas (altinis), o ST(1) operandas primjas. Rezultatas laikinai saugomas ST(1). Po to ST iimamas i steko , palikdamas rezultat steko virnje. Pvz. FADD ST ST(10 ;ST(1)=ST Iki 100.00 20.00 Po operacijos ST 120.00 ST(1)

Reals ir sveiki operandai atmintyje Komandos turi vien sivaizduojam operand ST. Antras operandas nurodomas tiksliai. Gali bti sveikas arba realus skaiius atmintyje. FADD mysingl ; ST=ST+mysingle FSUB mysingle ;ST=ST-mysingle FSUBR mysingle ;ST=mysingle-ST Darbui su sveikais skaiiais atmintyje komandos transformuojamos komandas FIADD, FISUB, FISUBR Koprocesoriaus registrai Komandos darbui su registrais naudoja koprocesoriaus registrus kaip paprastus. Vienas i operand yra btinai ST

57

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

FADD ST,ST(1) FDIV ST,ST(3) FMUL ST(2),ST Imimas i registr

ST=ST+st(1) ST=ST(3)/ST ST(2) =ST(2)*ST

Komandos darbui su registrais yra analogikos komandoms darbui su registrais, bet su viena iimtim vykdius komand, registras ST iimamas i steko. FADDP sumuoja registrus ST ir ST(1), o rezultat formuoja registre ST(1). Po to ST iimamas i steko, o ST(1) pesiuniamas ST. FADDP st(1),ST Iki operacijos ST 200.00 ST(1) 32.00 Pvz. 6*2+5 Veiksmai Paimti operandus ir patalpinti steke Nuskaiius operatorii jimo paimti du operandusi steko, vykdyti operacij ir patalpinti rezultat steke Pavyzdiai (Uduotys.) Paprastosiso programos Darbas su i anksto aprytais duomenimis 1. Apskaiiuokite pagl formul y=a+b-c+1 reikm, kai a=17, b=-3, c=2; Duomenys a,b,c aprayti duomen segmente. 2. Apraome 10 bait ilgio tekst duomen segmente. Reikia sukeisti vietomis tame lauke 1 ir 5 baitus. 3 bait pasisti simbol E , 6 ir 7 baitus nusisti reikmes 78. akotosios programos 1. Sudaryti program funkcijos skaiiavimui F=2a/(x+y), kai a>10 F=x-y kai a<10 a, x ir y reikia vesti i klaviaturos. vedimui naudoti paprogram. Rezultat atspausdinti ekrane. Ciklai Peradresavimo ciklai 1. Turime paeiliui masyve raytus imt skaii. Reikia rasti i skaii sum. Proceso metu 200.00 232.00 Po operacijos 232.00

58

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

2. Sudaryti program, kuri suskaiiuot kiek yra raidi A masyve T1 ir kiek yra raidi B masyve T2. Masyv pabaigos ymimos simboliu *. Ciklai cikle 3. Turime masyv, kurio struktra Grupes Numeris Studento Pavarde Egzamin Paymiai Paymi Vidurkis Reikia suskaiiuoti bendr vidurk. ia neinomas student skaiius. J kiek reikia nustatyti pagal masyvo pabaig. Masyvo pabaiga yra *** Darbas su realiais skaiiais Inden udavinys 1627 metais indnai pardav Manheteno sal u 24 dolerius. Kiek jie turet pinig iais metais, jei iuos dolerius bt padej bank ir bankas moket 3 procent metines palkanas. Jei pradin suma yra S0 ir kasmet ji padideja p procent, tai po n met gaunama suma Sn apskaiiuojama i formuls Sn=S0(1+p)n iuo atyveju S0=24, n=2007-1627=380, p=0.03. Sumos skaiiavimo algoritmas 1) Skaitliukas =n t.y. kiek met buvo skaiiuojamos palkanos Galutin suma S met gale 2) S=S0 t.y Suma nuo kurios skaiiuojamos palkanos, kiekvienais metais i suma yra padidjusi ankstesni met atvilgiu suskaiiuotomis palkanomis. 3) S=S(1+p) T.y. suskaiiuojame sum su palkanomis ir ji bus ieities skaiius kit met skaiiavimams (aiku jei indelininkas neatsiims i palkan ar vis pinig). iam punktui vykdyti organizuojame cikl tiek kart kiek met reikia skaiiuoti palkanas. Atsiskaitymui pateikti programo listing Programas tureti kompiuterinje laikmenoje, kad bt galima pademonstruoti j darb. Vykdymo metu programa turi pradti darb nuo autoriaus pavards ir grups numerio pateikimo displjaus ekrane.

59

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

Pavyzdys paprastos programos Jos vykdymui reikia pirmiausia paruoti fail klasikin schem I paruoiame programos ieities tekst ir j uraome fil, patikslinant failo tip .ASM ;-steko segmentasstekas segment stack db 256 dup (?) stekas ends ;-duomenu segmentasduom segment a dw 17 ; b dw -5 ; | - priskiriami duomenys kintamiesiems c dw 2 ; ten db 10 ats db 4 dup (?),'$' aut db 'Kursinio darbo uzduotis Nr.1',13,10 db 'Atliko Vardas Pavardele, II-0X',13,10 db '2007 07 07',13,10,'$' abc db 13,10,'a = 17' db 13,10,'b = -5' db 13,10,'c = 2',13,10,'$' txt db 'a+b-c+1= ',7,'$' minus db - duom ends ;-programos segmentasprogram segment assume cs:program, ds:duom, ss:stekas start: mov ax,duom ; mov ds,ax ; ds segmentin registr ukrauname duomensegmento adres ;Ivalome ekran mov ax, 0002h int 10h ;Ivedame praneimus ekrane mov ah,09h lea dx,aut ;pirmo praneimo adresas int 21h mov ah, 09h lea dx, abc ;antro praneimo adresas int 21h mov ah, 09h lea dx, txt ;treio praneimo adresas int 21h ;Atliekame veiksmus xor ax,ax ;ivalome al registr

60

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

mov ax,a ;al:=a , nusiuniame a reikm registr add ax,b ; al:=a+b Sudedame skaiius sub ax,c ; al:=a+b-c atimame c reikm add ax,1 ; al:=a+b-c+1, pridedame vienet ;Tikrinamar rezultats teigiamas CMP ax,0 JL neig Teig: lea si, ats+3 ;patalpiname atsakymo adres mov ah,0 mov cx, 3 ;Tai darome, kad normaliai isvestu atsakyma ciklas: ;paruoiame rezultat ivedimui, suformuodami ASCI kode div ten ;daliname i deimt add ah, 30h ; mov [si],ah ;masyvo skaitliukas dec si ;mainam skaitliuka vienetu mov ah, 0 ;ivalom ah:=0 loop ciklas ;grtame ciklo pradi mov ah, 09h lea dx, ats ;atspausdina atsakym int 21h ;-grzna DOS mov ah,4ch int 21h Neig: MOV ats,minus JMP teig program ends end start II sutransliuojame program III Sulinkuojame program

61

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

2 paprastos programos pavyzdys ir cilkas ;-steko segmentasstekas segment stack db 256 dup (?) stekas ends ;-duomenu segmentasduom segment a db 78 ; b db E ; | - priskiriami duomenys kintamiesiems masyvas db 1a2bcDHIJK aut db 'Darbo uzduotis Nr.2',13,10 db 'Atliko Vardas Pavardele, II-0X',13,10 db '2007 07 07',13,10,'$' duom ends ;-programos segmentasprogram segment assume cs:program, ds:duom, ss:stekas start: mov ax,duom ; mov ds,ax ; ds segmentin registr ukrauname duomensegmento adres ;Ivalome ekran mov ax, 0002h int 10h ;Ivedame praneimus ekrane mov ah,09h lea dx,aut ;pirmo praneimo adresas int 21h mov ah, 09h lea dx, abc ;antro praneimo adresas int 21h mov ah, 09h lea dx, masyvas ;treio praneimo adresas int 21h ;Atliekame veiksmus LEA SI,masyvas MOV AL,0(SI) MOV BL,4(SI) MOV 0(SI),BL MOV 4(SI),AL MOV AL,a MOV 2(SI),AL MOV AL,b MOV AH,b MOV 5(SI),AX Masyvas po pakeitimu

62

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

MOV AH,09H LEA DX,mayvas INT 21H ;-grzna DOS mov ah,4ch int 21h program ends end start 3 pavyzdys akotosios programos ir ciklas ;-steko segmentasstekas segment stack db 256 dup (?) stekas ends ;-duomenu segmentasduom segment a db 17 ; x db 5 ; | - priskiriami duomenys kintamiesiems y db 2 ; ten db 10 ats db 5 dup (?),'$' aut db 'Darbo uzduotis Nr.3',13,10 db 'Atliko Vardas Pavardele, II-0X',13,10 db '2007 07 07',13,10,'$' abc db 13,10,'a = 17' F1 db 13,10,F = 2a/(x+y),13,10,'$' F2 db F=(x-y) ',7,'$' duom ends ;-programos segmentasprogram segment assume cs:program, ds:duom, ss:stekas start: mov ax,duom ; mov ds,ax ; ds segmentin registr ukrauname duomensegmento adres ;Ivalome ekran mov ax, 0002h int 10h ;Ivedame praneimus ekrane mov ah,09h lea dx,aut ;pirmo praneimo adresas int 21h mov ah, 09h lea dx, abc ;antro praneimo adresas int 21h mov ah, 09h

63

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

lea dx, txt ;treio praneimo adresas int 21h ;Atliekame veiksmus SUB ax,ax ;ivalome ax registr ;pasirenkame programos kelia CMP a,ten JG daugiau mov al,x ;al:=a , nusiuniame x reikm registr sub al,y ; al:=x-y atimame skaiius JMP Pasruos Daudiau: Mov AL,2 MUL a ;rezultatas yra AX SUB BX,BX MOV BL,x ADD BL,y ;rezultatas yra x+y MUL BL ;rezultats yra AX Paruos: lea si, ats+4 ;patalpiname atsakymo adres MOV CX,5 ciklas: ;paruoiame rezultat ivedimui, suformuodami ASCI kode div ten ;daliname i deimt add ah, 30h ; mov [si],ah ;masyvo skaitliukas dec si ;mainam skaitliuka vienetu mov ah, 0 ;ivalom ah:=0 loop ciklas ;grtame ciklo pradi CMP a,ten JG F1sp MOV ah,09h LEA DX,F2 JMP Atsk F1sp: LEA DX,F1 Atsk: INT 21h mov ah, 09h lea dx, ats ;atspausdina atsakym int 21h ;-grzna DOS mov ah,4ch int 21h program ends end start

64

ASSEMBLERINIS PROGRAMAVIMAS.J.Galkauskait

II sutransliuojame program III Sulinkuojame program

65