30 0 290KB
Raport Arhitectura Calculatoarelor Lucrarea de laborator NR.2 Tema: „Bazele limbajului Assembler”
Elaborat: Cerlat Pavel FAF-192 Controlat: Postovan Dumitru
Scopul: Se prezinta problemele principale legate de conversii de date, reprezentarea datelor întregi,reprezentarea întregilor in format BCD, reprezentarea caracterelor si a șirurilor de caractere.
EX #1 INCLUDE Irvine32.inc .data alfa DW 3 DUP(?) .code main proc mov ax,17 ; adresare indirecta a operandului sursa mov ax,10101b ; mov ax,11b ; mov ax,21o ; mov alfa,ax ; Adresare directa a operandului destinatie mov cx,ax ; Interschimba registrele ax si bx mov ax,bx ; Folosind registrul cx mov ax,cx xchg ax,bx ; Interschimba direct cele 2 registre. mov si,2 mov alfa[si],ax ; Adresare relativa cu registrul si mov ebx,offset alfa ; Adresare imediata a operandului sursa lea ebx,alfa ; Acelasi efect mov esi,2 mov cx,[ebx][esi] ; Adresare bazata indexata a sursei mov cx,alfa[2] ; Acelasi efect. mov cx,[alfa+2] ; Acelasi efect mov di,4 mov byte ptr [ebx][edi],55h ; mov esi,2 mov ebx,3 mov alfa[ebx][esi],33h ; Adresare bazata indexata relativa a destinatiei mov alfa[ebx+esi],33h ; Notatii echivalente mov [alfa+ebx+esi],33h mov [ebx][esi]+alfa,33h exit ;Procedura de iesire din Irvine32.inc main ENDP ;Terminarea procedurii main
END main
;Punctul de terminare a programului
Listingul codului: 00000000
.data
00000000 00000003 [ alfa WORD 3 DUP(?) 0000 ] 00000000 .code 00000000 main proc 00000000 66| B8 0011 mov ax,17 ; adresare indirecta a operandului sursa 00000004 66| B8 0015 mov ax,10101b 00000008 66| B8 0003 mov ax,11b 0000000C 66| B8 0011 mov ax,21o 00000010 66| A3 mov alfa,ax ; Adresare directa a operandului destinatie 00000000 R 00000016 66| 8B C8 mov cx,ax ; copiem valoarea registrului ax in registrul cx 00000019 66| 8B C3 mov ax,bx ;copiem valoarea registrului bx in registrul ax 0000001C 66| 8B C1 mov ax,cx ; restauram valoarea anterioara a ax din registrul cx 0000001F 66| 93 xchg ax,bx ; schimbam cu locul valorile ax si bx 00000021 66| BE 0002 mov si,2 ; copiem valoarea 2 in registrul si (source index) 00000025 66| 89 04 35 mov alfa[si],ax ; copiem valoarea registrului ax in al doilea cuvant al tabloului alfa 00000000 R 0000002D BE 00000002 mov esi,2 ; scriem valoarea 2 in registrul esi 00000032 BB 00000000 Rmov ebx,offset alfa ; copiem miscarea alfa in registrul ebx 00000037 8D 1D 00000000 R lea ebx,alfa ; copiem adresa (miscarea) alfa in registrul ebx 0000003D 8B 0C 33 mov ecx,[ebx][esi] ; copiem valoarea celui de-al doilea cuvant al tabloului alfa in registrul ecx 00000040 66| 8B 0D mov cx,alfa[2] ; copiem valoarea celui de-al doilea cuvant al tabloului alfa in registrul cx 00000002 R 00000047 66| 8B 0D mov cx,[alfa+2] ; copiem valoarea celui de-al doilea cuvant al tabloului alfa in registrul 00000002 R 0000004E 66| BF 0004 mov di,4 ; scriem valoarea 4 in registrul di (destination index) 00000052 C6 04 3B 55 mov byte ptr [ebx][edi],55h; scriem 55h in al cincilea octet alfa (primul octet de 3 cuvinte) 00000056 BE 00000002 mov esi,2 ; scriem valoarea 2 in registrul esi 0000005B BB 00000003 mov ebx,3 ; scriem valoarea 3 in registrul ebx 00000060 66| C7 84 33 mov alfa[ebx][esi],33h ; scriem 33h in al doilea octet 3 cuvinte din tabloul alfa 00000000 R 0033 0000006A 66| C7 84 33 mov alfa[ebx+esi],33h ; scriem 33h in al doilea octet 3 cuvinte din tabloul alfa 00000000 R 0033 00000074 66| C7 84 33 mov [alfa+ebx+esi],33h; scriem 33h in al doilea octet 3 cuvinte din tabloul alfa 00000000 R 0033 0000007E 66| C7 84 33 mov [ebx][esi]+alfa,33h ; scriem 33h in al doilea octet 3 cuvinte din tabloul alfa 00000000 R 0033
00000088 6A 00 * 0000008A E8 00000000 E * 0000008F
exit push +000000000h call ExitProcess main ENDP END main
Ex #2 Sa se calculeze expresia aritmetica: e=((a+b*c-d)/f+g*h)/i. Se cere obţinerea fisierului executabil si rularea apoi pas cu pas. INCLUDE Irvine32.inc ; Sa se calculeze expresia aritmetica: e=((a+b*c-d)/f+g*h)/i ; se considera a, d, f – cuvant b, c, g, h, i –byte ; ca sa putem executa impartirea cu f convertim impartitorul la dublucuvânt ; ne vor interesa doar caturile impartirilor, rezultatul va fi de tip octet .data a dw 5 ;valoarea 5 de marimea de 2 biti pentru a b db 6 ;valoarea 6 de tipul bit pentru b cd db 10 ;valoarea 10 de tipul bit pentru cd d dw 5 ;valoarea 5 de marimea de 2 biti pentru d f dw 6 ;valoarea 6 de marimea de 2 biti pentru f g db 10 ;valoarea 10 de tipul bit pentru g h db 11 ;valoarea 11 de tipul bit pentru h i db 10 ;valoarea 10 de tipul bit pentru i interm dw ? ;valoare de marimea 2 biti rez db ? ;bit cu valoarea nealeasa .code main proc mov eax,0 mov al, b imul cd ; in ax avem b*c add ax, a ; ax=b*c+a sub ax, d ; ax=b*c+a-d cwd ; am convertit cuvantul din ax, in dublu cuvantul , retinut in dx:ax idiv f ; obtinem câtul în ax si restul în dx ax=(a+b*c-d)/f mov interm, ax ; interm=(a+b*c-d)/f mov al, g imul h ; ax=g*h add ax, interm ; ax=(a+b*c-d)/f+g*h idiv i ; se obtine catul în al si restul în ah mov rez, al exit main ENDP END main
Rezultatul obtinut ((a+b*c-d)/f+g*h)/i=((5+6*10-5)/6+10*11)/10= 12
Listingul EX #2 00000000
.data
00000000 0005
a dw 5
00000002 06
b db 6
00000003 0A
cd db 10
00000004 0005
d dw 5
00000006 0006
f dw 6
00000008 0A
g db 10
00000009 0B
h db 11
0000000A 0A
i db 10
0000000B 0000
interm dw ?
0000000D 00
rez db ?
00000000
.code
00000000
main proc
00000000 B8 00000000 mov eax,0 00000005 A0 00000002 R
mov al, b
0000000A F6 2D 00000003 R
imul cd ; in ax avem b*c
00000010 66| 03 05
add ax, a ; ax=b*c+a
00000000 R 00000017 66| 2B 05
sub ax, d ; ax=b*c+a-d
00000004 R 0000001E 66| 99
cwd ; am convertit cuvantul din ax, in dublu cuvantul , retinut in dx:ax
00000020 66| F7 3D
idiv f ; obtinem c?tul ?n ax si restul ?n dx ax=(a+b*c-d)/f
00000006 R 00000027 66| A3
mov interm, ax ; interm=(a+b*c-d)/f
0000000B R 0000002D A0 00000008 R
mov al, g
00000032 F6 2D 00000009 R
imul h ; ax=g*h
00000038 66| 03 05
add ax, interm ; ax=(a+b*c-d)/f+g*h
0000000B R 0000003F F6 3D 0000000A R
idiv i ; se obtine catul ?n al si restul ?n ah
00000045 A2 0000000D R
mov rez, al exit
0000004A 6A 00
*
0000004C E8 00000000 E * 00000051
push +000000000h call ExitProcess main ENDP END main
EX #3 Varianta #6 z=(a-b*c/d)/(c+2-a/b)+5 Codul: INCLUDE Irvine32.inc .data a dw 5 ; cu o valoare de 5 cuvinte de tip pentru a b db 1 ; cu o valoare de 1 octet un cuvânt pentru b cd db 10 ; cu o valoare de 10 octeți un cuvânt pentru cd d dw 5 ; cu o valoare de 5 cuvinte de tip pentru d interm dd ? rez dd ? .code main proc mov eax,0 ; punem valoarea 0 în registrul eax mov al, b ; punem valoarea 0 în registrul eax imul cd ; rezultatul b * c este salvat în ax cwd ; extindem al la ax (ținând cont de semn) idiv d ; coeficientul în ax și restul în dx,ax = b * c/d mov interm, eax; ; interm = b * c / d sub a, ax ; ax = a – b * c / d cwd ;extindem cuvântul din ax, într-un cuvânt dublu în dx: ax mov interm, eax ; interm = a – b * c / d mov ax, a ; scriem in ax idiv b ; executam a / b cwd ; extindem rezultatul împărțirii de la ax în eax(păstrând semnul) mov ecx, eax ; copiem rezultatul a / b în ecx mov al, cd cbw add ax, 2 mov ebx, interm ; copiem valoarea interm în registrul ebx mov word ptr interm, ax ; copiem in interm mic și mare cuvintele rezultate mov word ptr interm[2], dx sub interm, ecx ; executam a / b - c + a mov eax, ebx ; copiem rezultatul a-b * c / d în registrul eax cdq ; extindem eax la edx: eax (luand in seama semnul) idiv interm ; executam (a-b * c / d) / (c + 2-a / b) mov ax, 5 ; scriem 5 in ax add interm, eax ; executam eax=(a-b*c/d)/(c+2-a/b)+5 cbw ; extindem rezultatul diviziunii de la al la ax(păstrând semnul) cwd ; extindem rezultatul împărțirii de la ax pana la eax (păstrând semnul) mov rez, eax ; copiem rezultatul în rez exit ;Procedura de iesire din Irvine32.inc main ENDP ;Terminarea procedurii main END main ;Punctul de terminare a programului
Listingul: 00000000
.data
00000000 0005
a dw 5
00000002 01
b db 1
00000003 0A
cd db 10
00000004 0005
d dw 5
00000006 00000000
interm dd ?
0000000A 00000000
rez dd ?
00000000
.code
00000000
main proc
00000000 B8 00000000
mov eax,0
00000005 A0 00000002 R
mov al, b
0000000A F6 2D 00000003 R imul cd ; în ax rezultatul b * c este salvat (cu un semn) 00000010 66| 99
cwd
00000012 66| F7 3D
idiv d
; ax=b*c/d
00000004 R 00000019 A3 00000006 R 0000001E 66| 29 05
mov interm, eax
sub a, ax; ax=b*c/d-a
00000000 R 00000025 66| 99 cwd 00000027 98
; am extins cuvântul din ax, într-un cuvânt dublu în dx: ax
cwd ; extindem ax pana la eax (pastrand semnul)
00000028 A3 00000006 R 0000002D 66| A1
mov interm, eax; interm=ax=b*c/d-a
mov ax, a
; scriem a in ax
00000000 R 00000033 F6 3D 00000002 R
idiv b
; executam a/b
00000039 98
cwd
0000003A 8B C8
mov ecx, eax
0000003C A0 00000003 R
mov al, cd
; extindem rezultatul împărțirii de la ax în eax(păstrând semnul) ; copiem rezultatul a / b pe ecx
00000041 66| 98
cbw
00000043 66| 83 C0 02 add ax, 2 00000047 8B 1D 00000006 R
mov ebx, interm ; copiem valoarea interm în registrul ebx
0000004D 66| A3
mov word ptr interm, ax ;
00000006 R 00000053 66| 89 15
mov word ptr interm[2], dx
00000008 R 0000005A 29 0D 00000006 R 00000060 8B C3
sub interm, ecx ; executam a/b - c+a mov eax, ebx ; copiem rezultatul a-b * c / d în registrul eax
00000062 99
cdq ; extindem eax la edx: eax (luand semnul in seama)
00000063 F7 3D 00000006 R
idiv interm ; executam (a-b * c / d) / (c + 2-a / b)
00000069 66| B8 0005
mov ax, 5 ; scriem 5 in ax
0000006D 01 05 00000006 R
add interm, eax ; executam z=(a-b*c/d)/(c+2-a/b)+5
00000073 66| 98 cbw ; extindem rezultatul diviziunii de la al la ax (păstrând semnul) 00000075 98
cwd; extindem rezultatul împărțirii de la ax la eax(păstrând semnul)
00000076 A3 0000000A R mov rez, eax; copeim rezultatul in rez exit 00000082 END main
main ENDP
Concluzie: In urma acestui laborator am invatsat tipurile de date ale microprocesoarelor, lucrul cu cifrele in diferite "medii",directive,sisteme de calcul. Am executat un program in limbajul assembler care executa operatia aritmetica oferita.