Sunteți pe pagina 1din 10

7.

MACROINSTRUCTIUNI
7.1. Funcii DOS de intrare/ieire
Funciile DOS sunt un caz articular de su!r"#ra$e existente n sistemul de operare
DOS, care se apeleaz prin ntreruperi. Apelul funciilor DOS este independent de Versiunea
sistemului de operare. Transmiterea parametrilor se face prin registre sau prin zon de memorie.
Oricare c"$and% DOS are o funcie corespondent care poate fi apelat din programe scrise n
limba de asamblare. Se pot construi aplicaii care utilizeaz comenzile DOS n programe. Din
aceast categorie face parte !i "orton #ommander, sau $indo%s #ommander.
Apelarea unei funcii DOS de intrarea ie!ire se face printr&o sec'en de forma(
MO& A'(c"d)*uncie ) codul funciei DOS se ncarc n registrul A*
+OV reg,,par, ) pregtire parametrii n registre
+OV reg-,par-
INT +1' ) apel funcie .subprogram/ prin ,ntreruere +1'
Intreruerea +1' ser'e!te la apelarea a zeci de funcii indicate prin codul funciei ce se
ncarc n registrul A*. 0iecare funcie necesit un numr de parametrii care se ncarc n registre.
Orire r"#ra$ cu re'enire n DOS se realizeaz cu funcia care are codul -C'
+OV A*,1#* ) cod funcie re'enire n DOS
2"T -,*
0unciile de intrare ie!ire referitoare la dialogul cu operatorul sunt(
.1' Citire de la tastatur% un caracter ASCII cu ecou n registrul A/.
3cou nseamn afi!are caracter tastat !i pe pe ecran.
.+' A*iare un caracter ASCII din re#istru D4 pe monitor.
.0' Citire ,n A/ un caracter de la intrarea AU1, care este n mod normal portul de
comunicaii seriale #O+, .-155 bauds, fr paritate ,,bit de Stop, 6 bii de date/.
.-' Tri$ite din D/ un caracter ASCII sre "rtul serial AU1.
.2' Ti%rete din D/ un caracter ASCII la i$ri$ant%.
.3' Intrare ieire direct% *%r% ec"u ser'e!te la transmiterea caracterelor funcionale.#T748/
Dac D/4FF' a!teapt un caracter n A4 de la tastatur
9:, dac nu s&a tastat caracter !i se a!teapt
9:5 dac s&a apsat o tast caracterul se gse!te n A4
A4:5 indic recepia unui caracter funcional a crui cod se cite!te prin urmtoarea c&d
Dac D/5FF' se afi!eaz caracterul din D4
.7' Citire direct% ,n A/ de la tastatur fr ecou .nu 'erific #T7;<7=/
.6' A*iare la c"ns"l% irul de caractere terminat cu > indicat n registrul D?
,
.A' Citire de la tastatur% un ir de caractere cu ecou terminat cu 3"T37, la adresa din D?.
D1
NA NR Te7t
"A & numr de caractere maxim a!teptate .dac se introduc mai multe de "A&, se ignor/
"7 & numr de caractere recepionate p@n la 3"T37
+A' O!inerea datei curente A4 A ziua n sptm@n .5 duminic, , luni,.../
#? A anul . ,B65&-5B6/
D* A luna .,...,-/
D4 A ziua .,....C,/
+8' Setare dat% ,n calculat"r #?& anul, D* A luna, D4 A ziua
+C' O!inere "ra curent% #* & ora .5..-C/, #4 A minutul, D* secunda, D4 A Sutime secund
+D' Setare "ra ,n calculat"r #* & ora, #4 A minutul, D* secunda, D4 A Sutime secund
7.+. Citire caractere *unci"nale
2n aplicaiile actuale . editoare de texte, programe de baze de date, programe de grafic,../ se
folosesc foarte des caractere funcionale. 97tended ASCII& #oded =eDboard Data/ , care sunt
filtrate de ctre funciile DOS de citire !i afi!are !ir de carctere .5B*, 5A*, 5,*, 5-*/. #odurile
acestor caractere se suprapun peste codurile caracterelor AS#22 uzuale. Din aceast categorie fac
parte tastele funcionale 0,..0,-, sgeile, EageFp, EageDo%n,3nd, *ome, Del, SGift 80i, 3S# !i
caracterele nsoite de #T74 .#ontrole/ !i A4T .Alternate/. "umrul acestor coduri este foarte
mare !i pentru citirea lor n re#istrul A/ fr a fi filtrate se utilizeaz *uncia .3' din DOS !i se
seteaz D/4.FF'. 4a recepia unui caracter funcional A/4.. !i trebuie apelat nc odat
funcia DOS .2"T -,*/ c@nd se prime!te codul caracterului ce se 'a interpreta prin program ca un
caracter funcional. Eentru funcia 5H* nu se a!teapt apsarea unei taste. Erin program trebuie
testat dac s&a apsat o tast lucru indicat prin 9:5. #@t timp 9:, se a!teapt prin ciclu de apel.
Erezentm mai os o procedur care poate citi de la tastatur !i caractere funcionale. Eentru
caractere funcionale se poziioneaz #:,, pentru a putea s fie tratat caracterul ca funcional n
programul care a apelat procedura
ReadF:ROC *ar
C1; MO& A'(3 ) cod funcie citire afi!are fara ecou
+OV D4,500* ) funcie citire tast in A4
2"T -,* ) apel DOS
<= C1 ) 9:, ciclu de asteptare nu s&a apasat tasta
OR A/(A/ > test dac% A/ 4..' i C4.
I"9 #- ) nu este caracter funcional
INT +1' > ael + care d codul caracterului n A4
STC > "zii"nare C41 pentru a indica programului caracter functional
#-( 73T
#A70 3"DE
CA// ReadF ) cGemare procedura citeste un caracter .inclusi' functional/
<C Funct ) eticGeta sec'enta analiza caracter functional
+OV Text,JS2K,A4 ) caracter AS#22 uzual memorat intr&o zona de text
.......... ) continuare program
-
C
7.0. De*inire $acr"instruciuni
Macr"instruciunile sunt sec'ene de instruciuni definite ca macGet pe baza unor
parametrii formali prin directi?a MACRO. Ftilizarea unei macroinstruciuni se face ca !i pentru o
instruciune cablat. +acroinstruciunile permit o programare modular simpl prin(
3xtinderea setului de instruciuni recunoscute de Asamblor
Simplificarea scrierii sec'enelor de cod utilizate repetat, prin nlocuirea lor cu
macroinstruciuni.
Simplificarea apelului funciilor sistem prin definirea lor ca macroinstruciuni
Apelul simplu al subprogramelor, prin nlocuirea sec'enelor de apel !i pregtirea
parametrilor cu macroinstruciuni.
De*inirea unei $acr"instruciuni se face ca pentru un subprogram din limbaele de programare
de ni'el nalt specific@nd(
numele macroinstruciunii prin eticGeta directi'ei MACRO
lista de parametrii formali utilizai
sec'en de instruciuni care definesc algoritmul pe baza parametrilor formali, ai
'ariabilelor !i constantelor din program
sf@r!itul unei macroinstruciuni se specific prin directi'a 9NDM
eticGetele din sec'ena de instruciuni cu directi?a /OCA/
nu$e)$acr" MACRO ara$1(ara$+,..... ) lista de parametrii formali
/OCA/ etic@1(etic@+,... ) list de eticGete locale
........
) Sec?en% de r"#ra$ care utilizeaz parametrii formali
........
9NDM ) sf@r!it sec'en de program de definiie
Utilizarea unei $acr"instruciuni definite se face ca pentru o instruciune, specific@nd
parametrii efecti'i care 'or nlocui n sec'ena de program generat parametrii formali. Definirea
macroinstruciunii trebuie fcut nainte de utilizare, n cadrul programului.
Nu$e)$acr" ar1(ar+(....
97e$lul 1. A*iare ir de caractere prin apel funcie DOS definit ca macroinstruciune.
AFIS MACRO $esaA ) definire macroinstruciune A02S
+OV D?,offset mesa ) adres text de afi!at terminat cu L>L
+OV A*,B ) cod funcie DOS
2"T -,* ) apel funcia de afi!are
9NDM > sf@r!it sec'ena de definiie
Ftilizare macroinstruciune A02S n program pentru afi!are text (
AFIS te7t1 ) afi!are !ir de la adresa text,
2n program unde s&a utilizat macroinstruciune se 'a genera sec'ena(
+OV D?,offset text,
+OV A*,B
2"T -,*
1
97e$lul +. Medie arit$etic% a dou numere definit ca macroinstruciune(
+3D +A#7O ?,M,9 ) definire medie 9: .?8M/;-
+OV A?,?
ADD A? ,M ) A?:?8M
S*7 A?,, )A?:.?8M/;-
+OV 9,A? ) 9:A? memorare rezultat
3"D+
+edia # ntre dou numere A !i < se 'a calcula prin(
M9D A(8(C
97e$lul 0. C"n?ersia zeci$alB!inar% a unui numr definit ca macroinstruciune, care apeleaz
procedura de con'ersie C=8 definit anterior.
C)=8 MACRO zec(n(!in ) con'ersie nr. zecimal de la adresa zec n binar la adresa !in
+OV <?,offset zec ) adresa numar zecimal AS#22
+OV #?,n ) numar de cifre zecimale
#A44 #9< ) apel procedura con'ersiecare returneaza numar binar in A?
+OV bin,A? ) memorare numar binar la adresa bin
9NDM
Eentru con'ersia unui numr ?zec din zecimal n binar la adresa ? se 'a scrie(
C)=8 1zec(2(1 > este similar unei instruciuni cablate
9tic@etele l"cale din MACRO se definesc prin directi'a /OCA/.
Dac a'em eticGete n definirea +A#7O acestea nu pot fi folosite direct, deoarece sec'ena
de program se genereaz de mai multe ori !i eticGetele se duplic. 3ticGetele definite cu directi'a
4O#A4 'or fi modificate la fiecare utilizare a +A#7O, folosind elemente de timp din momentul
generrii !i 'or fi unice n program.
+A#, +A#7O ?,M
/OCA/ 91(9+ ) definire eticGete locale
#+E ?,M
I9 3- ) ie!ire din sec'ena de calcul
91; +OV A?,?
......
D3# %ord ptr ?
I"9 3, ) salt la eticGeta locala care 'a fi modificata la compilare
3- 4A<34 near ) eticGeta dupa ultima instructiune din +A#7O
3"D+
N.1. +acroinstruciuni !i subprograme.
+acroinstruciunile se folosesc pentru algoritmi care se realizeaz prin sec'ene scurte de
c@te'a instruciuni. 4a fiecare utilizare se genereaz sec'ena de program din definirea +A#7O.
"u se 'or defini macroinstruciuni pentru algoritmi care se realizeaz cu un numr mai mare de
instruciuni .con'ersii, nmulire de matrici, etc./.
Eentru cazul unei aplicaii cu algoritmi mai complec!i se 'a folosi programarea modular(
Se 'or analiza funciile ce trebuie realizate, pentru care se 'or definii proceduri.
O
Se 'a defini fiecare procedur pentru a specifica algoritmul folosit !i se 'or stabili
con'eniile de transmitere a parametrilor spre procedur.
Se 'a defini o macroinstruciune pentru fiecare procedur, care 'a defini sec'ena ce
pregte!te parametrii, apeleaz procedura !i memoreaz rezultatele.
Se 'a scrie un program principal care 'a utiliza macroinstruciuni pentru a realiza funciile
dorite. Apelul subprogramelor de'ine transparent la acest ni'el !i programarea se simplific
97e$lul -. :r"#ra$ c"$le7 care utilizeaz proceduri !i macroinstruciuni care pregtesc
parametrii pentru apelul procedurilor. 2n cadrul programului se realizeaz funciile(
Se citesc ,5 numere zecimale de la tastatur de ,...O cifre . numrul de cifre n octet buf8,/
Se con'erte!te n binar pe - octei fiecare numr citit !i se memoreaz ntr&un tabel
4a con'ersia zecimal binar se 'erific fiecare caracter introdus dac este cifr. 5...B/
Se afi!eaz tabelul nesortat
Se sorteaz tabelul n ordine cresctoare
Se afi!eaz tabelul sortat con'ertind n zecimal fiecare numr binar n buffer
Erogramul are urmtoarea structur(
Definire date ntr&un segment de date
Definire macroinstruciuni ce pregtesc parametrii !i apeleaz subprogramele definite sau
funcii DOS !i se folosesc n programul principal sau proceduri.
Definire subprograme necesare, care se apeleaz prin macroinstruciunile definite
Erogramul principal care utilizeaz numai macroinstruciuni prin care se apeleaz
procedurile.

2n cadrul programului s&au definit procedurile(
C8= i :RINTR realizeaz con'ersie binar zecimal !i afi!eaz numrul zecimal
D9CTO8IN con'ersie zecimal binar , 'erificare c a'em numai cifre !i 8 sau & .
S9/SORT sortare tabel de " numere binare pe - octei
+acroinstruciunile sunt definite la nceputul programului !i sunt folosite n programul
principal !i n proceduri(
:RINT afi!are text terminat cu L>L .apelare funcie 5B* dinDOS/.
C9T citire !ir de caractere de la tastatur .funcia 5A* din DOS/ !i trecere la r@nd nou.
:UTC Afi!are un caracter pe monitor din D4 .funcia 5-* din DOS/
CON&8IN con'ersie numr zecimal. lung. pe primul octet din !ir/ n binar, care apeleaz
procedura D3#TO<2" !i i transmite adresa numrului zecimal n S2 !i lungimea n #?.
SORT sortare tabel de n numere binare pe - octei
SCRI9 afi!are tabel de n numere binare pe - octei dup ce sunt con'ertite n zecimal
H
> :r"#ra$ care utilizeaza $acr"instructii entru c@e$are su!r"#ra$e
) & #itire un sir de numere ) #on'ersie zecimal binar ) +emorare in tabel
) & Sortare tabel ) #on'ersie binar zecimala ) Afisare elemente tabel sortat
) &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
dosseg
.model small
.data
buf db N,6 dup.P/ ) buffer primire N cifre
table d% ,5 dup.P/ ) tabel numere binare receptionate
mes db Q2ntroduceti ,5 nr. intregi cite unul pe linieQ,,C,,5,Q>Q
smsg db Q"r. sortate sunt(Q,,C,,5,Q>Q
bufs db ,5 dup .-5G/,,C,,5,Q>Q
in'al db Q"r. in'alidQ,,C,,5,Q>Q ) mesa pentru numar in'alid .litera semn,/
zece d% ,5 ) constanta ,5 pentru con'ersii<inar zecimale
cr db ,C,,5,Q> ) cr si lf
.stacR -OH ) segment sti'a
.code ) segment de cod program
:RINT +A#7O msg ) afisare mesa terminat cu >
mo' dx,offset msg
mo' aG,5BG
int -,G
endm
C9T +A#7O buff ) citire sir
mo' dx,offset buff ) adr. buf. receptie
mo' aG,,5
int -,G
print cr ) rind nou
endm
:UTC +A#7O ) afisare caracter din D4
pusG ax
mo' aG,-
int -,G
pop ax
endm
CON&8IN +A#7O buff ) con'ersie zecimal binara sir
mo' si,offset buff
inc si
mo' cl,JsiK ) contor nr. cifre
inc si ) prima cifra
xor cG,cG
call dectobin ) cGemare subprogram
endm
SORT +A#7O tab,cnt ) sortare tabel de n elem
mo' si,offset tab ) adresa tabel intregi
mo' cx,cnt ) nr elemente tabel
call selsort ) subpr. sortare tabel
endm
SCRI9 +A#7O tab,cnt ) afisare tabel n elemente intregi
4ocal s,
mo' cx,cnt ) nr. elemente
N
mo' di,5 ) index in tabel
s,( mo' ax,tabJdiK ) T.2/:SA?
mo' bx,offset bufs ) adresa bufer con'ersie
mo' si,N
call cbz ) subpr. con'. bin&zec si afisare
add di,-
loop s,
endm
> include !indec.inc ) se pot copia subprogramele de con'ersie bin&zec si zec&bin
)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
C8= :ROC near
) Afiseaza un numar binar din ax dupa ce il
) con'erteste in zecimal cu 8 sau & in fata
)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
or ax,ax ) pozitionare indicatori
ns pos ) numar poziti'
neg ax ) 'al absoluta
mo' dl,Q&Q
putc ) afisare un caracter din dl
pos( call printr ) procedura recursi'a con' bin&zec
print cr ) rind nou
ret
#<9 3"DE
) &&&&&&&&&&&&&&&&&&&&&&&&&&&
:RINTR :ROCnear
) 2n A? nr poziti' binar, resturile +OD ,5
) afisate in ordinea in'ersa obtinerii
c%d ) pregatire impartire D?:5
idi' zece ) ";,5 restul in dx, citul in A?
or ax,ax ) cit:5 P
z gata, ) da
pusG dx ) memorare rest
call printr ) apel recursi'
pop dx ) reface restul
gata,( or dl,C5G ) cifra AS#22
EFT# ) afisare cifra din dl
ret
E72"T7 3"DE
) &&&&&&&&&&&&&&&&&&&&&&&&&&&
S9/SORT :ROC near
) Erocedura sortare tabel elemente binare
) S2 & adresa primul element) #? & nr. de elemente
) &&&&&&&&&&&&&&&&&&&&&&&&&&&&
mo' bx,si
c,( dec cx
z gata
pusG cx
mo' si,5
mo' dG,5
c-( mo' ax,Jbx8siK
6
cmp ax,Jbx8si8-K
l cC
xcGg ax,Jbx8si8-K
mo' Jbx8siK,ax
inc dG
cC( add si,-
loop c-
or dG,dG
pop cx
z gata
mp c,
gata( ret
S34SO7T 3"DE
)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
S9/S :ROCnear ) Subprogram sortare prin selectie
) S2 & adresa primul element ) #? & nr elemente
) &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
cld ) directie stg&dr
dec cx
nextp( pusG cx ) n&, cicuri
lods% ) primul element JS2K
mo' di,si ) cautare in sir nesortat
nexte( scas%) ) compara ax cuJD2K
le ismin ) axT:JD2K
xcGg ax,JD2&-K ) noul minim
ismin( loop nexte
mo' Jsi&-K,ax ) memorare minim
pop cx
loop nextp ) cauta urmatorul minim
ret
S34S 3"DE
)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
D9CTO8IN :ROC near
) Erocedura con'ersie zec&binara cu semn
) S2 & adresa prima cifra
) #? & numar cifre
dec cx ) ciclu semn
cld ) df:5
lodsb ) primul caracter
cmp al,Q&Q ) semn minus
stc ) cf:,
z minus
cmp al,Q8Q ) semn plus
z plus
inc cx ) fara semn, corectie contoare
dec si
plus( clc ) cf:5
minus( pusGf ) sal'are indicatori
xor bG,bG
xor ax,ax ) ":5
B
c%d
next( mo' bl,JsiK ) o cifra zecimala
cmp bl,Q5Q ) 'erificare numeric
l nodigit )err.
cmp bl,QBQ
g nodigit )nu&i cifra
sub bl,C5G
mul zece ) ":"U,5
add ax,bx ) ":"U,58cifra
inc si
loop next ) urmatoarea cifra
popf ) reface indicatori
nc poziti'
neg ax ) numar negati'
clc
poziti'( ret
nodigit( print in'al ) mesa numar in'alid
popf
xor ax,ax
stc ) setare #0:, nr.in'alid
ret
dectobin endp
) &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
> :r"#ra$ rincial
) &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
pp( mo' ax,Vdata )initializare reg segment
mo' ds,ax
mo' es,ax
print mes ) mesa dialog
mo' cx,,5 ) numere de introdus
mo' di,5 ) prima pozitie in tabel
cit label near
pusG cx
pusG di
get buf ) asteapta un numar
con'bin buf ) A? nr. binar rezultat
pop di
pop cx
c cont )daca c:, atunci nr citit este in'alid
mo' tableJdiK,ax ) memorare numar binar in tabel
inc di
inc di
cont( adc cx,5 ) negliare numar eronat
loop cit
scrie table,,5 ) afis. tabel nesortat
sort table,,5 ) sortare tabel
scrie table,,5 ) afisare tabel sortat
mo' aG,1cG ) stop
int -,G
end pp
,5

S-ar putea să vă placă și