Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
1. Obiectivele lucrarii
Obiectivul acestei lucrarii este insusirea modului de utilizare a tipurilor de date in diferite aplicatii in limbaj de asamblare.
2. Aparatura si suporturile utilizate
PC in
configuratie obisnuita: unitate centrala, monitor, tastatura, mouse
Precizarile din prezentul indrumar de laborator.
3. Breviar teoretic
3.1. Alcatuirea si testarea unui program in limbaj de asamblare
Un program este alcatuit din mai multe linii sursa. O linie sursa este alcatuita din urmatorii atomi lexicali :
<Eticheta :><Mnemonicul><Operanzii> <;Comentariul>
<Eticheta:> este un nume simbolic asociat unei
adrese (locatii) de memorie
<Mnemonicul> se refera la denumirea codului operatiei unei instructiuni
de exemplu add, mov etc. Acest atom lexical poate fi insa si o directiva
(pseudo-operatie) de exemplu .code, .data, .dosseg, etc. Directivele servesc la
efectuarea anumitor actiuni de catre asamblor, in timp ce instructiunile permit
realizarea anumitor operatii
<Operanzii> insotesc de regula categoriile enumerate mai sus
(instructiuni, directive). De exemplu, instructiunea mov poseda doi operanzi
mov ax, @data
iar directiva de mai jos un singur operand :
stack 200h
<Comentariul>, ultimul atom lexical, este constituit dintr-o insiruire de
cuvinte - text explicativ - precedat de separatorul ";" .
Nu este absolut necesar ca cei patru atomi lexicali sa fie toti prezenti pe o
aceiasi linie de program. Eticheta poate fi izolata pe o linie, mnemonicul pe
alta el fiind urmat de operanzi. Comentariul poate sa se intinda pe mai multe
linii, dar fiecare trebuie sa inceapa cu separatorul punct si virgula.
Exemplu de program
Folosind un editor de texte se va edita urmatorul program :
TITLE
hello
; HELLO.
ASM - Afiseaza mesajul "Hello World"
; From the
Turbo Assembler Users Guide - Getting started
.MODEL smalI
.STACK 100h
; Aloca stiva 256 octeti
.DATA
Message DB
'Hello, world !', 13, 10, '$'; Mesaj ce trebuie scris
.CODE
start:
mov ax,
@data
; Incarca locatie
mov ds,
ax
; segment in
registrul ds
; functia
DOS 09h pentru afisarea unui sir "print string"
mov dx,
OFFSET Message
mov
ah,9
; DOS print string function
int
21h
; Afisare "Hello, world"
; functia
DOS 4ch pentru terminarea procesului
mov ah, 4ch
int 21h
END start
3.2. Definirea si initializarea datelor (tipuri de date)
Asamblorul recunoaste trei categorii sintactice de baza:
constante
variabile ;
etichete (inclusiv nume de proceduri).
Constantele pot fi absolute (numerice) sau simbolice. Constantele simbolice
reprezinta nume generice asociate unor valon numerice. Variabilele identifica
datele (un spatiu de memorie rezervat), iar etichetele identifica codul
(program sau procedura).
Instructiuni de tipul MOV, ADD, AND etc. folosesc variabile si constante,
instructiunile JMP si CALL folosesc etichete.
Variabilele si etichetele au asociate atribute, cum ar fi segmentul in care
sunt definite, offset-ul la care sunt definite in interiorul segmentului etc.
3.2.1. Constante
Constantele numerice absolute pot fi :
constante binare - se utilizeaza sufixul B sau b;
constante octale - se utilizeaza sufixele O, Q, o sau q;
constante zecimale - fara sufix sau cu sufixele D sau d;
constante hexazecimale - se utilizeaza sufixele H sau h si prefixul 0 daca
prima cifra este mai mare ca 9; pentru cifrele peste 9 se utilizeaza
simbolurile AF sau af;
constante ASCII - se scriu unul sau mai multe caractere ASCII intre semnul
apostrof sau ghilimele;
lata exemple de constante absolute: 123, 123D, 1000110B, 177q, 0AAH, 3fh,
'a',"AB".
Constantele simbolice se definesc cu directiva EQU, in forma generala:
nume EQU expresie
De exemplu, liniile de program :
CR EQU 0DH
LF EQU 0AH
definesc constantele simbolice CR si LF, cu valorile 0DH si 0AH. Se poate
folosi aceste constante simbolice in orice context in care este permisa
folosirea unei constante numerice.
3.2.2. Definirea si utilizarea variabilelor
Pentru definirea variabilelor, se utilizeaza directivele DB, DW, DD, DQ
sau DT. Forma generala a
unei definitii de date este
nume directiva lista_de_valori
in care nume este identificatorul asociat definitiei respective, iar
lista_de_valori este lista valorilor initiale, care poate cuprinde :
constante numerice (absolute sau simbolice);
simbolul ?
adresa, adica un nume de variabila sau de eticheta; se
foloseste la DW si DD;
un sir ASCII ;
operatorul DUP (expresie), in care expresie poate fi :
- constanta numerica ;
- lista de valori ;
- simbolul ?
- operatorul DUP.
Semnificatia simbolului ? este locatie neinitializata,
iar cea a operatorului DUP, repetarea de un numar de ori a expresiei din
paranteza.
Se considera definitiile urmatoare
var a db 2 dup (0, 3 dup (1) )
var_ b db 1, 2, 3, ?, ?
adr_ n dw var_a
adr_ f dd vax_d
Prima definitie este echivalenta cu :
var_a db 0, 1, 1, 1, 0, 1, 1, 1
Atributele datelor definite sunt :
segment - cel curent ;
offset - cel curent;
tip - 1, 2, 4, 8, 10, dupa cum s-a utilizat ca directiva de baza DB, DW DD .DQ
sau DT.
Variabilele pot fi utilizate ca
variabile simple - var_a, var_b;
variabile indexate - var_a [bx], var_b [2], ALFA [si][bx]
In cazul variabilelor indexate, trebuie tinut seama de tipul variabilei de
baza. De exemplu, in urma definitiei tabloului
B dw 10 dup(?)
expresiile indexate corecte din punct de vedere logic,
care acceseaza elementele lui B, sunt B[0], B[2] etc. Din punct de vedere
sintactic, putem scrie si
mov ax, B [1]
dar aceasta forma va incarca in AL partea high a primului cuvant din tablou si
in AH partea Iow a celui de-al doilea cuvant din tabloul B.
In cazul accesarii variabilelor
prin expresii anonime, poate aparea necesitatea operatorului PTR. Instructiunile :
lea bx, B
inc byte ptr [bx] [4]
inc word ptr [bx] [4]
incrementeaza octetul, respectiv cuvantul de la adresa BX + 4.
3.3.
Definirea inregistrarilor. Operatii specifice
Inregistrarile (RECORD) corespund de fapt unor structuri impachetate
din limbajele de nivel inalt. Concret, o inregistrare este o definitie de campuri de biti, de lungime
maxima 8 sau 16. Din punct de vedere sintactic, definitia unei inregistrari
este similara cu cea a unei structuri, forma generala fiind
nume_inregistrare RECORD nume_camp:valoare, . . .
sau, cu initializare implicita :
nume RECORD nume_camp:valoare = expresie, . . .
Valorile care apar asociate cu numele de campuri dau numarul de biti care se
memoreaza campul respectiv. In variante cu initializare, expresia care apare
dupa semnul egal se evalueaza la o cantitate care se reprezinta pe numarul de
biti asociat campului respectiv. La fel ca la structuri, numele campurilor
trebuie sa fie distincte, chiar daca apartin unor inregistrari diferite.
Se considera un exemplu
BETA record X:7, Y:4, Z:5
prin care se defineste un sablon de 16 biti, grupati in campurile X, Y si Z
(figura 1).
Figura 1
- Definitia unei inregistrari
La fel ca la structuri, se poate acum defini variabile de tipul inregistrarii
BETA
VAL BETA <5, 2, 7>
in care valorile dintre parantezele unghiulare initializeaza cele trei campuri
de biti. Se observa ca aceasta definitie este echivalenta cu definitia
explicita
VAL dw 0000101001000111B
Exista doi operatori specifici inregistrarilor : MASK si WIDTH. Operatorul MASK
primeste un nume de camp si furnizeaza o masca cu bitii 1 pe pozitia campului
respectiv si 0 in rest. Astfel, expresiile MASK X si MASK Y sunt echivalente cu
constantele binare 1111111000000000B si 0000000111100000B.
Asemenea expresii pot fi utilizate pentru selectarea campurilor respective, ca
in exemplele de mai jos
AND AX, MASK Y
; Filtreaza campul Y
AND BK, NOT MASK Z ; Forteaza campul Z la 0
Operatorul WIDTH primeste un nume de inregistrare sau un nume de camp dintr-o
inregistrare, intorcand numarul de biti ai inregistrarii sau ai campului
respectiv. De exemplu, secventa
MOV AL, WIDTH BETA ; AL <--- 16
MOV BL, WIDTH Y
; BL <--- 4
va incarca in AL valoarea 16 si in BL valoarea 4.
Daca se utilizeaza un nume de camp intr-o instructiune de tip MOV, se va
incarca un contor de deplasare, util pentru a deplasa campul respectiv pe
pozitiile cele mai putin semnificative.
Se presupune ca dorim sa testam valoarea numerica a campului Y din
inregistrarea VAL. Nu este suficient sa-l izolam si sa folosim o instructiune
de comparatie. Inainte de comparatie campul Y trebuie adus pe pozitiile cele
mai din dreapta. Aceste operatii se realizeaza prin secventa:
MOV AX, VAL ; Preluare
inregistrare
AND AX, MASK Y ; Selectare camp Y
MOV CL, WIDH Y ; Incarcare in CL, a valorii 4
SHR AX, CL
; Deplasare camp Y la dreapta
3.4. Operatori in limbajul de asamblare
Limbajul de asamblare dispune de un set de operatori cu care se pot forma expresii aritmetice si logice. Aceste expresii sunt evaluate la momentul asamblarii, producand, de fapt, constante numerice. Este esential sa se deosebeasca instructiunile executabile (codul masina) de operatiile care se fac la momentul asamblarii.
3.4.1. Operatori aritmetici si logici
Operatorii aritmetici sunt : +, -, *, /, MOD, SHL si SHR.
Primii patru au semnificatii evidente si opereaza numai cu cantitati intregi.
Operatorul MOD produce restul Ia impartire, iar SHL si SHR provoaca deplasare
la stanga sau la dreapta .
De exemplu, instructiunea
mov ax, 1 SHL 3
; 1 deplasat la stanga cu 3 biti
este echivalenta cu :
mov ax, 100B
Similar, in directiva :
COUNT dw ($ - TAB)/2
se va evalua la momentul asamblarii expresia ($ - TAB)/2, adica diferenta
dintre contorul curent de locatii si adresa TAB, impartita la 2.
Operatorii logici sunt NOT, AND,
OR si XOR, cu semnificatii evidente. Toti acesti operatori
accepta drept operanzi constante intregi; operatiile respective se fac la nivel
de bit. Ei nu trebuie confundati cu instructiunile
executabile cu acelasi nume. In instructiunea :
and al, (1 SHL 3 ) OR (1 SHL 5)
registrul
3.4.2. Operatori relationali
Operatorii relationali sunt EQ, NE, LT, LE, GT, GE cu
semnificatiile evidente:
EQ - egal
NE - diferit
LT - mai mic
LE - mai mic sau egal
GT - mai mare
GE - mai mare sau egal
Acestia intorc valori logice, codificate ca 0 sau ca secvente de 1 pe un numar
corespunzator de biti. In urma definitiilor
x db 1 EQ 2
y dw 1 NE 2
z dd 1 LT 2
variabilele x, y si z vor fi initializate cu constantele 0, 0FFFFH, respectiv
0FFFFFFFFH.
Operatorii relationali sunt utilizati in special in directivele de asamblare
conditionata.
3.4.3. Operatorul de atribuire "="
Operatorul de atribuire "=" defineste constante
simbolice, fiind similar cu directiva EQU, dar permite redefinirea simbolurilor
utilizate. O definire de forma
N EQU 1
N EQT 2
este semnalata ca eroare, dar secventa :
N = 1
N = 2
este corecta.
Acest operator este utilizat in special in definitiile de macroinstructiuni.
3.5. Operatori care intorc valori
Acesti operatori se aplica unor entitati ale programului
in limbaj de asamblare (variabile, etichete), intorcand valori asociate
acestora.
Operatori
SEG
Se aplica atat variabilelor, cat si etichetelor si furnizeaza adresa de segment
asociata variabilei respective. Daca var este o variabila, atunci putem scrie
secventa:
mov ax, SEG var
mov ds, ax
Operatorul
OFFSET
Este similar cu SEG, furnizand offset-ul asociat variabilei sau etichetei
mov bx, OFFSET var
Operatorul
THIS
Acest operator creeaza un operand care are asociate o adresa de segment si un offset
identice cu contorul curent de locatii. Forma generala a operandului este :
THIS tip
in care tip poate fi BYTE, WORD, DWORD, QWORD sau TBYTE pentru definitii de
date, respectiv NEAR / FAR pentru etichete. Operatorul THIS
se utilizeaza de obicei cu directiva EQU. De exemplu, definitia constantei simbolice :
ALFA EQU THIS WORD
este echivalenta cu definitia unei etichete :
ALFA LABEL WORD
Operatorul
TYPE
Se aplica variabilelor si etichetelor, intorcand tipul acestora. Pentru
variabile intoarce valorile 1, 2, 4, 8 sau 10, pentru variabile simple
(definite cu directivele DB, DW, DD, DQ respectiv DT), iar pentru structuri
intoarce numarul de octeti
pe care este memorata structura respectiva. Pentru etichete intoarce tipul etichetei
(NEAR sau FAR).
Operatorul
LENGTH
Se aplica numai variabilelor si intoarce numarul de elemente definite in
variabila respectiva. De
exemplu, in definitia :
A DW 100 dup (?)
expresia LENGTH A are valoarea 100.
Operatorul SlZE
Se aplica numai variabilelor si intoarce dimensiunea in octeti a variabilelor
respective. In definitia
de mai sus, expresia SIZE A are valoarea 200.
Pentru o variabila oarecare var, are loc totdeauna
identitatea :
SlZE var = (LENGTH var) * (TYPE var)
Acesti operatori sunt utili la prelucrarea tablourilor. Secventa urmatoare nu
depinde de tipul de baza al tabloului TAB si nici de dimensiunea sa
.data
TAB dd 100 dup (?)
.code
mov cx, LENGTH TAB
lea si, TAB
bucla :
add si, TYPE TAB
loop bucla
Daca inlocuim acum tipul de baza al tabloului TAB cu o structura de PERSOANA,
modificand si dimensiunea :
PERSOANA STRUC
PERSOANA ENDS
.data
TAB PERSOANA 50 dup < , , , >
partea de program nu trebuie modificata, deoarece asamblorul va evalua corect
expresiile LENGTH TAB si TYPE TAB.
Operatorul PTR
Acest operator se aplica atat variabilelor, cat si
etichetelor, avand ca efect schimbarea tipului variabilei sau al etichetei
respective. Este obligatoriu in
cazul in care se folosesc referinte anonime la memorie, din care nu se poate
deduce tipul operandului :
add word ptr [bx], 2
call dword ptr [bx]
call near ptr proc
4. Desfasurarea lucrarii
Se considera urmatorul exemplu de afisare a doua numere:
.MODEL
huge
.Stack 100 h
Data
enter db
'Afisare numar',13,10,'$'
gata db
13,10,'$'
nul db
13,10,'$'
sterge db 13,10,13,10,13,10,13,10,13,10,13,10,
n db 10
x db 67
r db ?
.CODE
start :
mov ax, @data
mov ds, ax
afis
proc near
mov dx, offset enter
mov ah,9
int 21h
ret
afis endp
afis_cifra
proc near
mov dl,ah
add dl,48
mov ah,2
int 21h
afis_cifra
endp
mov
dx,offset sterge
mov ah,9
int 21h
mov
al,8
mov ah,0
div n
mov
ah,02h
mov dl,al
add dl,48
int 21h
mov
dx,offset nul
mov ah,09h
int 21h
mov
ah,02h
mov dl,ah
add,48
int 21h
mov
dx,offset gata
mov ah,09h
int 21h
call afis
mov
ax,0
mov al,x
div n
mov r,ah
mov ah,al
call
afis_cifra
mov ah,r
call
afis_cifra
mov
ah, 4ch
int 21h
END start
5. Modul de lucru
1. Se vor asambla si link-edita programele prezentate ca
exemplu, obtinandu-se fisiere .EXE
2. Se vor obtine si se vor analiza fisierele listing si de referinte
incrucisate
3. Se vor rula sub DEBUG sau TD programele prezentate.
4. Se propune realizarea unui program in care sa se regaseasca un numar cat mai
mare de definitii de date, conform celor prezentate in breviarul teoretic.
Copyright © 2024 - Toate drepturile rezervate