1
+ ; Se da un fisier text. Sa se citeasca continutul fisierului, sa se contorizeze numarul de vocale si sa se afiseze aceasta valoare.
2
+ ; Numele fisierului text este definit in segmentul de date.
3
+
4
+ bits 32
5
+
6
+ global start
7
+
8
+ ; declare external functions needed by our program
9
+ extern exit , fopen , fread , fclose , printf
10
+ import exit msvcrt.dll
11
+ import printf msvcrt.dll
12
+ import fopen msvcrt.dll
13
+ import fread msvcrt.dll
14
+ import fclose msvcrt.dll
15
+
16
+ ; our data is declared here (the variables needed by our program)
17
+ segment data use32 class=data
18
+ nume_fisier db "p2.txt" , 0 ; numele fisierului care va fi deschis
19
+ mod_acces db "r" , 0 ; modul de deschidere a fisierului -
20
+ ; r - pentru scriere. fisierul trebuie sa existe
21
+ descriptor_fis dd - 1 ; variabila in care vom salva descriptorul fisierului - necesar pentru a putea face referire la fisier
22
+ len equ 100 ; numarul maxim de elemente citite din fisier.
23
+ text times len db 0 ; sirul in care se va citi textul din fisier
24
+ form at db "In fisier sunt %d vocale" , 0
25
+
26
+ ; our code starts here
27
+ segment code use32 class=code
28
+ start:
29
+ ; apelam fopen pentru a deschide fisierul
30
+ ; functia va returna in EAX descriptorul fisierului sau 0 in caz de eroare
31
+ ; eax = fopen(nume_fisier, mod_acces)
32
+ push dword mod_acces
33
+ push dword nume_fisier
34
+ call [ fopen ]
35
+ add esp , 4 * 2 ; eliberam parametrii de pe stiva
36
+
37
+ mov [ descriptor_fis ], eax ; salvam valoarea returnata de fopen in variabila descriptor_fis
38
+
39
+ ; verificam daca functia fopen a creat cu succes fisierul (daca EAX != 0)
40
+ cmp eax , 0
41
+ je final
42
+
43
+ ; citim textul in fisierul deschis folosind functia fread
44
+ ; eax = fread(text, 1, len, descriptor_fis)
45
+ push dword [ descriptor_fis ]
46
+ push dword len
47
+ push dword 1
48
+ push dword text
49
+ call [ fread ]
50
+ add esp , 4 * 4 ; dupa apelul functiei fread EAX contine numarul de caractere citite din fisier
51
+
52
+ mov ecx , eax ; numarul de caractere din fisier este numarul de pasi
53
+ mov esi , text ; sirul sursa
54
+ mov ebx , 0 ; numaram vocalele in ebx
55
+
56
+ Repeating:
57
+ ; punem caracterul curent in al
58
+ lodsb
59
+ ; test vocala
60
+ cmp al , 'a'
61
+ je vowel
62
+ cmp al , 'E'
63
+ je vowel
64
+ cmp al , 'i'
65
+ je vowel
66
+ cmp al , 'O'
67
+ je vowel
68
+ cmp al , 'u'
69
+ je vowel
70
+ cmp al , 'A'
71
+ je vowel
72
+ cmp al , 'e'
73
+ je vowel
74
+ cmp al , 'I'
75
+ je vowel
76
+ cmp al , 'o'
77
+ je vowel
78
+ cmp al , 'U'
79
+ je vowel
80
+ ; daca am ajuns aici nu e vocala
81
+ notVowel:
82
+ jmp endLoop
83
+ vowel:
84
+ inc ebx
85
+
86
+ endLoop:
87
+ loop Repeating
88
+
89
+ ; afisam numarul de vocale
90
+ push dword ebx
91
+ push dword form at
92
+ call [ printf ]
93
+ add esp , 4 * 2
94
+
95
+ ; apelam functia fclose pentru a inchide fisierul
96
+ ; fclose(descriptor_fis)
97
+ push dword [ descriptor_fis ]
98
+ call [ fclose ]
99
+ add esp , 4
100
+
101
+ final:
102
+
103
+ ; exit(0)
104
+ push dword 0
105
+ call [ exit ]
0 commit comments