Sunteți pe pagina 1din 15

Exemplu 1 program in limbaj de asamblare ce calculeaza valoarea expresiei e = a + b in care variabilele au valori fixe: ; programul determina expresia e=a+b

b ;---------------------------------------------------------------------.model small .286 .stack 100h .data a db 10 b db 35 e db ? .code mov AX,@data mov DS,AX mov AL,a add AL,b mov e,AL mov AX,4c00h int 21h end Descriere program: .model small : Liniile care incep cu .reprezinta instructiuni speciale care indica programului assembler anumite informatii, descrise de cuvintele cheie ce urmeaza, cu privire la programul de construit. in aceasta situatie model indica faptul ca urmeaza a se indica modelul de memorie (si cantitatea de memorie) utilizat de program. Acest program necesita un spatiu redus de memorie, fapt indicat prin small. Un model de memorie specifica modul in care codul si datele sunt adresate, ori sunt in acelasi segment fizic ori in mai multe segmente. Cnd toate datele (sau tot codul) se afla in acelasi segment atunci elementele sunt adresate prin adrese near date de deplasarea lor (offset) fata de adresa de inceput a segmentului. Daca se utilizeaza mai multe segmente atunci elementele sunt adresate prin adrese far date de adresa segmentului si offset. Tipuri standard de modele sunt: SMALL, MEDIUM, COMPACT si LARGE. Model de memorie Tip adrese Adrese COD Adrese DATE SMALL MEDIUM COMPACT LARGE near near near far far near far far

.stack : Alta linie care descrie programul. Instructiunea indica locul in care incepe segmentul de stiva. Acesta este utilizat ca zona temporara de stocare a rezultatelor intermediare sau pentru a conserva starea sistemului (descrisa de valorile din registre) inainte de a efectua operatii care sa altereze datele existente. De asemenea stiva este utilizata si in transferul parametrilor catre si din proceduri. Indiferent daca este utilizata sau nu este obligatorie definirea segmentului de stiva deoarece un program .EXE trebuie sa aiba o stiva. Optional se poate defini si dimensiunea stivei ca numar de octeti. Daca nu se specifica dimensiunea se iau implicit 1024 de bytes. .data : indica faptul ca incepe segmentul de date. Implicit, reprezinta terminarea segmentului de stiva. In segmentul de date sunt definite variabilele cu care se lucreaza in program. a db 10: se defineste o variabila de tip byte cu valoarea zecimala 10. .code : indica inceperea segmentului de cod si implicit, terminarea segmentului de date. Acest segment contine instructiunile programului. mov AX, @data : Instructiunea incarca in registrul AX adresa segmentului de date. Alte simboluri predefinite @code adresa segmentului de cod. mov DS,AX : Instructiunea incarca in registrul segment DS adresa segmentului de date din registrul AX. Operatia este necesara deoarece nu este permisa incarcarea registrului DS cu o valoare constanta (adresa). mov AL,a: se pune in registrul AL valoarea lui a. add AL,b: se aduna la valoarea din registrul AL, valoarea lui b. mov e,AL: variabila e este initializata cu valoarea din registrul AL mov AX, 4c00h : incarca in registrul AX valoarea hexazecimala 4c00h. Acest lucru este necesar apelarii ulterioare a rutinei 21h.

int 21h : Apelul intreruperii 21h. In registrul AH se gaseste valoarea 4ch deoarece AX are valoarea 4c00h. Pentru rutina DOS acest lucru semnifica iesire din program. Valoarea din AL, adica 00h, reprezinta codul de iesire din program ce indica terminare executie fara eroare. .end : marcheaza sfrsitul fisierului sursa. ATENTIE: Daca se specifica numele unei etichete definita anterior (de obicei inainte de prima instructiune) atunci aceasta reprezinta adresa din CS la care porneste executia programului. De exemplu programul ... .code mov AX,@data mov DS,AX Start: mov AL,a add AL,b mov e,AL ... end Start ruleaza incepnd cu instructiunea mov AL,a. Exemplu 2 afiseaza un mesaj la consola: ; programul afiseaza un mesaj ;---------------------------------------------------------------------.model small .stack .data mesaj db "Afisare mesaj !!!","$" .code main proc mov AX,seg mesaj mov DS,AX mov AH,09 lea DX,mesaj int 21h mov AX,4c00h int 21h main endp end main Descriere program: main proc : codul poate fi structurat prin intermediul procedurilor. Pentru a face analogie cu programul C care trebuie sa contina obligatoriu o procedura numita main, se defineste procedura si in programul assembler. Instructiunea indica inceputul subprogramului numit main. Sfarsitul subprogramului este indicat de instructiunea end main. mesaj db Afisare mesaj !!! : defineste o variabila sir de caractere numita message ce contine textulAfisare mesaj !!!. mov AX, seg mesaj : Instructiunea incarca in registrul AX adresa segmentului de date. Reprezinta o alternativa la instructiunea mov AX, @data pentru ca instructiunea seg intoarce adresa segmentului in care se afla definita variabila respectiva. Situatia este posibila pentru ca fiecare variabila este identificata printr-o adresa de forma segment:offset. Fara a incarca registrul DS cu adresa segmentului activ de date nu se incarca corect adresa variabilei mesaj. mov AH, 09 : incarca in registrul AH valoarea constanta 09. Este necesar pentru a afisa un mesaj pe ecran utiliznd intreruperea DOS 21h. lea DX, message : Instructiunea LEA (Load Efective Address) incarca in registrul DX offset-ul din cadrul segmentului de date la care se gaseste variabila mesaj . Acest lucru este necesar pentru a afisa mesajul pe ecran utiliznd intreruperea 21h. int 21h : Instructiunea genereaza o intrerupere DOS. Procesorul apeleaza rutina indicata de numarul intreruperii, in acest caz o rutina DOS. Procedura verifica registrul AH pentru a vedea ce trebuie sa faca. In acest caz, valoarea 09 din AH indica faptul ca trebuie sa scrie pe ecran un sir de biti. Instructiuni utilizate in cele 2 exemple: Instructiunea MOV realizeaza principalele operatii de transfer a valorilor;

este att de utilizata inct este imposibil sa scrii un program assembler fara aceasta instructiune; forma analitica a instructiunii este: MOV destinatie, sursa si realizeaza copierea valorii de la sursa la destinatie fara a modifica sursa. permite multiple combinatii de tipuri ale sursei si destinatiei (registru, valoare imediata, locatie de memorie) insa exclude situatiile: o destinatia nu poate fi segmentul CS; cum segmentul CS contine intotdeauna adresa codului de executat nu este indicat a se modifica aceasta valoarea in timpul prelucrarii.; singurul mod de a modifica CS este prin intermediul instructiunilor int, jmp sau call; o destinatia si sursa nu pot fi in acelasi timp operanzi din memorie (variabile definite in segmentul de date); aceasta restrictie se aplica tuturor instructiunilor procesoarelor 8086 care necesita doi operanzi; exemplu: vb1 DW 300 vb2 DW ?

.data . ;EROARE mov vb2,vb1 pentru a evita situatia se utilizeaza un registru asemenea unei zone temporare; de exemplu: .data vb1 DW 300 vb2 DW ? . mov AX, vb1 mov vb2,AX daca sursa este o valoare imediata (constanta valorica), destinatia nu poate fi unul dintre registrele de segment (CS, DS, ES, SS); pentru a evita situatia se utilizeaza un registru; destinatia nu poate fi un operand imediat (constanta valorica); exemplu: ;EROARE mov 5, AX cea mai rapida combinatie este MOV registru, registru; Instructiunea XCHG interschimba valorile din sursa si destinatie; forma analitica: XCHG destinatie, sursa nu afecteaza nici un Flag bit; Instructiunile LDS si LES sunt printre putinele instructiuni care prelucreaza un dublu cuvnt (32 de biti); transfera dublu-cuvntul din memorie catre 2 registre de 16 biti; valoarea din cei doi octeti superiori ai dublu-cuvntului este copiata intr-unul din registrele de segment (fie DS sau ES in functie de instructiune LDS sau LES); cuvntul (16 biti) mai putin semnificativ este copiat intr-un registru general indicat ca operand destinatie in instructiune; de obicei dublucuvntul este un pointer ce contine adresa unei variabile data de segment:offset (adresa segmentului pe 16 biti si offestul in cadrul segmentului tot pe 16 biti); incarca adresa in segment; forma analitica: LDS registru, sursa LES registru, sursa unde sursa este reprezentata de o variabila definita pe 32 de biti; registrul FLAG este neafectat; restrictie: registru nu poate fi unul din registrele de segment; exemplu: mesaj db "Afisare mesaj !!!","$" pointer_mesaj dd mesaj lds DX,pointer_mesaj ; incarca in DS adresa segmentului in care se afla mesaj si in DX offest-ul sau daca DS este deja incarcat cu adresa segmentului atunci ;incarca in ES adresa segmentului si in DX offset-ul les DX, mesaj

ultima instructiune poate fi inlocuita cu: mov DX, OFFSET mesaj ;OFFSET returneaza offset-ul variabilei mesaj Instructiunea ADD aduna la operandul destinatie valoarea operandului sursa; adunarea se realizeaza pe 16 biti; forma analitica: ADD destinatie, sursa permite multiple combinatii de tipuri ale sursei si destinatiei (registru, valoare imediata, locatie de memorie) insa exclude situatiile: o destinatia nu poate fi segmentul CS; cum segmentul CS contine intotdeauna adresa codului de executat nu este indicat a se modifica aceasta valoarea in timpul prelucrarii.; singurul mod de a modifica CS este prin intermediul instructiunilor int, jmp sau call; o destinatia si sursa nu pot fi in acelasi timp operanzi din memorie (variabile definite in segmentul de date); aceasta restrictie se aplica tuturor instructiunilor procesoarelor 8086 care necesita doi operanzi; exemplu: .data vb1 DW 300 vb2 DW ? . ;EROARE add vb2,vb1 pentru a evita situatia se utilizeaza un registru asemenea unei zone temporare; de exemplu: .data vb1 DW 300 vb2 DW ? . mov AX, vb1 add vb2,AX daca sursa este o valoare imediata (constanta valorica), destinatia nu poate fi unul dintre registrele de segment (CS, DS, ES, SS); pentru a evita situatia se utilizeaza un registru; destinatia nu poate fi un operand imediat (constanta valorica); exemplu: add 5, AX ;EROARE registru FLAG modificat: OF, CF, PF, SF, AF, ZF; Instructiunea SUB (SUBstract) scade din operandul destinatie valoarea operandului sursa; forma analitica: SUB destinatie, sursa restrictii identice ca la instructiunea ADD; exemple: .data vb1 DW 300 vb2 DW 50 . mov AX, vb1 mov CX, vb2 sub vb1, 50 sub AX, CX sub AX, vb1 sub AX,10 Instructiunea NEG utilizat pentru a nega operandul, scaznd-ul din valoarea 0; forma analitica: NEG operand registru FLAG afectat: OF,SF, ZF, AF, PF, CF; operandul trebuie sa fie registru sau variabila; cnd operandul contine valoarea minima posibila aceasta nu este afectata; Instructiunea MUL (MULtiply) multiplica o valoare unsigned din AL (cnd operandul este de tip byte) sau din AX (cnd operandul este de tip word) cu valoarea operandului specificat; rezultatul este returnat in AX cnd operandul este de tip byte si in DX:AX (cei 2 octeti superiori in DX) cnd acesta este de tip word;

forma analitica:

MUL operand registru FLAG modificat: OF si CF sunt setati daca partea superioara a rezultatului (DX daca operandul este de tip word, sau AH este de tip byte) este diferita de 0;alte flag-uri SF, ZF, AF, PF; operandul poate fi alt registru sau o variabila; daca valoarea inmultita are semn atunci se utilizeaza IMUL; Instructiunea DIV (DIVide) imparte o valoare unsigned din AX (cnd operandul este de tip byte; in acest caz DX trebuie sa contina valoarea 0) sau din DX:AX (cnd operandul este de tip word) cu valoarea operandului specificat; ctul este returnat in AL iar restul in AH cnd operandul este de tip byte si in DX:AX (DX contine restul si AX ctul) cnd acesta este de tip word; forma analitica: DIV operand registru FLAG modificat: nedefiniti; operandul poate fi alt registru sau o variabila; in cazul operandului de tip word memorarea deimpartitului in DX:AX se face cu instructiunea cwd (convert word to double) ce extinde valoarea din AX in zona DX:AX; exemplu: vb1 dw 55 vb2 dw 15 cat dw ? rest dw ? ... mov AX,vb1 cwd div vb2 mov cat,AX mov rest,DX<span style="text-decoration: underline;"><span style="text-decoration: underline;"> </span></span> Instructiunea ROR (ROtate Right) utilizata pentru a roti la dreapta bitii destinatiei de attea ori ct este specificat; cum fiecare bit este rotit la dreapta, cel mai putin semnificativ bit al destinatiei este copiat in locul celui mai semnificativ bit si in CF (carry flag); forma analitica: ROR destinatie, contor destinatia poate fi registru sau variabila; contorul poate fi constanta sau registrul CL; exemple: vb dw 1234h mov CL, 4 ror AX, CL ror AX,4 ror vb, CL ror vb, 4 registru FLAG: OF este setat doar daca contorul are valoarea 1 si bitul cel mai semnificativ al destinatiei este diferit de bitul vecin; pentru alte valori nu exista regula de modificare a lui OF; se modifica si CF; Instructiunea ROL (ROtate Left) utilizata pentru a roti la stnga bitii destinatiei de attea ori ct este specificat; cum fiecare bit este rotit la stnga, cel mai semnificativ bit al destinatiei este copiat in locul celui mai putin semnificativ bit si in CF (carry flag); analogie cu ROR; Instructiunea SAL sau SHL (Shift Arithmetic Left si SHift Left) se utilizeaza pentru a muta la stnga bitii din destinatie cu attea pozitii cte sunt specificate in contor; cu fiecare pozitie se adauga la stnga in bitul cel mai putin semnificativ valoarea 0; forma analitica: SAL destinatie, contor registrul FLAG: SF, ZF si PF; cel mai semnificativ bit al destinatiei este mutat in CF; OF este setat daca contorul are valoarea 1 iar bitul de semn isi pastreaza valoarea; utilizat pentru a inmulti destinatia o putere a lui 2; destinatia poate fi registru sau variabila; contorul poate fi constanta sau registrul CL; Instructiunea SAR (Shift Arithmetic Right)

se utilizeaza pentru a muta la dreapta bitii din destinatie cu attea pozitii cte sunt specificate in contor; cu fiecare pozitie se adauga la dreapta in vecinul bitului cel mai semnificativ valoarea 0; bitul cel semnificativ (bitul de semn) isi pastreaza valoarea; forma analitica: SAR destinatie, contor registrul FLAG: SF, ZF si PF; cel mai putin semnificativ bit al destinatiei este mutat in CF; OF este setat daca contorul are valoarea 1 iar bitul de semn si vecinul sau sunt diferiti; utilizat pentru a imparti un numar negativ (destinatia) la o putere a lui 2; destinatia poate fi registru sau variabila; contorul poate fi constanta sau registrul CL; Instructiunea SHR (Shift Rigth) se utilizeaza pentru a muta la dreapta bitii din destinatie cu attea pozitii cte sunt specificate in contor; cu fiecare pozitie se adauga in vecinul bitului cel mai semnificativ valoarea 0; forma analitica: SHR destinatie, contor registrul FLAG: SF, ZF si PF; cel mai putin semnificativ bit al destinatiei este mutat in CF; OF este setat daca contorul are valoarea 1 iar bitul de semn si vecinul sau sunt diferiti; utilizat pentru a imparti un numar pozitiv (destinatia) la o putere a lui 2; destinatia poate fi registru sau variabila; contorul poate fi constanta sau registrul CL; 1. Exemple de instructiuni si date: Tipuri de date: var1 db -16783 var2 db 'b' var3 dw 145615646747474 var4 dw 'om' var5 dd 3.14 var6 dq +13414.32534 var7 dt -799999999999999999999999999 Tipul Segment si directiva ASSUME: nume_data segment var1 db 'Haribol' nume_data ends assume ds:nume_data Declararea de variabile: sir1 db dup(100) ; sir de 100 de caractere CR equ dh ; constanta (carriage return, cod D) Un sablon de program: date segment sir db dup(100) num db ? ; nedefinit date ends assume cs:cod ds:date cod segment mov ax, num ; instructiuni ASM... mov ds, ax mov ah, 4ch ; iesire DOS int 21h ; iesire DOS cod ends end ; end-ul final(e obligatoriu!) Instructiuni de transfer: mov ax, bx ; muta in AX continutul lui BX mov ax, 5 ; ax = 5 Instructiuni aritmetice: add ax, 56; ax = ax + 56 dec bx; bx = bx - 1

mov ax, 9 div 4 ; ah = 2, al = 1 mov ax, 8 mul 7 ; ax = 56 sub ax, cx; ax = ax - cx mov ax, 5 shl ax, 2; ax = 5 * 4 = 20 mov ax, 64 shr 3 ; ax = 64 / 8 = 8 Instructiuni logice: xor ax, ax ; ax = 0 and cx, dx Instructiuni cu siruri: lea dx, ds ; ds e adresa unui sir lodsb Instructiuni de salt: @1:mov ax, 7 mov bx, 5 cmp ax, bx jl @2 ; nu sare deoarece 7 < 5 e fals jge @2 ; sare la @2 pt. ca 7 >= 5 jmp @1 ; sare la @1(fara discutie...) @2:... mov cx, 1000 @1:loop @1 ; sare la @1 de 1000 ori Instructiuni complexe: aduna macro a b ; parametrii a si b local @1 local mm db ? add a, b ; ii aduna aduna endm save proc pushf ; salveaza toti registrii ret ; return save endp Tehnici: IF (ax >= bx) and (ax > 10) THEN ax = ax / 2 ELSE ax = bx cmp ax, bx jl et1 cmp ax, 10 jle et1 et1:mov ax, bx jmp et2 shr ax, 1 et2: REPEAT readchar UNTIL enter et1:mov ah, 1; citeste caracter cu ecou int 16h cmp al, 13 ;cod ENTER jne et1 2. Exemple de programe ASM: Fisier COM(asteapta o tasta): code segment org 100h assume cs:code mov ah, 0 ;functie waitchar int 16h mov ah, 4ch ;iesire DOS int 21h

code ends end Afiseaza un sir: data segment sir db 'Haribol', '$' data ends assume cs:code ds:data code segment mov ax, data mov ds, ax mov ah, 9h ;functie sfisare sir lea dx, sir int 21h mov ah, 4ch ;iese DOS int 21h code ends end Aprinde toate LED-urile: code segment assume cs:code mov al, 0edh out 60h, al mov cx, 10000 ; asteapta... @1:loop @1 mov al, 7; 1 + 2 + 4 oout 60h, al mov ah, 4ch int 21h code ends end Macro de Bar grafic: code segment assume cs:code putpixel macro x, y, c mov ah, 0ch ;functia de pixel... mov bh, 0 mov cx, x mov dx, y mov al, c int 10h putpixel endm bar macro x1, y1, x2, y2, c local @1 mov cx, x1 mov dx, y1 @1:putpixel cx, dx, c ;se foloseste macro-ul definit anterior inc cx cmp cx, x2 jl @1 mov cx, x1 inc dx cmp dx, y2 jl @1 bar endm mov ax, 10h int 10h bar 1, 1, 300, 200, 5 mov ah, 0 int 16h mov ax, 3 int 10h mov ah, 4ch

int 21h code ends end Muta cursorul la coord. mouse-ului pentru b1. La b2 iese: code segment assume cs:code move macro x, y mov bh, x ;muta cursorul mov dx, y mov ah, 2 int 10h move endm xor ax, ax int 33h mov ax, 1 int 33h @1:mov ax, 3 ;preia coord. mouse(CS, DX) + buton(BX) cmp bx, 2 je @2 cmp bx, 1 je @3 jmp @1 @3:move cx, dx jmp @1 @2:mov ah, 4ch int 21h code ends end Citeste un sir si-l afiseaza apoi pe ecran: data segment sir db dup(?) ;dimensiune nedeclarata mes db 'Dati un sir:', '$' data ends code segment assume ds:data cs:code mov ax, data ;afisam mes mov ds, ax mov ah, 9 lea dx, mes int 21h lea di, sir ;atribuie sirului sir indicele DI @1:mov ah, 1 ;citeste char int 16h cmp al, 13 je @2 ;cat timp nu e ENTER inc di ;crestem indicele mov sir[di], al ;punem pe pozitia DI din sir caracterul citit in AL jmp @1 ;reluam @2:inc di ;adaugam un $(pentru final...) mov sir[di], '$' mov ah, 9 ;tiparim sirul lea dx, sir int 21h mov ah, 4ch int 21h code ends end 1. Despre limbajul ASM: Limbajul de asamblare(ASM) permite intelegerea la nivel de amanunt a ceea ce se intampla in realitate intr-un calculator. Exista mai multe motive pentru care programarea in ASM este necesara. Codul generat in ASM este, in general, foarte

rapid. Programele complexe au scrise in ASM modulele critice. Exista si situatii cand avem nevoie de accesul la dispozitive I/O sau locatii de memorie. Pe scurt, limbajul de asamblare ofera viteze de executie si acces la hardware care nu pot fi disponibile(cel mai adesea) in limbajele de nivel inalt(Pascal, C, Visual C, Visual Basic, Java). 2. Date generale.Arhitectura procesorului: Unitatea de baza a informatiei memorate in calculator este bitul. Acesta reprezinta o cifra binara(0 sau 1) Modelul hardware al acestuia este bistabilul (sau flagul). Un grup de bistabili formeaza un registru. Un byte(sau octet) este format din 8 biti.De exemplu, 01001011 ocupa un byte. Informatia ce poate fi codificata intr-un registru poate lua valori intre 00000000 si 11111111.Numarul de combinatii este de 256(28). Registrii procesorului: AX, BX, CX, DX, BP, SP, SI, DI - acestia sunt. Cei cu x se pot imparti in doua(partea high si low). astfel: ah, al, bh, bl, ch, cl, dh, dl. Functiile lor sunt: AX este registrul acumulator BX este registrul de baza general CX este registrul contor DX este registrul de date BP este registrul de baza pentru stiva SP este registrul indicator de stiva SI este registrul index sursa DI este registrul index destinatie Mai sunt si patru registri de segment: CS - segmentul de cod (code) DS - segmentul de date (date) SS - segmentul de stiva (stack) ES - segmentul de date suplimentar (extra) De mentionat ca in ASM se folosesc bazele 2 si 16(rar si 8). Trecerea dintr-o baza in alta se face astfel: 25510 = 111111112 = FF 16 = 3778 Numerotarea in ASM incepe de la 0(atentie!). Byte-ul este unitatea ce exprima volumul memoriei unui calculator. Deoarece dimensiunea memoriei este un multiplu de 2, multiplii pentru bytes sunt puteri ale lui 2(nu 10, 100, 1000...). Astfel: kilo = 1024 bytes mega = 1024 kilo = 10264576 bytes giga = 1024 mega = 10264576 kilo = 1073741824 bytes In memoria calculatorului trebuie memorate si caractere(litere, cifre, caractere speciale). Aici se foloseste codul ASCII(American Standard Code for Information Interchange). Iata cateva coduri speciale utilizate mai des: CR (carriage return) - muta cursorul la inceputul liniei. Cod = 13 (sau D) LF (line feed) - trece la linie noua. Cod = 10 (sau A) BS (backspace) - deplaseaza cursorul cu o pozitie la stanga. Cod = 8 DEL (delete) - sterge caracterul indicat de cursor. Cod = 127 (sau 7F) BEL (bell) - emite un sunet. Cod = 7 FF (form feed) - avanseaza hartia de la imprimanta la pagina noua. Cod = 12 (sau C) SP (space sau blank) - spatiu. Cod = 32(sau 20) In paranteza este codul in hexa(baza 16). In ASM acesta se scrie codh(ex: 16h, 198h...).In zecimal nu apare h-ul. Observati ca ENTER este tocmai CR si LF. Registrul de Flaguri(sau bistabili) este: CF (carry flag) - semnifica transport la operatii PF (parity flag) - numarul de octeti low e impar AF (auxilliary carry flag) - transport din bitul 4 al rezultatului ZF (zero flag) - e 1 daca rezultatul operatiei e 0 SF (sign flag) - e 1 daca bitul high e 1 OF (overflow flag) - e daca s-a depasit domeniul de definitie TF (trap flag) - e 1 daca se forteaza o intrerupere IF (interrupt flag) - e 1 daca se iau si intreruperile hardware DF (direction flag) - precizeaza sensul de variatie al adreselor la operatiile cu siruri 3. Structura programelor ASM: Instructiunile si datele trebuie scrise intr-un segment. Forma generala a directivei SEGMENT este: nume SEGMENT [aliniere] [combinare] [nume clasa] nume ENDS. Tipurile de date utilizate in ASM: Byte (1 octet) - intreg pe 8 biti cu semn sau caracter ASCII. Se defineste cu DB(define Byte)

Word (2 octeti) - intreg pe 16 biti sau 2 caractere ASCII. Se defineste cu DW (define word) Duble Word (4 octeti) - intreg pe 32 biti sau numar real simplu. Se defineste cu DD (define double) Quad Word (8 octeti) - intreg pe 64 biti sau real dublu. Se defineste cu DQ (quad word) Ten Bytes (10 octeti) - intreg impachetat sau real complex. Se defineste cu DT (define ten) Directiva ASSUME realizeaza o conexiune simbolica intre definirea segmentelor logice si registrele de segment. Modelul de mamorie(model) poate fi de mai multe tipuri: tiny(pentru fisierele COM), small, medium, compact, large si huge. Sirurile de caractere sau cifre se declara cu DUP. Un sir de caractere trebuie sa se termine cu '$' daca doriti sa-l afisati. Constantele simbolice cu EQU.Comentariile se scriu dupa semnul ;.

4. Instructiuni ASM: Se pot grupa in : a. Instructiuni de transfer b. Instructiuni aritmetice c. Instructiuni logice d. Instructiuni pentru siruri e. Instructiuni de salt f. Instructiuni complexe Instructiuni de transfer: Instructiunea MOV (transfera date): forma: MOV destinatie, sursa efect: destinatie := sursa Instructiunea PUSH (salveaza date in stiva): forma: PUSH sursa efect: salveaza sursa(ce poate fi un registru) Instructiunea POP (reface date din stiva): forma: POP destinatie efect: se transfera continutul stivei in destinatie Nota: Numarul de PUSH este, in general, egal cu cel de POP. Instructiunea XCHG (exchange): forma: XCHG destinatie, sursa efect: interschimba destinatia cu sursa. Instructiunea IN: forma: IN destinatie, port efect: citeste de la portul dat in destinatie. nota: destinatia poate fi doar AX sau AH. Instructiunea OUT: forma: OUT destinatie, port efect: scrie la portul dat valoarea destinatiei. nota: destinatia poate fi doar AX sau AL. Instructiunea LEA (load effective adress): forma: LEA registru, sursa efect: copiaza adresa efectiva a sursei in registru nota: este echivalenta cu MOV registru, OFFSET sursa Instructiunea PUSHF (push flags): forma: PUSHF efect: salveaza toti registrii in stiva Instructiunea POPF: forma: POPF efect: reface toti registrii din stiva Instructiuni aritmetice: Instructiunea ADD: forma: ADD dest, sursa efect: aduna sursa la dest. Instructiunea INC: forma: INC dest efect: creste dest. cu 1 Instructiunea SUB: forma: SUB dest, sursa efect: scade sursa din dest.

Instructiunea DEC: forma: DEC dest efect: scade dest. cu 1 Instructiunea NEG: forma: NEG dest efect: schimba semnul(0 - dest) Instructiunea MUL: forma: MUL sursa efect: inmulteste AX cu sursa Instructiunea DIV: forma: DIV sursa efect: imparte AX la sursa nota: in AL e catul si-n AH restul. Instructiunea SHR: forma: SHR operand, contor efect: operand e impartit la 2contor Instructiunea SHL: forma: SHL operand, contor efect: operand e inmultit cu 2contor Instructiuni logice(sunt cele cunoscute...): Sunt 5 la numar: NOT, AND, TEST, OR si XOR. Instructiuni pentru siruri: Instructiunea MOVSB: forma: MOVSB efect: se transfera un octet de la DS:SI la ES:DI Instructiunea LODSB: forma: LODSB efect: incarca in AX(sau AL) un octet de la DS:SI Instructiunea: STOSB forma: STOSB efect: depune la ES:DI octetul din AX(sau AL) Exemple Instructiuni de salt: JMP - Salt neconditionat JMP @1 - sare la eticheta @1 Salt conditionat: se folosesc dupa CMP a, b JE @1 - jump if equal(if a = b then jump @1) JNE @1 - jump if not equal(if a != b then jump @1) JL @1 - jump if less(if a < b then jump @1) JLE @1 - jump if less or equal(if a <= b then jump @1) JG @1 - jump if great(if a > b then jump @1) JGE @1 - jump if great or equal(if a >= b then jump @1) JZ @1 - jump if zero(if a = 0 then jump @1) JNZ @1 - jump if not zero(if a != 0 then jump @1) Instructiunea de ciclare LOOP: sintaxa: LOOP eticheta sare la eticheta de CX ori. Instructiuni complexe: Subprograme: Proceduri: Nume proc [parametri] [instructiuni] ret Nume endp Macro-uri: Nume macro [parametri] [instructiuni] Nume endm Procedurile se apeleaza cu call: call nume_proc Variabilele si etichetele proprii subprogramelor se declara cu LOCAL: Local et1, Local a db 67...

5. Intreuperi si functii importante: Intreruperea presupune oprirea programului in executie si apelarea unor rutine predefinite.Se apeleaza cu INT nr.intrerupere + 'h'(int 21h, int 33h) Principalele intreruperi sunt: INT 10h - functii pentru ecran INT 14h - functii pentru floppy(I/O) INT 15h si 16h - functii pentru tastatura INT 17h - functii pentru imprimanta INT 21h - functii DOS INT 33h - functii pentru mouse Incep prin a descrie cateva functii importante din fiecare intrerupere(dupa fiecare functie se apeleaza INT si numarul intreruperii): INT 10h - Screen Initializarea modului grafic: Pentru EGA: mov ax, 10h(640x350) mov ax, 0dh(320x200) mov ax, 0fh(640x200) mov ax, 03h(textmode) mov ax, 10h(640x350) Pentru VGA: mov ah, 0h apoi mov al, 11h(640x480, 2 colors) mov al, 12h(640x480, 16 colors) mov al, 13h(640x480, 256 colors) Putpixel (merge cam incet...): mov ah, 0ch mov bh, 0 mov cx, x ; coord. pe x mov dx, y ; coord. pe y mov al, color ; culoarea mov bh, x - muta cursorul text la (x, y) mov dx, y mov ah, 2 mov bh, 7 - sterge ecranul(e mai eficient inittext) mov ax, 600h mov cx, 0 mov dx, 24 * 256 + 79; 25 linii, 79 coloane mov ah, 1 - ascunde cursorul text mov ch, 32 mov cl, 7 INT 15h - Keyboard mov ah, 86h - DELAY mov cx, partea high in ms. mov dx, partea low in ms INT 16h - Keyboard mov ah, 0 - asteapta o tasta mov ah, 1 - verifica daca a fost apasata o tasta jnz et2 ; sare la et2 daca a fost apasata mov ah, 03h - seteaza viteza tastei mov al, 05h ; merge si mov ax, 0305h... mov bl, (0 - 1fh) unde 0 e rapid si 1fh incet mov bh, (0..3) un de 0 e rapid si 3 e incet INT 21h - DOS mov ah, 01h - citeste in AL un caracter si-l afiseaza mov ah, 02h - tipareste caracterul din DL mov dl, caracter mov ah, 08h - citeste in AL fara ecou mov ah, 09h - afiseaza sirul de la DS:SI mov ah, 4ch - iese in DOS (obligatoriu un program se termina cu asta) mov ah, 31h - iese in DOS, programul ramanand rezident(TSR)

mov ah, 2bh - seteaza data BIOS-ului mov cx, an mov dh, luna mov dl, zi mov ah, 2dh - seteaza ceas-ul BIOS-ului mov ch, ora mov cl, minute mov dh, sec. mov dl, sutimi de sec. INT 33h - Mouse In modul text coord. trebuie shr 3(impartite la 8) mov ax, 0 - initmouse (mai rapid e xor ax,ax) mov ax, 1 - afiseaza cursor mov ax, 2 - ascunde cursor mov ax, 3 - incarca in bx butonul(1, 4, 2) si-n cx si dx, coord. mov ax, 4 - seteaza cursorul la x, y mov cx, x mov dx, y mov ax, 07h - seteaza limitele pe X mov cx, limita minima pe x mov dx, limita maxima pe x mov ax, 08h - seteaza limitele pe Y mov cx, limita minima pe Y mov dx, limita maxima pe Y mov ax, 1ah - senzitivitatea(mickeys/sec) mov bx, senz. pe x mov cx, senz. pe y mov dx, dx ;mai bine xor dx, dx Nu uitati ca la sfarsitul fiecarei functii sa apelati intreruperea! 6. Tehnici + Tips&Tricks: Tehnici de programare in ASM: Evaluarea conditiilor logice. Decizii simple si compuse: Fie secventele pseudocod: IF (conditie) THEN ramuraIF ELSE ramuraELSE(poate lipsi) Scrierea ei in ASM este: evalueaza conditie salt conditionat daca e falsa la et1 et2:ramura true jmp et3(sare in alta parte) et1:ramura else IF (cond1) AND (cond2) THEN ramuraIF ELSE ramuraELSE In ASM devine: eval. cond1 salt daca e falsa la et2 eval. cond2 salt daca e falsa la et2 et1:ramuraIF... jmp et3 et2:ramuraELSE IF (cond1) OR (cond2) THEN ramuraIF ELSE ramuraELSE In ASM se scrie: eval. cond1 salt if true la et2 eval. cond2 salt if true la et2 et1:ramuraELSE ... jmp et3 et2:ramuraIF WHILE (cond) DO ramura ASM:

et1:eval. cond if false jump et2 ramura jmp et1 et2: REPEAT ramura UNTIL(cond) ASM: et1:ramura eval. cond. if false jump et2 jmp et1 et2: FOR i = L1 TO L2 DO ramura ASM: mov cx, L1 ; se incarca L1 et1:ramura inc cx ; creste cx cmp cx, L2 ; comparam cu L2 jl et1 ; reia bucla daca nu s-a ajuns la L2 La DOWNTO se scade cx-ul... Mai elegant e cu LOOP(dar merge doar de la 1) mov cx, L2 et1:ramura loop et1; se opreste singur cand a ajuns la L2 Tips&Tricks: Scriu aici rutine interesante sau mai subtile: CLI si HLT blocheaza sistemul. Afisarea unui caracter special: 7 scoate sunet XOR AX, AX e mult mai rapida ca mov ax, 0 Uneori e nevoie de o mica pauza. Fie utilizati comanda NOP(care de fapt e XCHG AX, AX...) fie puneti in CX un numar mare(gen 10000) si dati et1:loop et1 care cicleaza de CX ori nimic(adica pierde timp...). Sa presupunem un sir in DS(presupunand ca variabila cu sirul e sir1, acesta se incarca cu mov ax, sir1 apoi mov ds, ax). sir1[SI] este caracterul SI din sir1. Va puteti juca cu faza asta, scriind un sir citit. O alta rutina frumoasa e jucatul cu cele 3 LED-uri de la tasta. Aceasta se face astfel: mov al, 0edh out 60h, al mov cx, 10000 et1:loop et1(pauza pentru transmiterea corecta) mov al, LED(1..7, 2 e NUM, 1 SCROLL, 4 CAPS. Se accepta si sume, aprinzandu-se mai multe...) out60h, al O puteti folosi in combinatie cu ah = 1 din 16h (care verifica o tasta) pentru a canta pe LED-uri... Citirea fara ecou pe ecran(caracterul e citit in AL) e utilizata pe la parole... Aveti grija cu TSR-urile!!! Daca doriti sa creati fisiere .COM puneti la inceput .model tiny si apoi org 100h. Acestea se Tlink-eaza ci tlink /t [nume].obj Puteti include fisiere externe (cu macro-uri sau proceduri) cu include "nume_fisier" dupa .model (...) Poti face bar in modul grafic cu FOR...

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