Sunteți pe pagina 1din 12

Proiect la Bazele

Tehnologiei Informatiei

Arhip Georgiana
Grupa 1003
1. Sa se evalueze expresia:
E=x+6-y:3+z:2, unde x,y,z
a). sunt de tip BYTE
.model small
.data
x db 20
y db 21
z db 22
E db ?
.code
cli
mov ax, @data
mov ds, ax
; Prima data calculez y/3. Pun y in registrul AL(21 in zecimal => AL=15h), curat registrul AH si
pun 3 in registrul CL. Impart cu idiv AL la CL(y la 3), si imi rezulta catul in AL(AL=7h) si
restul in AH(AH=00). Curat registrul AH.
mov al,y
xor ah,ah
mov cl,3
idiv cl; al=y/3
xor ah,ah; clean reg
; Mut rezultatul din AL=7h in registrul BL(BL=7h)
mov bl, al; bl=y/3
; Calculez z/2. Pun z in registrul AL(22 in zecimal => AL=16h), curat registrul AH si pun 2 in
registrul CL. Impart cu idiv AL la CL(y la 3), si imi rezulta catul in AL(11 in zecimal =>
AL=0B) si restul in AH(AH=00). Curat registrul AH.
mov al, z
mov cl, 2
idiv cl; al=z/2
xor ah,ah; clean reg
; Adun BL la AL(AL = z/2 + y/3 = 12h => 18 in zecimal). Apoi adun x la AL(26h => 38 in
zecimal) si 6 la rezultat. => AL = z/2 + y/3 + x + 6 = 2Ch => 38 in zecimal
add al,bl
add al,x
add al,6; al + x+6
; Mut rezultatul expresiei din AL in variabila E
mov E, al; E = al
int 21h
end

b). Sunt de tip DOUBLE


.model small
.data
x dd 11111111h
y dd 34
z dd 22
E dd ?
.code
cli
mov ax, @data
mov ds, ax ;
; Prima data calculez y/3. Pun cuvantul cel mai putin semnificativ al lui y in registrul AX(34 in
zecimal => AX=0022h). Pun cuvantul cel mai semnificativ al lui y in registrul DX(DX=0000h)
si pun 3 in registrul CX(CX=0003h). Impart cu idiv DX:AX la CX(y la 3), si imi rezulta catul in
AX(AX=000Bh) si restul in DX(DX=0001h).
OBS: Catul si restul impartirii nu trebuie sa depaseasca 16 biti, deoarece assembler-ul aloca
DX:AH ca deimpartit(32 de biti), iar catului registrul AX(16 biti) si restului registrul DX(16
biti).
Curat registrul DX. Am ales numere mai mici, intrucat, daca impartitorul este 3(un numar mic)
iar catul impartirii depaseste 16 biti, avem stack overflow, programul simuland o impartire la 0.
mov ax, word ptr y; cuv cel mai putin semnif al lui y
mov dx, word ptr y + 2; cuv cel mai semnif al lui y
mov cx,3
idiv cx; dx:ax=y/3
xor dx,dx; clean reg
;Mut rezultatul din AX=000Bh in registrul BX(BX=000Bh)
mov bx, ax; bl=y/3
;Calculez z/2. Pun cuvantul cel mai putin semnificativ al lui z in registrul AX(22 in zecimal =>
AX=0016h). Pun cuvantul cel mai semnificativ al lui z in registrul DX(DX=0000h) si pun 2 in
registrul CX(CX=0002h). Impart cu idiv DX:AX la CX(z la 2), si imi rezulta catul in
AX(AX=000Bh) si restul in DX(DX=0000h). Curat registrul DX. Am ales numere mai mici,
intrucat, daca impartitorul este 3(un numar mic) iar catul impartirii depaseste 16 biti, avem stack
overflow, programul simuland o impartire la 0.
mov ax, word ptr z;cuv cel mai putin semnif al lui z
mov dx, word ptr z+2; cuv cel mai semnif al lui z
mov cx, 2
;xor dx,dx
idiv cx; dx:ax=z/2
xor dx,dx; clean reg
; Adun BX la AX(AX= z/2 + y/3 = 16h => 22 in zecimal).
add ax,bx; ax = y/3 + z/2
; Curat registrul BX.
xor bx,bx; clean reg
; Mut in registrul BX cuvantul cel mai putin semnificativ al lui x (BX = 1111h)
mov bx, word ptr x;cuv cel mai putin semnif al lui x
; Adun 6 la BX => BX = 1117h
add bx, 6;
; Adun BX la AX( cuvantul cel mai putin semnificativ al expresiei) => AX = 112Dh
add ax,bx; adun bx(x+6) la ax(y/3 + z/2)
; Adun cuvantul cel mai semnificativ al lui x si un eventual carry de la cel mai putin semnificativ
cuvant al expresiei la DX cu adc => DX = 1111h
adc dx, word ptr x+2;cuv cel mai semnif al lui x la dx + eventual carry
; Mut rezultatul expresiei din AX in cuvantul cel mai putin semnificativ al variabilei E
mov word ptr E, ax; E = :ax
; Mut rezultatul expresiei din DX in cuvantul cel mai semnificativ al variabilei E
mov word ptr E+2, dx; E = dx:ax
int 21h
end

Problema 2
Cum arat n registrii microprocesorului i n memorie urmtoarele iruri de date:
a). numerele 8, 23, 34 la nivel de W;

.model small
.data
x db 8
y db 23
z db 24
.code
cli
mov ax, @data
mov ds, ax ;

mov al, x
mov dl, y
mov bl, z
int 21h
end
Variabila x(8) apare la offset-ul 0000, ceea ce inseamna ca se afla la adresa 0 fata
de inceputul segmentului de date.
Pentru a obtine adresa fizica a variabilei, se deplaseaza adresa segmentului cu 4
biti spre stanga, locurile ramase libere completandu-se cu 0.
La valoarea astfel obtinuta se aduna deplasamentul in cadrul segmentului si se
obtine adresa fizica.
In cazul de fata: 0711 deplasat spre stanga cu 4 biti -> 07110 Deplasamentul este
0711+ 0 = 07110 ( adresa fizica). In acest caz, deplasamentul este 0.
Registrul AX arata astfel: 0708
Vom cauta adresa fizica in memorie pentru variabila x.
Adresa fizica a variabilei x este 07116 = 0711 + 0006(offset)

Variabila y(23) apare la offset-ul 0001, ceea ce inseamna ca se afla la adresa 1 fata
de inceputul segmentului de date.
Pentru a obtine adresa fizica a variabilei, se deplaseaza adresa segmentului cu 4
biti spre stanga, locurile ramase libere completandu-se cu 0.
La valoarea astfel obtinuta se aduna deplasamentul in cadrul segmentului si se
obtine adresa fizica.
In cazul de fata: 0711 deplasat spre stanga cu 4 biti -> 0711 Deplasamentul este
0711+ 1 = 07111 ( adresa fizica). In acest caz, deplasamentul este 1.
Registrul DX arata astfel: 0017
Vom cauta adresa fizica in memorie pentru variabila y.
Adresa fizica a variabilei x este 07119 = 0711 + 0009(offset)

Variabila z(34) apare la offset-ul 0002, ceea ce inseamna ca se afla la adresa 2 fata
de inceputul segmentului de date.
Pentru a obtine adresa fizica a variabilei, se deplaseaza adresa segmentului cu 4
biti spre stanga, locurile ramase libere completandu-se cu 0.
Registrul BX arata astfel: 0018
Vom cauta adresa fizica in memorie pentru variabila z.
Adresa fizica a variabilei x este 0711D = 0711 + 000D(offset)

b). un vector de 4 numere, la nivel de B, apoi de W;


B:
.model small
.data
x db 4 dup(2)
.code
cli
mov ax, @data
mov ds, ax ;

mov al, x[0]


mov bl, x[1]
mov cl, x[2]
mov dl, x[3]
int 21h
end

Variabila x[0] apare la offset-ul 0000, ceea ce inseamna ca se afla la adresa 0 fata
de inceputul segmentului de date.
Pentru a obtine adresa fizica a variabilei, se deplaseaza adresa segmentului cu 4
biti spre stanga, locurile ramase libere completandu-se cu 0.
La valoarea astfel obtinuta se aduna deplasamentul in cadrul segmentului si se
obtine adresa fizica.
In cazul de fata: 0711 deplasat spre stanga cu 4 biti -> 07110 Deplasamentul este
0711+ 0 = 07110 ( adresa fizica). In acest caz, deplasamentul este 0.
Registrul AX arata astfel: 0702
Vom cauta adresa fizica in memorie pentru variabila x[0].
Adresa fizica a variabilei x este 07116 = 0711 + 0006(offset)

Variabila x[1] apare la offset-ul 0001, ceea ce inseamna ca se afla la adresa 1 fata
de inceputul segmentului de date.
Pentru a obtine adresa fizica a variabilei, se deplaseaza adresa segmentului cu 4
biti spre stanga, locurile ramase libere completandu-se cu 0.
La valoarea astfel obtinuta se aduna deplasamentul in cadrul segmentului si se
obtine adresa fizica.
Registrul BX arata astfel: 0002
Vom cauta adresa fizica in memorie pentru variabila x[1].
Adresa fizica a variabilei x este 07119 = 0711 + 0009(offset)
Variabila x[2] apare la offset-ul 0002, ceea ce inseamna ca se afla la adresa 2 fata
de inceputul segmentului de date.
Pentru a obtine adresa fizica a variabilei, se deplaseaza adresa segmentului cu 4
biti spre stanga, locurile ramase libere completandu-se cu 0.
La valoarea astfel obtinuta se aduna deplasamentul in cadrul segmentului si se
obtine adresa fizica.
Registrul CX arata astfel: 0002
Vom cauta adresa fizica in memorie pentru variabila x[2].
Adresa fizica a variabilei x este 0711D = 0711 + 000D(offset)

Variabila x[3]apare la offset-ul 0003, ceea ce inseamna ca se afla la adresa 3 fata


de inceputul segmentului de date.
Pentru a obtine adresa fizica a variabilei, se deplaseaza adresa segmentului cu 4
biti spre stanga, locurile ramase libere completandu-se cu 0.
Registrul DX arata astfel: 0002
Vom cauta adresa fizica in memorie pentru variabila x[3].
Adresa fizica a variabilei x este 07121 = 0711 + 0011(offset)

WORD:
.model small
.data
x dw 4 dup(2)
.code
cli
mov ax, @data
mov ds, ax ;

mov ax, x[0]


mov bx, x[1]
mov cx, x[2]
mov dx, x[3]
int 21h
end
Variabila x[0] apare la offset-ul 0000, ceea ce inseamna ca se afla la adresa 0 fata
de inceputul segmentului de date.
Pentru a obtine adresa fizica a variabilei, se deplaseaza adresa segmentului cu 4
biti spre stanga, locurile ramase libere completandu-se cu 0.
La valoarea astfel obtinuta se aduna deplasamentul in cadrul segmentului si se
obtine adresa fizica.
In cazul de fata: 0711 deplasat spre stanga cu 4 biti -> 07110 Deplasamentul este
0711+ 0 = 07110 ( adresa fizica). In acest caz, deplasamentul este 0.
Registrul AX arata astfel: 0702
Vom cauta adresa fizica in memorie pentru variabila x[0].
Adresa fizica a variabilei x este 07116 = 0711 + 0006(offset)

Variabila x[1] apare la offset-ul 0001, ceea ce inseamna ca se afla la adresa 1 fata
de inceputul segmentului de date.
Pentru a obtine adresa fizica a variabilei, se deplaseaza adresa segmentului cu 4
biti spre stanga, locurile ramase libere completandu-se cu 0.
La valoarea astfel obtinuta se aduna deplasamentul in cadrul segmentului si se
obtine adresa fizica.
Registrul BX arata astfel: 0002
Vom cauta adresa fizica in memorie pentru variabila x[1].
Adresa fizica a variabilei x este 07119 = 0711 + 0009(offset)

Variabila x[2] apare la offset-ul 0002, ceea ce inseamna ca se afla la adresa 2 fata
de inceputul segmentului de date.
Pentru a obtine adresa fizica a variabilei, se deplaseaza adresa segmentului cu 4
biti spre stanga, locurile ramase libere completandu-se cu 0.
La valoarea astfel obtinuta se aduna deplasamentul in cadrul segmentului si se
obtine adresa fizica.
Registrul CX arata astfel: 0002
Vom cauta adresa fizica in memorie pentru variabila x[2].
Adresa fizica a variabilei x este 0711D = 0711 + 000D(offset)

Variabila x[3]apare la offset-ul 0003, ceea ce inseamna ca se afla la adresa 3 fata


de inceputul segmentului de date.
Pentru a obtine adresa fizica a variabilei, se deplaseaza adresa segmentului cu 4
biti spre stanga, locurile ramase libere completandu-se cu 0.
Registrul DX arata astfel: 0002
Vom cauta adresa fizica in memorie pentru variabila x[3].
Adresa fizica a variabilei x este 07121 = 0711 + 0011(offset)
Sunt la fel.

c) irul de caractere DEF123, apoi abc;

.model small
.data
x dw 'DEF123'
y dw 'abc'

.code
cli
mov ax, @data
mov ds, ax ;

mov ax, x
mov dx, y
int 21h
end
Variabila x apare la offset-ul 0000, ceea ce inseamna ca se afla la adresa 0 fata de
inceputul segmentului de date.
Pentru a obtine adresa fizica a variabilei, se deplaseaza adresa segmentului cu 4
biti spre stanga, locurile ramase libere completandu-se cu 0.
La valoarea astfel obtinuta se aduna deplasamentul in cadrul segmentului si se
obtine adresa fizica.
In cazul de fata: 0711 deplasat spre stanga cu 4 biti -> 07110 Deplasamentul este
0711+ 0 = 07110 ( adresa fizica). In acest caz, deplasamentul este 0.
Registrul AX arata astfel: 4544
Vom cauta adresa fizica in memorie pentru variabila x
Adresa fizica a variabilei x este 07116 = 0711 + 0006(offset)

Variabila y apare la offset-ul 0006, ceea ce inseamna ca se afla la adresa 6 fata de


inceputul segmentului de date.
Pentru a obtine adresa fizica a variabilei, se deplaseaza adresa segmentului cu 4
biti spre stanga, locurile ramase libere completandu-se cu 0.
La valoarea astfel obtinuta se aduna deplasamentul in cadrul segmentului si se
obtine adresa fizica.
Registrul DX arata astfel: 6261
Vom cauta adresa fizica in memorie pentru variabila y.
Adresa fizica a variabilei x este 07119 = 0711 + 0009(offset)
d) Caracterul 12, apoi numarul 12
.model small
.data
x dw '12'
y dw12

.code
cli
mov ax, @data
mov ds, ax ;

mov ax, x
mov dx, y
int 21h
end

Variabila x apare la offset-ul 0000, ceea ce inseamna ca se afla la adresa 0 fata de


inceputul segmentului de date.
Pentru a obtine adresa fizica a variabilei, se deplaseaza adresa segmentului cu 4
biti spre stanga, locurile ramase libere completandu-se cu 0.
La valoarea astfel obtinuta se aduna deplasamentul in cadrul segmentului si se
obtine adresa fizica.
In cazul de fata: 0711 deplasat spre stanga cu 4 biti -> 07110 Deplasamentul este
0711+ 0 = 07110 ( adresa fizica). In acest caz, deplasamentul este 0.
Registrul AX arata astfel: 3231
Vom cauta adresa fizica in memorie pentru variabila x
Adresa fizica a variabilei x este 07116 = 0711 + 0006(offset)

Variabila y apare la offset-ul 0002, ceea ce inseamna ca se afla la adresa 2 fata de


inceputul segmentului de date.
Pentru a obtine adresa fizica a variabilei, se deplaseaza adresa segmentului cu 4
biti spre stanga, locurile ramase libere completandu-se cu 0.
La valoarea astfel obtinuta se aduna deplasamentul in cadrul segmentului si se
obtine adresa fizica.
Registrul DX arata astfel: 000C
Vom cauta adresa fizica in memorie pentru variabila y.
Adresa fizica a variabilei x este 07119 = 0711 + 0009(offset)

e) numrul 1ACDH.

.model small
.data
x dw 1ACDH

.code
cli
mov ax, @data
mov ds, ax ;

mov ax, x
int 21h
end

Variabila x apare la offset-ul 0000, ceea ce inseamna ca se afla la adresa 0 fata de


inceputul segmentului de date.
Pentru a obtine adresa fizica a variabilei, se deplaseaza adresa segmentului cu 4
biti spre stanga, locurile ramase libere completandu-se cu 0.
La valoarea astfel obtinuta se aduna deplasamentul in cadrul segmentului si se
obtine adresa fizica.
In cazul de fata: 0711 deplasat spre stanga cu 4 biti -> 07110 Deplasamentul este
0711+ 0 = 07110 ( adresa fizica). In acest caz, deplasamentul este 0.
Registrul AX arata astfel: 1ACD
Vom cauta adresa fizica in memorie pentru variabila x
Adresa fizica a variabilei x este 07116 = 0711 + 0006(offset)