Documente Academic
Documente Profesional
Documente Cultură
IntroASM PDF
IntroASM PDF
Regitrii microprocesorului
Regitrii de uz general
MOV BX, 2
MOV DX, 3
ADD BX, DX
ncarc valoarea 2 n registrul BX, valoarea 3 n registrul DX, adun cele dou
valori iar rezultatul (5) este memorat n registrul BX. n exemplul anterior putem
utiliza oricare dintre regitrii de uz general n locul regitrilor BX i DX. n afara
proprietii de a stoca valori i de a folosi drept operanzi surs sau destinaie pentru
instruciunile de manipulare a datelor, fiecare dintre cei 8 regitri de uz general au
propria personalitate. Vom vedea n continuare care sunt caracteristicile specifice
fiecruia dintre regitrii de uz general.
Registrul AX (EAX)
MOV AH, 1
INC AH
MOV AL, AH
Registrul BX (EBX)
Registrul BX (Base), sau registrul de baz poate stoca adrese pentru a face
referire la diverse structuri de date, cum ar fi vectorii stocai n memorie. O valoare
reprezentat pe 16 bii stocat n registrul BX poate fi utilizat ca fiind o poriune din
adresa unei locaii de memorie ce va fi accesat. Spre exemplu, urmtoarele
instruciuni ncarc registrul AH cu valoarea din memorie de la adresa 21.
MOV AX, 0
MOV DS, AX
MOV BX, 21
MOV AH, [ BX ]
Registrul CX (ECX)
MOV CX, 5
start:
<instruciuni ce se vor executa de 5 ori>
SUB CX, 1
JNZ start
Registrul DX (EDX)
...
MOV AL, 101
MOV DX, 1002
OUT DX, AL
Referitor la operaiile de nmulire i mprire, atunci cnd mprim un
numr pe 32 de bii la un numr pe 16 bii, cei mai semnificativi 16 bii ai
dempritului trebuie s fie n DX. Dup mprire, restul mpririi se va afla n DX.
Cei mai puin semnificativi 16 bii ai dempritului trebuie s fie n AX iar ctul
mpririi va fi n AX. La nmulire, atunci cnd se nmulesc dou numere pe 16 bii,
cei mai semnificativi 16 bii ai produsului vor fi stocai n DX iar cei mai puin
semnificativi 16 bii n registrul AX.
Registrul SI
MOV AX, 0
MOV DS, AX
MOV SI, 33
MOV AL, [ SI ]
ncarc valoarea (pe 8 bii) din memorie de la adresa 33 n registrul AL.
Registrul SI este, de asemenea, foarte folositor atunci cnd este utilizat n legtur cu
instruciunile dedicate tipului string (ir de caractere). Secvena urmtoare :
CLD
MOV AX, 0
MOV DS, AX
MOV SI, 33
LODSB
Registrul DI
MOV AX, 0
MOV DS, AX
MOV DI, 1000
ADD BL, [ DI ]
Registrul BP
PUSH BP
MOV BP, SP
MOV AX, [ BP+4 ]
fac s se acceseze segmentul de stiv pentru a ncrca registrul AX cu primul
parametru trimis de un apel C unei rutine scrise n limbaj de asamblare. n concluzie,
registrul BP este conceput astfel nct s ofere suport pentru accesul la parametri,
variabile locale i alte necesiti legate de accesul la poriunea de stiv din memorie.
Registrul SP
MOV BX, 9
PUSH BX
MOV CX, 10
PUSH CX
POP BX
POP CX
Figura 3. Modalitatea de funcionare a stivei dup execuia
primelor 4 instruciuni
Regitrii de segment
unde:
.MODEL small
.STACK 200h
.DATA
Valoare_Factorial DW ?
Factorial DW ?
.CODE
Trei_Factorial PROC
MOV ax, @data
MOV ds, ax
MOV [Valoare_Factorial], 1
MOV [Factorial], 2
MOV cx, 2
Ciclare:
MOV ax, [Valoare_Factorial]
MUL [Factorial]
MOV [Valoare_Factorial], ax
INC [Factorial]
LOOP Ciclare
RET
Trei_Factorial ENDP
END
...
JMP scadere
...
scadere:
SUB AX, CX
...
urmtoarea instruciune care va fi executat dup instruciunea JMP scadere
va fi instruciunea SUB AX, CX. Exemplul anterior este echivalent cu secvena:
...
JMP scadere
...
scadere: SUB AX, CX
...
Exist unele avantaje atunci cnd scriem instruciunile pe linii separate. n
primul rnd, atunci cnd scriem un nume de etichet pe o singur linie, este mai uor
s folosim nume lungi de etichete fr a strica forma programului scris n limbaj de
asamblare. n al doilea rnd, este mai uor s adugm ulterior o nou instruciune n
dreptul etichetei dac aceasta nu este scris pe aceeai linie cu instruciunea.
Numele variabilelor sau etichetelor folosite ntr-un program nu trebuie s se
confunde cu numele rezervate de asamblor, cum ar fi numele de directive i
instruciuni, numele regitrilor, etc. De exemplu, o declaraie de genul:
...
ax DW 0
BYTE:
...
nu poate fi acceptat, deoarece AX este numele registrului acumulator, AX, iar
BYTE reprezint un cuvnt cheie rezervat.
Orice nume de etichet ce apare pe o linie fr instruciuni sau apare pe o linie
cu instruciuni trebuie s aib semnul : dup numele ei. Tototdat, se ncearc s se
dea un nume sugestiv etichetelor din program. Fie urmtorul exemplu:
...
CMP AL, a
JB Nu_este_litera_mica
CMP AL, z
JA Nu_este_litera_mica
SUB AL, 20H ; se transforma in litera mare
Nu_este_litera_mica:
comparativ cu:
...
CMP AL, a
JB x5
CMP AL, z
JA x5
SUB AL, 20H ; se transforma in litera mare
x5:
Observaie:
Limbajul de asamblare nu este case sensitive. Aceasta semnific faptul c, ntr-un
program scris n limbaj de asamblare, numele de variabile, etichete, instruciuni,
directive, mnemonice, etc., pot fi scrise att cu litere mari ct i cu litere mici,
nefcndu-se diferena ntre ele (Nu_este_litera_mica este acelai lucru cu
nu_este_litera_mica sau Nu_Este_Litera_Mica, etc.).
Directive de segment simplificate
.STACK
.CODE
.DATA
.MODEL
DOSSEG
END
Explicaii:
1. Se pot introduce comentarii ntr-un program ASM prin folosirea ";". Tot ce
urmeaz dup ";" i pn la sfritul liniei este considerat comentariu.
2. Nu are importan dac programul este scris folosind litere mari sau mici
(nu este "case sensitive").
3. Fr cele dou instruciuni care seteaz registrul DS ctre segmentul definit
de .DATA, funcia de afiare a string-ului nu ar fi funcionat cum trebuie. Variabila
DataString se afl n segmentul .DATA i nu poate fi accesat dac DS nu este
poziionat ctre acest segment. Acest lucru se explic n modul urmtor: atunci cnd
facem apelul DOS de afiare a unui string, trebuie s parcurgem ntreaga adres de
tipul segment:offset a string-ului n DS:DX. De aceea, de abia dup ce am ncrcat
DS cu segmentul .DATA i DX cu adresa (offset-ul) lui DataString avem o referin
complet segment:offset ctre DataString.
Observaii.
;Program p02.asm
.MODEL small
.STACK 200H
.DATA
OutputChar DB 'B' ;definirea variabilei OutputChar
;iniializat cu valoarea "B"
.CODE
ProgramStart:
mov dx, @data
mov es, dx ;spre deosebire de programul anterior,
se folosete ES pentru specificarea
segmentului de date
mov bx, offset OutputChar ;se ncarc BX cu adresa
;variabilei OutputChar
mov dl, es:[bx] ;se ncarc AL cu valoarea de la
;adresa explicit es:[bx]
;(adresare indexat)
mov ah,02 ;codul funciei DOS de afiare a
;unui caracter
int 21H ;apelul DOS de execuie a afirii
mov ah, 4cH ;codul funciei DOS de terminare a
;programului
int 21H ;apelul DOS de terminare a programului
END ProgramStart ;directiva de terminare a codului
;programului
DOSSEG este directiva ce face ca segmentele dintr-un program s fie grupate
conform conveniilor Microsoft de adresare a segmentelor.
Directiva .MODEL
...start:
mov ax,[bx+si]
mov ch,[bx+di]
MOV [ var ], 1
ADD [ var ], 2
Instruciuni logice
NOT: A =~A
AND: A &= B
OR: A |= B
XOR: A ^= B
TEST: A&B
Instruciunea NOT
Instruciunea AND
Este o instruciune cu doi operanzi (instruciune binar), cu forma general:
AND destinatie, sursa
Unde destinatie este fie un registru, fie o locaie de memorie pe 8 sau 16 bii, iar
sursa poate fi registru, locaie de memorie sau o constant pe 8 sau 16 bii.
Instruciunea are ca efect operaia: <destinatie> == <destinatie> AND <sursa>.
Indicatorii de stare modificai sunt: SF, ZF, PF, CF, OF = 0, AF nedefinit.
Instruciunea OR
Observaie:
De cele mai multe ori, instruciunile AND i OR sunt folosit pe post de
mascare a datelor; n acest sens, o valoarea de tip masc (mask) este utilizat
pentru a fora anumii bii s ia valoarea zero sau valoarea 1 n cadrul altei valori. O
astfel de masc logic are efect asupra anumitor bii, n timp ce pe alii i las
neschimbai. Exemple:
Instruciunea AND CL, 0Fh face ca cei mai semnificativi 4 bii s ia
valoarea 0, n timp ce biii mai puin semnificativi sunt lsai neschimbai;
astfel, dac registrul CL are valoarea iniial 1001 1101, dup execuia
instruciunii AND CL, 0Fh va avea valoarea 0000 1101.
Instruciunea OR CL, 0Fh face ca cei mai puin semnificativi 4 bii
s ia valoarea 1, n timp ce biii mai semnificativi s rmn nemodificai. Dac
registrul CL are valoarea iniial 1001 1101, dup execuia instruciunii OR CL,
0Fh va avea valoarea 1001 1111.
Observaie.
Exemple:
Exemplu:
Exemple:
Instruciuni aritmetice
Exemple:
INC <destinatie>
Exemplu:
Exemplu:
Adunarea a dou numere pe 32 de bii se poate face astfel (BXAX) +
(DXCX):
ADD AX, CX
ADC BX, DX
Pentru instruciunile:
Rezultatul este -12 (1110 1110), iar indicatorii de stare se modific astfel:
DEC <destinatie>
Exemplu
Exemple de programe
pstart:
mov ax,@data
mov ds,ax
mov ah,09
mov dx,offset mesaj
int 21h
END pstart
dosseg
.model small
.stack
.data
nr DB 10,10 dup(0)
r DB 10, 10 dup(0)
mesaj db 13,10,'Introduceti numarul:(<=256)$'
patrat db 13,10,'Patratul numarului este:$'
.code
pstart:
mov ax,@data
mov ds,ax
mov ah,09
mov dx,offset mesaj
int 21h
mov ah,0ah
mov dx,offset nr
int 21h
mul ax
xor si,si
mov bx,10
mov ah,9
mov dx, offset patrat
int 21h
caracter:
dec si
mov ah,02 ;apelarea functiei 02 pentru afisarea unui caracter
mov dl,r[si] ;al carui cod ASCII este in DL
int 21h
cmp si,0
jne caracter
jmp sfarsit
mov ah,9
mov dx,offset patrat
int 21h
sfarsit:
mov ah,4ch
int 21h ; stop program
END pstart
.model small
.stack
.data
.code
pstart:
mov ax,@data
mov ds,ax
mov ah,09
mov dx,offset mesaj1
int 21h
mov ah,01h ; se citeste un caracter de la tastatura
; codul ASCII al caracterului introdus va fi in AL
int 21h
and ax,00FFh
sub ax, 30h ; se obtine valoarea numerica
; scazandu-se codul lui 0 in ASCII (30H)
push ax ; se salveaza valoarea lui ax in stiva
mov ah,09
mov dx,offset mesaj2
int 21h
mov ah,01h ; se citeste un caracter de la tastatura
; codul ASCII al caracterului introdus va fi in AL
int 21h
and ax,00FFh
sub ax, 30h ; se obtine valoarea numerica
; scazandu-se codul lui 0 in ASCII (30H)
mov cx,ax ; registrul CX contorizeaza numarul de inmultiri
cmp cx,0
jne putere_0
mov ah,09
mov dx, offset mesaj_putere_0
int 21h
jmp sfarsit
putere_0:
pop bx ;se salveaza in BX valoarea cu care inmulteste
mov ax,0001
inmultire:
mul bx
loop inmultire
xor si,si
mov bx,10
cifra:
div bx
add dl,30h
mov r[si],dl
inc si
xor dx,dx
cmp ax,0
jne cifra
mov ah,9
mov dx, offset mesaj_final
int 21h
caracter:
dec si
mov ah,02 ;apelarea functiei 02 pentru afisarea unui caracter
mov dl,r[si] ;al carui cod ASCII este in DL
int 21h
cmp si,0
jne caracter
sfarsit:
mov ah,4ch
int 21h ; sfarsitul programului
END pstart
4. Program care verific dac un numr este palindrom (un numr se numete
palindrom dac scris de la dreapta la stnga sau invers are aceeai valoare).
dosseg
.model small
.stack
.data
nr DB 10,10 dup(0)
.code
pstart:
mov ax,@data
mov ds,ax
mov ah,09
mov dx,offset mesaj
int 21h
mov ah,0ah
mov dx,offset nr
int 21h
mov si,1
mov cl,nr[si] ; incarc in CL numarul de cifre al numarului introdus
and cx,00FFh
mov ax,cx
mov bl,2
div bl ; in AL este catul impartirii lui AX la 2
and ax,00FFh
inc ax
inc cx
mov di,cx
urmatorul_caracter:
inc si ; SI creste de la inceputul sirului spre mijloc
mov bl,nr[di]
cmp nr[si],bl
jne nu_este
dec di ; DI scade de la sfarsitul sirului spre mijloc
cmp si,ax ; in sir se va merge pana la pozitia cl+1
jne urmatorul_caracter
mov ah,9
mov dx,offset mesaj_da
int 21h
jmp sfarsit
nu_este:
mov ah,9
mov dx,offset mesaj_nu
int 21h
sfarsit:
mov ah,4ch
int 21h ; stop program
END pstart
dosseg
.model small
.stack
.data
nr DB 10,10 dup(?)
rezultat DB 10,10 dup(?)
.code
pstart:
mov ax,@data
mov ds,ax
mov si,1
mov cl,nr[si] ; incarc in CL numarul de cifre al numarului introdus
and cx,00FFh
inc cx ; CX stocheaza acum ultima pozitie din sirul de cifre
xor ax,ax ; stocam rezultatul in AX, pe care il initializam cu zero
urmatorul_caracter:
inc si ; SI creste de la inceputul sirului spre sfarsit
add al,nr[si]
mov bx,0ah
div bx
add dl,30h
mov rezultat[si],dl
inc si
xor dx,dx
cmp ax,0
jne cifra
mov ah,9
mov dx,offset mesaj_suma
int 21h
caracter:
dec si
mov ah,02 ;apelarea functiei 02 pentru afisarea unui caracter
mov dl,rezultat[si] ;al carui cod ASCII este in DL
int 21h
cmp si,0
jne caracter
mov ah,4ch
int 21h ; terminarea programului
END pstart