Darbas su tekstu Video režimo nustatymas(BIOS) Komanda: INT 10h Įrašymas: AH = 00h AL =video režimo numeris 7 jaunesni baitai, o vyriausias 1 – ekranas nevalomas, 0 – nuvalomas. AL reikšmės: 01h – 16 spalvų 40X25, 02h ir 03h – 16 spalvų 80X25, 07h – nespalvotas 80X25. Yra ir daugiau, bet jie priklauso nuo konkrečios vaizdo plokštės. Žymeklio pozicija (BIOS) Komanda: INT 10h Įrašymas: AH = 02h BH = puslapio numeris, DH = eilutė, DL = stulpelis. Stulpeliai ir eilutės skaičiuojami nuo kairiojo viršutinio ekrano kampo, pradinė koordinatė (0, 0). Video režimai 2 ir 3 gali naudoti nuo 0 iki 3 puslapių, o 0 ir 1 naudoja nuo 0 iki 7 puslapio. Juos naudojant galima tekstą spausdinti neaktyviame puslapyje, o po to akimirksniu persijungti. Skaityti žymeklio padėti ekrane (BIOS) Komanda: INT 10h Įrašymas: AH = 03h BH = puslapio numeris, DH = eilutė, DL = stulpelis, CH = pirmoji žymeklio pozicija, CL = paskutinioji žymeklio pozicija, Simbolių spausdinimas ekrane (BIOS) Kiekvienas simbolis ekrane aprašomas dviem baitais: Pirmas baitas ASCII kodas, antras – atributai Atributo baito reikšmės: 7 bitas – 1 reiškia, kad simbolis mirksi arba fonas pavaizduojamas ryškesne spalva, 6-4 bitai – fono spalva, 3 bitas – 1 reiškia simbolis ryškio spalvos arba fonas mirksi, 2-0 bitai – simbolio spalva. Atributas Spalvos pavadinimas Ryški spalva 000b Juoda Tamsiai pilka 001b Mėlyna Šviesiai mėlyna 010b Žalia Šviesiai žalia 011b Žydra Šviesiai žydra 100b Raudona Šviesiai raudona 101b Purpurinė Šviesiai purpurinė 110b Ruda Geltona 111b Šviesiai pilka Balta Skaityti simbolį žymeklio pozicijoje (BIOS) Komanda: INT 10h Įrašymas: AH = 08h BH = puslapio numeris, Duomenys AH = simbolio atributas, AL = simbolio ASCII kodas, Spausdinti simbolį žymeklio pozicijoje (BIOS) Komanda: INT 10h Įrašymas: AH = 09h BH = puslapio numeris, AL = simbolio ASCII kodas, BL = simbolio atributas, CX = simbolio kartojimo skaičius. CX neturi viršyti simbolių kiekio, likusio iki ekrano pabaigos. Spausdina simbolį su einamuoju atributu. Komanda: INT 10h Įrašymas: AH = 0Ah BH = puslapio numeris, AL = simbolio ASCII kodas, CX = simbolio kartojimo skaičius Spausdinti simbolį teletaipo režimu (BIOS) Komanda: INT 10h Įrašymas: AH = 0Eh BH = puslapio numeris, AL = simbolio ASCII kodas, Jei ekrane netelpa tekstas, tai jis prasukamas žemyn. Interpretuoja valdančiuosius kodus CR(0Dh), LF(0Ah), BEL(7). Spausdina eilutę su nurodytais atributais (BIOS) Komanda: INT 10h Įrašymas: AH = 13h AL = režimas: 0 bitas – žymeklis į eilutės pabaigą atspausdinus tekstą, 1 bitas – eilutė turi ir simbolius ir atributus, t.y. simbolis parašomas 2 baitais, 2-7 bitai rezervuoti. CX = eilutės ilgis, BL = atributas, jei eilutė turi tik simbolius, DH, DL = spausdinimo pradžios eilutė ir stulpelis, ES:BP = eilutės pradžios atmintyje adresas. Interpretuoja valdančiuosius kodus CR(0Dh), LF(0Ah), BS(08), BEL(7). Skaito simbolių eilutę į buferį (DOS) Komanda: INT 21h Įrašymas: AH = 0Ah DS:DX = buferio(atminties) adresas. Pirmas buferio baitas turi skaičių, nusakantį simbolių kiekį(1-254). Jei nurodytas turinys, tai jis gali būti panaudotas kaip sufleris. Renkant tekstą, kaip ir DOS-e galioja tos pačios valdymo taisyklės. Paspaudus ENTER eilutė įrašoma į buferį(atmintį) pradedant trečiuoju baitu, antrame įrašomas realiai surinktos eilutės ilgis, neskaitant ENTER. Skaito simbolį (DOS) Komanda: INT 21h Įrašymas: AH = 01h Reikšmė AL = simbolio ASCII kodas arba 0. Įvedant duomenis su šia funkcija spausdinama reikšmė kartojama ekrane. Galima nutraukti su CTRL+BREAK arba CTRL+C, jei nuspaustas ne simbolis reikšmė 0. Komanda: INT 21h Įrašymas: AH = 08h Reikšmė AL = simbolio ASCII kodas arba 0. Įvedant duomenis su šia funkcija reikšmė ekrane nekartojama. Galima nutraukti su CTRL+BREAK arba CTRL+C, jei nuspaustas ne simbolis reikšmė 0. Komanda: INT 21h Įrašymas: AH = 07h Reikšmė AL = simbolio ASCII kodas arba 0. Įvedant duomenis su šia funkcija reikšmė ekrane nekartojama. Laukia klavišo paspaudimo, bet negalima nutraukti su CTRL+BREAK. Komanda: INT 21h Įrašymas: AH = 06h, DL = 0FFh. Reikšmė ZF = 1, jei nebuvo paspaustas simbolio klavišas ir AL = 0, ZF = 0, jei buvo paspaustas simbolio klavišas ir AL = simbolio kodas, Klaviatūros būsena (DOS) Komanda: INT 21h Įrašymas: AH = 0Bh Reikšmė AL = 0, jei nepaspaustas klavišas, AL = 0FFh, jei paspaustas klavišas. Patogu naudoti prieš 01, 07 ir 08 funkcijas. Komanda: INT 21h Įrašymas: AH = 0Ch, AL = 01, 06, 07, 08, 0Ah funkcijų numeriai. Reikšmė priklauso nuo pasirinktos funkcijos. Naudojama tam, kad funkcijos neperimtų anksčiau paspausto klavišo kodo. Skaito simbolį (BIOS) Komanda: INT 16h Įrašymas: AH = 00h(83/84 klavišų), 10h(101/102 klavišų), 20h(122 klavišų) Reikšmė AL = klavišo ASCII kodas, 0 arba prefiksas, AH = prefiksas arba praplėstas ASCII kodas. Komanda: INT 16h Įrašymas: AH = 01h(83/84 klavišų), 11h(101/102 klavišų), 21h(122 klavišų) Reikšmė ZF = 1, jei buferis tuščias, ZF = 0, jei yra simbolis: AL = klavišo ASCII kodas, 0 arba prefiksas, AH = prefiksas arba praplėstas ASCII kodas. Perkelia į klaviatūros buferį (BIOS) Komanda: INT 16h Įrašymas: AH = 05h CH = prefiksas, CL = ASCII kodas. Reikšmė AL = 00 jei operacija sėkminga, AL = 01, jei klaviatūros buferis perpildytas. Tikrina klaviatūros būseną (BIOS) Komanda: INT 16h Įrašymas: AH = 02h(83/84 klavišų), 12h(101/102 klavišų), 22h(122 klavišų) Reikšmė AL = 00 jei operacija sėkminga, AL = klaviatūros būsenos baitas 1, AL = klaviatūros būsenos baitas 2(12h ir 22h). Būsenos baitas yra kompiuterio atmintyje adresu: 0000h:0417h arba 0040h:0017h: 7 bitas INS įjungta, 6 bitas CAPSLOCK įjungta, 5 bitas NUMLOCK įjungta, 4 bitas SCROLLLOCK įjungta, 3 bitas ALT nuspaustas(dažnai galioja tik kairiajam), 2 bitas CTRL nuspaustas, 1 bitas kairysis SHIFT nuspaustas, 0 bitas dešinysis SHIFT nuspaustas, Būsenos baitas 2 atveju yra kompiuterio atmintyje adresu: 0000h:0418h arba 0040h:0018h: 7 bitas SYSRG įjungta, 6 bitas CAPSLOCK įjungta, 5 bitas NUMLOCK įjungta, 4 bitas SCROLLLOCK įjungta, 3 bitas dešinysis ALT nuspaustas, 2 bitas dešinysis CTRL nuspaustas, 1 bitas kairysis ALT nuspaustas, 0 bitas dešinysis CTRL nuspaustas. Sąlyginės komandos Jcc žymė – perėjimas turi būti ne didesnis nei 128 baitų Komandos variantai Komandos kodas Sąlyga CMP sąlyga JA JBE CF=0 ir ZF=0 Jei daugiau Jei ne mažiau ir nelygu JAE JNB JNC CF=0 Jei daugiau arba lygu Jei mažiau Jei nėra perkėlimo JB JNAE JC CF=1 Jei mažiau Jei ne mažiau ir nelygu Jei perkėlimas JBE JNA CF=1 arba ZF=1 Jei mažiau arba lygu Jei ne mažiau JE JZ ZF=1 Jei lygu Jei nulis JG JNLE ZF=0 ir SF=OF Jei daugiau Jei ne mažiau ir nelygu JGE JNL SF=OF Jei daugiau arba lygu Jei mažiau JL JNGE SFOF Jei mažiau Jei ne daugiau ir nelygu JLE JNG ZF=1 arba SFOF Jei mažiau arba lygu Jei ne daugiau JNE JNZ ZF=0 Jei nelygu Jei ne nulis JNO OF=0 Jei nėra perpildymo JO OF=1 Jei perpildymas JNP JPO PF=0 Jei nėra lygiškumo Jei nelyginis JP JPE PF=1 Jei yra lygiškumas Jei lyginis JNS SF=0 Jei nėra ženklo JS SF=1 Jei yra ženklas Loop žymė – vykdo ciklą, dažniausiai o sąlygos patikrinimo. Test gav, sal - atlieka gav ir sal loginę sumą ir nustato SF, ZF ir PF požymius Sąlyginis perėjimas … Cmp sal1, sal2 – tikrinama sąlyga Jcc zym1 –perėjimas į zym1, atsižvelgiant į Cmp rezultatą … – komandos, jei netenkinama Jcc sąlyga Jmp zym2 –besąlyginis perėjimas į zym2 Zym1: … – komandos, jei tenkinama Jcc sąlyga … Zym2: … – programos tęsinys .model tiny .code org 100h start: mov al, 00h mov ah, 01h int 21h cmp al, 53 jle pirmas mov dx, offset daugiau mov ah, 9 int 21h jmp viskas pirmas: mov dx, offset maziau mov ah, 9 int 21h viskas: ret maziau db ' - kodas mazesnis uz skaiciaus 5 arba jam lygus',0dh,0ah,'$' daugiau db ' - kodas didesnis uz skaiciaus 5',0dh,0ah,'$' end start Ciklas … mov reg, pab_sk – į reg perkeliamas ciklo kartojimų Cikpr: … Dec reg – programos tęsinys Jnz Cikpr – jei reg nelygus 0, tai pereiti į Cikpr … – ciklas baigtas … – programos tęsinys Gali būti sukurti ir kitokie programos atkarpos kartojimo būdai, panaudojant komandą Cmp, Int ir pan. model tiny .code org 100h start: mov dx, offset koment mov ah, 9 int 21h - komentaras ekrane mov al, 00h mov ah, 01h int 21h - laukia kol įrašysiu simbolį mov dx, 0 - spausdinsime simbolius nuo kairiojo viršutinio ekrano kampo mov si, 10 - kartosime 10 kartų ciklą ciklas: mov ah, 02h int 10h - perkelia žymeklį į nurodytą poziciją mov ah, 09h mov bl, 10101101b mov cx, 15 push dx - išsaugome žymeklio poziciją int 10h - spausdina 15 simbolių eilutę pop dx - atstatome žymeklio pozicijos reikšmę inc dh - sekanti eilutė dec si - mažinama ciklo skaitliuko reikšmė jnz ciklas - jei ne nulis tęsti ret koment db 'Rasykite simboli ir po 15 simboliu pakartosiu 10 eiluciu',0dh,0ah,'$' end start .model tiny - spausdina ASCII kodų lentelę eilutėje po 16 simbolių .code org 100h start: mov ax, 0003h int 10h - nustatomas 3 video režimas ir valomas ekranas, žymeklis į 0,0 poziciją mov dx, 0 - dh ir dl saugos žymeklio poziciją mov si, 256 - ciklas vykdomas 256 kartų ir si registras - skaitliukas mov al, 0 mov ah, 9 mov cx,1 - spausdinsime tik 1 simbolį mov bl, 00011111b - simbolis spausdinamas baltas mėlyname fone ciklas: int 10h - spausdinamas simbolis push ax - išsaugosime registro ax reikšmę mov ah, 2 inc dl - sekantis stulpelis int 10h - perkeliame žymeklį mov ax, 0920h - spausdinamas tarpas al=20h ir funkcijos kodas ah=09 int 10h - spausdinsime tarpą mov ah, 2 - funkcijos numeris 2 inc dl - sekantis stulpelis int 10h - perkeliame žymeklį pop ax - gražiname ax inc al - sekantis ASCII simbolis test al, 0fh - tikriname ar al nėra 16 jnz tesk_cikla - jei taip tęsiame ciklą push ax - jei ne saugome ax mov ah, 2 - video funkcijos numeris inc dh - sekanti eilutė mov dl, 0 - žymeklis į eilutės pradžią int 10h - perkeliame žymeklį pop ax - gražiname reikšmę tesk_cikla: dec si - mažiname skaitliuko reikšmę jnz ciklas - jei ne 0, tai tęsiame ciklą ret end start Grafinio ekrano valdymas assembleryje Video režimo nustatymas(BIOS) Komanda: INT 10h Įrašymas: AH = 00h AL =video režimo numeris AL reikšmės: 11h – 640x480 taškų ir 2 spalvos, 12h – 640x480 taškų ir 16 spalvų, 13h – 320x200 taškų ir 256 spalvos. Pavyzdžiui: mov ax, 0013h int 10h Perjungia į 320x200 taškų su 256 spalvų režimą. Grafinės funkcijos(BIOS) Komanda: INT 10h – vaizduoja tašką ekrane Įrašymas: AH = 0Ch BH = video puslapio numeris(nepalaiko 13h) DX = eilutės numeris CX = stulpelio numeris AL =spalvos numeris. Komanda: INT 10h – skaito tašką iš ekrano Įrašymas: AH = 0Dh BH = video puslapio numeris(nepalaiko 13h) DX = eilutės numeris CX = stulpelio numeris Rezultatas: AL =spalvos numeris Išraiškos - reiškinys skliaustuose, interpretuojamas kaip simbolių eilutė. ( ) - reiškinys skliaustuose skaičiuojamas pirmiausiai. + - * / - aritmetiniai veiksmai. Mod – sveikos dalybos liekana. and – loginis ir, or – loginis arba, not – loginis ne, xor – atimantis arba, shl – postūmis per vieną bitą į kairę, shr – postūmis per vieną bitą į dešinę. Palyginimo operatoriai: EQ – lygu, GE – daugiau arba lygu, GT – daugiau, LT – mažiau, LE – mažiau arba lygu, NE – nelygu. Pavyzdžiui: .err $ gt 65535 ; jei adresas daugiau už 64Kb – klaida. Adresavimo operatoriai: SEG reiškinys – nurodo segmento adresą. OFFSET reiškinys – nurodo adreso postūmį nuo segmento pradžios. THIS tipas – einamasis adresas. Tipas PTR reiškinys – adreso tipo pakeitimas. LARGE reiškinys – 32 bitų adreso postūmis nuo segmento pradžios. SMALL reiškinys – 16 bitų adreso postūmis nuo segmento pradžios. SHORT reiškinys – 8 bitų adreso postūmis nuo segmento pradžios. Pavyzdžiui: Mov dx, offset msg ; įrašyti į DX registrą kintamojo msg postūmį. Mov a1, this byte-1 ; įrašyti į AX ankstesnės komandos paskutinį baitą. . – nuoroda į struktūros elementą. : – segmento elemento pakeitimas. [ ] – netiesioginis adresavimas. ? – neinicializuojama reikšmė. Skaičius DUP(reikšmė) – besikartojanti reikšmė. Neprivilegijuotos komandos Inc gav – didina gav reikšmę vienetu. Dec gav – mažina gav reikšmę vienetu. Cmp gav, sal – lygina duomenis ir keičia būsenas CF, OF, SF, AF, PF. Jmp gav – perduoda besąlygiškai valdymą į kitą programos vietą. Jcc gav – perduoda valdymą į kitą programos vietą, jei tenkinama sąlyga, pavyzdžiui po cmp įvykdymo jei sutampa vykdomas perėjimas. Loop gav – mažinama registro EAX reikšmė 1 ir vykdomas Short tipo(-128..+127) perėjimas į gav, jei ECX nelygus 0. 16 bitų bus AX ir CX. Ret – gražina valdymą iškvietusiai programai: retn – skaitys iš steko žodį, kad sugrįžtu, retf – skaitys iš steko IP arba EIP ir CS grįžimo adresus. Pilnas ekranas taškų - 1 .model tiny .code org 100h start: mov ax, 0013h ;grafinis rezimas 320X200, 256 spalvų int 10h ;Spausdiname pilną ekraną taškų mov cx, 319 ;maksimalus stulpelių kiekis ekrane mov dx, 199 ;maksimalus eilučių kiekis ekranas: mov al, 00110011b ;taško spalva mov ah, 0Ch ;video funkcija int 10h ;taškas ekrane dec cx ;sekantis stulpelis jns ekranas ;jei stulpelis nesibaigė, tęsti mov cx, 319 ;maksimalus stulpelių kiekis dec dx ;sekanti eilutė jns ekranas pauze: mov ah, 1 ;jei nepaspaustas klavišas int 16h jz pauze ;kitas ciklas mov ax, 0003h ;grįžtame į tekstinį režimą int 10h ret end start Pilnas ekranas skirtingų taškų - 2 Spausdiname pilną ekraną taškų, keičiant spalvą mov cx, 319 ;maksimalus stulpelių kiekis ekrane mov dx, 199 ;maksimalus eilučių kiekis mov al, 255 ;spalva ekranas: shr al, 1 ;keičiame taško spalvą jnz tesk mov al, 255 ;jei nulis tesk: mov ah, 0Ch ;video funkcija int 10h ;taškas ekrane dec cx ;sekantis stulpelis jns ekranas ;jei stulpelis nesibaigė, tęsti mov al, 255 mov cx, 319 ;maksimalus stulpelių kiekis dec dx ;sekanti eilutė jns ekranas pauze: mov ah, 1 ;jei nepaspaustas klavišas int 16h jz pauze ;kitas gyvenimo ciklas mov ax, 0003h ;grižtame į tekstinį ekraną int 10h ret end start Įstrižainė – 3 ekranas: shr al, 1 ;taško spalva jnz tesk mov al, 255 tesk: cmp cx, dx jne praleisk mov ah, 0Ch ;video funkcija int 10h ;taškas ekrane praleisk: dec cx ;sekantis stulpelis jns ekranas ;jei stulpelis nesibaige, testi mov al, 255 mov cx, 319 ;maksimalus stulpelių kiekis dec dx ;sekanti eilutė jns ekranas ; Taško skaitymas ir kartojimas – 4 mov cx, 319 ;maksimalus stulpelių kiekis ekrane mov dx, 199 ;maksimalus eilučių kiekis skai: mov ah, 0Dh ;skaitome einamąjį tašką int 10h push cx ;išsaugome koordinates push dx inc al mov ah, 0Ch dec cx ;taškas prieš tai jle skai1 ;jei 0 arba neigiama koordinatė, praleisti int 10h dec cx ;dar vienas taškas prieš tai jle skai1 int 10h skai1: inc dx ;sekanti eilutė cmp dx, 199 ;jei viršijome maksimalų skaičių jge skai2 ;praleisti int 10h inc dx ;dar sekanti eilutė cmp dx, 199 jge skai2 int 10h skai2: pop dx ;atstatome reikšmes pop cx dec cx ;sekantis stulpelis jns skai ;jei stulpelis nesibaigė, tęsti skaitymą mov cx, 319 ;maksimalus stulpelių kiekis dec dx ;sekanti eilutė jns skai Taško spalvos parinkimas iš eilutės(mas1) mov ax, 0003h ;Tekstinis režimas int 10h mov ah, 09h mov dx, offset komentaras ;Komentaras spausdinamas ekrane int 21h laukiu: mov ah, 08h ;Laukiame kol įves spalvos numerį nuo 1 iki 8 int 21h ;jei nepaspaustas klavisas mov bx, offset taskai ;tasku spalvu masyvo adresas cmp al, 49 ;jei 1 Jne kt1 mov al, byte ptr[bx] jmp ekranas kt1: cmp al, 50 ;jei 2 Jne kt2 mov al, byte ptr[bx+1] jmp ekranas kt2: cmp al, 51 ;jei 3 Jne kt3 mov al, byte ptr[bx+2] jmp ekranas kt3: cmp al, 52 ;jei 4 Jne kt4 mov al, byte ptr[bx+3] jmp ekranas kt4: cmp al, 53 ;jei 5 Jne kt5 mov al, byte ptr[bx+4] jmp ekranas kt5: cmp al, 54 ;jei 6 Jne kt6 mov al, byte ptr[bx+5] jmp ekranas kt6: cmp al, 55 ;jei 7 Jne kt7 mov al, byte ptr[bx+6] jmp ekranas kt7: cmp al, 56 ;jei 8 Jne laukiu ;Jei ne skaičius, tai laukiu mov al, byte ptr[bx+7] ekranas: push ax ;Išsaugome ax registro reikšmę ;Perjungiame į grafinį ekraną mov ax, 0013h ;grafinis rezimas 320X200, 256 spalvu int 10h pop ax mov cx, 100 ;100 - asis stulpelis mov dx, 100 ;100 - oji eilute vaizdas: mov ah, 0Ch ;video funkcija int 10h ;taskas ekrane dec cx ;sekantis stulpelis jns vaizdas ;jei stulpelis nesibaige, testi mov cx, 100 ;100 stulpelis dec dx ;sekanti eilute jns vaizdas ;Pauzė mov ah, 08h ;jei nepaspaustas klavisas int 21h cmp al, 84 ;jei T testi jne viskas Jmp start ;Nes sąlyginis šuolis yra per trumpas viskas: mov ax, 0003h ;griztame i tekstini rezima int 10h ret komentaras db 'Iveskite skaiciu nuo 1 iki 8 ir bus patinkta atitinkama spalva: $' taskai db 00000001b,00000011b,00000111b,00001111b,00011111b,00111111b,01111111b,11111111b end start Piešinio formavimas(mas2) Pirmiausiai turime pasidaryti piešinio schemą, atsižvelgiant į pasirinktą koordinačių sistemą, ir susirašyti jo koordinates (100,100) X X X X X X X X X X X X X X X X X X X X X X X X Piešinys į ekraną(mas2) ekranas: push ax ;Išsaugome ax registro reikšmę mov ax, 0013h ;grafinis rezimas 320X200, 256 spalvu int 10h pop ax mov si, 0 ;piešinio taškų kiekis registre si mov bx, offset kord vaizdas: mov cx,[bx+si] mov dx,[bx+si+2] mov ah, 0Ch ;video funkcija int 10h ;taškas ekrane add si,4 ;sekantis taškas cmp si, 96 ;jei dar ne visi taškai, tęsti, viso yra 24 taškai – 2 koordinatės po žodį jne vaizdas ;Pauzė mov ah, 08h ;jei nepaspaustas klavišas int 21h cmp al, 84 ;jei T tęsti jne viskas Jmp start ;Nes sąlyginis šuolis yra per trumpas viskas: mov ax, 0003h ;grįžtame į tekstinį režimą int 10h ret komentaras db 'Iveskite skaiciu nuo 1 iki 8 ir bus patinkta geles spalva: $' taskai db 00000001b,00000011b,00000111b,00001111b,00011111b,00111111b,01111111b,11111111b kord dw 100,100,102,100,104,100 dw 98,102,100,102,102,102,104,102,106,102 dw 100,104,102,104,104,104 dw 102,106,108,106,110,106 dw 102,108,106,108,108,108 dw 102,110,104,110,106,110,110,110 dw 102,112,102,114,102,116 end start Veiksmai su failais Failo aprašymas Failo aprašymui naudojamas 16 bitų skaičius skirtas failo arba įrenginio identifikavimui. Pirmieji bitai paskirstyti taip: 0:STDIN – standartinis įrašymo įrenginys(dažniausiai klaviatūra) 1:STDOUT – standartinis išvedimo įrenginys(paprastai ekranas) 2:STDERR – pranešimų apie klaidą įrenginys(visada ekranas) 3:AUX – nuoseklusis prievadas(COM1) 4:PRN – lygiagretusis prievadas(LPT1) Failo kūrimas Dos 21h: - sukuria failą Įrašymas:AH = 3Ch CX – failo atributas 7 bitas:failą galima atverti skirtingiems procesams 6 bitas:nenaudojamas 5 bitas: archyvinis(1, jei neišsaugotas) 4 bitas: katalogas(3Ch funkcijai 0) 3 bitas: tomo žymė(3Ch ignoruoja) 2 bitas: sisteminis failas 1 bitas: failas paslėptas 0 bitas: failas tik skaitymui DS:DX – ASCIZ eilutės su pilnu failo vardu adresas Rezultatas:CF = 0 ir AX – failo identifikatorius jei nebuvo klaidos CF = 1 ir AX = 03h, jei nerastas kelias CF = 1 ir AX = 04h, jei per daug atvertų failų CF = 1 ir AX = 05h, jei prieiga uždrausta. Failo atidarymas Dos 21h: - sukuria failą Įrašymas:AH = 3Dh AL – prieigos režimas 0 bitas:atverti tik skaitymui 1 bitas:atverti rašymui(ir skaitymui) 2 –3 bitai: rezervuoti 6 – 4 bitai: prieiga prie procesų 001 – visos operacijos uždraustos 010 – uždraustas rašymas 011 – uždraustas skaitymas 100 – draudimų nėra 7 bitas: failas nepaveldimas kitų procesų DS:DX – ASCIZ eilutės su pilnu failo vardu adresas CL – failo atributų kaukė Rezultatas:CF = 0 ir AX – failo identifikatorius jei nebuvo klaidos CF = 1 ir AX = 02h, jei nerastas failas, AX = 03h, jei nerastas kelias, AX = 04h jei per daug atvertų failų, AX = 05h, jei prieiga uždrausta, AX = 0Ch, jei neteisingas prieigos režimas Failo kūrimas ir atidarymas Dos 21h: - sukuria failą ir atidaro failą Įrašymas:AH = 5Bh CX – failo atributas DS:DX – ASCIZ eilutės su pilnu failo vardu adresas Rezultatas:CF = 0 ir AX – failo identifikatorius jei nebuvo klaidos CF = 1 ir AX = 03h, jei nerastas kelias, AX = 04h jei per daug atvertų failų, AX = 05h, jei prieiga uždrausta, AX = 50h, jei failas jeu yra. DOS 21h – sukuria ir atidaro laikiną failą Įrašymas:AH = 5Ah CX – failo atributas DS:DX – ASCIZ eilutės su pilnu failo vardu ir keliu adresas baigiasi simboliu \ ir 13 nulinių baitų gale Rezultatas:CF = 0 ir AX – failo identifikatorius jei nebuvo klaidos CF = 1 ir AX = 03h, jei nerastas kelias, AX = 04h jei per daug atvertų failų, AX = 05h, jei prieiga uždrausta. Failų kiekio keitimas Dos 21h: - sukuria failą ir atidaro failą Įrašymas:AH = 67h BX – naujas maksimalus identifikatorių kiekis(20 – 65535) Rezultatas:CF = 0 nebuvo klaidos CF = 1 ir AX = 03h, jei nerastas kelias, AX = 04h jei per daug atvertų failų, AX = 05h, jei prieiga uždrausta, AX = 50h, jei failas yra. Skaitymas iš failo Dos 21h: - skaitymas iš failo arba įrenginio Įrašymas:AH = 3Fh BX –identifikatorius CX – baitų kiekis DS:DX – duomenų perdavimo buferio adresas Rezultatas:CF = 0 ir AX nuskaitytų baitų kiekis, jei nebuvo klaidos CF = 1 ir AX = 05h, jei prieiga uždrausta, AX = 06h, jei neteisingas identifikatorius. Perėjimas prie kito įrašo Dos 21h: - žymeklio perkėlimas į kitą failo vietą Įrašymas:AH = 42h BX –identifikatorius CX:DX – atstumas per kurį reikia perkelti žymeklį AL – perkėlimo pobūdis: 0 – nuo failo pradžios, 1 – nuo einamosios pozicijos, 2 – nuo failo pabaigos. Rezultatas:CF = 0 ir CX:DX nauja žymeklio reikšmė, jei nebuvo klaidos CF = 1 ir AX = 06h, jei neteisingas identifikatorius. Assemblerio programos pelės valdymui, laiko skaičiavimui Pelės valdymo funkcijos Visos pelės valdymo funkcijos realizuojamos per INT33 pertraukimą. Komanda: INT 33h – suaktyvina pelę Įrašymas: AX = 0000h Rezultatas: AX = 0000h, jei nėra pelės tvarkyklių AX = 0FFFFh, jei įdiegtos pelės tvarkyklės BX = klavišų skaičius: 0002 arba 0FFFFh – du, 0003 – trys 0000 – kitas kiekis. Komanda: INT 33h – parodyti pelės žymeklį Įrašymas: AX = 0001h Komanda: INT 33h – paslėpti pelės žymeklį Įrašymas: AX = 0002h Komanda: INT 33h – nustatyti pelės būseną Įrašymas: AX = 0003h Rezultatas: BX = klavišų būsena: 0 bitas – paspaustas kairysis klavišas, 1 bitas – paspaustas dešinysis klavišas, 2 bitas – paspaustas vidurinysis klavišas. CX = X koordinatė DX = Y koordinatė Paprastai grafinio ekrano koordinatės sutampa su taškų kiekiu ekrane. Tik grafiniuose režimuose 04, 05, 0Dh ir 13h X koordinatę reikia padalinti iš dviejų, kad gautume atitinkamo stulpelio numerį. Pavyzdžiui: sar cx, 1 - bus cx registre esanti koordinatė padalinta iš 2 Komanda: INT 33h – nustatyti pelės įvykių apdorojimo programą Įrašymas: AX = 000Ch ES:DX = įvykius apdorojančios programos adresas CX = programos iškvietimo sąlyga: 0 bitas – bet koks pelės judesys, 1 bitas – paspaustas kairysis klavišas, 2 bitas – atleistas kairysis klavišas, 3 bitas – paspaustas dešinysis klavišas, 4 bitas – atleistas dešinysis klavišas, 5 bitas – paspaustas vidurinysis klavišas, 6 bitas – atleistas vidurinysis klavišas, CX = 0000h atšaukti pelės įvykių apdorojimo programą Įvykių apdorojimo programa turi būti aprašoma kaip tolima procedūra, t.y. grįžimas iš jos atliekamas su komanda RETF. Įvykių apdorojimą BŪTINA atšaukti, priešingu atveju į įvykių apdorojimo programą bus nukreikiama po įvykio ir išėjus iš vartotojo programėlės. Sisteminis laikas Kiekvienas personalinis kompiuteris turi du procesų valdymo įrenginius: realaus laiko laikrodį(RTC), sisteminis taimeris. RTC maitinamas iš akumuliatoriaus ant kompiuterio pagrindinės plokštės ir pastoviai veikia. Jį galima naudoti datai, laikui nustatyti ir apdoroti įvykius. Sisteminis taimeris valdo tiesioginio priėjimo atminties kontrolerį, kompiuterio garsiakalbį bei generuoja IRQ0(INT 8h) pertraukimų impulsus 18,2 karto per sekundę. DOS ir BIOS lygmenyje šie laikrodžiai naudojami laiko nustatymui bei užlaikymų organizavimui. Komanda: INT 21h – parodyti datą Įrašymas: AH = 2Ah Rezultatas: CX = metai(1980-2099) DH = mėnuo DL = diena AL = savaitės diena(0 – sekmadienis, 1- pirmadienis ir t.t.) Komanda: INT 21h – parodyti laiką Įrašymas: AH = 2Ch Rezultatas: CH = valandos CL = minutės DH = sekundės DL = šimtoji sekundės dalis. Komanda: INT 21h – nustatyti datą Įrašymas: AH = 2Bh CX = metai(1980-2099) DH = mėnuo DL = diena Rezultatas: AH = FFh, jei įvesta neegzistuojanti data, 00h, jei data nustatyta Komanda: INT 21h – nustatyti laiką Įrašymas: AH = 2Dh CH = valandos CL = minutės DH = sekundės DL = šimtoji sekundės dalis. Rezultatas: AH = FFh, jei įvesta neegzistuojantis laikas, 00h, jei laikas nustatytas Komanda: INT 1Ah – peskaityti RTC datą Įrašymas: AH = 04h Rezultatas: CF = 0, jei data perskaityta CX = metai(BCD formate, 2001h –2001 metams) DH = mėnuo(BCD formate) DL = diena (BCD formate) CF = 1, jei laikrodis nedirba arba skaitymas atnaujinimo metu. Komanda: INT 1Ah – perskaityti RTC laiką Įrašymas: AH = 02h Rezultatas: CF = 0, jei laikas perskaitytas CH = valandos (BCD formate) CL = minutės (BCD formate) DH = sekundės (BCD formate) DL = 01h, jei vasaros laikas, 00h, jei ne. CF = 1, jei laikrodis nedirba arba skaitymas atnaujinimo metu. Komanda: INT 1Ah – nustatyti RTC datą Įrašymas: AH = 05h CX = metai(BCD formate) DH = mėnuo(BCD formate) DL = diena (BCD formate) Komanda: INT 1Ah – nustatyti RTC laiką Įrašymas: AH = 03h CH = valandos (BCD formate) CL = minutės (BCD formate) DH = sekundės (BCD formate) DL = 01h, jei vasaros laikas, 00h, jei ne. Komanda: INT 1Ah – nustatyti žadintuvą Įrašymas: AH = 06h CH = valandos (BCD formate) CL = minutės (BCD formate) DH = sekundės (BCD formate) Rezultatas: CF = 1, jei klaida(jau nustatytas žadintuvas arba veiksmas pertraukimo metu), 0, jei veiksmas sėkmingas. Komanda: INT 1Ah – atšaukti žadintuvą Įrašymas: AH = 07h BIOS, panaudojant IRQ0(INT 8Hh) pertraukimą pastoviai seka laiką ir jį saugo kompiuterio atmintyje adresu: 0000h:046Ch(32 bitų skaitliukas), jei šis adresas perpildomas, tai baitas 0000h:0470h didinamas vienetu. Komanda: INT 1Ah – sužinoti laiko skaitliuko reikšmę Įrašymas: AH = 00h Rezultatas: CX:DX = skaitliuko reikšmė AL = skaitliuko perpildymo baito reikšmė. Komanda: INT 1Ah – pakeisti laiko skaitliuko reikšmę Įrašymas: AH = 01h CX:DX = skaitliuko reikšmė. Komanda: INT 1Ah – užlaikymo formavimas Įrašymas: AH = 86h CX:DX = užlaikymo trukmė mikrosekundėmis (milijoninė sekundės dalis) Rezultatas: AL = pertraukimo apdorojimo programos įrašyta kaukė. CF = 0, jei užlaikymas įvykdytas, CF = 1, jei laikmatis buvo užimtas. Komanda: INT 1Ah – laikmačio paleidimas Įrašymas: AH = 83h AL = 0 paleisti skaitliuką CX:DX = užlaikymo trukmė mikrosekundėmis (milijoninė sekundės dalis) ES:BX = baito adresas, kurios vyriausias bitas baigus skaitliuko darbą bus nustatytas 1. AL = 1 sustabdyti skaitliuką. Pavyzdys su laiku start: mov ah, 2Ch ;Laikas int 21h cmp bh, dh ;Patikriname ar praėjo sekundė je start ;Jei ne kartok mov bh, dh ;Saugome einamosios sekundės dh registre parodymus push bx ;Į steką mov ah, 09h mov dx, offset laikas ;Tekstas ekrane int 21h cmp byte ptr offset laikas+2, "9" ;Tikriname ar sekundės neviršijo 9 jne maz1 ;Jei ne tęsti mov byte ptr offset laikas+2, "0" ;Priešingu atveju įrašome 0 cmp byte ptr offset laikas+1, "9" ;Tikriname ar sekundžių dešimtys neviršijo 9 dešimčių jne maz2 ;Jei ne tęsti mov byte ptr offset laikas+1, "0" ;Priešingai 0 cmp byte ptr offset laikas, "9" ;Tikriname ar sekundžių šimtai neviršijo 9 šimtų jne maz3 ; mov byte ptr offset laikas, "0" jmp short toliau maz3: add byte ptr offset laikas, 1 jmp short toliau maz2: add byte ptr offset laikas+1, 1 jmp short toliau maz1: add byte ptr offset laikas+2, 1 toliau: pop bx jmp short start ret laikas: db "000 sekunde, stabdymui CTRL+C",0Ah,0Dh,"$" end start 1 pavyzdys su pelės valdymu start: mov ax, 13h ; int 10h ;grafinis videorežimas mov ax, 0 ;inicializuojame pelę int 33h mov ax, 1 ;rodyk pelės žymeklį int 33h mov ax, 000Ch ;Įjungiame pelės įvykių apdorojimo programą mov cx, 0002h ;Įvykis - kairiojo pelės klavišo paspaudimas mov dx, offset buf ;ES:DX - įvykių apdorojimo buferio adresas int 33h taskai: mov ah, 08h int 21h ;Laukiame klavišo t paspaudimo cmp al, "t" jne taskai mov ax, 000Ch ;Iškviečiame pelės įvyklių apdorojimo programą mov cx, 000h int 33h ;Atsisakome įvykių apdorojimo pelei mov ax, 3 ;Tekstinis režimas int 10h ret buf: ;Pelės įvykių apdorojimo programos pradžia pusha ;Saugojame visus registrus mov bx, 0 sar cx, 1 ;Stulpelio koordinatė dalinama iš 2 inc cx dec dx mov al, 00000100b mov ah, 0Ch int 10h popa retf end start 2 pavyzdys su pelės valdymu start: mov ah, 09h ;Laukia kol paspaus 1, 2 arba 3 mov dx, offset tekstas int 21h kas: mov ah, 08h int 21h ;Laukiame klavišo t paspaudimo cmp al, "1" jne kas1 mov cx, 0001h jmp short pirmyn kas1: cmp al, "2" jne kas2 mov cx, 000Ah jmp short pirmyn kas2: cmp al, "3" jne kas3 mov cx, 0001h jmp short pirmyn kas3: mov ah, 09h ;Laukia kol paspaus t mov dx, offset tekstas1 int 21h mov ah, 08h int 21h ;Laukiame klavišo t paspaudimo cmp al, "t" je viskas jmp short start pirmyn: push cx mov ax, 13h ; int 10h ;grafinis videorežimas mov ax, 0 ;inicializuojame pelę int 33h mov ax, 1 ;rodyk pelės žymeklį int 33h mov ax, 000Ch ;Įjungiame pelės įvykių apdorojimo programą pop cx ;Pelės klavišų apdorojimo įvykiai mov dx, offset buf ;ES:DX - įvykių apdorojimo buferio adresas int 33h taskai: mov ah, 08h int 21h ;Laukiame klavišo t paspaudimo cmp al, "t" jne taskai mov ax, 000Ch ;Iškviečiame pelės įvyklių apdorojimo programą mov cx, 000h int 33h ;Atsisakome įvykių apdorojimo pelei mov ax, 3 ;Tekstinis režimas int 10h viskas: ret buf: ;Pelės įvykių apdorojimo programos pradžia pusha ;Saugojame visus registrus mov bx, 0 sar cx, 1 ;Stulpelio koordinatė dalinama iš 2 inc cx ;Stulpelio koordinatė didnama vienetu, nes ištrina pelės žymeklis dec dx ;Eilutė bus viena aukščiau, nes ištrina pelės žymeklis mov al, 00000100b ;Spalva mov ah, 0Ch ;Funkcijos numeris int 10h ;Taškas popa ;Gražiname ankstesnes regostrų koordinates retf tekstas: db "1 - desime taska, kai spustelesite kairiji peles klavisa",0Dh,0Ah db "2 - desime taska, kai spustelesite desiniji peles klavisa",0Dh,0Ah db "3 - piesime, kai judinsite pele",0Dh,0Ah,"$" tekstas1: db 07h,0Ah,0Ah,"Deja, jus paspaudete kita klavisa... ",0Dh,0Ah db "Spauskite t - jei tikrai norite baigti, bet kuri kita jei tesite",0Dh,0Ah,"$" end start Darbas su prievadais Nuoseklus prievadas DOS visada suaktyvina(inicializuoja) prievadą COM1 2400 bod, 8N1(8 bitai žodyje, 1 stop – bitas, lygiškumas netikrinamas). Jis susiejamas su STDAUX įrenginiu. Funkcijos 03h ir 04h įrašo ir nuskaito vieną baitą informacijos susietos su prievadu. Dos 03h: - skaito baitą iš STDAUX įrenginio Įrašymas: AH = 03h Rezultatas: AL = nuskaitytas baitas. Dos 04h: - įrašo baitą į STDAUX įrenginį Įrašymas: AH = 04h Rezultatas: AL = nuskaitytas baitas. Pagrindinis šių funkcijų trūkumas, tai, kad darbo greitis tik 2400 bod, kurį gaima reguliuoti su DOS komanda MODE. Tiesioginis darbas su nuosekliu prievadu Tam naudojamas speciali tvarkyklė turinti servisų rinkinį FOSSIL tiesioginiam darbui su preivadu. INT 14h: - suaktyvina FOSSIL servisus Įrašymas: AH = 04h DX = prievado numeris(0-COM1, 1 – COM2…) Rezultatas: AX = 1954h BL = maksimalus aplaikomos funkcijos numeris BH = FOSSIL versija INT 14h: - naikina FOSSIL servisų aktyvumą Įrašymas: AH = 05h DX = prievado numeris(00h – 03h) INT 14h: - suaktyvina nuoseklų prievadą Įrašymas: AH = 00h AL = prievado parametrai: 7-5 bitai: 000 – 19200 bod(110 bod be FOSSIL) 001 – 38400 bod(150 bod be FOSSIL) 010 – 300 bod 011 – 600 bod 100 – 1200 bod 101 – 2400 bod 110 – 4800 bod 000 – 9600 bod 4-3 bitai – lygiškumas:01 – nelyginė, 11 lyginė, 00 arba 10 netikrinamas 2 bitas – stop bitų kiekis:0 – vienas, 1 – du 1-0 bitai – žodžio ilgis:00 – 5, 01 – 6, 10 – 7, 11 – 8 DX = prievado numeris(00h – 03h) Rezultatas: AH = prievado būsena: AL = modemo būsena: 7 bitas – taim – aut 7 bitas – yra signalas(būsena DCD) 6 bitas – išvesties registras tuščias 6 bitas – yra skabutis(RI būsena) 5 bitas – išvesties registre yra vietos 5 bitas – užklausa perdavimui(DSR būsena) 4 bitas – nustatyta būsena BREAK 4 bitas – pasirengimas perdavimui(CTS būsena) 3 bitas – sinchronizacijos klaida 3 bitas – DCD linija pakeitė būsena 2 bitas – lygiškumo klaida 2 bitas – RI linija pakeitė būsena 1 bitas – perpildymo klaida(duomenys prarasti) 1 bitas – DSR linija pakeitė būsena 0 bitas – įvesties buferyje yra duomenų 0 bitas – CTS linija pakeitė būsena INT 14h: - simbolio įrašymas į nuoseklų prievadą Įrašymas: AH = 01h AL = simbolis DX = prievado numeris(00h – 03h) Rezultatas: AH = prievado būsena INT 14h: - simbolio skaitymas iš nuoseklaus prievado su laukimu Įrašymas: AH = 02h DX = prievado numeris(00h – 03h) Rezultatas: AH = prievado būsena AL = nuskaitytas simbolis, jei 7 bitas AH bitas nulis(nebuvo taim aut) INT 14h: - sužinoti prievado būsena Įrašymas: AH = 03h DX = prievado numeris(00h – 03h) Rezultatas: AH = linijos būsena AL = modemo būsena Lygiagretus prievadas Dos 02h – simbolio spausdinimas į PRN įrenginį Įrašymas: AH = 05h DL = ASCII simbolio kodas INT 17h – simbolio spausdinimas spausdinimo įrenginyje Įrašymas: AH = 00h AL = ASCII simbolio kodas DX = lygiagretaus prievado numeris:00-lpt1, 01- lpt2, 02 – lpt3 Rezultatas: AH = spausdintuvo būsena: 7 bitas – spausdintuvas užimtas, 6 bitas – patvirtinimas, 5 bitas – nėra popieriaus, 4 bitas – spausdintuvas On line 3 bitas – IO klaida, 0 bitas – taim-aut. INT 17h – spausdintuvo perkrovimas Įrašymas: AH = 01h DX = lygiagretaus prievado numeris(00h – 02h) Rezultatas: AH = spausdintuvo būsena INT 17h – sužinoti spausdintuvo būseną Įrašymas: AH = 02h DX = lygiagretaus prievado numeris(00h – 02h) Rezultatas: AH = spausdintuvo būsena Vietoj spausdintuvo ir nuoseklaus prievado galima sėkmingai taikyti ir pertraukimus, skirtus darbui su failais: 1. BX registre yra rašomas skaičius 3, jei dirbame su nuosekliais prievadais, 2. BX registre rašomas 4, jei dirbame su lygiagrečiais prievadais. Programavimas įvesties prievadų lygyje Klaviatūra Klaviatūros kontroleris naudoja adresus nuo 60h iki 6Fh. 64h – skirtas skaitymui klaviatūros būsenos registras: 7 bitas – lygiškumo klaida perduodant duomenis iš klavitūros, 6 bitas – taim-out priimant duomenis, 5 bitas – taim-out perduodant duomenis, 4 bitas – klaviatūra užrakinta, 3 bitas – duomenys įrašyti į įvesties registrą, naudojant komandą, 2 bitas – klaviatūros testavimas baigtas, 1 bitas – įvesties registre yra duomenų(klaviatūros kontroleriui), 0 bitas – išvesties registre yra duomenų(kompiuteriui). 61h – skaitymo – rašymo registras. Jei vyriausiame jo bite 1, tai klaviatūra blokuojama, 0 – panaikinamas blokavimas. Kiti bitai valdo kitus įrenginius, todėl reikia baitą nuskaityti iš prievado, pakeisit 7 bitą ir vėl įrašyti. 60h – skaitymui. Iš jo skaitant galima gauti paskutinio nuspausto klavišo skan-kodą, čia galima gauti bet kurio klavišo paspaudimo kodą, jei klavišas atleidžiamas, tai prie paspaudimo kodo reikia pridėti 80h. 60h – rašymui. Galima rašyti tik tada, kai 64h 1 bitas yra 0, tada į 60h įrašytas skaičius interpretuojamas kaip komanda, jei komanda sudaryta iš didesnio kiekio baitų, tai kiekvieną kartą reikia laukti kol 64h 1 bitas virs 0. Pagrindinės komandos: 0EDh 0?h – keisti klaviatūros šviesos diodų būseną: 0 bitas Scroll Lock būsena(1 – įjungtas, 0 – išjungtas), 1 bitas Num Lock būsena, 2 bitas Caps Lock būsena. 0EEh – aidas – užklausa, klaviatūra atsako 0EEh kodu. 0F3h ??h – keisti automatinio kartojimo režimo parametrus: 7 bitas – 0, 6-5 bitai – nustatyti pauzę prieš pradedant automatinį kartojimą: 00b – 250 ms, 01b – 500 ms, 10b – 750 ms, 11b – 1000 ms. 4-0 bitai – nustato kartojimo greitį: 00000b – 30 01111b – 8 00010b – 24 10010b – 6 00100b – 20 10100b – 5 00111b – 16 10111b – 4 01000b – 12 11111b – 2 01100b - 10 0F4h – išjungia klaviatūrą. 0F5h – įjungia klaviatūrą. 0F6h – nustatyti klaviatūros parametrus(default). 0FEh – nusiųsti paskutinį skan kodą dar kartą. 0FFh – atlikti klaviatūros testavimą. Garsiakalbio valdymas 42h – valdo kompiuteryje įmontuotą garsiakalbiuką, t.y. į jį įrašomi skaičiai po baitą, kurie bus naudojami kaip daliklis generuojama garsiakalbio dažniui 1193180. Pavyzdžiui: įrašius skaičių 4560, garsiakalbis generuos 261 Hz dažnį(mi nata). 61h – reikia 0 ir 1 bitus nustatyti 1. Tada įjungiamas garsiakalbis. Po to būtina išjungti, nes kitaip visą laiką jis veiks. Rekomenduojama panaudoti pertraukimus valdančius pauzę: INT 15h – pauzė. Įrašymas: AH = 86h CX:DX – pauzės ilgis mikrosekundėmis(milijoninė sek.dalis). Rezultatas: AL = pertraukimų apdorojimo programos įrašytas skaičius CF = 0, jei veiksmas sėkmingas, CF = 1, jei nesėkmingai. Procedūros ir funkcijos Call proc – iškviečiama procedūra proc. Gali būti naudojamas žodis near, tada procedūra yra tame pačiame atminties segmente. Procedūra aprašoma kaip ir programa: .model tiny .code org 100h Start ;programos pradžia … ;programa ret ;programos pabaiga Proc_vardas proc near ;procedūros pradžia … ;procedūros komandos ret ;perduoti valdymą programai Proc_vardas endp ;procedūros pabaiga Data: dw ??? ;duomenų blokas end start ;visos programos pabaiga Duomenų perdavimas Pagal nurodytą reikšmę. Pavyzdžiui: mov ax, word ptr reiksme call procedura Pagal nurodytą adresą. Pavyzdžiui: mov ax, offset adresas ;duomenų bloko pradžios adresas call procedura Pagal gražinamą adresą. Pavyzdžiui: mov data_adresas, offset reiksme ;duomuo į keitimosi adresą call procedura … Procedura proc near mov bx, data_adresas ;duomens adresas mov ax, word ptr [bx] ;persiunčiamas į registrą … mov word ptr [bx], ax ;gražinama reikšmė ret Procedura endp Pagal gražinamą rezultatą. Šis būdas toks pat kaip ir ankstesnis, tik pradinė duomenų perdavimui skirtos atminties srities reikšmė neapibrėžta. Parametrų perdavimas pagal vardą. Naudojamas, kai programoje yra makro apibrėžimai. Pavyzdžiui: Vardas macro parametras mov ax, parametras endm Tada programoje parametras nurodomas taip: vardas reiksme call procedura Parametrų perdavimas nurodant jų apskaičiavimo būdą. Šiuo atveju tik nusakomas parametrų radimo būdas, o programa apskaičiavusi juos persisiunčia. Pavyzdžiui vieta masyve ir pan. Perdavimas per registrus. Juos naudoja vis DOS ir BIOS pertraukimai. Bendraujant su aukšto lygio programavimo kalbomis paprastai naudojamas AX registras. Parametrų perdavimas per globaliuosius kintamuosius. Kai pritrūksta registrų, tai programa duomenis surašo į kintamuosius. Šis būdas laikomas neefektyviu, nes lėtokas. Parametrų perdavimas steke. Parametrai sudedami į steką prieš kvietimą, po to atstatoma steko viršūnės reikšmė. Jį naudoja aukšto lygio programavimo kalbos. Pavyzdžiui: push parametras1 push parametras2 call procedura add sp, 4 ;atstatoma steko viršūnės reikšmė. Perdavimas betarpiškai programos kode. Šiuo atveju duomenys talpinami tuojau pat už komandos, kuri iškviečia procedūrą. Duomenų adresą procedūra ras steke. Aišku prieš perduodant valdymą programai procedūroje reikė įrašyti kitą grįžimo adresą, t.y. pirma komanda po duomenų. Parametrų perdavimas parametrų bloke. Tai duomenų segmentas, kur talpinami visi programos naudojami duomenys. Procedūra šį adresą gauna bet kuriuo anksčiau apršytu būdu. Pavyzdys1 . start proc near mov ah, 09h mov dx, offset pasirink ;Tekstas ekrane int 21h kas: mov ah, 08h int 21h ;Laukiame klavišo paspaudimo cmp al, "D" jne kas1 mov cl, 100b call lempute jmp short start kas1: cmp al, "N" jne kas2 mov cl, 0 call lempute jmp short start kas2: cmp al, "B" jne start ret start endp Pasirink: db "Jei spausite D uzdegsiu CapsLock lempute, jei N - uzgesinsiu, B - baigti",0Ah,0Dh,"$" ;Perjungia klaviatūros lemputes lempute proc near call lauk_bito ;laukia kol bus galima siūsti komandą mov al, 0EDh out 60h, al ;siunčiama komanda 0EDh call lauk_bito mov al, cl ;pasirinktas lempučių variantas out 60h, al ret lempute endp ;Laukia, kol bus galima perduoti duomenis lauk_bito proc near in al, 64h ;skaityk būsenos žodį test al, 0010b ;ar 2 bitas 1 jnz lauk_bito ;jei ne laukiame ret lauk_bito endp end start Pavyzdys2 .model tiny .code org 100h start: mov al, 10110110b ;2 kanalas 3 režimas out 43h, al ;įjungti mov al, 0Dh ;Jaunesnis baitas - dažnio daliklis out 42h, al mov al, 11h ;Vyresnis baitas - dažnio daliklis out 42h, al in al, 61h ;61h porto būsena or al, 00000011b ;nustatome 1 0 it 1 bitus out 61h, al ;įrašyti mov cx, 0007h ;pauzės ilgis mov dx, 0A120h ;pauzės ilgis mov ah, 86h ;pauzė int 15h in al, 61h ;išjungti garsiakabį and al, 11111100b ;nustatome 0 0 ir 1 bitams out 61h, al ret end start Neprivilegijuotos komandos Mov gav, sal – kopijuoja duomenis iš sal į gav. Push sal – perkelia sal duomenis į steką. Pop sal – perkelia į sal duomenis iš steko. Pusha – perkelia į steką registrus tokia tvarka: AX, CX, DX, BX, SP, BP, SI ir DI. Pushad – perkelia į steką registrus tokia tvarka: EAX, ECX, EDX, EBX, ESP, EBP, ESI ir EDI. Popa – perkelia iš steko registrus priešingai nei pusha. Popad – perkelia iš steko registrus priešingai nei pushad. In gav, sal – skaityti duomenis nurodyto prievado, kurio numeris yra sal – tai arba operandas arba DX, gav – tik AL, AX, EAX. Out gav, sal – rašyti duomenis į nurodytą prievadą, kurio numeris yra gav – tai arba operandas arba DX, sal – tik AL, AX, EAX. Add gav, sal – sudeda duomenis iš sal su gav atsakymas gav. Sub gav, sal – atima duomenis iš sal su gav atsakymas gav. Mul gav – daugina be ženklo duomenis gav su AL, AX EAX, atsakymas AX, DX:AX, EDX:EAX. Div gav – dalina be ženklo duomenis gav su AL, AX EAX, atsakymas AL, AX, EAX, liekana AH, DX arba EDX. Inc gav – didina gav reikšmę vienetu. Dec gav – mažina gav reikšmę vienetu. Cmp gav, sal – lygina duomenis ir keičia būsenas CF, OF, SF, AF, PF. Jmp gav – perduoda besąlygiškai valdymą į kitą programos vietą. Jcc gav – perduoda valdymą į kitą programos vietą, jei tenkinama sąlyga, pavyzdžiui po cmp įvykdymo jei sutampa vykdomas perėjimas. Loop gav – mažinama registro EAX reikšmė 1 ir vykdomas Short tipo(-128..+127) perėjimas į gav, jei ECX nelygus 0. 16 bitų bus AX ir CX. Call gav – perduoda valdymą, išsaugojant registrų reikšmes steke. Ret – gražina valdymą iškvietusiai programai: retn – skaitys iš steko žodį, kad sugrįžtu, retf – skaitys iš steko IP arba EIP ir CS grįžimo adresus.
Šį darbą sudaro 6833 žodžiai, tikrai rasi tai, ko ieškai!
★ Klientai rekomenduoja
Šį rašto darbą rekomenduoja mūsų klientai. Ką tai reiškia?
Mūsų svetainėje pateikiama dešimtys tūkstančių skirtingų rašto darbų, kuriuos įkėlė daugybė moksleivių ir studentų su skirtingais gabumais. Būtent šis rašto darbas yra patikrintas specialistų ir rekomenduojamas kitų klientų, kurie po atsisiuntimo įvertino šį mokslo darbą teigiamai. Todėl galite būti tikri, kad šis pasirinkimas geriausias!
Norint atsisiųsti šį darbą spausk ☞ Peržiūrėti darbą mygtuką!
Mūsų mokslo darbų bazėje yra daugybė įvairių mokslo darbų, todėl tikrai atrasi sau tinkamą!
Kiti darbai
Atsisiuntei rašto darbą ir neradai jame reikalingos informacijos? Pakeisime jį kitu nemokamai.
Pirkdamas daugiau nei vieną darbą, nuo sekančių darbų gausi 25% nuolaidą.
Išsirink norimus rašto darbus ir gauk juos akimirksniu po sėkmingo apmokėjimo!