Definirea constantelor �n limbaj de asamblare
Definirea datelor (variabilelor) �n limbaj de asamblare
Declararea �i utilizarea segmentelor �n limbaj de asamblare
Definirea �i utilizarea procedurilor �n limbaj de asamblare
Formatul instruc�iunilor �n limbaj de asamblare
Structura unui program �n limbaj de asamblare
Asamblarea �i editarea leg�turilorRegistrele microprocesorul 8086
Setul de instruc�iuni al lui 8086
nume EQU <valoare>unde:
nume - numele constantei. Pentru o constant� nu se rezerv� spa�iu �n memorie.Exemple:
<valoare> - reprezint� valoarea ce este atribuit� constantei.
PI equ 3.14159 INT_DOS equ 21h BASE_ADDR equ 378h
[nume] <tip> <lista_expresii> [;<comentariu>]sau
[nume] <tip> <factor> DUP(<lista_expresii>) [;<comentariu>]unde:
[ ] - indic� faptul c� acest c�mp poate lipsi;Exemple:
[nume] - numele prin care va fi referit� data. Acest nume are asociat un tip �i o valoare. Tipul rezult� din tipul datei iar valoarea este adresa la care se va g�si �n memorie �n timpul execu�iei programului primul octet rezervat pentru data etichetat� cu numele respectiv.
<lista_expresii> - reprezint� lista unor expresii cu ale c�ror valori se vor ini�ializa zonele de date rezervate pentru declara�ia respectiv�. Prin �?� se specific� faptul c� zona respectiv� de date nu este ini�ializat�.
<factor> - este un num�r care indic� de c�te ori se repet� lista de expresii care urmeaz� �n parantez�.
<tip> - tipul de date:DB - date de tip octet (BYTE) - 8 bi�i;
DW - date de tip cuv�nt sau adres� (WORD) - 16 bi�i;
DD - date de tip pointer (DWORD) - 32 bi�i;
DQ - date de tip constant� real� (QWORD) - 8 octe�i;
DT - date de tip constant� BCD (TBYTE) - 10 octe�i.
x dw 0 y dw ? sir db 'Sir de caractere!' ptr dd 1000h
<nume> SEGMENT [<tip_aliniere>] [<tip>] [<clasa>]unde:
<corpul_segmentului>
<nume> ENDS
<nume> - este numele asociat segmentului. Acestui nume i se asociaz� o valoare �i anume adresa de segment corespunz�toare pozi�iei segmentului �n memorie �n faza de execu�ie a programului. �nc�rcarea unui registru segment cu o adres� de segment se face prin urm�toarea secven�� de instruc�iuni:Av�nd �n vedere c� �ntr-un program pot s� existe mai multe segmente este necesar ca asamblorul s� cunoasc� �n fiecare moment care sunt cele patru segmente logice curente pentru a putea s� genereze corect codurile instruc�iunilor. De asemenea asamblorul trebuie s� �tie ce registru de segment se poate utiliza pentru a realiza accesul la datele referite. Aceast� informa�ie este transmis� asamblorului cu ajutorul pseudoinstruc�iunii ASSUME, care are urm�toarea forma genearal�:MOV AX, <nume><tip_aliniere> - poate s� fie PARA, BYTE, WORD, PAGE �i indic� tipul adresei de �nceput a segmentului, adic� adresa de �nceput a zonei de memorie rezervat� segmentului este divizibil� cu 16, 1, 2, respectiv 256.
MOV DS, AX
<tip> - este o informa�ie pentru editorul de leg�turi. Aceast� informa�ie indic� raportul �ntre acest segment �i segmente definite �n alte module obiect.
ASSUME {<registru_segment> : <segment>}Definirea simplificat� a segmentelor: acest tip de declarare a segmentelor este mai simplu de utilizat. Pentru a utiliza acest mod de definire trebuie sa se stabileasc� �nt�i care este modelul de memorie pentru care este scris programul respectiv:
.MODEL <tip_model>unde <tip_model> poate fi: TINY, SMALL, MEDIUM, COMPACT, LARGE sau HUGE.
Dup� stabilirea modelului pot apare urm�toarele pseudoinstruc�iuni:
.STACK [dimensiune] - segmentul de stiv�;
.CODE [nume] - segmentul de cod;
.DATA - segmentul de date;
.DATA? - segment de date neini�ializate;
.FARDATA [nume] - segment de date la care referirile se fac prin intermediul unor adrese complete (segment �i offset);
.FARDATA? [nume]
.CONST - segment de date ini�ializate, date ale c�ror valori nu se modific� prin execu�ia programului.
<nume> PROC [<atribut>]unde:
<corp_procedur�>
<nume> ENDP
<nume> - numele prin care se vor face apelurile procedurei. Acest nume are asociat� ca valoare adresa primei instruc�iuni din procedur�;
<atribut> - FAR sau NEAR.
[<eticheta>:] [<opera�ie> [<operanzi>]] [;<comentariu>]unde:
<eticheta> - un nume care are asociat� adresa relativ� �n cadrul segmentului din care face parte primul octet din instruc�iunea etichetat�;
<opera�ie> - mnemonica corespunz�toare instruc�iunii;
<operanzi> - este un c�mp a c�rui existen�� �i form� depind de tipul instruc�iunii.
;;.286 ; se accept� instruc�iuni de 286 INT_DOS equ 21h ; definirea unei constante data_seg segment ; segmentul de date hex_digit db '0123456789ABCDEF' data_seg ends bios_seg segment at 0000h ; un alt segment de date care se ; suprapune peste zona de date BIOS bios_seg ends stack_seg segment stack ; segmentul de stiv� dw 100h dup (?) top_off label word stack_seg ends code_seg segment 'code' ; segmentul de cod assume cs:code_seg,ds:data_seg,es:data_seg,ss:stack_seg ; definirea procedurilor nume_proc proc near ; input : ; output: ret nume_proc endp ; programul principal start: mov ax,data_seg ; ini�ializarea segmentului de mov ds,ax ; date mov es,ax ; mov ax,stack_seg ; ini�ializarea segmentului de mov ss,ax ; stiv� mov sp,offset top_off ; ... ; aici se plaseaz� programul end_prog: mov ax,4c00h ; exit to DOS int INT_DOS ; code_seg ends end start
tasm nume_fisier.asm ;
sau
masm nume_fisier.asm
Iar editarea leg�turilor:
tlink nume_fisier.obj ;
sau
link nume_fisier.obj
Figura 2.1 Registrele generale ale procesorului 8086
Registrele indicatoare de adres� (SP, BP) - sunt registre care
con�in adrese relative �n segmentul stiv� curent. Registrul SP are semnifica�ia
de adres� curent� a v�rfului stivei, iar registrul BP este utilizat pentru
a permite accesul la informa�ia con�inut� �n stiv�.
Registrele index (SI, DI) - sunt utilizate �n general pentru adresarea indexat�, con�in�nd adrese relative �n segmentul de date curent. Segmentul implicit utilizat �n adresare poate s� fie modificat prin utilizarea �n instruc�iuni a unor prefixe speciale. Registrele index sunt utilizate ca registre index implicite �n instruc�iunile de transfer sau prelucrare pe �iruri de octe�i: SI - adresa relativ� curent� �n �irul surs�, DI - adresa relativ� curent� �n �irul destina�ie.
Figura 2.2 Registrele indicatoare de adres� �i index
Registrele segment (CS, DS, ES, SS) - con�in adresa segmentului program (CS), adresa segmentului de date curent (DS), adresa segmentului de date suplimentar (ES) �i adresa segmentului de stiv� (SS).
Figura 2.3 Registrele segment
Indicatorii de condi�ii
Sunt utiliza�i pentru a memora informa�ii referitoare la rezultatul
unor opera�ii aritmetice sau logice (AF, CF, OF, PF, SF, ZF) �i pentru
memorarea unor informa�ii de control pentru microprocesor (DF, IF, TF).
MOV <destina�ie>, <surs�>Instruc�iuni pentru transferul valorilor indicatorilor de condi�ii
PUSH <surs�>
POP <destina�ie>
XCHG <destina�ie>, <surs�> - interschimb� sursa cu destina�ia;
XLAT - converte�te con�inutul registrului AL utiliz�nd o tabel� a c�rei adres� de �nceput este �n BX;
LEA <registru>, <operand> - �ncarc� �n registru adresa relativ� a operandului;
LDS <registru>, <adres�> - se �ncarc� �n registrele DS �i <registru> adresa aflat� �n memorie la adresa <adres�>;
LES <registru>, <adres�> - se �ncarc� �n registrele DS �i <registru> adresa aflat� �n memorie la adresa <adres�>;
SAHF - �ncarc� indicatorii de condi�ii conform con�inutului registrului AH;Instruc�iuni pentru pozi�ionarea indicatorilor de condi�ie
LAHF - memoreaz� valorile indicatorilor �n registrul AH;
PUSHF - salveaz� pe stiv� indicatorii de condi�ie;
POPF - reface din stiv� valorile indicatorilor de condi�ie.
CLC - pune pe 0 valoarea indicatorului CF;Instruc�iuni aritmetice
STC - pune pe 1 valoarea indicatorului CF;
CMC - comlpementeaz� valoarea indicatorului CF;
CLD - pune pe 0 valoarea indicatorului -DF;
STD - pune pe 1 valoarea indicatorului DF;
CLI - dezactiveaz� sistemul de �ntreruperi;
STI - activeaz� sistemul de �ntreruperi.
ADD <d>, <s> - <d> � <d> + <s>Instruc�iuni logice
ADC <d>, <s> - <d> � <d> + <s> + CF
INC <d> - <d> � <d> + 1
AAA - corec�ie zecimal� dup� adunare BCD despachetat (AL)
DAA - corec�ie zecimal� dup� adunare BCD �mpachetat (AL)
SUB <d>, <s> - <d> � <d> - <s>
SBB <d>, <s> - <d> � <d> - <s> - CF
DEC <d> - <d> � <d> - 1
NEG <d> - <d> � 0 - <d>
AAS - corec�ie zecimal� dup� sc�dere BCD despachetat (AL)
DAS - corec�ie zecimal� dup� sc�dere BCD �mpachetat (AL)
CBW - conversie valoare con�inut� �n AL la cuv�nt �n AX (extensie de semn)
CWD - conversie valoare con�inut� �n AX la dublu cuv�nt �n DX, AX (extensie de semn)
MUL <s> - dac� <s> este de tip octet AX � AL * <s>
- dac� <s> este de tip cuv�nt DX,AX � AX * <s>
operanzii sunt trata�i ca �ntregi f�r� semn
IMUL <s> - dac� <s> este de tip octet AX � AL * <s>
- dac� <s> este de tip cuv�nt DX,AX � AX * <s>
operanzii sunt trata�i ca �ntregi cu semn
AAM - corec�ie zecimal� dup� o �nmul�ire BCD despachetat. (MUL)
DIV <s> - dac� <s> este de tip octet AL � AX / <s> �i AH � AX mod <s>
- dac� <s> este de tip cuv�nt AX � DX,AX / <s> �i DX � DX,AX mod <s>
operanzii sunt trata�i ca �ntregi f�r� semn
IDIV <s> - dac� <s> este de tip octet AL � AX / <s> �i AH � AX mod <s>
- dac� <s> este de tip cuv�nt AX � DX,AX / <s> �i DX � DX,AX mod <s>
operanzii sunt trata�i ca �ntregi cu semn
AAD - corec�ie zecimal� �nainte de o �mp�r�ire BCD despachetat. (DIV)
SHL <s>, n - deplasare logic� la st�ngaInstruc�iuni pe �iruri de caractere
SAL <s>, n
SHL <s>, CL
SAL <s>, CL
SHR <s>, n - deplasare logic� la dreapta
SHR <s>, CL
SAR <s>, n - deplasare aritmetic� la dreapta
SAR <s>, CL
ROL <s>, n - rotire st�nga prin carry
ROL <s>, CL
ROR <s>, n - rotire dreapta prin carry
ROR <s>, CL
RCL <s>, n - rotire st�nga cu carry
RCL <s>, CL
RCR <s>, n - rotire dreapta cu carry
RCR <s>, CL
NOT <s> - complementeaz� fa�� de 1 pe <s>
AND <d>, <s> - <d> � <d> � <s>
TEST <d>, <s> - se pozi�ioneaz� indicatorii ca la AND dar nu se modific� <d>
OR <d>, <s> - <d> � <d> � <s>
XOR <d>, <s> - <d> � <d> � <s>
CMP <d>, <s> - se pozi�ioneaz� indicatorii ca la SUB dar nu se modific� <d>
MOVSB, MOVSW - transfer� un octet, cuv�nt �ntre surs� �i destina�ie;
CMPSB, CMPSW - pozi�ioneaz� indicatorii de condi�ie corespunz�tor diferen�ei �ntre surs� �i destina�ie;
SCASB, SCASW - pozi�ioneaz� indicatorii de condi�ie conform diferen�ei �ntre AL, AX �i destina�ie;
LODSB, LODSW - �ncarc� un octet, cuv�nt din surs� �n AL, AX;
STOSB, STOSW - memoreaz� con�inutul AL, AX �n destina�ie;
REP, REPZ, REPE - se repet� opera�ia p�n� c�nd con�inutul registrului CX devine zero sau p�n� c�nd indicatorul ZF devine zero.
Instruc�iuni de salt
CALL adresa - apel de procedur�;Instruc�iuni de intrare/ ie�ire
RET - re�ntoarcere din procedur�;
JZ, JE - ZF = 1;
JL, JNGE - mai mic (SF ? OF) - compara�ie valori cu semn;
JLE, JNG - mai mic sau egal (ZF = 1 sau SF ? OF) - compara�ie valori cu semn;
JB, JNAE, JC - mai mic (CF = 1) - compara�ie valori f�r� semn;
JBE, JNA - mai mic sau egal (CF = 1 sau ZF = 1) - compara�ie valori f�r� semn;
JP, JPE - PF = 1;
JO - OF = 1;
JNZ, JNE - ZF = 0;
JNL, JGE - mai mare sau egal (SF = OF) - compara�ie valori cu semn;
JNLE, JG - mai mare (ZF = 0 �i SF = OF) - compara�ie valori cu semn;
JNB, JAE, JNC - mai mare (CF = 0) - compara�ie valori f�r� semn;
JNBE, JA - mai mare (CF = ZF = 0) - compara�ie valori f�r� semn;
JNP, JPO - PF = 0;
JNO - OF = 0;
JNS - SF = 0;
JCXZ - CX = 0;
IN AL, port
IN AL, DX
OUT port, AL
OUT DX, AL
isch macroApelul unei proceduri:
;Testeaza daca exista caracter disponibil in buffer-ul de tastatura
; input : (none)
; output: zf - 0 caracter disponibil
; - 1 nu e caracter disponibil
...
functia DOS 0bh
...
endmgetch macro
;Citeste un caracter de la tastatura
; input : (none)
; output: al - cod ASCII al caracterului citit
...
functia DOS 01h
...
endmputch macro c
;Afiseaza un caracter pe ecran
; input : c - cod ASCII al caracterului
; output: (none)
...
functia DOS 02h
...
endmdelay macro n
;Introduce o intarziere de n bucle de asteptare
; input : n - numar bucle de asteptare
; output: (none)
...
endmshow_al_bin proc near
;Afiseaza in binar continutul lui AL
; input : al - numar 8 biti
; output: (none)
...
cx � 8
repeta
daca bitul 7 din al este 0 atunci
afiseaza �0�
altfel
afiseaza �1�
al � al << 1
cx � cx - 1
pana cand cx = 0
...
show_al_bin endpshow_ax_bin proc near
;Afiseaza in binar continutul lui AX
; input : ax - numar 16 biti
; output: (none)
...
apelez show_al_bin pentru AH si apoi pentru AL
...
show_ax_bin endpshow_al_hex proc near
;Afiseaza in hexa continutul lui AL
; input : al - byte
; output: (none)
...
* se define�te un tabel care con�ine �irul �0123456789ABCDEF�
bl � al
al � al >> 4
ah � 0
si � ax
* afi�ez caracterul din tabel[si]
al � bl
al � al & 0fh
si � ax
* afi�ez caracterul din tabel[si]sau:
dl � al
dl � dl >> 4
dac� dl <= 9 atunci
dl � dl + �0�
altfel
dl � dl + �A� - 10
* afi�ez caracterul din registrul dl
dl � al
dl � dl & 0fh
dac� dl <= 9 atunci
dl � dl + �0�
altfel
dl � dl + �A� -10
* afi�ez caracterul din registrul dl
...
show_al_hex endpshow_ax_hex proc near
;Afiseaza in hexa continutul lui AX
; input : ax - word
; output: (none)
...
apelez show_al_hex pentru AH si apoi pentru AL
...
show_ax_hex endpshow_al_bcd proc near
;Afiseaza in BCD continutul lui AL
; input : al - byte
; output: (none)
...
show_al_bcd endpread_al_bin proc near
;Citeste un numar binar pe 8 biti
; input : (none)
; output: al - numarul citit de la tastatura
...
read_al_bin endpread_al_hex proc near
;Citeste un numar hexa pe 8 biti
; input : (none)
; output: al - numarul citit de la tastatura
...
read_al_hex endpcalc_address proc near
;Calculeaza adresa fizica din adresa logica
; input : ax - segment
; dx - offset
; output: ax - primii 4 biti mai semnificativi din adresa fizica
; dx - ultimii 16 biti din adresa fizica
...
adresa fizica = segment * 16 + offset
...
calc_address endp
MOV AL, 0aah ; parametru
CALL show_al_bin
Apelul unui macro:
putch �A�sau
putch al
Obs.