Scrigroup - Documente si articole

     

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

MACROINSTRUCTIUNI

calculatoare



+ Font mai mare | - Font mai mic



MACROINSTRUCTIUNI

1. Functii DOS de intrare/iesire

Functiile DOS sunt un caz particular de subprograme existente in sistemul de operare DOS, care se apeleaza prin intreruperi. Apelul functiilor DOS este independent de Versiunea sistemului de operare. Transmiterea parametrilor se face prin registre sau prin zona de memorie.



Oricare comanda DOS are o functie corespondenta care poate fi apelata din programe scrise in limbaj de asamblare. Se pot construi aplicatii care utilizeaza comenzile DOS in programe. Din aceasta categorie face parte si Norton Commander, sau Windows Commander.

Apelarea unei functii DOS de intrarea iesire se face printr-o secventa de forma:

MOV AH,cod_functie ; codul functiei DOS se incarca in registrul AH

MOV reg1,par1 ; pregatire parametrii in registre

MOV reg2,par2

INT 21H ; apel functie (subprogram) prin intrerupere 21H

Intreruperea 21H serveste la apelarea a zeci de functii indicate prin codul functiei ce se incarca in registrul AH. Fiecare functie necesita un numar de parametrii care se incarca in registre.

Oprire program cu revenire in DOS se realizeaza cu functia care are codul 4CH

MOV AH,4CH ; cod functie revenire in DOS

INT 21H

Functiile de intrare iesire referitoare la dialogul cu operatorul sunt:

01H Citire de la tastatura un caracter ASCII cu ecou in registrul AL.

Ecou inseamna afisare caracter tastat si pe pe ecran.

02H Afisare un caracter ASCII din registru DL pe monitor.

03H Citire in AL un caracter de la intrarea AUX, care este in mod normal portul de

comunicatii seriale COM1 (2400 bauds, fara paritate ,1bit de Stop, 8 biti de date).

04H Trimite din DL un caracter ASCII spre portul serial AUX.

05H Tipareste din DL un caracter ASCII la imprimanta.

06H Intrare iesire directa fara ecou serveste la transmiterea caracterelor functionale(CTRL+)

Daca DL=FFH asteapta un caracter in AL de la tastatura

Z=1 daca nu s-a tastat caracter si se asteapta

Z=0 daca s-a apasat o tasta caracterul se gaseste in AL

AL=0 indica receptia unui caracter functional a carui cod se citeste prin urmatoarea c-da

Daca DL#FFH se afiseaza caracterul din DL

07H Citire directa in AL de la tastatura fara ecou (nu verifica CTR/BRK)

09H Afisare la consola sirul de caractere terminat cu $ indicat in registrul DX

0AH Citire de la tastatura un sir de caractere cu ecou terminat cu ENTER, la adresa din DX.

DX

NA

NR

Text

NA - numar de caractere maxim asteptate (daca se introduc mai multe de NA-1 se ignora)

NR - numar de caractere receptionate pana la ENTER

2AH Obtinerea datei curente AL - ziua in saptamana (0 duminica, 1 luni,)

CX - anul ( 1980-2098)

DH - luna (112)

DL - ziua (1.31)

2BH Setare data in calculator CX- anul, DH - luna, DL - ziua

2CH Obtinere ora curenta CH - ora (0..23), CL - minutul, DH secunda, DL - Sutime secunda

2DH Setare ora in calculator CH - ora, CL - minutul, DH secunda, DL - Sutime secunda

2. Citire caractere functionale

In aplicatiile actuale ( editoare de texte, programe de baze de date, programe de grafica,..) se folosesc foarte des caractere functionale( Extended ASCII- Coded Keyboard Data) , care sunt filtrate de catre functiile DOS de citire si afisare sir de carctere (09H, 0AH, 01H, 02H). Codurile acestor caractere se suprapun peste codurile caracterelor ASCII uzuale. Din aceasta categorie fac parte tastele functionale F1..F12, sagetile, PageUp, PageDown,End, Home, Del, Shift +Fi, ESC si caracterele insotite de CTRL (Controle) si ALT (Alternate). Numarul acestor coduri este foarte mare si pentru citirea lor in registrul AL fara a fi filtrate se utilizeaza functia 06H din DOS si se seteaza DL=0FFH. La receptia unui caracter functional AL=00 si trebuie apelata inca odata functia DOS (INT 21H) cand se primeste codul caracterului ce se va interpreta prin program ca un caracter functional. Pentru functia 06H nu se asteapta apasarea unei taste. Prin program trebuie testat daca s-a apasat o tasta lucru indicat prin Z=0. Cat timp Z=1 se asteapta prin ciclu de apel.

Prezentam mai jos o procedura care poate citi de la tastatura si caractere functionale. Pentru caractere functionale se pozitioneaza C=1, pentru a putea sa fie tratat caracterul ca functional in programul care a apelat procedura

ReadF PROC far

C1: MOV AH,6 ; cod functie citire afisare fara ecou

MOV DL,0FFH ; functie citire tasta in AL

INT 21H ; apel DOS

JZ C1 ; Z=1 ciclu de asteptare nu s-a apasat tasta

OR AL,AL ; test daca AL =00H si C=0

JNZ C2 ; nu este caracter functional

INT 21H ; apel 2 care da codul caracterului in AL

STC ; pozitionare C=1 pentru a indica programului caracter functional

C2: RET

CARF ENDP

CALL ReadF ; chemare procedura citeste un caracter (inclusiv functional)

JC Funct ; eticheta secventa analiza caracter functional

MOV Text1[SI],AL ; caracter ASCII uzual memorat intr-o zona de text

; continuare program

3. Definire macroinstructiuni

Macroinstructiunile sunt secvente de instructiuni definite ca macheta pe baza unor parametrii formali prin directiva MACRO. Utilizarea unei macroinstructiuni se face ca si pentru o instructiune cablata. Macroinstructiunile permit o programare modulara simpla prin:

Extinderea setului de instructiuni recunoscute de Asamblor

Simplificarea scrierii secventelor de cod utilizate repetat, prin inlocuirea lor cu macroinstructiuni.

Simplificarea apelului functiilor sistem prin definirea lor ca macroinstructiuni

Apelul simplu al subprogramelor, prin inlocuirea secventelor de apel si pregatirea parametrilor cu macroinstructiuni.

Definirea unei macroinstructiuni se face ca pentru un subprogram din limbajele de programare de nivel inalt specificand:

numele macroinstructiunii prin eticheta directivei MACRO

lista de parametrii formali utilizati

secventa de instructiuni care definesc algoritmul pe baza parametrilor formali, ai variabilelor si constantelor din program

sfarsitul unei macroinstructiuni se specifica prin directiva ENDM

etichetele din secventa de instructiuni cu directiva LOCAL

nume_macro MACRO param1,param2 ; lista de parametrii formali

LOCAL etich1,etich2, ; lista de etichete locale

..

; Secventa de program care utilizeaza parametrii formali

..

ENDM ; sfarsit secventa de program de definitie

Utilizarea unei macroinstructiuni definite se face ca pentru o instructiune, specificand parametrii efectivi care vor inlocui in secventa de program generata parametrii formali. Definirea macroinstructiunii trebuie facuta inainte de utilizare, in cadrul programului.

Nume_macro par1,par2,.

Exemplul 1. Afisare sir de caractere prin apel functie DOS definita ca macroinstructiune.

AFIS MACRO mesaj ; definire macroinstructiune AFIS

MOV DX,offset mesaj ; adresa text de afisat terminat cu '$'

MOV AH,9 ; cod functie DOS

INT 21H ; apel functia de afisare

ENDM ; sfarsit secventa de definitie

Utilizare macroinstructiune AFIS in program pentru afisare text :

AFIS text1 ; afisare sir de la adresa text1

In program unde s-a utilizat macroinstructiune se va genera secventa:

MOV DX,offset text1

MOV AH,9

INT 21H

Exemplul 2. Medie aritmetica a doua numere definita ca macroinstructiune:

MED MACRO X,Y,Z ; definire medie Z= (X+Y)/2

MOV AX,X

ADD AX ,Y ; AX=X+Y

SHR AX,1 ;AX=(X+Y)/2

MOV Z,AX ; Z=AX memorare rezultat

ENDM

Media C intre doua numere A si B se va calcula prin:

MED A,B,C

Exemplul 3. Conversia zecimal-binara a unui numar definita ca macroinstructiune, care apeleaza procedura de conversie CZB definita anterior.

C_ZB MACRO zec,n,bin ; conversie nr. zecimal de la adresa zec in binar la adresa bin

MOV BX,offset zec ; adresa numar zecimal ASCII

MOV CX,n ; numar de cifre zecimale

CALL CZB ; apel procedura conversiecare returneaza numar binar in AX

MOV bin,AX ; memorare numar binar la adresa bin

ENDM

Pentru conversia unui numar Xzec din zecimal in binar la adresa X se va scrie:

C_ZB Xzec,5,X ; este similara unei instructiuni cablate

Etichetele locale din MACRO se definesc prin directiva LOCAL.

Daca avem etichete in definirea MACRO acestea nu pot fi folosite direct, deoarece secventa de program se genereaza de mai multe ori si etichetele se duplica. Etichetele definite cu directiva LOCAL vor fi modificate la fiecare utilizare a MACRO, folosind elemente de timp din momentul generarii si vor fi unice in program.

MAC1 MACRO X,Y

LOCAL E1,E2 ; definire etichete locale

CMP X,Y

JZ E2 ; iesire din secventa de calcul

E1: MOV AX,X

DEC word ptr X

JNZ E1 ; salt la eticheta locala care va fi modificata la compilare

E2 LABEL near ; eticheta dupa ultima instructiune din MACRO

ENDM

4. Macroinstructiuni si subprograme

Macroinstructiunile se folosesc pentru algoritmi care se realizeaza prin secvente scurte de cateva instructiuni. La fiecare utilizare se genereaza secventa de program din definirea MACRO. Nu se vor defini macroinstructiuni pentru algoritmi care se realizeaza cu un numar mai mare de instructiuni (conversii, inmultire de matrici, etc.).

Pentru cazul unei aplicatii cu algoritmi mai complecsi se va folosi programarea modulara:

Se vor analiza functiile ce trebuie realizate, pentru care se vor definii proceduri.

Se va defini fiecare procedura pentru a specifica algoritmul folosit si se vor stabili conventiile de transmitere a parametrilor spre procedura.

Se va defini o macroinstructiune pentru fiecare procedura, care va defini secventa ce pregateste parametrii, apeleaza procedura si memoreaza rezultatele.

Se va scrie un program principal care va utiliza macroinstructiuni pentru a realiza functiile dorite. Apelul subprogramelor devine transparent la acest nivel si programarea se simplifica

Exemplul 4. Program complex care utilizeaza proceduri si macroinstructiuni care pregatesc parametrii pentru apelul procedurilor. In cadrul programului se realizeaza functiile:

Se citesc 10 numere zecimale de la tastatura de 15 cifre ( numarul de cifre in octet buf+1)

Se converteste in binar pe 2 octeti fiecare numar citit si se memoreaza intr-un tabel

La conversia zecimal binara se verifica fiecare caracter introdus daca este cifra( 09)

Se afiseaza tabelul nesortat

Se sorteaza tabelul in ordine crescatoare

Se afiseaza tabelul sortat convertind in zecimal fiecare numar binar in buffer

Programul are urmatoarea structura:

Definire date intr-un segment de date

Definire macroinstructiuni ce pregatesc parametrii si apeleaza subprogramele definite sau functii DOS si se folosesc in programul principal sau proceduri.

Definire subprograme necesare, care se apeleaza prin macroinstructiunile definite

Programul principal care utilizeaza numai macroinstructiuni prin care se apeleaza procedurile.

In cadrul programului s-au definit procedurile:

CBZ si PRINTR realizeaza conversie binar zecimala si afiseaza numarul zecimal

DECTOBIN conversie zecimal binara , verificare ca avem numai cifre si + sau - .

SELSORT sortare tabel de N numere binare pe 2 octeti

Macroinstructiunile sunt definite la inceputul programului si sunt folosite in programul principal si in proceduri:

PRINT afisare text terminat cu '$' (apelare functie 09H dinDOS).

GET citire sir de caractere de la tastatura (functia 0AH din DOS) si trecere la rand nou.

PUTC Afisare un caracter pe monitor din DL (functia 02H din DOS)

CONVBIN conversie numar zecimal( lung. pe primul octet din sir) in binar, care apeleaza procedura DECTOBIN si ii transmite adresa numarului zecimal in SI si lungimea in CX.

SORT sortare tabel de n numere binare pe 2 octeti

SCRIE afisare tabel de n numere binare pe 2 octeti dupa ce sunt convertite in zecimal

; Program care utilizeaza macroinstructii pentru chemare subprograme

; - Citire un sir de numere ; Conversie zecimal binar ; Memorare in tabel

; - Sortare tabel ; Conversie binar zecimala ; Afisare elemente tabel sortat

dosseg

.model small

.data

buf db 7,8 dup(?) ; buffer primire 7 cifre

table dw 10 dup(?) ; tabel numere binare receptionate

mes db 'Introduceti 10 nr. intregi cite unul pe linie',13,10,'$'

smsg db 'Nr. sortate sunt:',13,10,'$'

bufs db 10 dup (20h),13,10,'$'

inval db 'Nr. invalid',13,10,'$' ; mesaj pentru numar invalid (litera semn,)

zece dw 10 ; constanta 10 pentru conversiiBinar zecimale

cr db 13,10,'$ ; cr si lf

.stack 256 ; segment stiva

.code ; segment de cod program

PRINT MACRO msg ; afisare mesaj terminat cu

mov dx,offset msg

mov ah,09h

int 21h

endm

GET MACRO buff ; citire sir

mov dx,offset buff ; adr. buf. receptie

mov ah,10

int 21h

print cr ; rind nou

endm

PUTC MACRO  ; afisare caracter din DL

push ax

mov ah,2

int 21h

pop ax

endm

CONVBIN MACRO buff ; conversie zecimal binara sir

mov si,offset buff

inc si

mov cl,[si] ; contor nr. cifre

inc si ; prima cifra

xor ch,ch

call dectobin ; chemare subprogram

endm

SORT MACRO tab,cnt ; sortare tabel de n elem

mov si,offset tab ; adresa tabel intregi

mov cx,cnt ; nr elemente tabel

call selsort ; subpr. sortare tabel

endm

SCRIE MACRO tab,cnt ; afisare tabel n elemente intregi

Local s1

mov cx,cnt ; nr. elemente

mov di,0 ; index in tabel

s1: mov ax,tab[di] ; T(I)=>AX

mov bx,offset bufs ; adresa bufer conversie

mov si,7

call cbz ; subpr. conv. bin-zec si afisare

add di,2

loop s1

endm

; include bindec.inc ; se pot copia subprogramele de conversie bin-zec si zec-bin

CBZ PROC near

; Afiseaza un numar binar din ax dupa ce il

; converteste in zecimal cu + sau - in fata

or ax,ax ; pozitionare indicatori

jns pos ; numar pozitiv

neg ax ; val absoluta

mov dl,'-'

putc ; afisare un caracter din dl

pos: call printr ; procedura recursiva conv bin-zec

print cr ; rind nou

ret

CBZ ENDP

PRINTR PROC near

; In AX nr pozitiv binar, resturile MOD 10

; afisate in ordinea inversa obtinerii

cwd ; pregatire impartire DX=0

idiv zece ; N/10 restul in dx, citul in AX

or ax,ax ; cit=0 ?

jz gata1 ; da

push dx ; memorare rest

call printr ; apel recursiv

pop dx ; reface restul

gata1: or dl,30h ; cifra ASCII

PUTC ; afisare cifra din dl

ret

PRINTR ENDP

SELSORT PROC near

; Procedura sortare tabel elemente binare

; SI - adresa primul element; CX - nr. de elemente

mov bx,si

c1: dec cx

jz gata

push cx

mov si,0

mov dh,0

c2: mov ax,[bx+si]

cmp ax,[bx+si+2]

jl c3

xchg ax,[bx+si+2]

mov [bx+si],ax

inc dh

c3: add si,2

loop c2

or dh,dh

pop cx

jz gata

jmp c1

gata: ret

SELSORT ENDP

SELS PROC near ; Subprogram sortare prin selectie

; SI - adresa primul element ; CX - nr elemente

cld ; directie stg-dr

dec cx

nextp: push cx ; n-1 cicuri

lodsw ; primul element [SI]

mov di,si ; cautare in sir nesortat

nexte: scasw; ; compara ax cu[DI]

jle ismin ; ax<=[DI]

xchg ax,[DI-2] ; noul minim

ismin: loop nexte

mov [si-2],ax ; memorare minim

pop cx

loop nextp ; cauta urmatorul minim

ret

SELS ENDP

DECTOBIN PROC near

; Procedura conversie zec-binara cu semn

; SI - adresa prima cifra

; CX - numar cifre

dec cx ; ciclu semn

cld ; df=0

lodsb ; primul caracter

cmp al,'-' ; semn minus

stc ; cf=1

jz minus

cmp al,'+' ; semn plus

jz plus

inc cx ; fara semn, corectie contoare

dec si

plus: clc ; cf=0

minus: pushf ; salvare indicatori

xor bh,bh

xor ax,ax ; N=0

cwd

next: mov bl,[si] ; o cifra zecimala

cmp bl,'0' ; verificare numeric

jl nodigit ;err.

cmp bl,'9'

jg nodigit ;nu-i cifra

sub bl,30h

mul zece ; N=N*10

add ax,bx ; N=N*10+cifra

inc si

loop next ; urmatoarea cifra

popf ; reface indicatori

jnc pozitiv

neg ax ; numar negativ

clc

pozitiv: ret

nodigit: print inval ; mesaj numar invalid

popf

xor ax,ax

stc ; setare CF=1 nr.invalid

ret

dectobin endp

; Program principal

pp: mov ax,@data ;initializare reg segment

mov ds,ax

mov es,ax

print mes ; mesaj dialog

mov cx,10 ; numere de introdus

mov di,0 ; prima pozitie in tabel

cit label near

push cx

push di

get buf ; asteapta un numar

convbin buf ; AX nr. binar rezultat

pop di

pop cx

jc cont ;daca c=1 atunci nr citit este invalid

mov table[di],ax ; memorare numar binar in tabel

inc di

inc di

cont: adc cx,0 ; neglijare numar eronat

loop cit

scrie table,10 ; afis. tabel nesortat

sort table,10 ; sortare tabel

scrie table,10 ; afisare tabel sortat

mov ah,4ch ; stop

int 21h

end pp



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 2695
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