CATEGORII DOCUMENTE |
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:
Observatii:
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:
Vezi si: AH=06h,AH=09h.
INT 21h, 05h - SCRIE UN CARACTER LA IMPRIMANTA
Intrare:AH=05h
DL = caracter de printat.
Observatii:
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.
Intrare: AH = 06h;
DL = FFh.
Efect
Observatii:
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:
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:
Observatii: ^C/^Break sunt testate.
Vezi si: AH=06h'INTRARE'.
INT 21h, 0Ch - GOLESTE BUFFERUL SI CITESTE DE LA INTRAREA STANDARD
Intrare:
AH=0Ch;
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:
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:
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:
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:
Observatii:
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:
Observatii:
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:
Observatii:
Vezi si: AH=3Ah,AH=3Bh,AH=6Dh.
INT 21h, 3Ah - STERGE DIRECTORUL
Intrare: AH=3Ah;
DS:DX -> ASCIIZ calea directorului de sters.
Efect:
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:
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:
Efect:
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:
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:
Vezi si: AH=0Fh,AH=3Ch,AX=4301h,AX=5D00h.
Intrare: AH=3Eh;
BX = tratare fisier
Efect:
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:
Efect:
Observatii:
Vezi si: AH=27h,AH=40h,AH=93h.
INT 21h, 40h - SCRIE INTR-UN FISIER SAU DISPOZITIV
Intrare:
Efect:
Observatii:
Vezi si: AH=28h,AH=3Fh.
INT 21h, 41H - STERGE FISIERUL
Intrare:
Efect:
Observatii:
Vezi si: AH=13h,AX=4301h,AX=4380h,AX=5D00h,AH=60h,AH=71h.
INT 21h, 42h - SETEAZA POZITIA CURENTA IN FISIER
Intrare:
Efect:
Observatii:
Vezi si: AH=24h.
INT 21h, 43 - AFLA ATRIBUTELE FISIERULUI
Intrare:
Efect:
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:
Efect:
Observatii:
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:
Efect:
Observatii:
Vezi si: AH=19h,AH=3Bh,AH=71h.
INT 21h, 4Ch - IESIRE CU COD DE FINALIZARE
Intrare:
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:
Observatii:
Vezi si: AH=4Bh,AH=4Ch,AH=8Ah.
INT 21h, 54h - AFLA STAREA FANIONULUI DE VERIFICARE
Intrare: AH=54h;
Efect:
Vezi si: AH=2Eh.
INT 21h, 56h - REDENUMESTE FISIERUL
Intrare:
Efect:
Observatii:
INT 21h, 57h - AFLA DATA ULTIMEI SCRIERI IN FISIER
Intrare:
Efect:
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:
Efect:
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 |
Vizualizari: 2478
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved