Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateC
C sharpCalculatoareCorel drawDot netExcelFox pro
FrontpageHardwareHtmlInternetJavaLinux
MatlabMs dosPascalPhpPower pointRetele calculatoare
SqlTutorialsWebdesignWindowsWordXml

Lista functiilor sistemului de operare INT 21h

calculatoare



+ Font mai mare | - Font mai mic



Lista functiilor sistemului de operare INT 21h

Functiile sistem reprezinta o colectie de subrutine standard foarte performante, care pot fi chemate de un program in limbaj de asamblare prin intermediul intreruperii 21h. Diferentierea intre ele se face prin valoarea care se incarca in prealabil in registrul AH, conform tabelului de mai jos.



AH

Descriere

AH

Descriere

Citeste un caracter de la STDIN

Scrie un caracter la STDOUT

Scrie un caracter la imprimanta

Intrare/Iesire Consola

Citeste direct un caracter de la STDIN fara ecou

Citeste un caracter de la STDIN fara ecou

Scrie un sir la STDOUT

0A

Intrare bufferata

0B

Afla starea STDIN

0C

Goleste bufferul de la STDIN

0D

Reset disk

0E

Selecteaza unitatea implicita

Afla unitatea curenta implicita

Seteaza vectorul de intrerupere

2A

Afla data sistemului

2B

Seteaza data sistemului

2C

Afla ora sistemului

2D

Seteaza ora sistemului

2E

Seteaza fanionul de verificare

Afla versiunea DOS

Afla vectorul de interupere

Afla spatiul liber de pe disc

Creaza un subdirector

3A

Sterge un subdirector

3B

Seteaza directorul de lucru

3C

Creaza un fisier

3D

Deschide un fisier

3E

Inchide un fisier

3F

Citeste un fisier

Scrie un fisier

Sterge un fisier

Cauta un fisier

Afla/Seteaza atributele fisierelor

Afla directorul curent

4C

Iese din program

4D

Afla return code

Afla fanionul de verificare

Redenumeste fisierul

Afla/Seteaza data fisierului

INT 21h, 01h CITESTE UN CARACTER DE LA INTRAREA STANDARD, CU ECOU

Intrare: AH=01h.

Efect: AL = caracter citit.

Observatii:

  • ^C/^Break sunt testate;
  • ^P comuta starea fanionului intern DOS al ecoului la imprimanta;
  • ^Z nu este interpretat, asadar nu cauzeaza un EOF. Daca intrarea este redirectionata, caracterul este trimis in ecou la iesirea standard.

Vezi si: AH=06h,AH=07h,AH=08h,AH=0Ah.

INT 21h, 02h -SCRIE UN CARACTER LA IESIREA STANDARD

Intrare:AH=02h;

DL = caracter de scris.

Efect: AL = ultimul caracter iesit.

Observatii:

  • ^C/^Break sunt testate;
  • ultimul caracter iesit va fi caracterul din DL exceptie facand DL=09h la intrare, caz in care AL=20h deoarece tab-urile sunt inlocuite cu blank-uri;
  • daca intrarea standard este redirectionata intr-un fisier, nu se tine cont de nici o eroare (protectie la scriere, mediu de stocare plin, etc.).

Vezi si: AH=06h,AH=09h.

INT 21h, 05h - SCRIE UN CARACTER LA IMPRIMANTA

Intrare:AH=05h

DL = caracter de printat.

Observatii:

  • se testeaza imprimanta pentru ^C/^Break;
  • STDPRN este de obicei primul port paralel, dar poate fi redirectat sub DOS 2+ ;
  • Daca imprimanta e ocupata, aceasta functie va astepta.

Vezi si: INT 17/AH=00h.

INT 21h, 06h - IESIRE DIRECTA LA CONSOLA

Intrare: AH=06h;

DL = caracter (exceptie FFh).

Efect AL = caracter iesit.

Observatii: nu testeaza ^C/^Break.

Vezi si: AH=02h,AH=09h.

INT 21h, 06h - INTRARE DIRECTA DE LA CONSOLA

Intrare: AH = 06h;

DL = FFh.

Efect

  • ZF setat daca nu exista caracter disponibil si AL = 00h;
  • ZF sters daca exista caracter disponibil AL = caracter citit.

Observatii:

  • ^C/^Break nu sunt testate;
  • daca rezultatul returnat este 00h, utilizatorul a apasat o tasta cu un cod de tasta extins, care se va returna la urmatoarea apelare a acestei functii.
  • Desi returnarea lui AL=00h atunci cand nici un caracter nu e disponibil nu este documentata, unele programe se bazeaza pe acest comportament.

Vezi si: AH=0Bh.

INT 21h, 07h - INTRAREA DIRECTA A UNUI CARACTER, FARA ECOU

Intrare: AH=07h;

Efect AL = caracter citit de la intrarea standard.

Observatii: nu testeaza ^C/^Break.

Vezi si: AH=01h,AH=06h,AH=08h,AH=0Ah.

INT 21h, 08h - INTRARE CARACTER FARA ECOU

Intrare: AH=08h;

Efect: AL = caracter citit de la intrarea standard.

Observatii: ^C/^Break sunt testate.

Vezi si: AH=01h,AH=06h,AH=07h,AH=0Ah,AH=64h.

INT 21h, 09h - SCRIE UN SIR LA IESIREA STANDARD

Intrare: AH=09h;

DS:DX -> sir terminat cu '$'.

Efect: AL = 24h.

Observatii: ^C/^Break sunt testate.

Vezi si: AH=02h,AH=06h'OUTPUT'.

INT 21h, 0Ah - INTRARE BUFFERATA

Intrare: AH=0Ah;

DS:DX -> buffer (vezi mai jos).

Efect: buffer umplut cu informatia introdusa de utilizator.

Observatii:

  • ^C/^Break sunt testate ;
  • citeste de la intrarea standard.

Vezi si: AH=0Ch.

Formatul buffer-ului de intrare DOS:

Index

Marime

Descriere

Numarul maxim de caractere ce pot intra in buffer

Numarul maxim de caractere de de la ultima intrare care pot fi rechemate sau numarul de caractere din citirea actuala, fara CR

N

Caracterul actual citit, incluzand CR-ul final

INT 21h, 0Bh - AFLA STAREA STDIN (Intrare standard)

Intrare: AH=0Bh;

Efect:

  • AL = 00h daca nu exista caracter disponibil;
  • AL = FFh daca caracterul este disponibil.

Observatii: ^C/^Break sunt testate.

Vezi si: AH=06h'INTRARE'.

INT 21h, 0Ch - GOLESTE BUFFERUL SI CITESTE DE LA INTRAREA STANDARD

Intrare:

AH=0Ch;

  • AL = functiea de executat dupa golirea bufferului;
  • celelalte registre corespunzatoare functiei de intrare.

Efect: corespunzator functiei de intrare specificate.

Observatie: daca AL nu are una dintre valorile 01h,06h,07h,08h, sau 0Ah, bufferul e golit dar nu este asteptata nici o intrare.

Vezi si: AH=01h,AH=06h'INTRARE',AH=07h,AH=08h,AH=0Ah.

INT 21h, 0Dh - RESETAREA DISCULUI

Intrare: AH=0Dh;

Observatii: Aceasta functie scrie pe disc toate bufferele modificate, dar nu actualizeaza informatia directoarelor.

Vezi si: AX=5D01h.

INT 21h, 0Eh - SELECTEAZA UNITATEA IMPLICITA

Intrare: AH=0Eh

DL = noua unitate implicita (0=A:, 1=B:, etc).

Efect: AL = numarul unitatilor potential valide.

Observatii: valoarea intoarsa reprezinta valoarea corespunzatoare ultimei unitati prezente.

Vezi si: AH=19h,AH=3Bh,AH=DBh.

INT 21h, 19h - AFLA UNITATEA CURENTA IMPLICITA

Intrare: AH=19h;

Efect: AL = unitate (0=A:, 1=B:, etc).

Vezi si: AH=0Eh,AH=47h,AH=BBh.

INT 21h, 25h - SETEAZA VECTORUL DE INTRERUPERE

Intrare:

  • AH=25h;
  • AL = numarul intreruperii;
  • DS:DX -> noua tratare a intreruperii.

Observatii: aceasta functie este de preferat modificarii directe a tabelei vectorilor de intrerupere.

Vezi si: AX=2501h,AH=35h.

INT 21h, 2Ah - AFLA DATA SISTEMULUI

Intrare: AH=2Ah;

Efect: CX = an (1980-2099) DH = luna DL = zi AL = zi a saptamanii (00h=Duminica).

Vezi si: AH=2Bh'DOS',AH=2Ch,AH=E7h.

INT 21h, 2Bh - SETEAZA DATA SISTEMULUI

Intrare: AH=2Bh;

CX = an (1980-2099) DH = luna DL = zi.

Efect:

  • AL = 00 operatie reusita;
  • FFh data invalida, data sistemului neschimbata.

Observatie: DOS 3.3+ seteaza deasemenea ceasul din CMOS;

Vezi si: AH=2Ah,AH=2Dh.

INT 21h, 2Ch - AFLA ORA SISTEMULUI

Intrare: AH=2Ch;

Efect: CH = ora CL = minute DH = secunde DL = 1/100 secunda.

Observatie: pe majoritatea sistemelor, rezolutia ceasului sistem este de 5/100sec, asa ca valoarea lui DL nu se incrementeaza cu 1 pe unele sisteme, acesta returnand intotdeauna 00h.

Vezi si: AH=2Ah,AH=2Dh,AH=E7h.

INT 21h, 2Dh - SETAREA OREI SISTEMULUI

Intrare: AH=2Dh;

CH = ora CL = minute DH = secunde DL = 1/100 secunda.

Efect:

  • AL = 00h operatiune reusita;
  • FFh daca valoarea este invalida, ora sistemului ramane neschimbata.

Observatie: De la DOS 3.3 in sus , functia seteaza si ceasul din CMOS.

Vezi si: AH=2Bh'DOS',AH=2Ch.

INT 21h, 30h - AFLA VERSIUNEA DE DOS

Intrare: AH=30h;

AL = ce sa intoarca in BH (00h OEM numar, 01h localizarea sistemului de operare).

Efect:

  • AL = numarul superior al versiunii (00h daca DOS 1.x);
  • AH = numarul inferior al versiunii;
  • BL:CX = seria utilizatorului pe 24-biti (majoritatea versiunilor nu folosesc aceasta) daca DOS <5 or AL=00h;
  • BH =Numar furnizorului sistemului daca DOS 5+ si AL=01h;
  • BH = Localizarea sistemului: 08h in ROM, 10h in XMA.

Observatii:

  • DOS 4.01 si 4.02 se identifica ca versiune 4.00;
  • MS-DOS 6.21 raporteaza versiunea ca 6.20; versiunea 6.22 returneaza valoarea corecta;
  • Windows95+ returneaza versiunea 7.00 ( MS-DOS-ul asociat).

Vezi si: AX=3000h/BX=3000h,AX=3306h,AX=4452h.

INT 21h, 35h - AFLA VECTORUL DE INTRERUPERE

Intrare: AH=35h;

AL = numarul intreruperii.

Efect: ES:BX -> tratarea intreruperii curente.

Vezi si: AH=25h,AX=2503h.

INT 21h, 36h - AFLA SPATIUL LIBER DE PE DISC

Intrare: AH=36h;

DL = numarul unitatii (0=implicit, 1=A:, 2=B:,3=C:,etc).

Efect:

  • AX = FFFFh daca unitatea este invalida;
  • AX = sectoare per cluster BX = numarul de clustere libere CX = bytes per sector DX = numar total de clusteri per unitate.

Observatii:

  • spatiul liber pe unitate in bytes este AX * BX * CX ;
  • spatiul total pe unitate in bytes este AX * CX * DX;
  • clusterii indisponibili sunt considerati a fi utilizati ;
  • aceasta functie nu da rezultate corecte pe unitatile CD-ROM; folositi in schimb AX=4402h pentru CD-ROM.

Vezi si: AH=1Bh,AH=1Ch,AX=4402h'CD-ROM'.

INT 21h, 39h - CREEAZA UN DIRECTOR

Intrare: AH=39h;

DS:DX -> ASCIIZ numele caii.

Efect:

  • CF sters daca AX a fost sters;
  • CF setat in caz de eroare AX = cod eroare (03h,05h).

Observatii:

  • Tooate directoarele din calea data trebuie sa existe, mai putin ultimul;
  • esueaza daca directorul parinte este radacina si este plin;
  • DOS 2.x-3.3 permite crearea unui director suficient de indepartat in structura arborescenta de directoare, dar nu din directorul curent daca calea depaseste 64 de caractere.

Vezi si: AH=3Ah,AH=3Bh,AH=6Dh.

INT 21h, 3Ah - STERGE DIRECTORUL

Intrare: AH=3Ah;

DS:DX -> ASCIIZ calea directorului de sters.

Efect:

  • CF sters daca AX a fost sters;
  • CF setat in caz de eroare AX = cod eroare (03h,05h,06h,10h).

Observatii: directorul trebuie sa fie gol (sa contina numai intrari '.' si '..' ).

Vezi si: AH=39h,AH=3Bh.

INT 21h, 3Bh - SCHIMBA DIRECTORUL CURENT

Intrare: AH=39h;

DS:DX -> ASCIIZ calea directorului ce va deveni curent (maxim 64 bytes)

Efect:

  • CF sters daca AX a fost sters
  • CF setat in caz de eroare AX = cod eroare (03h)

Observatii: daca numele directorului include litera unei unitati, unitatea curenta nu este schimbata ci numai directorul curent pe unitatea respectiva.

Vezi si: AH=47h,AH=71h,INT 2F/AX=1105h.

INT 21h, 3Ch - CREAZA SAU TRUNCHEAZA FISIERUL

Intrare:

  • AX=3Ch
  • CX = atribute fisier;
  • DS:DX -> ASCIIZ nume fisier.

Efect:

  • CF sters daca a reusit, AX = tratare fisier;
  • CF setat in caz de eroare, AX = cod eroare (03h,04h,05h).

Observatii: daca un fisier cu numele dat exista este trunchiat la dimensiunea zero.

Vezi si: AH=16h,AH=3Dh,AH=5Ah,AH=5Bh.

INT 21h, 3Dh - DESCHIDE FISIERUL EXISTENT

Intrare:

AX=3Dh;

AL = modurile de acces si partajare:

Bit 0..2: Modul de acces:

000 = numai citire;

001= numai scriere;

010 = citire/scriere.

Bit 3: rezervat;

Bit 4..6: Modul de partajare:

000 = modul compatibil;

001 = numai programul curent are acces;

010 = interzice scrierea (alte programe pot doar citi fisierul);

011 = interzice citirea (alte programe pot doar sa scrie in fisier);

100 = permite totul (alte programe pot scrie si citi fisierul).

Bit 7: Se mostenesc proprietatile.

DS:DX -> ASCIIZ nume fisier.

Efect:

  • CF sters daca a reusit, AX = tratare fisier;
  • CF setat in caz de eroare AX = cod eroare (01h,02h,03h,04h,05h,0Ch,56h);

01h = nu exista software pentru partajare;

02h = fisierul nu este gasit;

03h = calea nu este gasita sau fisierul nu exista;

04h = nu exista program de tratare a fisierului;

05h = accesul interzis;

0Ch = modul de acces specificat nu este permis.

Observatii:

  • Indicatorul fisierului este setat la inceputul fisierului;
  • Fisierele trunchiate mostenesc de la fisierul parinte din care au fost trunchiate; restrictiile de acces si partajare;
  • fisierele pot fi deschise chiar daca li se dau atribute hidden sau system.

Vezi si: AH=0Fh,AH=3Ch,AX=4301h,AX=5D00h.

INT 21h, 3Eh - INCHIDE FISIERUL

Intrare: AH=3Eh;

BX = tratare fisier

Efect:

  • CF sters daca a reusit, AX sters;
  • CF setat in caz de eroare, AX = cod eroare (06h).

Observatie: odata ce fisierul a fost scris, etichetele cu timpul si data creerii fisierului sunt actualizate la valorile curente, iar intrarea in director este reactualizata.

Vezi si: AH=10h,AH=3Ch,AH=3Dh.

INT 21h, 3Fh - CITESTE DIN FISIER SAU DISPOZITIV

Intrare:

  • AH=3Fh;
  • BX = nume fisier;
  • CX = numar bytes de citit;
  • DS:DX -> buffer de date.

Efect:

  • CF sters daca operatiunea a reusit - AX = numar de bytes cititi (0 daca EOF apare inaintea chemarii functiei);
  • CF setat in caz de eroare AX = cod eroare (05h,06h).

Observatii:

  • datele sunt citite incepand de la locatia curenta din fisier, iar pozitia locatiei curente este reactualizata dupa o citire reusita;
  • rezultatul returnat in AX poate fi mai mic decat cel solicitat in CX daca survine o citire partala;
  • daca se citeste de la CON, citirea se opreste la primul CR.

Vezi si: AH=27h,AH=40h,AH=93h.

INT 21h, 40h - SCRIE INTR-UN FISIER SAU DISPOZITIV

Intrare:

  • AH=40h;
  • BX = nume fisier;
  • CX = numar bytes de scris;
  • DS:DX -> date de scris.

Efect:

  • CF sters daca operatiunea a reusit -AX = numar de bytes scris la actuala scriere;
  • CF setat in caz de eroare - AX = cod eroare (05h,06h).

Observatii:

  • Daca CX este zero, datele nu sunt scrise, iar fisierul este trunchiat sau extins pana la pozitia curenta;
  • datele sunt scrise incepand de la pozitia curenta, iar pozitia in fisier este reactualizata dupa fiecare scriere reusita;
  • cauza uzuala pentru care se returneaza AX < CX este lipsa de spatiu liber pe disc.

Vezi si: AH=28h,AH=3Fh.

INT 21h, 41H - STERGE FISIERUL

Intrare:

  • AH=41h;
  • DS:DX -> ASCIIZ nume fisier;
  • CL = masca atributului fsierului de sters.

Efect:

  • CF sters daca operatiunea a reusit, AX sters;
  • CF setat in caz de eroare, AX = cod eroare (02h,03h,05h).

Observatii:

  • (DOS 3.1+) caracterele de inlocuire sunt permise daca sunt apelate via AX=5D00h, caz in care specificatiile fisierului trebuie sa fie valide (cum sunt citite cu functia AH=60h), si numai fisierele a caror atribute se potrivesc cu masca atributelor din CL sunt sterse;
  • DOS nu sterge datele din fisier; pur si simplu fisierul devine inaccesibil deoarece lantul de locatii asociate fisierului este sters din FAT;
  • stergerea unui fisier deschis poate conduce la erori in sistemul de fisiere.

Vezi si: AH=13h,AX=4301h,AX=4380h,AX=5D00h,AH=60h,AH=71h.

INT 21h, 42h - SETEAZA POZITIA CURENTA IN FISIER

Intrare:

  • AH=42h;
  • AL =originea deplasarii: 00h inceputul fisierului 01h pozitia curenta in fisier 02h sfarsitul fisierului;
  • BX = nume fisier;
  • CX:DX = deplasarea (CX octetul mai semnificativ, DX octetul mai putin semnificativ).

Efect:

  • CF sters daca operatiunea a reusit, DX:AX = noua pozitie in fisier in bytes de la inceputul fisierului ;
  • CF setat in caz de eroare, AX = cod eroare (01h,06h).

Observatii:

  • Pentru originile 01h si 02h, deplasarea este un numar cu semn, deci indicatorul ar putea fi pozitionat inaintea inceputului fisierului; nici o eroare nu este semnalata in acest caz, dar incercarile ulterioare de intrare/iesire vor produce erori;
  • daca noua pozitie este dincolo de sfarsitul fisierului, fisierul va fi extins la urmatoarea scriere (vezi AH=40h).

Vezi si: AH=24h.

INT 21h, 43 - AFLA ATRIBUTELE FISIERULUI

Intrare:

  • AH=43h;
  • AL = 00h;
  • DS:DX -> Nume fisier (ASCIIZ).

Efect:

  • CF sters daca operatiunea a reusit, CX = atributele fisierului;
  • CF setat in caz de eroare, AX = cod eroare (01h,02h,03h,05h).

Observatie: Windows for Workgroups returneaza cod eroare 05h (acces nepermis) in locul codului de eroare 02h (fisierul nu a fost gasit) atunci cand se incearca aflarea atributelor unui fisier inexistent.

Vezi si: AX=4301h,AX=4310h,AX=7143h,AH=B6h.

INT 21h, 43 - SETEAZA ATRIBUTELE FISIERULUI

Intrare:

  • AH=43h;
  • AL = 01h;
  • CX = noile atribute fisier;
  • DS:DX -> Nume fisier (ASCIIZ).

Efect:

  • CF sters daca operatiunea a reusit, AX sters;
  • CF setat in caz de eroare, AX = cod eroare (01h,02h,03h,05h).

Observatii:

  • nu va schimba eticheta de volum a directorului sau bitii atributelor; directorului, dar va schimba alti biti ai atributelor din director;
  • MS-DOS 4.01 raporteaza fisierul inchis daca acesta era deschis.

Vezi si: AX=4300h,AX=4311h,AX=7143h,INT 2F/AX=110Eh.

Campul bitilor pentru atributele fisierelor:

Biti

Descriere

Partajabil

arhiva

director

eticheta  volum

sistem

ascuns

numai citire

INT 21h, 47h - AFLA DIRECTORUL CURENT

Intrare:

  • AH=47h;
  • DL = numar unitate (00h = implicit, 01h = A:, etc);
  • DS:SI -> buffer de 64 bytes pentru numele caii (ASCIIZ ).

Efect:

  • CF sters daca operatiunea a reusit;
  • CF setat in caz de eroare, AX = cod eroare (0Fh).

Observatii:

  • Calea returnata nu include unitatea sau primul backslash;
  • Multe din produsele Microsoft Windows se bazeaza pe faptul ca AX devine 0100h cand operatiunea a reusit.

Vezi si: AH=19h,AH=3Bh,AH=71h.

INT 21h, 4Ch - IESIRE CU COD DE FINALIZARE

Intrare:

  • AH=4Ch;
  • AL = cod finalizare.

Efect: nu se mai intoarce.

Observatii: in afara cazului in care procesul este propriul sau parinte, toate fisierele sunt inchise si toata memoria apartinind procesului este eliberata.

Vezi si: AH=00h,AH=26h,AH=4Bh,AH=4Dh.

INT 21h, 4Dh - AFLA CODUL RETURNAT (NIVELUL ERORII)

Intrare: AH=4Dh;

Efect:

  • AH = tip terminare (00=normal, 01h control-C abandon, 02h=abandon eroare critica, 03h termina si ramane resident);
  • AL = codul returnat.

Observatii:

  • Locatia in care sistemul DOS stocheaza codul returnat este stearsa dupa ce a fost citita de aceasta functie, asadar codul returnat poate fi aflat o singura data;
  • COMMAND.COM stocheaza codul returnat la ultima comanda externa, ca nivel al erorii

Vezi si: AH=4Bh,AH=4Ch,AH=8Ah.

INT 21h, 54h - AFLA STAREA FANIONULUI DE VERIFICARE

Intrare: AH=54h;

Efect:

  • AL = fanion de verificare (00h=off, 01h=on, deci toate scrierile pe disc sunt verificate dupa scriere).

Vezi si: AH=2Eh.

INT 21h, 56h - REDENUMESTE FISIERUL

Intrare:

  • AH=56h;
  • DS:DX -> Numele existent al fisierului (ASCIIZ fara caractere speciale);
  • ES:DI -> Noul nume al fisierului (ASCIIZ fara caractere speciale);
  • CL = masca atributelor.

Efect:

  • CF sters daca operatiunea a reusit;
  • CF setat in caz de eroare, AX= cod eroare (02h,03h,05h,11h).

Observatii:

  • Permite mutarea intre directoare cu acelasi volum logic;
  • aceasta functie nu seteaza atributul arhiva;
  • fisierele deschise nu vor fi redenumite;
  • (DOS 3.0+) permite redenumirea directoarelor.

INT 21h, 57h - AFLA DATA ULTIMEI SCRIERI IN FISIER

Intrare:

  • AH=57h;
  • AL = 00h (Afla attributele);
  • BX = nume fisier.

Efect:

  • CF sters daca operatiunea a reusit, CX = file's time DX = file's date;
  • CF setat in caz de eroare, AX = cod eroare (01h,06h).

Vezi si: AX=5701h.

Campul bitilor pentru ora crearii fisierului:

Biti

Descriere

ora

minutul

secunda

Campul bitilor pentru data crearii fisierului:

Biti

Descriere

anul (1980-)

luna

ziua

INT 21h, 57h - SETAREA DATEI ULTIMEI SCRIERI IN FISIER

Intrare:

  • AH=57h;
  • AL =01h (Seteaza atributele);
  • BX = nume fisier;
  • CX = noua ora;
  • DX = noua data.

Efect:

  • CF sters daca operatiunea a reusit;
  • CF setat in caz de eroareAX = cod eroare (01h,06h).

Vezi si: AX=5700h.

ANEXA 4

Rezolvarile programelor

Programul 2.1

.model small

.stack 100h

.code

start: mov al,99h

mov bl,0AAh

mov cl,0BBh

mov dl,0CCh

; terminate program

term: jmp term

end start


Programul 2.2

.model small

.stack 100h

.code

start: mov al,22h

mov bl,al

mov bh,al

mov cl,al

mov dh,al

; terminate program

term: jmp term

end start


Programul 2.3

.model small

.stack 100h

.code

start: mov ax,1122h

mov bx,3344h

mov cx,5566h

mov dx,7788h

term: jmp term

end start


Programul 2.4

.model small

.stack 100h

.code

start: mov bx,1122h

mov cx,3344h

mov dx,bx

mov ax,cx

term: jmp term

end start


Programul 2.5

.model small

.stack 100h

.code

start: mov ax,1234h

mov ds,ax

mov dx,5678

term: jmp term

end start


Programul 2.6

.model small

.stack 100h

.code

start:

mov al,99h

mov bh,0AAh

mov ah,al

mov al,bh

mov bh,ah

term: jmp term

end start


Programul 2.7

.model small

.stack 100h

.code

start:

mov al,11h

mov bl,22h

mov cx,3344h

mov dx,5566h

xchg al,bl

xchg cx,dx

term: jmp term

end start


Programul 2.8

.model small

.stack 100h

.code

start: mov al,0AAh

mov ah,0BBh

mov bl,0CCh

mov bh,0DDh

xchg al,ah

xchg ah,bl

xchg bl,bh

term: jmp term

end start


Programul 2.9

.model small

.stack 100h

.code

start:

mov ax,1122h

mov bx,3344h

mov cx,5566h

mov dx,7788h

add al,66h

add al,bl

sub al,cl

sub al,22h

add al,bl ;Rezultatul este in AL

add al,cl ;si se aduna cu termenul al treilea

add al,dl ;si apoi cu al patrulea

; Se va observa ca la ultima adunare (EEh+88h) apare carry

term: jmp term

end start


Programul 2.10

.model small

.stack 100h

.code

start:

mov ax,1122h

mov bx,3344h

mov cx,5566h

mov dx,7788h

add ax,6666h

add ax,bx

sub ax,cx

sub ax,22h

add ax,bx ;Rezultatul este in AL

add ax,cx ;si se aduna cu termenul al treilea

add ax,dx ;si apoi cu al patrulea

; Se va observa ca la ultima adunare (DDEEh+7788h) apare carry

term: jmp term

end start


Programul 2.11

.model small

.stack 100h

.code

start: mov ax,1122h

mov bx,3344h

mov cx,5566h

mov dx,7788h

add bx,dx ;NU apare transport

adc ax,cx ;deci urmatoarea adunare NU necesita

;sa-l includa si pe acesta

;Corect este totusi sa se tina seama de aceasta ;eventualitate

term: jmp term

end start


Programul 2.12

.model small

.stack 100h

.code

start:

mov ax,5566h

mov bx,7788h

mov cx,99AAh

mov dx,0BBCCh

add bx,dx ;Apare transport

adc ax,cx ;deci urmatoarea adunare va trebui

;sa-l includa si pe acesta

term: jmp term

end start


Programul 2.13

.model small

.stack 100h

.code

start:

mov ax,5566h

mov bx,7788h

mov cx,1122h

mov dx,3344h

sub bx,dx ;Nu apare imprumut

sbb ax,cx ;totusi corect este ca urmatoarea ;scadere sa-l includa si pe acesta

term: jmp term

end start


Programul 2.14

.model small

.stack 100h

.code

start:

mov ax,2233h

mov bx,4455h

mov cx,6677h

mov dx,8899h

sub bx,dx ;Apare imprumut

sbb ax,cx ;deci urmatoarea scadere va trebui

;sa-l includa si pe acesta

term: jmp term

end start


Programul 3.1

.model small

.stack 100

.code

start: mov al,22

MOV BX,0

MOV bx[20],al

MOV DS:[30],al

term: jmp term

end start


Programul 3.2

.model small

.stack 100h

.code

start: mov al,22h

MOV BX, 10h

MOV [bx],al

mov bx,30h

MOV [bx],al

mov bp,120h ;Pentru segmentul de stiva se face

mov [bp],al ;adresarea prin intermediul BP

term: jmp term

end start


Programul 3.3

.model small

.stack 100h

.code

start: mov ax,3344h

MOV BX, 20h

MOV [bx],al

term: jmp term

end start


Programul 3.4

.model small

.stack 100

.code

start: MOV BX,0

MOV [bx+20h],1122h

MOV [BX+30h],byte ptr 44h

term: jmp term

end start

Programul 3.5

.radix 16

.model small

.stack 100

.code

start: mov ax,33EEh

MOV BX,0

MOV [bx+30h],ax

mov al,22h

mov ah,0

add [bx+30h],ax

term: jmp term

end start

Programul 3.6

.radix 16

.model small

.stack 100

.code

start: mov bx,0

mov word ptr [bx+10], 44; Specifica 2 octeti

add [bx+10],122 ;pentru a aduna pe 2 octeti

term: jmp term

end start

Programul 3.7

.radix 16

.model small

.stack 100

.code

start: mov al,44

mov word ptr ds:[30], al ; Nu s-a folosit nici

add ds:[30],122;un registru pt adresare indirecta

;S-au folosit adresari imediate

term: jmp term

end start

Programul 3.8

.radix 16

.MODEL SMALL

.STACK 100H

.CODE

Start:

mov ch,ds:[10]

mov dx,ds:[11]

mov ds:[20],byte ptr 22

mov ds:[21],word ptr 8877

mov ds:[30],ch

mov ds:[31],dx

; S-au folosit adresari imediate (nerecomandat)

term:

jmp term

END Start

SAU:

.radix 16

.MODEL SMALL

.STACK 100H

adr equ 0

.CODE

Start:

mov ch,ds:[adr+10]

mov dx,ds:[adr+11]

mov ds:[adr+20],byte ptr 22

mov ds:[adr+21],word ptr 8877

mov ds:[adr+30],ch

mov ds:[adr+31],dx

;Avantajul este ca modificand valoarea adr se ;translateaza intreaga structura unde se doreste

term: jmp term

END Start


Programul 3.9

.radix 16

.MODEL SMALL

.STACK 100H

.data

dateo db 11,22 ;se declara 2 locatii de 1 octet

datec dw 4455,6677 ;se declara 2 locatii de 2 octeti

.code

Start:

mov ax,@data

mov ds,ax

mov al,dateo ; Desi nu apar paranteze drepte,dateo

add al,date0+1;simbolizeaza continutul unei locatii

mov bx,datec ;de memorie, iar datec continutul a

add bx,datec+2;doua locatii de memorie

mov ah,0

sub bx,ax

term:

jmp term

END Start

Programul 3.10

.radix 16

.MODEL SMALL

.STACK 100H

.data

adr1 dw ?

.CODE

Start:

mov ax,@data; Aceste 2 instructiuni nu sunt ;obligatorii pentru ca nu se declara

mov ds,ax ;date numerice initiale

mov ax,8899

mov cx,2211

mov dl,10

mov bx,20

mov adr1,ax ;Salveaza continutul initial al lui AX

add ax,cx

mov dh,0 ;Pentru adunarea cu BX a lui DX=0010

add bx,dx

mov [bx],ax

mov ax,adr1

sub ax,cx

mov [bx+2],ax; Primul rezultat a fost de 2 octeti

term:

jmp term

END Start

Programul 3.11

.radix 16

.MODEL SMALL

.STACK 100H

.data

adr1 dw ?

.CODE

Start:

mov ax,@data; Aceste 2 instructiuni nu sunt ;obligatorii pentru ca nu se declara

mov ds,ax ;date numerice initiale

mov ax,1122

mov bx,3344

mov cx,5566

mov dx,7788

mov adr1,ax

;sau mov DS[0],ax

;sau mov [bx],ax ;se scrie in locatia [3344]

mov ax,bx

mov bx,cx

mov cx,dx

mov dx,adr1

term:

jmp term

END Start

Programul 3.12

.radix 16

.MODEL SMALL

.STACK 100H

.CODE

Start:

mov bx,10

mov al,1

mov [bx],al

inc al

inc bx

mov [bx],al

inc al

inc bx

mov [bx],al

inc al

inc bx

mov [bx],al

term: jmp term

END Start

Programul 3.13

.radix 16

.MODEL SMALL

.STACK 100H

.CODE

Start:

mov bx,10

mov ax,1000

mov [bx],ax

inc ax

inc bx ;AX ocupa 2 locatii consecutive

inc bx ;deci BX trebuie marit cu 2

mov [bx],ax

inc ax

inc bx

inc bx

mov [bx],ax

inc ax

inc bx

inc bx

mov [bx],ax

term: jmp term

END Start

Programul 3.14

.radix 16

.MODEL SMALL

.STACK 100H

.CODE

Start:

mov bx,10

mov al,5

mov [bx],al

add al,5

inc bx

mov [bx],al

add al,5

inc bx

mov [bx],al

add al,5

inc bx

mov [bx],al

term: jmp term

END Start

Programul 3.15

.radix 16

.MODEL SMALL

.STACK 100H

.CODE

Start:

mov bx,10

mov ax,201

mov [bx],ax

add ax,201

inc bx

inc bx

mov [bx],ax

add ax,201

inc bx

inc bx

mov [bx],ax

add ax,201

inc bx

inc bx

mov [bx],ax

term: jmp term

END Start

Programul 4.1

.MODEL SMALL

.STACK 100H

.CODE

Start:

mov ax,1122

mov bx,3344

mov cx,5566

mov dx,7788

push ax

push bx

push cx

push dx

pop cx ;La POP, stiva furnizeaza informatia

pop bx ;in ordine inversa fata de PUSH

pop ax ;dupa principiul 'Last In-First Out'

pop dx

term: jmp term

END Start

Programul 4.3

.radix 16

.MODEL SMALL

.STACK 100H

.data

sursa dw 1122,3344,5566

dest dw 3 DUP(?)

.CODE

Start:

mov ax,@data

mov ds,ax

mov ax,sursa

mov dest,ax

mov ax,sursa+2 ; Fusesera ocupate 2 locatii

mov dest+2,ax ;deci s-a avansat cu 2 in memorie

mov ax,sursa+4

mov dest+4,ax

term: jmp term

END Start

Programul 4.4

.Radix 16

.Model small

.Stack 100h

.Data

sir DB 1,2,3,4,5,6,7,8,9,0a

.Code

start: mov ax,seg sir; Se putea folosi si MOV AS,@data

mov ds,ax

mov al,sir

mov ah,sir+9

mov sir+9,al

mov sir,ah

mov al,sir+1

mov ah,sir+8

mov sir+8,al

mov sir+1,ah

term: jmp term

end start

Programul 4.5

.radix 16

.model small

.stack 100h

.data

tabela1 db 13,14,15,16,1,2,3,4,5

.code

start: mov ax,@data ;Adresa segmentului de date

mov ds,ax ;se incarca in DS

mov bx,0

mov al,5

xlat

mov dl,al

;Indexarea incepe de la 0 deci elementul 5 are valoarea 2

mov al,8

xlat

mov dh,al

;Indexarea incepe de la 0 deci elementul 8 are valoarea 5

term: jmp term

end start

Programul 4.6

.radix 16

.model small

.stack 100h

.code

start:

les ax,ds:10

; Se va observa efectul asupra lui ES si AX in functie

;de datele existente initial in memorie incepand de la ;adresa 10h.

term: jmp term

end start

Programul 4.7

.radix 16

.model small

.stack 100h

.data

adresa1 db 13,14,15,1,2,3

adresa2 db 16,17,18,19

.code

start: mov ax,@data ;Adresa segmentului de date

mov ds,ax ;se incarca in DS

lea bx,adresa1 ;In DI se va afla offset-ul in ;memoria de date al sirului

;notat 'adresa1' (in acest caz 06)

mov al,[bx+2] ;Transfera din a treia locatie a ;sirului in AL

lea bx,adresa2 ;Noua adresa efectiva

mov ah,[bx+3] ;de la care este luat 19h

mov [bx+3],al ;si la care este trimis 15h

lea bx,adresa1 ;Adresa efectiva unde trebuie

mov [bx+2],ah ;trimis 19h

term: jmp term

end start

Programul 5.1

.radix 16

.model small

.stack 100h

.code

start:

mov al,11

mov bx,10

mov cl,33

mov dl,44

mov [bx],byte ptr 99; Transfer pe 1 octet

add al,cl

adc al,dl;In cazul general, putea sa apara CY

sub [bx],al ;Rezultatul in memorie la [bx]

mov al,[bx]

mov [bx+1],al ;Se trimite la [bx+1]

term: jmp term

end start

Programul 5.2

.radix 16

.model small

.stack 100h

.code

start:

mov ax,1122

mov bx,10

mov cx,3344

mov dx,5566

mov [bx],0AABBh

add ax,cx

adc ax,dx; In cazul general, putea sa apara CY

sub [bx],ax

mov ax,[bx]

mov [bx+2],ax ;Rezultatul era pe 2 octeti

term: jmp term

end start

Programul 5.3

.radix 16

.model small

.stack 100h

.code

start:

mov al,9

mov bl,19

mov cl,29

inc al

inc bl

inc cl

mul bl

mov ch,0 ;Pregatim CX pentru inmultire cu rezultat

mul cx ;de 16 biti

term: jmp term

end start

Programul 5.4

.radix 16

.model small

.stack 100h

.data

rez dw 2 dup(?); 4 locatii pentru rezultat c251ec98

temp dw 2 dup(?); salvari temporare de registre

.code

start:

mov ax,@data

mov ds,ax

mov bx,1122

mov cx,5566

mov dx,22

mov temp,dx ;temp =22

mov ax,bx

mul cx ;Rezultat in DX:AX=05b71d8c

mov temp+2,dx;Stocheaza dx la temp+2=05b7

mov bx,temp ;Reface bx=22

mul bx ;Inmulteste ax=1D8C cu 22

mov rez+2,ax ;Stocheaza in ultimii 2 octeti ax

mov rez,dx ;si in primii 2 octeti dx

mov ax,temp+2;Pregateste 05B7

mul bx ;si inmulteste cu 22

add rez,ax ;aduna rezultatul la primii 2 octeti

term:

jmp term

end start

Programul 5.5

.radix 16

.model small

.stack 100h

.data

tempw dw ?; locatie temporara pentru 1 word

tempb db ?; locatie temporara pentru 1 byte

.code

start: mov ax,@data

mov ds,ax

mov cx,6655

mov bl,44

mov dl,22

mov tempb,dl; Impartirea se face cu 16 biti

mov dx,0 ;deci trebuie adus DX la 0

mov ax,cx ;formand cu AX deimpartitul

mov bh,0 ;pregateste cei 16 biti

div bx ;ai impartitorului

mov tempw,dx;tempw=restul

mov dl,tempb;reface DL

mul dl ;Si inmulteste cu catul

adc ax,tempw;iar rezultatul cu CY aduna la rest

term: jmp term

end start

Programul 6.1

.radix 16

.model small

.stack 100h

.code

start:

mov ax,0EEEEh

and ax,0F

term: jmp term

end start

Programul 6.2

.radix 16

.model small

.stack 100h

.code

start:

mov ax,0EEEEh

or ax,1111111100001111b

term: jmp term

end start

Programul 6.3

.radix 16

.model small

.stack 100h

.code

start:

mov bl,10100110b; Valoare initiala BL

mov cl,00011111b; Valoare initiala CL

and bl,00001100b; Separa bitii 2 si 3 din BL

and cl,11110011b; Bitii omologi din CL anulati

or cl,bl ; Combina rezultatele

term: jmp term

end start

Programul 6.4

.radix 16

.model small

.stack 100h

.code

start: mov dl,05 ;Valoarea initiala a lui DL

mov al,0 ;Pregateste AL pentru a prelua CARRY

mov bx,0 ;Pregateste pointerul in memorie

ror dl,1 ;Rotire dreapta. Bitul 0 in CARRY

adc al,0 ;Aduna cu CARRY. Rezulta AL=CARRY

mov [bx],al;Trimite in prima locatie

xor al,al ;Sterge AL pentru urmatorul CARRY

;procesul se repata pentru celelalte 3 locatii

ror dl,1

adc al,0

mov [bx+1],al

xor al,al

ror dl,1

adc al,0

mov [bx+2],al

xor al,al

ror dl,1

adc al,0

mov [bx+3],al

term: jmp term

end start

Programul 6.5

.radix 16

.model small

.stack 100h

.code

start:

mov bl,12 ;Valoarea initiala a lui BL

mov ch,56 ;Valoarea initiala a lui CH

mov al,bl ;Copii de lucru in

mov dh,ch ;AL si DH

and al,0Fh ;Ia semioctetul inferior din BL

and bl,0F0h;Ramine in BL doar octetul superior

and dh,0F0h;Ia semioctetul superior din CH

and ch,0Fh ;Ramine in CH doar octetul inferior

shr bx,4 ;Deplaseaza cu un semioctet dreapta

shl cx,4 ;Deplaseaza cu un semioctet stanga

or ch,al ;Combina semioctetii

or bl,dh

xchg bl,ch ;Inverseaza registrele

term: jmp term

end start

Programul 6.6

.radix 16

.model small

.stack 100h

.code

start:

mov cl,25 ;Valoarea initiala a lui CL

mov dh,55 ;Valoarea initiala a lui DH

mov al,cl ;Copie de lucru a lui CL

xor al,dh ;Daca 2 biti omologi sunt identici, ;XOR ii anuleaza, restul devin 1

and cl,al ;Sunt pusi in 0 in CL numai bitii ;care fusesera identici cu ai lui DH

term: jmp term

end start

Programul 6.7

.radix 16

.model small

.stack 100h

.code

start:

mov cl,25 ;Valoarea initiala a lui CL

mov dh,55 ;Valoarea initiala a lui DH

mov al,cl ;Copie de lucru a lui CL

xor al,dh ;Daca 2 biti omologi sunt identici, XOR ;ii anuleaza, restul devin 1

not al ;Inverseaza bitii

or cl,al ;Sunt pusi in 1 in CL numai bitii ;care fusesera identici cu ai lui DH

term: jmp term

end start

Programul 6.8

.radix 16

.model small

.stack 100h

.code

start:

mov bp,77 ; Valoarea initiala in BP

mov dx,bp ;Copie de lucru in DX

shl dx,8 ;Inmulteste copia cu 256

shl bp,6 ;Inmulteste valoarea initiala cu 64

add bp,dx ;Aduna 256+64=320 ori valoarea initiala

term: jmp term

end start

Programul 6.9

.radix 16

.model small

.stack 100h

.code

start:

mov bp,33 ; Valoarea initiala in BP

mov dx,bp ;Copie de lucru in dx

shl dx,9 ;Inmulteste copia cu 512

shl bp,7 ;Inmulteste valoarea initiala cu 128

add bp,dx ;Aduna 512+128=640 ori valoarea initiala

term: jmp term

end start

Programul 7.1

.radix 16

.model small

.stack 100h

.data

adr1 dw 7777

adr2 dw 3333

adr3 dw 2222

.code

start: mov ax,@data

mov ds,ax

mov ax,adr1

mov bx,adr2

cmp ax,bx ;Compara numerele 1 si 2

jb comp2 ;Daca 1 e mai mic, treci la comparatia 2

mov adr1,bx;Daca 1 e mai mare se trimit in memorie

mov adr2,ax;In ordine inversa

comp2:

mov ax,adr2

mov bx,adr3

cmp ax,bx ;Compara numerele 2 si 3

jb comp3 ;Daca 2 e mai mic, treci la comparatia 3

mov adr2,bx;Daca 2 e mai mare se trimit in memorie

mov adr3,ax;In ordine inversa

comp3:

mov ax,adr1;Posibil ca in urma inversarii 2 cu 3

mov bx,adr2;in pozitia 2 sa fie acum un numar

cmp ax,bx ;mai mic si decat cel din pozitia 1

jb term ;Daca sunt in ordine, termina

mov adr1,bx;Daca nu, se face din nou

mov adr2,ax;inversarea in memorie

term: jmp term

end start

Programul 7.2

.radix 16

.model small

.stack 100h

.code

start:

mov bx,0

mov cx,20

reia: mov [bx],byte ptr 33

inc bx

dec cx

jnz reia

term: jmp term

end start

Programul 7.3

.radix 16

.model small

.stack 100h

.code

start:

mov bx,0

mov cx,20

mov al,5

reia: mov [bx],al

inc al

inc bx

dec cx

jnz reia

term: jmp term

end start

Programul 7.4

.radix 16

.model small

.stack 100h

.code

start:

mov bx,0

mov cx,20

mov al,5

reia: mov [bx],al

inc al

inc bx

dec cx

jnz reia ;S-a terminat incarcarea in memorie

;Acum se vor suma numerele din memorie

mov cx,20

mov ax,0 ;In AX va apare suma

mov bx,0

mov dh,0 ;Suma va fi pe doi octeti,

reia1: mov dl,[bx];deci se pregateste adunarea cu DX

add ax,dx

inc bx

dec cx

jnz reia1

mov [bx],ah;Bx este acum 20

mov [bx+1],al

term: jmp term

end start

Programul 7.5

.radix 16

.model small

.stack 100h

.code

start: mov bx,0

mov cx,20

mov ax,10 ;Progresia da si numere pe 2 octeti

reia: mov [bx],ax;deci se va folosi AX

add ax,10

inc bx ;Fiecare numar ocupa 2 octeti

inc bx ;deci bx se incrementeaza de 2 ori

dec cx

jnz reia ;S-a terminat incarcarea in memorie

term: jmp term

end start

Programul 7.6

.radix 16

.model small

.stack 100h

.code

start:

mov bx,0

mov cx,20

mov ax,200 ;Numere pe 2 octeti

reia: mov [bx],ax ;deci se va folosi AX

sub ax,10

inc bx ;Fiecare numar ocupa 2 octeti

inc bx ;deci bx se incrementeaza de 2 ori

dec cx

jnz reia ;S-a terminat incarcarea in memorie

term: jmp term

end start

Programul 7.7

.radix 16

.model small

.stack 100h

.code

start:

mov bx,0

mov cx,10

mov ah,[bx] ;Consideram primul numar ca maxim

inc bx

dec cx

reia: mov al,[bx] ;Ia urmatorul numar

cmp ah,al ;compara cu cel maxim

ja conti ;Daca primul e mai mare continua

mov ah,al ;Daca cel nou e mai mare, acesta ;devine noul maxim

conti: inc bx ;Incrementeaza adresa

dec cx ;decrementeaza contorul

jnz reia ;reia cautarea

mov [bx],ah ;Dupa ultima locatie citita scrie

;numarul maxim gasit

term: jmp term

end start

Programul 8.1

.radix 16

.model small

.stack 100h

LungimeBloc equ 20

.DATA

BlocSursa dw LungimeBloc dup(1122)

BlocDest dw LungimeBloc dup(?)

.code

start:

mov ax,seg BlocSursa

; Se putea folosi si ; mov ax,@data

mov ds,ax ;Segmentul sursa in DS

mov ax,seg BlocDest ;Necesar numai daca ;blocurile sunt in ;segmente diferite

mov es,ax ;Segmentul destinatie ES

cld ;directia in sensul ;cresterii adreselor

mov si, offset BlocSursa ;AE a sursei in SI

mov di, offset BlocSursa+60;AE a destinatiei in DI

mov cx, LungimeBloc ;Numarul de transferuri in CX

bucla:

lodsw ;Incarca in AX un octet

stosw ;si il trimite la destinatie

loop bucla ;Decrementeaza CX si reia ;bucla pana cand CX devine 0

term:

jmp term

end start

Programul 8.4

.radix 16

.model small

.stack 100h

.DATA

BlocSursa db 'jgasjagsasasgauahdjushd'

LB equ $-BlocSursa ;Asamblorul ;calculeaza lungimea blocului

.code

start:

mov ax,@data

mov ds,ax

mov es,ax ;Incarca in ES segmentul de ;date (pentru SCASB)

mov di, offset BlocSursa ;Incarca in DI adresa ;sirului(Pentru SCASB)

mov cx, LB ;In CX lungimea sirului

mov al,'a' ;Constanta de comparat

mov bh,0 ;Valoare initiala contor

bucla:

scasb ;Compara AL cu un octetul de ;la [ES:DI] din sir

jnz conti ;Daca nu e egalitate sare

inc bh ;Daca e 'a', incrementeaza BH

conti:

loop bucla ;Reluare daca nu s-a terminat

term:

jmp term

end start

Programul 8.5

.radix 16

.radix 16

.model small

.stack 100h

.data

BlocSursa db 'ghfafasfasfahsyfhhhsaad'

LB equ $-BlocSursa

.code

start:

mov ax,@data

mov ds,ax

mov es,ax ;Incarca in ES segmentul de date ;(pentru SCASB)

mov di, offset BlocSursa;Incarca in DI adresa ;sirului(Pentru SCASB)

mov cx,LB ;Contorul de comparatii in CX

mov ax,'af' ;Constanta de comparat cu octetii ;inversati (cum se compara

;cu cuvintele din memorie)

bucla:

scasw ;Compara AX cu cuvantul respectiv

jnz b1 ;Daca nu este secventa 'fa', se sare

inc bh ;Daca s-a gasit 'fa' incrementeaza BH

b1: dec di

loop bucla ;Reluare daca nu s-a terminat sirul

term:

jmp term

end start

Programul 8.7

.radix 16

.model small

.stack 100h

.DATA

Sir1 db '6512631827961792'

LB equ $-Sir1 ;Lungimea este data de sirul 1

Sir2 db '7531790734264725'

.code

start:

mov ax,@data

mov ds,ax ;Incarca in DS segmentul de date

mov es,ax ;Incarca in ES segmentul de date

mov si, offset Sir1;Incarca in SI adresa sirului 1

mov di, offset Sir2;Incarca in DI adresa sirului 2

mov cx,LB ;Contorul de comparatii in CX

bucla:

cmpsb ;Compara AL cu octetul respectiv

jnz b1 ;Daca nu este egalitate, se sare

inc bh ;Daca s-a gasit egalitate, se ;incrementeaza BH

jmp b3 ;si se trece la urmatoarea pereche

b1: jb b2 ;Daca este mai mic sare

inc dh ;Daca e mai mare incrementeaza DH

jmp b3 ;si se trece la urmatoarea pereche

b2: inc dl ;Daca era mai mic incrementeaza DL

b3: loop bucla ;Reluare daca nu s-a terminat

term: jmp term

end start

Programul 8.8

.radix 16

.model small

.stack 100h

.DATA

Sir1 db 'ABCDEFGHIJKL'

LB equ $-Sir1 ;Lungimea este data de sirul 1

.code

start:

mov ax,@data

mov ds,ax ;Incarca in DS segmentul de date

mov es,ax ;Incarca in ES segmentul de date

mov di, offset Sir1 ;Incarca in DI adresa sirului

mov cx,LB ;Contorul de comparatii in CX

mov al,'E'

repnz scasb ;Compara pana la prima egalitate

neg cx ;In CX este numarul ramas din LB

add cx,LB ;si trebuie scazut din LB

term: jmp term

end start

Programul 8.9

.radix 16

.model small

.stack 100h

.DATA

Sir1 db '123456789'

LB equ $-Sir1 ;Lungimea este data de sirul 1

Sir2 db '987654321'

.code

start:

mov ax,@data

mov ds,ax ;Incarca in DS segmentul de date

mov es,ax ;Incarca in ES segmentul de date

mov si, offset Sir1;Incarca in SI adresa sirului 1

mov di, offset Sir2;Incarca in DI adresa sirului 2

mov cx,LB ;Contorul de comparatii in CX

repnz cmpsb ;Compara pana la prima egalitate

neg cx ;In CX este numarul ramas din LB

add cx,LB ;si trebuie scazut din LB

term:

jmp term

end start

Programul 8.10

.model small

.stack 100h

.DATA

Sir1 db '112233445566'

LB equ $-Sir1 ;Lungimea este data de sirul 1

Sir2 db '112244335566'

.code

start:

mov ax,@data

mov ds,ax ;Incarca in DS segmentul de date

mov es,ax ;Incarca in ES segmentul de date

mov si, offset Sir1;Incarca in SI adresa sirului 1

mov di, offset Sir2;Incarca in DI adresa sirului 2

mov cx,LB ;Contorul de comparatii in CX

repz cmpsb ;Compara pana la prima inegalitate

neg cx ;In CX este numarul ramas din LB

add cx,LB ;si trebuie scazut din LB

term:

jmp term

end start

Programul 9.1

.radix 16

.model small

.stack 100h

.code

start:

mov dl,30 ;Primul cod ASCII

mov dh,80 ;Ultimul cod ASCII

reia:

mov ah,02 ;Functia 02

Int 21h

inc dl ;Urmatorul cod ASCII

cmp dh,dl ;S-a ajuns la ultimul?

jnz reia ;Daca nu, se reia ciclul

term:

mov ah,4Ch;Iesirea se face cu functia 4C

int 21 ;si se poate vedea ecranul cu

end start ;comanda 'User Screen' submeniul Window

Programul 9.2

.radix 16

.model small

.stack 100h

.data

sir1 db 'Un sir de caractere terminate cu dolar$'

.code

start: mov ax,@data

mov ds,ax

mov dx,offset sir1;Adresa efectiva a sirului in DS

mov ah,09;Functia 09

Int 21h

term: mov ah,4Ch

int 21

end start

Programul 9.3

.radix 16

.model small

.stack 100h

.data

sir1 db 'Primul sir de caractere',0dh,0ah,'$'

sir2 db 'Al doilea sir de caractere $'

.code

start:

mov ax,@data

mov ds,ax

mov dx,offset sir1;Adresa efectiva a sirului 1 in DS

mov ah,09 ;Functia 09

Int 21h

mov dx,offset sir2;Adresa efectiva a sirului 2 in DS

mov ah,09 ;Functia 09

Int 21h

term:

mov ah,4Ch

int 21

end start

Programul 9.4

.radix 16

.model small

.stack 100h

.code

start:

mov ah,01 ;Citire tasta in AL

Int 21h

mov dl,al ;Pentru afisare, codul ASCII in DL

mov ah,02 ;Functia 02

Int 21h

cmp al,0dh;S-a tastat CR?

jnz start ;Daca nu, reia

term: mov ah,4Ch

int 21

end start

Programul 9.5

.radix 16

.model small

.stack 100h

.code

start:

mov ah,07 ;Citire tasta in AL, fara ecou

Int 21h

mov dl,al ;Pentru afisare, codul ASCII in DL

mov ah,02 ;Functia 02

Int 21h

cmp al,0dh;S-a tastat CR?

jnz start ;Daca nu, reia

term: mov ah,4Ch

int 21

end start

Programul 9.6

.radix 16

.model small

.stack 100h

.code

start:

mov ah,01 ;Citire tasta in AL, cu ecou

Int 21h

sub al,20

mov dl,al ;Pentru afisare, codul ASCII in DL

mov ah,02 ;Functia 02

Int 21h

add al,20

cmp al,0dh;S-a tastat CR?

jnz start ;Daca nu, reia

term:

mov ah,4Ch

int 21

end start

Programul 9.7

.radix 16

.model small

.stack 100h

.data

buff0 db 10 ;Lungimea permisa a sirului

buff1 db ? ;Rezervare (lungimea actuala)

buff2 db 10 dup (?);Bufferul de caractere

.code

start:

mov ax,@data

mov ds,ax

mov dx,buff0 ; Originea sirului in DX

mov ah,0A ;Citire tasta in AL

Int 21h

;Acum se formeaza sirul de afisat (terminat cu '$')

mov bh,0 ;Pregateste BX

mov bl,byte ptr ds:[1];Pentru a citi lungimea ;actuala

add bl,2 ;Se adauga 2 (octetii CR si LF)

mov ds:[bx],byte ptr '$';Sfarsitul de sir la ;lungime+2

mov buff0,0Ah ;La inceput Line Feed

mov buff1,0Dh ;si Carriage Return

mov ah,09 ;Functia 09

Int 21h

term:

mov ah,4Ch

int 21

end start

Programul 9.8

.radix 16

.model small

.stack 100h

.data

Sir1 db 'Care din urmatoarele registre indica segmentul de date? (Apasati 1,2,3 sau 4)',0dH,0Ah,'1. BX',0dH,0Ah,'2. BP',0dH,0Ah,'3. SI',0dH,0Ah,'4. DI',0dH,0Ah,0dh,0ah,'$'

Sir2 db '. Corect!$'

Sir3 db '. Gresit! Era BX sau SI.$'

.code

start:

mov ax,@data

mov ds,ax ;Incarca in DS segmentul de date

mov dx, offset Sir1 ;Incarca in SI adresa sirului 1

mov ah, 09

Int 21h

mov ah,01

int 21h

cmp al,'1'

jz corect

cmp al,'3'

jz corect

mov dx, offset sir3

jmp afi

corect:

mov dx, offset sir2

afi: mov ah,09

int 21

term:

mov ah,4Ch

int 21

end start

Programul 10.1

.model small

.stack 100h

.code

start:

;Mod video 320x200

mov ah,0

mov al,13h

int 10h

afis: ;Afiseaza un punct la x=CX, y=DX si culoare=AL

mov cx,100

mov dx,50

mov al,2

mov ah,0Ch ;functia 0Ch

int 10h ;Cheama intreruperea 10h

term: jmp term

end start

Programul 10.2

.model small

.stack 100h

.code

start:

;Mod video 320x200

mov ah,0

mov al,13h

int 10h

;Afiseaza o linie la x=CX, y=DX si culoare=AL

mov dx,50

mov cx,100

lin1:

mov al,2

mov ah,0Ch ;functia 0Ch

int 10h ;Intreruperea 10h

inc cx ;Se pregateste scriereaaltui punct

cmp cx,200 ;pana se ajunge la 100 de puncte

jne lin1

term: jmp term

end start

Programul 10.3

.model small

.stack 100h

.code

;Declara parametrii

x1=50 ;Inceputul liniilor

y1=50

culoare=2

lungime=100 ;Lungimea liniilor

h=50  ;numarul de linii

start:

;Mod video 320x200

mov ah,0

mov al,13h

int 10h

afis: ;Afiseaza o linie la x=CX, y=DX si culoare=AL

mov dx,y1

mov al,culoare

lin2:

mov cx,x1

lin1:

mov ah,0Ch ;functia 0Ch

int 10h ;call bios service

inc cx

cmp cx,x1+lungime

jne lin1

inc dx

cmp dx,y1+h ;S-a ajuns la numarul final de linii?

jne lin2 ;Daca nu, se reia

term: jmp term

end start


Programul 10.4

.model small

.stack 100h

.code

x1=50

y1=50

culoare=2

lungime=100

h=50 ;numarul de linii

start:

;Mod video 320x200

mov ah,0

mov al,13h

int 10h

afis: ;Afiseaza un punct la x=CX, y=DX si culoare=AL

mov dx,y1

lin2:

mov al,culoare;Se reia linia cu culoarea de inceput

mov cx,x1

lin1:

inc al ;Noul punct cu alta culoare

mov ah,0Ch ;functia 0Ch

int 10h

inc cx

cmp cx,x1+lungime

jne lin1

inc dx

cmp dx,y1+h ;S-a ajuns la numarul final de linii?

jne lin2

term: jmp term

end start

Programul 10.5

.stack 100h

.code

x1=50

y1=50

culoare=2

lungime=100

h=50 ;numarul de linii

start:

;Mod video 320x200

mov ah,0

mov al,13h

int 10h

afis: ;Afiseaza un punct la x=CX, y=DX si culoare=AL

mov dx,y1

mov al,culoare ;Culoarea primei linii

lin2:

mov cx,x1

lin1:

mov ah,0Ch ;functia 0Ch

int 10h ;call bios service

inc cx

cmp cx,x1+lungime

jne lin1

inc al ;Urmatoarea linie are alta culoare

inc dx ;si alt y

cmp dx,y1+h ;S-a ajuns la ultima linie?

jne lin2 ;Daca nu, reia

term: jmp term

end start

Programul 10.6

.MODEL SMALL

.STACK 200H

.CODE

x1=160

culoarea =3

Start:

;Mod video 320x200

mov ah,0

mov al,13h

int 10h

MOV AX, 0A000H;Adresa memoriei ecran

MOV ES, AX ;in ES

mov di,x1 ;Pozitia punct este offset fata de ES

mov al,culoarea

stosb

oprire:

jmp oprire

END Start

Programul 10.7

.MODEL SMALL

.STACK 200H

.CODE

lung=200

culoarea =5

Start:

;Mod video 320x200

mov ah,0

mov al,13h

int 10h

MOV AX, 0A000H

MOV ES, AX

Linieo:

mov di,0

mov cx,lung

mov al,culoarea

rep stosb ;Repeta pana cand CX=0

oprire:

jmp oprire

END Start

Programul 10.8

.MODEL SMALL

.STACK 200H

.CODE

x1=100 ;Originea liliei

lung=200

culoarea =5

Start:

;Mod video 320x200

mov ah,0

mov al,13h

int 10h

MOV AX, 0A000H

MOV ES, AX

Linieo:

mov di,x1 ;Linia incepe in pozitia x1

mov cx,lung

mov al,culoarea

repz stosb ;Scrie punctele liniei

oprire:

jmp oprire

END Start

Programul 10.9

.MODEL SMALL

.STACK 200H

.CODE

x1=100

lung=200

culoarea =5

Start:

;Mod video 320x200

mov ah,0

mov al,13h

int 10h

MOV AX, 0A000H

MOV ES, AX

Linieo:

mov di,x1

add di,320

mov cx,lung

mov al,culoarea

repz stosb ;Scrie punctele liniei

oprire:

jmp oprire

END Start

Programul 10.10

.MODEL SMALL

.STACK 200H

.CODE

x1=100

y1=50

lung=200

culoarea =5

Start:

;Mod video 320x200

mov ah,0

mov al,13h

int 10h

MOV AX, 0A000H

MOV ES, AX

Liniev:

mov di,x1

mov bp,y1

mov cx,lung

mov al,culoarea

mov dx,bp ;Se face inmultirea

shl dx,6 ;lui BP (adica a lui Y1) cu 320

shl bp,8 ;Prin copiere in DX

add bp,dx ;deplasari la stinga si adunare

add di,bp ;Deplasamentul obtinut se aduna la DI

rep stosb ;Scrie punctele liniei

oprire:

jmp oprire

END Start

Programul 10.11

.MODEL SMALL

.STACK 200H

.CODE

x1=100

y1=50

lung=50

culoarea =5

Start:

;Mod video 320x200

mov ah,0

mov al,13h

int 10h

MOV AX, 0A000H

MOV ES, AX

Liniev:

mov di,x1

mov bp,y1

mov cx,lung

mov al,culoarea

mov dx,bp ;Se face inmultirea

shl dx,6 ;lui BP (adica a lui Y1) cu 320

shl bp,8 ;Prin copiere in DX

add bp,dx ;deplasari la stinga si adunare

add di,bp ;Deplasamentul obtinut se aduna la

lv1: add di,320 ;Noul punct este cu 320 mai ;departe in memoria de ecran

mov es:[di],al ;Pune punctul

loop lv1 ;Repeta de CX ori

oprire:

jmp oprire

END Start

Programul 10.12

.MODEL SMALL

.STACK 200H

.CODE

x1=100

y1=50

lung=50

culoarea =5

Start:

;Mod video 320x200

mov ah,0

mov al,13h

int 10h

MOV AX, 0A000H

MOV ES, AX

Liniev:

mov di,x1

mov bp,y1

mov cx,lung

mov al,culoarea

mov dx,bp ;Se face inmultirea

shl dx,6 ;lui BP (adica a lui Y1) cu 320

shl bp,8 ;Prin copiere in DX

add bp,dx ;deplasari la stinga si adunare

add di,bp ;Deplasamentul obtinut se aduna la

lv1: add di,321;Noul punct este cu 320+1 mai ;departe in memoria de ecran

mov es:[di],al ;Pune punctul

loop lv1 ;Repeta de CX ori

oprire:

jmp oprire

END Start

Programul 10.13

.MODEL SMALL

.STACK 200H

.CODE

x1=100

y1=50

lung=50

culoarea =5

Start:

;Mod video 320x200

mov ah,0

mov al,13h

int 10h

MOV AX, 0A000H

MOV ES, AX

Liniev:

mov di,x1

mov bp,y1

mov cx,lung

mov al,culoarea

mov dx,bp ;Se face inmultirea

shl dx,6 ;lui BP (adica a lui Y1) cu 320

shl bp,8 ;Prin copiere in DX

add bp,dx ;deplasari la stinga si adunare

add di,bp ;Deplasamentul obtinut se aduna la

lv1: add di,319 ;Noul punct este cu 320-1 mai ;departe in memoria de ecran

mov es:[di],al ;Pune punctul

loop lv1 ;Repeta de CX ori

oprire:

jmp oprire

END Start

Programul 10.14

.MODEL SMALL

.STACK 200H

.CODE

x1=100

y1=50

lung=50

culoarea =5

nrlinii=100

Start:

;Mod video 320x200

mov ah,0

mov al,13h

int 10h

MOV AX, 0A000H

MOV ES, AX

mov bx,nrlinii ;Contorul de linii verticale

mov di,x1 ;pozitia primei linii in DI

Liniev:

mov si,di ;DI va fi modificat eci se salveaza

mov bp,y1

mov cx,lung

mov al,culoarea

mov dx,bp ;Se face inmultirea

shl dx,6 ;lui BP (adica a lui Y1) cu 320

shl bp,8 ;Prin copiere in DX

add bp,dx ;deplasari la stinga si adunare

add di,bp ;Deplasamentul obtinut se aduna la

lv1: add di,320 ;Noul punct este cu 320 mai ;departe in memoria de ecran

mov es:[di],al ;Pune punctul

loop lv1 ;Repeta de CX ori

mov di,si ;Reface DI (pozitia liniei curente)

inc di ;si il incrementeaza (linia ;urmatoare)

dec bx ;Decrementeaza si contorul de linii

jnz liniev ;si daca nu a ajuns la 0, reia

oprire:

jmp oprire

END Start

Programul 11.2

.MODEL SMALL

.STACK 200H

.CODE

x1=100

y1=50

l=200

h=50

culoarea1 =05h

culoarea2 =01h

Start:

call sterge

;Mod video 320x240

mov ah,0

mov al,13h

int 10h

;Paleta

mov ah,0bh

mov bh,1

mov bl,8

int 10h

princ:

MOV AX, 0A000H

MOV ES, AX

mov al,culoarea1 ;in AL culoarea orizontala

call dreptunghi

oprire:

jmp oprire

;******* Subrutine *******

sterge: ;Sterge ecran

mov ah,06h

mov bh,0

int 10h

ret

lino: ;Afiseaza o linie orizontala , la y = DX din puncte cu culoarea din DI

mov dx,bp

shl dx,8

shl bp,6

add dx,bp

add di,dx

repz stosb

ret

linv: ;Afiseaza o linie verticala

mov dx,bp

shl dx,8

shl bp,6

add dx,bp

add di,dx

lv1: MOV ES:[DI],al

add di,320

loop lv1

ret

dreptunghi:

mov bp,y1 ;in BP e Y1

mov di,x1 ;In DI e X1

mov cx,l ;In CX e lungimea

call lino

mov bp,y1+h ;in BP e Y1

mov di,x1 ;In DI e X1

mov cx,l ;In CX e lungimea

call lino

mov bp,y1 ;in BP e Y1

mov di,x1 ;In DI e X1

add di,320

mov cx,h ;In CX e lungimea

dec cx

mov al,culoarea2

call linv

mov bp,y1 ;in BP e Y1

mov di,x1+l-1;In DI e X2 (cu 1 mai putin decat x1+l)

add di,320

mov cx,h ;In CX e lungimea

dec cx

mov al,culoarea2

call linv

ret

END Start

Programul 11.3

.MODEL SMALL

.STACK 200H

.DATA

x1=100

y1=50

l=120

h=60

culoarea1 =05h

.CODE

Start:

;Mod video 320x240

mov ah,0

mov al,13h

int 10h

princ:

MOV AX, 0A000H

MOV ES, AX

mov di,x1 ;Parametrii primei linii

mov bp,y1

mov cx,l

mov al,culoarea1 ;in AL culoarea orizontala

mov bx,h

drept1:

call linieo

inc bp

dec bx

jnz drept1

oprire:

jmp oprire

;****** Subrutine ** **

linieo: ;Linie orizintala

push cx

push di

push bp

mov dx,bp

shl dx,8

shl bp,6

add dx,bp

add di,dx

repz stosb

pop bp

pop di

pop cx

ret

END Start

Programul 11.4

.MODEL SMALL

.STACK 200H

.CODE

x1=10

y1=50

l=20

h=30

culoarea1 =05h

culoarea2 =01h

Start:

;Mod video 320x240

mov ah,0

mov al,13h

int 10h

princ:

MOV AX, 0A000H

MOV ES, AX

mov di,x1 ;Parametrii primei linii

mov bp,y1

mov cx,l

mov al,1 ;in AL culoarea orizontala

mov bx,h

mov si,20

et1: call dreptunghi

add di,5

add bp,5

inc al

dec si

jnz et1

oprire:

jmp oprire

;****** Subrutine ** **

linieo: ;Linie orizontala

push cx

push di

push bp

mov dx,bp

shl dx,8

shl bp,6

add dx,bp

add di,dx

repz stosb

pop bp

pop di

pop cx

ret

dreptunghi:

push bx

push bp

drept1:

call linieo

inc bp

dec bx

jnz drept1

pop bp

pop bx

ret

END Start

Programul 11.5

.MODEL SMALL

.STACK 200H

.DATA

x1=100

y1=50

l=200

h=50

culoarea =1h

.CODE

Start:

;Mod video 320x240

mov ah,0

mov al,13h

int 10h

princ:

MOV AX, 0A000H

MOV ES, AX

mov bx,300h

p1: mov al,[bx] ;in AL culoarea

inc al

mov bp,[bx+1]

and bp,00ffh ;in BP e Y1

mov di,[bx+2]

and di,01ffh ;In DI e X1

mov cx,[bx+2]

and cx,003fh ;In CX e lungimea

inc cx ;Lungimea trebuie sa nu fie 0

mov si,20 ;In SI e inaltimea

call dreptunghi

inc bx

cmp bx,56000

jnz p1

oprire:

jmp oprire

;****** Subrutine ** **

linv: ;Afiseaza o linie verticala

push di

push cx

push bp

mov dx,bp

shl dx,8

shl bp,6

add dx,bp

add di,dx

mov cx,si

lv1: MOV ES:[DI],al

add di,320

loop lv1

pop bp

pop cx

pop di

ret

dreptunghi:

;afiseaza un dreptunghi cu culoarea 'culoare' la x1,y1, de ;lungime l si inaltime h

push cx

push di

d1: call linv

inc di

dec cx

jnz d1

pop di

pop cx

ret

END Start

Programul 11.6

.MODEL SMALL

.STACK 200H

.CODE

h=30

Start:

;Mod video 320x240

mov ah,0

mov al,13h

int 10h

princ:

MOV AX, 0A000H

MOV ES, AX

mov bx,500h

p1: push bx

mov al,[bx] ;in AL culoarea

inc al

mov bp,[bx+1]

and bp,00ffh ;in BP e Y1

mov di,[bx+2]

and di,01ffh ;In DI e X1

mov cx,[bx+2]

and cx,003fh ;In CX e lungimea

inc cx ;Lungimea trebuie sa nu fie 0

inc cx

inc cx

mov si,h ;In SI e inaltimea

call dreptunghi

pop bx

inc bx

cmp bx,56000

jnz p1

oprire:

jmp oprire

MOV AH, 4CH ;Return to DOS

MOV AL, 00H

INT 21H

;****** Subrutine ** **

lino: ;Afiseaza o linie orizontala , la y = BP din ;puncte cu culoarea din DI

push bp

push di

push cx

push ax

mov al,0

mov dx,bp

shl dx,8

shl bp,6

add dx,bp

add di,dx

repz stosb

pop ax

pop cx

pop di

pop bp

ret

linv: ;Afiseaza o linie verticala

push di

push cx

push bp

mov dx,bp

shl dx,8

shl bp,6

add dx,bp

add di,dx

mov cx,si

sub cx,1

add di,320

lvi: MOV ES:[DI],al

add di,320

loop lvi

pop bp

pop cx

pop di

ret

dreptunghi:

;afiseaza un dreptunghi cu culoarea 'culoare' la x1,y1, ;de lungime l si inaltime h

push cx

push di

call lino

push bp

add bp,si ;in BP e Y1

call lino

pop bp

push ax

mov al,0

call linv

pop ax

inc di

dec cx

dec cx

d1: call linv

inc di

dec cx

jnz d1

push ax

mov al,0

call linv

pop ax

pop di

pop cx

ret

END Start

Programul 12.2

.MODEL SMALL

.STACK 200H

.DATA

x1=100

y1=50

lung=100

inalt=50

culo=5

culv=1

.CODE

Linieo macro x1,y1,lung,culoarea

local lo1

mov di,x1 ;DI contine X1

mov bp,y1 ;BP contine Y1

mov cx,lung ;CX contine numarul de puncte

mov al,culoarea;In AL este culoarea

mov dx,bp ;Se face inmultirea

shl dx,6 ;lui BP (adica a lui Y1) cu 320

shl bp,8 ;Prin copiere in DX

add bp,dx ;deplasari la stinga si adunare

add di,bp ;Deplasamentul obtinut se aduna la ;adresa initiala

lo1: mov es:[di],al ;Pune punctul

inc di

loop lo1 ;Repeta de CX ori

endm

Liniev macro x1,y1,lung,culoarea

local lv1

mov di,x1 ;DI contine X1

mov bp,y1 ;BP contine Y1

mov cx,lung ;CX contine numarul de puncte

mov al,culoarea;In AL este culoarea

mov dx,bp ;Se face inmultirea

shl dx,6 ;lui BP (adica a lui Y1) cu 320

shl bp,8 ;Prin copiere in DX

add bp,dx ;deplasari la stinga si adunare

add di,bp ;Deplasamentul obtinut se aduna la ;adresa initiala

lv1: mov es:[di],al ;Pune punctul

add di,320 ;Noul punct este cu 320 mai ;departe in memoria de ecran

loop lv1 ;Repeta de CX ori

endm

Start:

;Mod video 320x200

mov ah,0

mov al,13h

int 10h

MOV AX, 0A000H; Adresa segmentului ecran in modul 13

MOV ES, AX ;in ES

linieo x1,y1,lung,culo

linieo x1,y1+inalt,lung,culo

liniev x1,y1+1,inalt-1,culv

liniev x1+lung-1,y1+1,inalt-1,culv

oprire:

jmp oprire

END Start

Programul 12.3

.MODEL SMALL

.STACK 200H

.DATA

x1=100

y1=20

lung=100

inalt=50

culo=5

culv=1

.CODE

;Linia orizontala

Linieo macro x1,y1,lung,culoarea

local lo1

mov di,x1 ;DI contine X1

mov bp,y1 ;BP contine Y1

mov cx,lung ;CX contine numarul de puncte

mov al,culoarea;In AL este culoarea

mov dx,bp ;Se face inmultirea

shl dx,6 ;lui BP (adica a lui Y1) cu 320

shl bp,8 ;Prin copiere in DX

add bp,dx ;deplasari la stinga si adunare

add di,bp ;Deplasamentul obtinut se aduna la ;adresa initiala

lo1: mov es:[di],al ;Pune punctul

inc di

loop lo1 ;Repeta de CX ori

endm

;Linia verticala

Liniev macro x1,y1,lung,culoarea

local lv1

mov di,x1 ;DI contine X1

mov bp,y1 ;BP contine Y1

mov cx,lung ;CX contine numarul de puncte

mov al,culoarea;In AL este culoarea

mov dx,bp ;Se face inmultirea

shl dx,6 ;lui BP (adica a lui Y1) cu 320

shl bp,8 ;Prin copiere in DX

add bp,dx ;deplasari la stinga si adunare

add di,bp ;Deplasamentul obtinut se aduna la ;adresa initiala

lv1: mov es:[di],al ;Pune punctul

add di,320 ;Noul punct este cu 320 mai ;departe in memoria de ecran

loop lv1 ;Repeta de CX ori

endm

;Linia spre dreapta

Lindr macro x1,y1,lung,culoarea

local lv1

mov di,x1 ;DI contine X1

mov bp,y1 ;BP contine Y1

mov cx,lung ;CX contine numarul de puncte

mov al,culoarea;In AL este culoarea

mov dx,bp ;Se face inmultirea

shl dx,6 ;lui BP (adica a lui Y1) cu 320

shl bp,8 ;Prin copiere in DX

add bp,dx ;deplasari la stinga si adunare

add di,bp ;Deplasamentul obtinut se aduna la ;adresa initiala

lv1: mov es:[di],al ;Pune punctul

add di,321 ;Noul punct este cu 320 mai ;departe in memoria de ecran

loop lv1 ;Repeta de CX ori

endm

;Linia spre stanga

Linst macro x1,y1,lung,culoarea

local lv1

mov di,x1 ;DI contine X1

mov bp,y1 ;BP contine Y1

mov cx,lung ;CX contine numarul de puncte

mov al,culoarea;In AL este culoarea

mov dx,bp ;Se face inmultirea

shl dx,6 ;lui BP (adica a lui Y1) cu 320

shl bp,8 ;Prin copiere in DX

add bp,dx ;deplasari la stinga si adunare

add di,bp ;Deplasamentul obtinut se aduna la ;adresa initiala

lv1: mov es:[di],al ;Pune punctul

add di,319 ;Noul punct este cu 320 mai ;departe in memoria de ecran

loop lv1 ;Repeta de CX ori

endm

Start:

;Mod video 320x200

mov ah,0

mov al,13h

int 10h

MOV AX, 0A000H; Adresa segmentului ecran in modul ;13

MOV ES, AX ;in ES

linieo x1,y1,lung,culo

lindr x1,y1,lung/2+1,culo

linst x1+lung,y1,lung/2,culo

linieo x1,y1+60+lung,lung,culo

liniev x1,y1+60,lung,culo

lindr x1,y1+60,lung+1,culo

oprire:

jmp oprire

END Start

Programul 12.4

.MODEL SMALL

.STACK 200H

.CODE

x1=100

y1=50

l=200

h=50

culoarea =1h

linv macro ;Afiseaza o linie verticala

local lv1

push di

push cx

push bp

mov dx,bp

shl dx,8

shl bp,6

add dx,bp

add di,dx

mov cx,si

lv1: MOV ES:[DI],al

add di,320

loop lv1

pop bp

pop cx

pop di

endm

dreptunghi macro

;afiseaza un dreptunghi cu culoarea 'culoare' la x1,y1, ;de lungime l si inaltime h

push cx

push di

dd1: linv ;dd1 nu trebuie declarat LOCAL

inc di

dec cx

jnz dd1

pop di

pop cx

endm

Start:

;Mod video 320x240

mov ah,0

mov al,13h

int 10h

princ:

MOV AX, 0A000H

MOV ES, AX

mov bx,300h

p1: mov al,[bx] ;in AL culoarea

inc al

mov bp,[bx+1]

and bp,00ffh ;in BP e Y1

mov di,[bx+2]

and di,01ffh ;In DI e X1

mov cx,[bx+2]

and cx,003fh ;In CX e lungimea

inc cx ;Lungimea trebuie sa nu fie 0

mov si,20 ;In SI e inaltimea

dreptunghi

inc bx

cmp bx,56000

jnz p1

oprire:

jmp oprire

END Start

B I B L I O G R A F I E

1. I. Spanulescu, S.I.Spanulescu - Circuite integrate digitale si sisteme cu microprocesoare, Editura Victor, Bucuresti, 1996;

2. I. Spanulescu, S.I.Spanulescu - Prelucrarea, inregistrarea, transmiterea si afisarea datelor, Universitatea din Bucuresti, 1984;

3. S.I.Spanulescu - Programarea in limbaj de asamblare a microcontrolerelor -Lucrari de laborator, Editura Victor, 2003

4. D. Somnea, T.Vladut -Programarea in Assembler - Editura tehnica, Bucuresti, 1992;

5. Vlad Caprariu, Andrei Enyedi, Marius Muntean- Sistemul de operare DOS. Ghidul programatorului, Ed. Microinformatica, Cluj-Napoca, 1993;

6. Vlad Caprariu, Sistemul de operare DOS. Functii sistem, Ed. Microinformatica, Cluj-Napoca, 1995;

7. *** INTEL Microprocessors, Vol. 1, 2, Intel Corporation, Santa Clara, California, 1991;

8. Intel Architecture Sofware Developer's Manual Vol 1, 2A, 2B, 3, Intel Corporation, Santa Clara, California, 2003.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 2410
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved