Sunteți pe pagina 1din 14

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei

RAPORT
Lucrare de laborator Nr.4
la Arhitectura Calculatoarelor
Tema: Programe cu ramificri i bucle. Subprograme i macroinstruciuni
Var.3, 6

A efectuat:
St. gr. TI
A verificat:
Colesnic V.

Chiinu 2016

1. Scopul lucrrii
Lucrarea urmrete deprinderea studenilor cu proiectarea i implementarea programelor cu
subprograme i macroinstruciuni, cu ramificaii i bucle in limbaj de asamblare. Se prezint
cteva exemple tipice de astfel de programe, incluznd cteva metode elementare de sortare i
cutare. De asemenea se prezint cteva implementri de operaii aritmetice care necesit
utilizarea unor structuri de control de tip ramificare i buclare. Se vor utiliza instruciunile de
comparare, salt i buclare. Se prezint de asemenea i cteva exemple de utilizare a
instruciunilor logice.
2. Sarcina
a) Elaborai un program care convertete un numr de 16 cifre codificate BCD mpachetat
ncepnd de la adresa packed ntr-un numr BCD nempachetat ncepnd de la adresa
unpacked. Modificai apoi secvena anterioar astfel nct s se ob in numrul codificat
sub forma unui ir de caractere ASCII i s se afi eze apoi irul respectiv.
b) Elaborai un program care citete un ir de 4 cifre hexa codificate ASCII ce reprezint
un numr hexazecimal, convertete acest numr in format BCD nempachetat si l
depune ncepnd de la adresa unpacked i realizeaz apoi conversia sa n binar ntrun cuvnt memorat la adresa binary_word.

3. Efectuarea lucrrii de laborator


Exemplul 9
Determinarea echivalentului binar al unui octet. S se elaboreze un program (pe16 biti) care determin
i afieaz echivalentul binar al unui octet aflat la adresa octet sub forma unui ir de caractere
ASCII ('0', '1').

.DATA
byte
byte
octet byte
.CODE
echiv

8 DUP(?)
13,10
98h

mov cx,8
mov al,octet
mov di,cx
bucl: dec
di
shr al,1
jc
unu
mov echiv[di],'0'
jmp SHORT skip
unu: mov
echiv[di],'1'
skip: loop bucl
mov dx,OFFSET echiv
mov ah,09h
int
21h
mov ax,4C00h
int
21h
END
begin

Exemplul 11
Conversie din BCD nempachetat in BCD mpachetat. S se scrie o secven de program (pe 16 bi i)
care realizeaz conversia unui numr BCD nempachetat de 16 cifre zecimale n forma mpachetat:
TITLE exemplul_11
.MODEL SMALL
.STACK 10h
unpck DB
1,2,4,0,7,8,9,0,6,7,9,1,2,5,8,3
pck
DB
8 DUP(?)
.CODE

mov
mov
xor
mov
conv: mov
shl
shr
mov
add
inc
dec
jnz
exit

a)

dx,8
cl,4
si,si
di,si
ax,WORD PTR unpck[si]
al,cl
ax,cl
pck[di],al
si,2
di
dx
conv

INCLUDE Irvine32.inc

.data

ascii DB 16 DUP(? )
neimp DB 16 DUP(? )

imp DB 11h, 13h, 35h, 57h, 79h, 91h, 99h, 19h


Print byte ?
.code
main proc

mov esi, 0
mov edi, 0
mov ecx, 8
Ciclu:

xor eax, eax


mov al, imp[esi]
rol ax, 4

mov
inc
ror
mov
inc

neimp[edi], ah
edi
al, 4
neimp[edi], al
edi

inc esi
loopw Ciclu
mov edi, 0
mov ecx, 16
CiclulAsc:
mov al, 30h;

add al, neimp[edi]

mov ascii[edi], al
inc edi
loopw CiclulAsc
xor eax, eax
call Crlf
mov esi, 0
mov ecx, 16
CiclulAscPrint: mov
al, ascii[esi] call
WriteChar

inc esi
loopw CiclulAscPrint
call Crlf

call Crlf
exit
main ENDP
END main

Rezultate obinute

Listing-ul programului

INCLUDE Irvine32.inc
C ; Include file for Irvine32.lib
(Irvine32.inc)
C
C ;OPTION CASEMAP:NONE
; optional: make
identifiers case-sensitive
C
C INCLUDE SmallWin.inc
; MS-Windows prototypes,
structures, and constants
C .NOLIST
C .LIST
C
C INCLUDE VirtualKeys.inc
C ; VirtualKeys.inc
C .NOLIST
C .LIST
C
C
C .NOLIST
C .LIST
C
00000000
.data
00000000 00000010 [
ascii
00
]
00000010 00000010 [
neimp
00
]
00000020 11 13 35 57 79 imp DB 11h,
91 99 19
00000028 00
Print
00000000
.code
00000000
main proc

00000000
00000005
0000000A
0000000F
0000000F
00000011
00000017
0000001B
00000021
00000022
00000025
0000002B
0000002C
0000002D

BE 00000000
BF 00000000
B9 00000008

00000030
00000035
0000003A
0000003A
0000003C
00000042
00000048
00000049

BF 00000000
B9 00000010

DB 16 DUP(? )

DB 16 DUP(? )

13h, 35h, 57h, 79h, 91h, 99h, 19h


byte ?

mov esi, 0
mov edi, 0
mov ecx, 8

Ciclu:
33 C0
xor eax, eax
8A 86 00000020 R
mov al, imp[esi]
66| C1 C0 04
rol ax, 4
88 A7 00000010 R
mov neimp[edi], ah
47
inc edi
C0 C8 04
ror al, 4
88 87 00000010 R
mov neimp[edi], al
47
inc edi
46
inc esi
67& E2 DF
loopw Ciclu

mov edi, 0
mov ecx, 16
CiclulAsc:
B0 30
mov al, 30h;
02 87 00000010 R
add al, neimp[edi]
88 87 00000000 R
mov ascii[edi], al
47
inc edi
67& E2 EE
loopw CiclulAsc

0000004C

33 C0

xor eax, eax

0000004E
00000053
00000058
0000005D
0000005D
00000063
00000068
00000069
0000006C
00000071

E8 00000000 E call Crlf


BE 00000000
mov esi, 0
B9 00000010
mov ecx, 16
CiclulAscPrint:
8A 86 00000000 R
mov al, ascii[esi]
E8 00000000 E call WriteChar
46
inc esi
67& E2 F1
loopw CiclulAscPrint
E8 00000000 E call Crlf
E8 00000000 E call Crlf

00000076
00000078
0000007D

6A 00
*
E8 00000000 E

exit

b)

push
+000000000h
*
call
ExitProcess
main ENDP
END main

INCLUDE Irvine32.inc

ShowMessage MACRO message


mov edx, OFFSET message; deplasarea in edx a offsetului
message1 call WriteString; apel procedura de afisare a sirului
call Crlf
call Crlf
endm

ReadStr MACRO buffer, byteCount


mov edx, OFFSET buffer; incarcarea adresei noului sir
mov ecx, SIZEOF buffer; specificam nr.max de caractere din
sir call ReadString
mov byteCount, eax; determinam nr.de caractere din
sir call Crlf
endm
;

1234

;
;
;

0000 0000 0000 0000 0000 0000 0000 0000


0000 0100 0000 0011 0000 0010 0000 0001
0000 0001 0000 0010 0000 0011 0000 0100

Conversion MACRO buffer, buffer2


mov al, byte ptr buffer; deplasarea primului byte din buffer in
al cmp al, '0'; verificarea daca caracterul este cifra
JB error; salt la eticheta error in caz ca nu este
cifra cmp al, '9'
JA error
mov byte ptr buffer2 + 3, al; deplasarea primului byte din buffer in
ultimul byte a buffer2
and byte ptr buffer2 + 3, 00001111b; AND logic cu valoarea respectiva
pentru a egala
; cu 0 tetrada superioara si a pastra valoarea tetradei inferioare

mov al, byte ptr buffer + 1; procedura se repeta pentru fiecare caracter

introdus
cmp al, '0'
JB error
cmp al, '9'
JA error
mov byte ptr buffer2 + 2, al
and byte ptr buffer2 + 2, 00001111b
mov al, byte ptr buffer + 2
cmp al, '0'
JB error
cmp al, '9'
JA error
mov byte ptr buffer2 + 1, al
and byte ptr buffer2 + 1, 00001111b
mov al, byte ptr buffer + 3
cmp al, '0'
JB error
cmp al, '9'
JA error
mov byte ptr buffer2, al
and byte ptr buffer2, 00001111b
JMP no_error; daca sirul introdus contine doar cifre, salt la eticheta
no_error
endm
.data
message1
message2
message3
message5

byte
byte
byte
byte

"Introduceti un sir de 4 cifre", 0; definirea datelor


"Din Hex in BCD neimpachetat >> ", 0
"Din BCD neimpachetat in binar >> ", 0
"Numar invalid", 0

buffer
buffer2
buffer3
byteCount
result

byte 4 DUP(0), 0; input buffer


dword 0; backup buffer2
dword 0; copy buffer3
dword 0
byte 0

.code main
PROC

ShowMessage message1; apel - afisare sir


ReadStr buffer, byteCount; apel - citire sir de la tastatura
mov eax, dword ptr buffer; sirul original se pastreaza intr - o variabila
suplimentara
mov buffer3, eax
Conversion buffer, buffer2; apel - conversia din ASCII in BCD despachetat
error :
mov edx, OFFSET message5; afisarea mesajului in caz de eroare
call WriteString
call Crlf
call Crlf

JMP quit

no_error :
ShowMessage message2
mov eax, 0
mov eax, buffer2
call WriteHex; afisarea BCD
despachetat call Crlf
call Crlf
ShowMessage message3
call WriteBin; afisarea BCD despachetat in
binar call Crlf
call Crlf

quit :
call WaitMsg
exit
main ENDP
END main

Rezultate obinute

Listing-ul programului

INCLUDE Irvine32.inc
C
C
C
identifiers case-sensitive
C
C
structures, and constants
C
C
C
C
C
C
C
C
C
C
C
C

; Include file for Irvine32.lib

(Irvine32.inc)

;OPTION CASEMAP:NONE

; optional: make

INCLUDE SmallWin.inc

; MS-Windows prototypes,

.NOLIST
.LIST
INCLUDE VirtualKeys.inc
; VirtualKeys.inc
.NOLIST
.LIST

.NOLIST
.LIST

ShowMessage MACRO message


mov edx, OFFSET message; deplasarea in edx a offsetului
message1
call WriteString; apel procedura de afisare a sirului
call Crlf
call Crlf
endm

ReadStr MACRO buffer, byteCount


mov edx, OFFSET buffer; incarcarea adresei noului sir
mov ecx, SIZEOF buffer; specificam nr.max de caractere din
sir
call ReadString
mov byteCount, eax; determinam nr.de caractere din
sir call Crlf
endm

; 1234

; 0000 0000 0000 0000 0000 0000 0000 0000 ;


0000 0100 0000 0011 0000 0010 0000 0001 ;
0000 0001 0000 0010 0000 0011 0000 0100

Conversion MACRO buffer, buffer2


mov al, byte ptr buffer; deplasarea primului byte din buffer
in al
cmp al, '0'; verificarea daca caracterul este cifra
JB error; salt la eticheta error in caz ca nu este
cifra cmp al, '9'

JA error
mov byte ptr buffer2 + 3, al; deplasarea primului byte din
buffer in ultimul byte a buffer2
and byte ptr buffer2 + 3, 00001111b; AND logic cu valoarea
respectiva pentru a egala
; cu 0 tetrada superioara si a pastra valoarea tetradei
inferioare
mov al, byte ptr buffer + 1; procedura se repeta pentru
fiecare caracter introdus
cmp al, '0'
JB error
cmp al, '9'
JA error

mov byte ptr buffer2 + 2, al


and byte ptr buffer2 + 2, 00001111b
mov al, byte ptr buffer + 2
cmp al, '0'
JB error
cmp al, '9'
JA error

mov byte ptr buffer2 + 1, al


and byte ptr buffer2 + 1, 00001111b
mov al, byte ptr buffer + 3
cmp al, '0'
JB error
cmp al, '9'
JA error

mov byte ptr buffer2, al


and byte ptr buffer2, 00001111b
JMP no_error; daca sirul introdus contine doar cifre, salt

la eticheta no_error
endm
00000000
00000000 49 6E 74 72 6F
definirea datelor
64 75 63 65 74
69 20 75 6E 20
73 69 72 20 64
65 20 34 20 63
69 66 72 65 00
0000001E 44 69 6E 20 48
65 78 20 69 6E
20 42 43 44 20
6E 65 69 6D 70
61 63 68 65 74
61 74 20 3E 3E
20 00
0000003E 44 69 6E 20 42
43 44 20 6E 65
69 6D 70 61 63
68 65 74 61 74
20 69 6E 20 62
69 6E 61 72 20
3E 3E 20 00
00000060 4E 75 6D 61 72
20 69 6E 76 61

.data
message1

byte

"Introduceti un sir de 4 cifre", 0;

message2

byte

"Din Hex in BCD neimpachetat >> ", 0

message3

byte

"Din BCD neimpachetat in binar >> ", 0

message5

byte

"Numar invalid", 0

6C 69

0000006E

00000073
00000077
0000007B
0000007F

64 00

00000004 [
00
] 00
00000000
00000000
00000000
00

buffer

buffer2
buffer3
byteCount
result

00000000
00000000

byte

byte

4 DUP(0), 0; input buffer

dword 0; backup buffer2


dword 0; copy buffer3
dword 0
0

.code
main PROC

00000000
offsetului
00000005
0000000A
0000000F

BA 00000000
message1
E8 00000000
E8 00000000
E8 00000000

00000014
00000019
caractere
0000001E
00000023
sir
00000028

BA 0000006E R
B9 00000005
din sir
E8 00000000 E
A3 0000007B R

E
E
E

E8 00000000 E

ShowMessage message1; apel - afisare sir


1 mov edx, OFFSET message1; deplasarea in edx a
1
1
1

call WriteString; apel procedura de afisare a sirului


call Crlf
call Crlf

ReadStr buffer, byteCount; apel - citire sir de la tastatura


1 mov edx, OFFSET buffer; incarcarea adresei noului sir
1 mov ecx, SIZEOF buffer; specificam nr.max de
1
1

call ReadString
mov byteCount, eax; determinam nr.de caractere din

call Crlf

0000002D A1 0000006E R mov eax, dword ptr buffer; sirul original se pastreaza intr
- o variabila suplimentara
00000032 A3 00000077 R mov buffer3, eax

Conversion buffer, buffer2; apel - conversia din ASCII in


BCD despachetat
00000037 A0 0000006E R
1 mov al, byte ptr buffer; deplasarea primului byte din
buffer in al
0000003C 3C 30
1 cmp al, '0'; verificarea daca caracterul este cifra
0000003E 72 5D
1 JB error; salt la eticheta error in caz ca nu este cifra
00000040 3C 39
1 cmp al, '9'
00000042 77 59
1 JA error
00000044 A2 00000076 R
1 mov byte ptr buffer2 + 3, al; deplasarea primului
byte din buffer in ultimul byte a buffer2
00000049 80 25 00000076 R 1 and byte ptr buffer2 + 3, 00001111b; AND logic cu
valoarea respectiva pentru a egala
0F
00000050 A0 0000006F R
1 mov al, byte ptr buffer + 1; procedura se repeta
pentru fiecare caracter introdus
00000055 3C 30
1 cmp al, '0'
00000057 72 44
1 JB error
00000059 3C 39
1 cmp al, '9'
0000005B 77 40
1 JA error
0000005D A2 00000075 R
1 mov byte ptr buffer2 + 2, al
00000062 80 25 00000075 R 1 and byte ptr buffer2 + 2, 00001111b
0F
00000069 A0 00000070 R
1 mov al, byte ptr buffer + 2
0000006E 3C 30
1 cmp al, '0'
00000070 72 2B
1 JB error
00000072 3C 39
1 cmp al, '9'
00000074 77 27
1 JA error

00000076
0000007B

A2 00000074 R
1 mov byte ptr
80 25 00000074 R
1 and byte ptr
0F
00000082 A0 00000071 R
1 mov al, byte
00000087 3C 30
1 cmp al, '0'
00000089 72 12
1 JB error
0000008B 3C 39
1 cmp al, '9'
0000008D 77 0E
1 JA error
0000008F A2 00000073 R
1 mov byte ptr
00000094 80 25 00000073 R
1 and byte ptr
0F
0000009B EB 16
1 JMP no_error; daca
la eticheta no_error
0000009D
0000009D
eroare
000000A2
000000A7
000000AC
000000B1

buffer2 + 1, al
buffer2 + 1, 00001111b
ptr buffer + 3

buffer2, al
buffer2, 00001111b
sirul introdus contine doar cifre, salt

BA 00000060 R

error :
mov edx, OFFSET message5; afisarea mesajului in caz de

E8
E8
E8
EB

call WriteString
call Crlf
call Crlf
JMP quit

00000000 E
00000000 E
00000000 E
50

000000B3

no_error :
ShowMessage message2
1 mov edx, OFFSET message2; deplasarea in edx a

000000B3
offsetului
000000B8
000000BD
000000C2
000000C7
000000CC
000000D1
000000D6
000000DB

BA 0000001E R
message1
E8 00000000 E
1 call WriteString; apel procedura de afisare a sirului
E8 00000000 E
1 call Crlf
E8 00000000 E
1 call Crlf
B8 00000000
mov eax, 0
A1 00000073 R mov eax, buffer2
E8 00000000 E call WriteHex; afisarea BCD despachetat
E8 00000000 E call Crlf
E8 00000000 E call Crlf

000000E0
offsetului
000000E5
000000EA
000000EF
000000F4
000000F9
000000FE

ShowMessage message3
BA 0000003E R
1 mov edx, OFFSET message3; deplasarea in edx a
message1
E8 00000000 E
1 call WriteString; apel procedura de afisare a sirului
E8 00000000 E
1 call Crlf
E8 00000000 E
1 call Crlf
E8 00000000 E call WriteBin; afisarea BCD despachetat in binar
E8 00000000 E call Crlf
E8 00000000 E call Crlf

00000103

quit :

00000103

E8 00000000 E

00000108
0000010A
0000010F

6A 00
*
E8 00000000 E

call WaitMsg
exit
push
+000000000h
*
call
ExitProcess
main ENDP
END main

Concluzie
n urma realizrii lucrrii de laborator nr.4 la tema: Programe cu ramificri i bucle. Subprograme
i macroinstruciuni, am nsuit mai bine proiectarea i implementarea programelor cu subprograme
i macroinstruciuni, cu ramificaii i bucle n limbaj de asamblare. Am prezentat utilizarea unor
structuri de control de tip ramificare i buclare. La fel, am utilizat instruc iunile de comparare, salt i
buclare, prezentnd i cteva exemple de utilizare a instruc iunilor logice.
Am utilizat urmtoarele instruciuni:

- Jmp instruciunea de salt necondiionat; (jump)


- Ja instruciunea de salt condiionat; (jump if above)
- Jb instruciunea de salt condiionat; (jump if below)
- XOR exclusive or se efectueaz operaia modulo 2;
- ROL rotate left - realizeaz operaii de deplasare i de rotaie la stnga;
- ROR rotate right - realizeaz operaii de deplasare i de rotaie la dreapta;
- INC incrementarea cu unu;
- LOOPW decrementarea CX (utilizat ca contor);
- LOOPD decrementarea ECX (utilizat ca contor);
MACRO macroinstruciune - secven de cod surs creia i se atribuie un nume
simbolic, coninutul acestei secvene putnd fi repetat ori de cte ori n cadrul unui
program prin simpla referire la numele simbolic respectiv.

n concluzie, conform variantelor am elaborat dou programe, care presupun studierea numerelor

mpachetate i nempachetate, astfel fiind codificate sub forma unui ir de caractere ASCII i
afiarea acestuia.
La fel, am realizat un program cu introducerea datelor de la tastatur i convertirea acestora n
format BCD nempachetat, apoi realizndu-i conversia sa n binar ntr-un cuvnt memorat la adresa
binary_word.