Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

Informatica


Index » educatie » Informatica
» Definirea si initializarea datelor in limbaj de asamblare (date simple, structuri, inregistrari). Operatori


Definirea si initializarea datelor in limbaj de asamblare (date simple, structuri, inregistrari). Operatori


Definirea si initializarea datelor in limbaj de asamblare (date simple, structuri, inregistrari). Operatori

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 AL va fi incarcat cu constanta 101000B.

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.





Politica de confidentialitate





Copyright © 2024 - Toate drepturile rezervate