Sunteți pe pagina 1din 23

Definirea segmentelor în limbaj de

asamblare

Modul de definire :
<nume> segment [<tip aliniere>] [<tip>] [<clasa>]
........
<corpul segmentului>
........
<nume> ends
Definirea segmentelor în limbaj de
asamblare

<nume> este numele asociat segmentului, care


nu poate fi utilizat cu o altă semnificaţie în
program
Definirea segmentelor în limbaj de
asamblare
<tip aliniere> poate fi: para, byte, word
sau page indicând tipul adresei de început a
segmentului.
para indică faptul că adresa de început a zonei
de memorie rezervată este divizibilă cu 16,
byte cu 1
word cu 2
page cu 256
Definirea segmentelor în limbaj de
asamblare
<tip> este o informaţie pentru editoril de legături. Această
informaţie indică raportul între acest segment şi
segmentele definite în alte module de obiect.

Tipul poate fi:


- public – dacă într-un alt modul obiect, cu care se leagă
modulul obiect curent se conţine un segment cu acelaşi
nume, atunci se va face o concatenare a celor două
segmente, obţinându-se un segment unic.

- common – dacă într-un alt modul obiect, cu care se


leagă modulul obiect curent se conţine un segment cu
acelaşi nume, atunci se va face o suprapunere a celor
două segmente(cele două segmente încep de la aceeaşi
adresă).
Definirea segmentelor în limbaj de
asamblare

- at <expresie> - segmentul va fi încărcat în


memorie la adresa de segment reprezentată de
valoarea expresiei.
- stack – segmentul curent este segmentul stivă
în faza de execuţie a programului.
- memory - segmentul curent va fi aşezat în
memorie în spaţiul disponibil rămas după
aşezarea celorlalte segmente în memorie
Definirea segmentelor în limbaj de
asamblare

<clasa> este un nume cuprins între


ghilimele simple care permite stabilirea modului
în care se aşează în memorie segmentele care
compun în program
Definirea segmentelor în limbaj de
asamblare
Având în vedere că într-un program pot să existe
mai multe segmente este necesar ca asamblorul să
ştie în fiecare moment care sunt segmentele curente
pentru a putea să genereze corect codurile
instrucţiunilor.
De asemenea trebuie să ştie ce registru de
segment se poate utiliza pentru a realiza accesul la
datele referite.
Această informaţe este transmisă asamblorului
cu ajutorul pseudoinstrucţiunii assume .

Definirea segmentelor în limbaj de
asamblare
Forma generală pentru această pseudoinstrucţiune este:

assume {<registru de segment>:<nume segment>}

Assume este o pseudoinstrucţiune pentru care nu se


generează cod, rolul ei fiind numai de a informa
asamblorul care este intenţia programatorului.
Definirea segmentelor în limbaj de
asamblare
Ex.
data segment para public ’data’
mesaj1 db “Introduceti un numar: $”
mesaj2 db 10,13,“Introduceti al doilea numar$”
data ends

stk segment stack


db 256 dup(0) ;iniţializarea cu 0 a unei zone de memorie de 256 octeţi
stk ends

code segment para public ‘code’


assume cs:code, ds:data, ss:stk
……
code ends
Definirea simplificată a segmentelor
în limbaj de asamblare
Începând de la versiunea 5.0 a asamblorului
masm a fost introdus un nou mecanism pentru
declararea segmentelor într-o formă simplificată.
Pentru a utiliza acest mod de definire trebuie să
se stabilească mai întâi care este modelul de
memorie pentru care este scris programul respectiv.
Acest model nu are o semnificaţie hardware, ci una
software, precizând modul în care se utilizează
segmentele în cadrul programului respectiv. Toate
directivele simplificate încep cu punct.
Definirea simplificată a segmentelor
în limbaj de asamblare
Declararea modelului se face cu ajutorul unei
pseudoinstrucţiuni de forma:

.model <tip model>


Definirea simplificată a segmentelor
în limbaj de asamblare
Tip poate fi tiny, small, medium, large sau
huge.
Semnificaţia acestor tipuri este:
tiny - toate segmentele (date, cod, stivă) se
pot genera într-un spaţiu de 64Ko şi formează
un singur grup de segmente. Se foloseşte la
programele de tip com. Toate salturile, apelurile
şi definiţiile de proceduri sunt implicit de tip
near.
Definirea simplificată a segmentelor
în limbaj de asamblare
small - datele şi stiva sunt grupate într-un
singur segment, iar codul în alt segment.
Fiecare din acestea nu trebuie să depăsească
64Ko. Toate salturile, apelurile şi definiţiile de
proceduri sunt implicit de tip near.
Definirea simplificată a segmentelor
în limbaj de asamblare
medium - datele şi stiva sunt grupate într-
un singur segment (cel mult egal cu 64K0), dar
codul poate fi în mai multe segmente separate
(nu se grupează), deci poate depăşi 64K0.
Salturile și apelurile sunt implicit tip far, iar
definiţiile de proceduri sunt implicit de tip far.
Definirea simplificată a segmentelor
în limbaj de asamblare
compact - codul generat ocupă cel mult 64Ko (se
grupează), dar datele şi stiva sunt în segmente separate
(pot depăşi 64Ko). Apelurile şi salturile sunt implicit de
tip near. Se utilizează adrese complete (segment şi
offset) atunci când se accesează date definite în alte
segmente.
large - atât datele, cat şi codul generat pot depăi 64Ko.
huge - este asemănător modelului large, dar structurile
de date pot depăşi 64K0; se utilizează adrese complete
normalizate în care offset-ul este redus la minim (în
domeniul 0-15), ceea ce face ca o adresă fizică să fie
descrisă de o unică pereche (segment, offset).
Definirea simplificată a segmentelor
în limbaj de asamblare
Folosirea directivelor simplificate prezintă şi
avantajul că nu mai sunt necesare directive
assume.
Asocierile între segmentele generate si registrele
de segment sunt implicite.
Definirea simplificată a segmentelor
în limbaj de asamblare
Directive slmplificate de definire a segmentelor
Formele generale ale acestor directive sunt:

.stack [dimensiune]

Această directivă alocă o zonă de memorie de


dimensiune specificată pentru segmentul de
stivă
Definirea simplificată a segmentelor
în limbaj de asamblare

.code [nume]

Această directivă precede segmentul de cod.


Încărcarea registrului segment cs se va face
automat de către DOS ce are are sarcina
amplasării segmentelor în memorie.

Definirea simplificată a segmentelor
în limbaj de asamblare
.data
Această directivă descrie segmentul de date
pentru care utilizatorul trebuie să iniţializeze în
mod explicit registrul de segment ds cu adresa
segmentului de date @data.

@data furnizează adresa segmentului de date


care o obţine după momentul editării de
legături.

Definirea simplificată a segmentelor
în limbaj de asamblare
.data?
Poate fi folosită pentru date neiniţializate.

.fardata [nume]

.fardata? [nume]
Definirea simplificată a segmentelor
în limbaj de asamblare
.const
Constantele simbolice se definesc cu directiva equ,
Forma generală:

<nume> equ <expresie>

De exemplu, liniile de program:

cr equ 0dh
lf equ 0ah

definesc constantele smbolice cr şi lf, cu valorile 0dh şi 0ah.


Putem folosi aceste constante simbolice în orice context în
care este permisă folosirea unei constante numerice.
Modele de structura a unui program
; comentarii
stk segment para public ‘stack’
db 64 dup(0) ; memorie pentru stivă
stk ends
dseg segment para public ‘data’
; datele
dseg ends
cseg segment para public ‘code’
assume cs:cseg, ds:dseg, ss:stk
main proc
mov ax,dseg ;iniţializarea segmentului
mov ds, ax ; de date
........
;instrucţiuni
........
mov ah, 4ch ;intrare în DOS
int 21h

main endp
cseg ends
end main
Modele de structura a unui program
; comentarii
.model small
.stack
.data
;datele
.code
mov ax, @data
mov ds, ax
...
;instrucţiunile.
...
mov ah, 4ch
int 21h
end

S-ar putea să vă placă și