Documente Academic
Documente Profesional
Documente Cultură
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.
.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(? )
mov esi, 0
mov edi, 0
mov ecx, 8
Ciclu:
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;
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(? )
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
0000004E
00000053
00000058
0000005D
0000005D
00000063
00000068
00000069
0000006C
00000071
00000076
00000078
0000007D
6A 00
*
E8 00000000 E
exit
b)
push
+000000000h
*
call
ExitProcess
main ENDP
END main
INCLUDE Irvine32.inc
1234
;
;
;
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
buffer
buffer2
buffer3
byteCount
result
.code main
PROC
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
(Irvine32.inc)
;OPTION CASEMAP:NONE
; optional: make
INCLUDE SmallWin.inc
; MS-Windows prototypes,
.NOLIST
.LIST
INCLUDE VirtualKeys.inc
; VirtualKeys.inc
.NOLIST
.LIST
.NOLIST
.LIST
; 1234
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
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
message2
byte
message3
byte
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
.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
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
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:
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.