Sunteți pe pagina 1din 13

Ministerul Educaiei i Tineretului al Republicii Moldova

Universitatea Tehnic a Moldovei


Catedra Automatic i Tehnologii Informaionale

Raport
Lucrare de laborator Nr. 1
la Arhitectura Calculatoarelor
Tema: Descrierea pachetului de programe Turbo-Assembler

A elaborat:

st.gr. SI-111

A verificat:

Colesnic V.

Chiinu 2013

1.

Scopul lucrrii

Lucrarea urmareste familiarizarea studentilor cu mediul de dezvoltare a programelor scrise in


limbaj de asamblare pus la dispozitie de catre produsul Turbo-Assembler al firmei Borland. Se prezinta pe
scurt componentele pachetului de programe si procedura generala de lucru cu exemplificare pe doua clase
diferite de programe: in format EXE si in format COM.

2.

MODUL DE LUCRU

1. Se vor asambla si rula programele prezentate obtinindu se atit fisiere .EXE cit si .COM;
2. Se vor obtine si se vor analiza fisierele listing si de referinte incrucisate;
3. Se vor testa cit mai multe dintre optiunile de lucru ale macroasamblorului TASM;
4. Se va rula sub DEBUG sau TD cel putin unul dintre programele prezentate.
EXEMPLU DE PROGRAM IN FORMAT EXE EXEMPLU DE PROGRAM IN FORMAT COM
TITLE salut_exe
.MODEL SMALL
.STACK 100h
.DATA
mesaj DB "Salut!",13,10
lmesaj EQU $-mesaj
.CODE
start: mov ax,@data
mov ds,ax
mov bx,1
mov cx,lmesaj
mov dx,OFFSET mesaj
mov ah,40h
int 21h
mov ax,4C00h
int 21h
END start

3.

TITLE salut_com
_TEXT SEGMENT
ASSUME cs:_TEXT,ds:_TEXT,ss:_TEXT
ORG 100h
start: jmp inceput
mesaj DB "Salut!",13,10
lmesaj EQU $ mesaj
inceput: mov bx,1
mov cx,lmesaj
mov dx,OFFSET mesaj
mov ah,40h
int 21h
mov ax,4C00h
int 21h
_TEXT ENDS
END start

Noiuni teoretice

Arhitectura 8086
Memoria unui calculator este vzut ca o succesiune de octei. Fiecare octet are
asociat o adres de memorie. Pentru a putea adresa memoria, e nevoie de un
registru de adrese, a crui lungime determin dimensiunea maxim a memoriei.
Dac avem un regsitru de adrese de 8 bii, atunci vom putea adresa 28 octei de
memorie. Procesorul 8086 are un registru de adrese de 20 de bii, deci poate
adresa 220 octei de memorie (sau 1 MO). Arhitectura procesorului 8086, din punctul de vedere
al programului utilizator, este ilustrat schematic n figura 2.1. Sunt figurate registrele accesibile prin
program.

Figura 1 - Registrele procesorului 8086


Toate registrele sunt de 16 bii. O serie de registre (AX, BX, CX, DX) sunt disponibile i la nivel de
octet, prile mai semnificative fiind AH, BH, CH i DH, iar cele mai puin semnificative, AL, BL, CL i
DL. Denumirile registrelor sunt:
AX - registru acumulator
BX - registru de baz general
CX - registru contor
DX - registru de date
BP - registru de baz pentru stiv (base pointer)
SP - registru indicator de stiv (stack pointer)
SI - registru index surs
DI - registru index destinaie
Registrul notat FLAGS cuprinde flagurile procesorului, sau bistabililor de condiie, iar registrul IP
(instruction pointer) este registrul de instruciuni.
Denumirile registrelor de segment sunt:
CS - registru de segment de cod (code segment)
DS - registru de segment de date (data segment)
SS - registru de segment de stiv (stack segment)
ES - registru de segment de date suplimentar (extra segment)
Se observ c denumirile registrelor de segment corespund zonelor principale ale unui program
executabil. Astfel, perechea de registre (CS:IP) va indica totdeauna adresa urmtoarei instruciuni care se
va executa, iar perechea (SS:SP) indic totdeauna adresa vrfului stivei. Registrele DS i ES sunt folosite
pentru a accesa date.
Registrul de flaguri (bistabili de condiie) al procesorului 8086 are configuraia din Figura 2.2. O serie
de flaguri sunt flaguri de stare: acestea sunt poziionate la 0 sau la 1 ca urmare a unor operaii aritmetice
sau logice. Celelalte flaguri controleaz anumite operaii ale procesorului.
Semnificaia flagurilor este urmtoarea:
CF (Carry Flag, bistabil de transport) - semnific un transport sau un mprumut din/n bitul cel mai
semnificativ al rezultatului, de exemplu la operaii de adunare sau de scdere.

Figura 2.2 - Registrul de flaguri al procesorului 8086

PF (Parity Flag, flag de paritate) - este poziionat n aa fel nct numrul de bii egali cu 1 din octetul
cel mai puin semnificativ al rezultatului, mpreun cu flagul PF, s fie impar; altfel formulat, suma
modulo 2 (XOR) a tuturor biilor din octetul c.m.p.s. i a lui PF s fie 1.
AF (Auxiliarry Carry Flag, bistabil de transport auxiliar) - indic un transport sau un mprumut din/n
bitul 4 al rezultatului.
ZF (Zero Flag, bistabil de zero) - este poziionat la 1 dac rezultatul operaiei este 0.
SF (Sign Flag, bistabil de semn) - este poziionat la 1 dac b.c.m.s. al rezultatului (bitul de semn) este
1.
OF (Overflow Flag, bistabil de depire) - este poziionat la 1 dac operaia a condus la o depire de
domeniu a rezultatului (la operaii cu sau fr semn).
TF (Trap Flag, bistabil de urmrire) - dac este poziionat la 1, se foreaz o ntrerupere, pe un nivel
predefinit, la execuia fiecrei instruciuni; acest fapt este util n programele de depanare, n care este
posibil rularea pas cu pas a unui program.
IF (Interrupt Flag, bistabil de ntreruperi) - dac este poziionat la 1, procesorul ia n consideraie
ntreruperile hardware externe; altfel, acestea sunt ignorate.
DF (Direction Flag, bistabil de direcie) - precizeaz sensul (cresctor sau descresctor) de variaie a
adreselor la operaiile cu iruri de octei sau de cuvinte.
Flagurile CF, PF, AF, ZF, SF i OF sunt numite flaguri de stare (aritmetice). Flagurile TF, IF i DF sunt
numite flaguri de control.
Procesorul 8086 dispune de adrese pe 20 de bii, fiind capabil s adreseze 1 megaoctet de memorie
(220). Se pune problema cum se formeaz adresa fizic pe 20 de bii (deci pe 5 cifre hexa), deoarece toate
registrele procesorului sunt de 16 bii, putnd codifica adrese n domeniul 0000...0FFFFH (pe 4 cifre
hexa), deci ntr-un spaiu de maxim 64 KO.
Memoria unui sistem cu procesor 8086 este divizat n segmente. Un segment este o zon continu de
memorie, de lungime maxim de 64 KO, care ncepe la o adres fizic multiplu de 4. Acest fapt nseamn
c ultima cifr hexa a adresei de nceput a unui segment este totdeauna 0. Ca atare, aceast cifr se poate
omite i adresa de segment se poate reprezenta tot pe 16 bii. Adresele de nceput ale segmentelor se vor
gsi ntotdeauna ntr-unui din cele 4 registre de segment.
Adresarea n interiorul unui segment se realizeaz printr-un deplasament (offset) relativ la nceputul
segmentului. Deoarece un segment nu poate depi 64 KO, deplasamentul se poate memora tot pe 16 bii.
Deplasamentul poate fi o constant sau coninutul unui registru care permite adresarea memoriei.
n concluzie, pentru adresarea unui octet de memorie, se folosesc dou entiti pe 16 bii: o adres de
segment (coninut obligatoriu ntr-un registru de segment) i un deplasament. Deoarece ambele entiti
sunt pe 16 bii, se vorbete de adrese (sau pointeri) de 32 de bii, dei adresa fizic este doar pe 20 de bii.
Formarea adresei fizice (pe 20 de bii) este realizat automat (prin hardware) de ctre o component a
procesorului, conform Figurii 2.3.
Concret, adresa fizic se obine prin deplasarea adresei de segment cu 4 bii la stnga i prin adunarea
deplasamentului. Pentru specificarea unei adrese complete (de 32 de bii), se folosete notaia
(segment:offset) sau (registru_segment:offset).

Figura 2.3 - Formarea adresei fizice


O adres complet de 32 de bii este memorat cu offsetul la adrese mici i cu adresa de segment la
adrese mari. Adresele complete se pot obine cu directiva DD (Define Double-Word).

4.

Realizarea sarcinii

Listingul programelor .EXE i .COM


sal_exe.lst
Turbo Assembler
sal_exe.asm
salut_exe
1
0000
2
0000
3
0000
4
0000
5
6
7
0008
8
0000
9
0003
10
0005
11
0008
12
000B
13
000E
14
0010
15
0012
16
0015
17
Turbo Assembler
Symbol Table
salut_exe
Symbol Name
??DATE
??FILENAME
??TIME
??VERSION
@32BIT
@CODE
@CODESIZE
@CPU
@CURSEG

Version 4.1

02/25/13 21:41:48

Page 1

.MODEL
SMALL
.STACK
100h
.DATA
53 61 6C 75 74 21 0D+ mesaj DB
"Salut!",13,10
0A
=0008
lmesaj EQU
$-mesaj
.CODE
B8 0000s
start:
mov
ax,@data
8E D8
mov
ds,ax
BB 0001
mov
bx,1
B9 0008
mov
cx,lmesaj
BA 0000r
mov
dx,OFFSET mesaj
B4 40
mov
ah,40h
CD 21
int
21h
B8 4C00
mov
ax,4C00h
CD 21
int
21h
END
start
Version 4.1
02/25/13 21:41:48
Page 2

Type

Value
Text

"02/25/13"
"sal_exe "
Text
"21:41:48"
Number 040A
Text
0
Text
_TEXT
Text
0
Text
0101H
Text
_TEXT
Text

@DATA
@DATASIZE
@FILENAME
@INTERFACE
@MODEL
@STACK
@WORDSIZE
LMESAJ
MESAJ
START

Text
DGROUP
Text
0
Text
SAL_EXE
Text
000H
Text
2
Text
DGROUP
Text
2
Number 0008
Byte
DGROUP:0000
Near
_TEXT:0000

Groups & Segments

Bit Size Align

DGROUP
STACK
_DATA
_TEXT

Group
16 0100 Para
16 0008 Word
16 0017 Word

Combine Class
Stack
Public
Public

STACK
DATA
CODE

sal_com.lst
Turbo Assembler
sal_com.asm
salut_com

Version 4.1

02/25/13 21:46:43

Page 1

1
0000
_TEXT
SEGMENT
2
ASSUME
cs:_TEXT,ds:_TEXT,ss:_TEXT
3
ORG
100h
4
0100 EB 09 90
start:
jmp
inceput
5
0103 53 61 6C 75 74 21 0D+ mesaj
DB "Salut!",13,10
6
0A
7
=0008
lmesaj
EQU
$-mesaj
8
010B BB 0001
inceput: mov
bx,1
9
010E B9 0008
mov
cx,lmesaj
10 0111 BA 0103r
mov
dx,OFFSET mesaj
11 0114 B4 40
mov
ah,40h
12 0116 CD 21
int
21h
13 0118 B8 4C00
mov
ax,4C00h
14 011B CD 21
int
21h
15 011D
_TEXT
ENDS
16
END
start
Turbo Assembler
Version 4.1
02/25/13 21:46:43
Page 2
Symbol Table
salut_com
Symbol Name
??DATE
??FILENAME
??TIME
??VERSION
@CPU
@CURSEG
@FILENAME
@WORDSIZE
INCEPUT
LMESAJ
MESAJ
START
Groups & Segments

Type

Value
Text

"02/25/13"
"sal_com "
Text
"21:46:43"
Number 040A
Text
0101H
Text
_TEXT
Text
SAL_COM
Text
2
Near
_TEXT:010B
Number 0008
Byte
_TEXT:0103
Near
_TEXT:0100
Text

Bit Size Align

Combine Class

_TEXT

16

011D Para

none

Observm c la programul EXE avem 2 segmente _DATA pentru date i _TEXT pentru cod cu
dimensiunile de 8h B, respectiv 17h B, pentru stiv 100h B ns la programul COM avem doar un
segment _TEXT pentru date, cod i stiv de 011Dh B.
Depanarea cu TD
Fereastra TD dup executarea comezii td sal_exe:

TD n modul CPU din meniul View, unde sunt afiate 5 ferestre(programul, registrele, flagurile, stiva i
datele):

Observm adresele segmentelor ds,es,ss i cs n fereastra registrelor.

Adresa segmentului de date ds este 1464, adresa de segment a variabilei mesaj este 1476, deci
deplasamentul variabilei este 12h, deci adresa fizic va fi 1464:0120. Activm fereastra de date apsm
CTRL-G i tastm ds:0120 i vizualizm datele de pe aceast adres:

Depanare obinuit:
Modificarea valorilor din ferestrele regitrilor, flagurilor i a stivei la execuia programului pas cu pas:
cs:0000
cs:0003
cs:0005
cs:0008

cs:000B

cs:000E

cs:0010

cs:0012

cs:0015

Depanare simbolic:
cs:0000

cs:0003

cs:0005

cs:0008

cs:000B

cs:000E

cs:0010

cs:0012

cs:0015

Depanarea cu depanatorul DEBUG:


Afiarea datelor

Afiarea modificrilor n regitri dup execuia a 5 linii de cod:

Execuia programului:

Concluzii
n urma efecturii acestei lucrri m-am familiarizat cu mediul de lucru cu pachetul de programe Turbo
Assembler. Am nsuit modul de lucru cu registrele accesibile prin program ale procesorului 8086, modul
de formare a adreselor. M-am familiarizat cu modul simplificat de definire a segmentelor, cu crearea
fiiere de tip .EXE i COM i cu modul de funcionare a instruciunilor 40h, 4Ch i intreruperii 21.