Skip to content

Commit de1aa2b

Browse files
committed
Lab 8
1 parent 645a450 commit de1aa2b

File tree

2 files changed

+146
-0
lines changed

2 files changed

+146
-0
lines changed

Lab 8/p1.asm

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
; Sa se citeasca de la tastatura doua numere (in baza 10) si sa se calculeze produsul lor.
2+
; Rezultatul inmultirii se va salva in memorie in variabila "rezultat" (definita in segmentul de date).
3+
4+
bits 32
5+
global start
6+
7+
; declare external functions needed by our program
8+
extern exit, printf, scanf
9+
import exit msvcrt.dll
10+
import printf msvcrt.dll ; indicating to the assembler that the printf fct can be found in the msvcrt.dll library
11+
import scanf msvcrt.dll ; similar for scanf
12+
13+
; our data is declared here
14+
segment data use32 class=data
15+
a resw 2
16+
b resw 2
17+
result resd 1
18+
format db "%d", 0
19+
20+
; our code starts here
21+
segment code use32 class=code
22+
start:
23+
; citirea lui a
24+
push dword a
25+
push dword format
26+
call [scanf]
27+
add ESP, 4*2
28+
29+
; citirea lui b
30+
push dword b
31+
push dword format
32+
call [scanf]
33+
add ESP, 4*2
34+
35+
; calculeaza a*b si il pune in result
36+
mov ax, word[a]
37+
mul word[b]
38+
mov [result], eax
39+
40+
push dword 0
41+
call [exit]

Lab 8/p2.asm

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
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+
format 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 format
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

Comments
 (0)