Programarea in limbaj de asamblare Lucrarea nr. 1
 

Programarea �n limbajul de asamblare al procesoarelor x86

 
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�turilor

Registrele microprocesorul 8086
Setul de instruc�iuni al lui 8086

Tema de laborator
 
 

Definirea constantelor �n limbaj de asamblare

�n limbaj de asamblare o constant� se poate defini astfel:
nume EQU <valoare>
unde:
nume - numele constantei. Pentru o constant� nu se rezerv� spa�iu �n memorie.
<valoare> - reprezint� valoarea ce este atribuit� constantei.
Exemple:
PI              equ     3.14159
INT_DOS         equ     21h
BASE_ADDR       equ     378h


Definirea datelor (variabilelor) �n limbaj de asamblare

Forma general� pentru definirea datelor este:
[nume] <tip> <lista_expresii> [;<comentariu>]
sau
[nume] <tip> <factor> DUP(<lista_expresii>) [;<comentariu>]
unde:
[ ] - indic� faptul c� acest c�mp poate lipsi;
[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.
Exemple:
x        dw    0
y        dw    ?
sir      db    'Sir de caractere!'
ptr      dd    1000h

 

Declararea �i utilizarea segmentelor �n limbaj de asamblare

Declararea unui segment se face sub forma:
<nume> SEGMENT [<tip_aliniere>] [<tip>] [<clasa>]
<corpul_segmentului>
<nume> ENDS
unde:
<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:
MOV AX, <nume>
MOV DS, AX
<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.
<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.
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�:
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.


Definirea �i utilizarea procedurilor �n limbaj de asamblare

Forma general� de definire a procedurilor este:
<nume> PROC [<atribut>]
<corp_procedur�>
<nume> ENDP
unde:
<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.


Formatul instruc�iunilor �n limbaj de asamblare

�n limbaj de asamblare o instruc�iune se poate reprezenta pe o linie care are maximum 128 de caractere �i care are forma general�:
[<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.


Structura unui program �n limbaj de asamblare

 
;;
.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


Asamblarea �i editarea leg�turilor

Asamblarea unui program �n limbaj de asamblare

    tasm nume_fisier.asm ;

sau

    masm nume_fisier.asm

Iar editarea leg�turilor:

    tlink nume_fisier.obj ;

sau

    link nume_fisier.obj
 


Registrele microprocesorul 8086

Pot fi clasificate din punctul de vedere al rolului pe care �l au �n 5 grupuri: Registrele generale (AX, BX, CX, DX) - sunt utilizate �n instruc�iunile aritmetice �i logice. Majoritatea instruc�iunilor aritmetice utilizeaz� �n acela�i mod toate registrele. Exist� �ns� unele instruc�iuni aritmetice pentru care anumite registre generale au semnifica�ii speciale: AX - registru acumulator; BX - registru baz�; CX - registru contor; DX - utilizat implicit �n opera�iile de �nmul�ire �i �mp�r�ire; �i de asemenea poate con�ine adresa unui port. Toate cele patru registre generale pot fi utilizate �i ca perechi de registre pe 8 bi�i: AX - AH, AL.


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).


Figura 2.4 Indicatorii de condi�ii



Setul de instruc�iuni al lui 8086

Instruc�iuni pentru transferul datelor �i adreselor
MOV <destina�ie>, <surs�>
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�>;
Instruc�iuni pentru transferul valorilor indicatorilor de condi�ii
SAHF - �ncarc� indicatorii de condi�ii conform con�inutului registrului AH;
LAHF - memoreaz� valorile indicatorilor �n registrul AH;
PUSHF  - salveaz� pe stiv� indicatorii de condi�ie;
POPF - reface din stiv� valorile indicatorilor de condi�ie.
Instruc�iuni pentru pozi�ionarea indicatorilor de condi�ie
CLC - pune pe 0 valoarea indicatorului CF;
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.
Instruc�iuni aritmetice
ADD <d>, <s> - <d> <d> + <s>
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)
Instruc�iuni logice
SHL <s>, n  - deplasare logic� la st�nga
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>
Instruc�iuni pe �iruri de caractere
Sursa este implicit dat� de adresa DS:SI, iar destina�ia ES:DI. Dup� un transfer registrele SI �i DI se modific� �n func�ie de valoarea indicatorului DF.
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�;
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;
Instruc�iuni de intrare/ ie�ire
IN AL, port
IN AL, DX
OUT port, AL
OUT DX, AL

 


Tema de laborator

S� se implementeze urm�toarele rutine �i macro-uri. Acestea vor fi folosite ca baz� de plecare pentru celelalte laboratoare.
 
isch macro
;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
        ...
endm

getch macro
;Citeste un caracter de la tastatura
; input : (none)
; output: al - cod ASCII al caracterului citit
        ...
        functia DOS 01h
        ...
endm

putch macro c
;Afiseaza un caracter pe ecran
; input : c - cod ASCII al caracterului
; output: (none)
        ...
        functia DOS 02h
        ...
endm

delay macro n
;Introduce o intarziere de n bucle de asteptare
; input : n - numar bucle de asteptare
; output: (none)
        ...
endm

show_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 endp

show_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 endp

show_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 endp

show_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 endp

show_al_bcd proc near
;Afiseaza in BCD continutul lui AL
; input : al - byte
; output: (none)
        ...
show_al_bcd endp

read_al_bin proc near
;Citeste un numar binar pe 8 biti
; input : (none)
; output: al - numarul citit de la tastatura
        ...
read_al_bin endp

read_al_hex proc near
;Citeste un numar hexa pe 8 biti
; input : (none)
; output: al - numarul citit de la tastatura
        ...
read_al_hex endp

calc_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

Apelul unei proceduri:
MOV AL, 0aah ; parametru
CALL show_al_bin


Apelul unui macro:

putch �A�
sau
putch al


Obs.