-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtrabalhoArq.asm
246 lines (163 loc) · 7.09 KB
/
trabalhoArq.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\masm32.inc
include \masm32\include\msvcrt.inc
include \masm32\macros\macros.asm
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\msvcrt.lib
.data
;-----------------------Mensagens Definidas Para o Usuario---------------
mensagem1 db "Digite a quantidade de Notas:",0ah,0h ;mensagem para o usuario
mensagem2 db "digite a nota",0
mensagem3 db ":",0h
mensagem_4 db "Aluno reprovado"
mensagem_5 db "Aluno aprovado", 0ah, 0h
mensagem_6 db ", necessita tirar na final:",0h
mensagem_7 db " | Deseja adicionar outra nota?",0ah, 0h
mensagem_8 db "Digite (s) para sim ou (n) para nao", 0ah, 0h
mensagem_9 db "Media Final: ",0h
len1 equ $ - mensagem_8
;-------------------------Variaveis para o funcionamento do programa-------
var_qntNotas dd ? ;quantidade de notas
var_numNota dd ? ;ordem das notas
stk real8 ? ;ponto flutuante de 8 bytes (double) SOMATORIO DAS NOTAS
var_respUsuario dd ?
len2 equ $ - var_respUsuario
var_valorSasc dd 115
var_Notasfloat real8 ? ;variaveis para receber a entrada convertida
notaAprovado real8 7.0
notaReprovado real8 4.0
peso1 real8 5.0
peso2 real8 0.6
peso3 real8 0.4
;-------------------Variaveis para ler e Printar-----------------------
readCount dword ?
writeCount dword ?
consoleInHandle dword ?
consoleOutHandle dword ?
;---------------------------------------------------------------------
;-----------------------variaveis para converter asc --------------------
stringEntrada db 5 dup(?),0ah,0h
num dword ?
entradaConvertida db 5 dup(?)
;---------------------------------------------------------------------
.code
start:
;----------------- Funçoes para Ler e Printar ----------------
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov consoleOutHandle, eax
invoke GetStdHandle, STD_INPUT_HANDLE
mov consoleInHandle, eax
;-------------------------Printf e Scanf (Para saber a quantidade de notas)-----------------------------------------------------
invoke WriteConsole, consoleOutHandle, addr mensagem1, sizeof mensagem1, addr writeCount, NULL
invoke ReadConsole, consoleInHandle, addr stringEntrada, sizeof stringEntrada, addr readCount, NULL
call convertAsc
invoke atodw, addr stringEntrada
mov var_qntNotas, eax
;printf("%i", var_Notas) ;printf para teste
;------------------------Print e Scanf (Para preencher as notas)------------------------------
xor ecx, ecx ;zerando o registrador ecs para usar ele no laço
finit ;incia um array float zerado
fld stk ;empilhando a variavel stk (double) na pilha de execução da fpu
laco:
inc ecx
mov var_numNota, ecx
invoke dwtoa, var_numNota, addr entradaConvertida
invoke WriteConsole, consoleOutHandle, addr mensagem2, sizeof mensagem2, addr writeCount, NULL
invoke WriteConsole, consoleOutHandle, addr entradaConvertida, sizeof entradaConvertida, addr writeCount, NULL
invoke WriteConsole, consoleOutHandle, addr mensagem3, sizeof mensagem3, addr writeCount, NULL
invoke ReadConsole, consoleInHandle, addr stringEntrada, sizeof stringEntrada, addr readCount, NULL
invoke StrToFloat, addr stringEntrada, addr var_Notasfloat ;convertendo string para float
fld var_Notasfloat
fadd st(0), st(1)
mov ecx, var_numNota
cmp ecx, var_qntNotas
jl laco
fstp stk
;--------------------------------Calculando a media das notas---------------------------
invoke dwtoa, var_qntNotas, addr entradaConvertida ;convertendo (double/float) para string
invoke StrToFloat, addr entradaConvertida, addr var_Notasfloat ;CONVERTENDO STRINGO PARA FLOAT
fld var_Notasfloat ;empilha a quantidade das notas
fld stk ;empilha a soma das notas
fdiv st(0), st(1) ;divide a soma das notas pela quantidade de notas
fst stk ;pega o valor que ficou no topo da pilha que o resultado da divisao
invoke WriteConsole, consoleOutHandle, addr mensagem_9, sizeof mensagem_9, addr writeCount, NULL
invoke FloatToStr, stk, addr stringEntrada
invoke WriteConsole, consoleOutHandle, addr stringEntrada, sizeof stringEntrada, addr writeCount, NULL
;------------------Analisar se o aluno passou, foi pra final, ou reprovou direto ------------------------------
finit
fld notaAprovado ;equivale a 7
fld stk ;media final do somatorio das notas
fcom
fstsw ax
sahf
jae aprovado
jb reprovado
aprovado:
invoke WriteConsole, consoleOutHandle, addr mensagem_5, sizeof mensagem_5, addr writeCount, NULL
jmp cadastro
reprovado:
invoke WriteConsole, consoleOutHandle, addr mensagem_4, sizeof mensagem_4, addr writeCount, NULL
finit
fld notaReprovado
fld stk
fcom
fstsw ax
sahf
jae final
jmp cadastro
final:
;calculo final = (5-0.6xMDF)/0,4
finit
fld peso2 ;0.6
fld stk ;media final
fmul st(0), st(1)
fst stk
finit
fld stk
fld peso1 ;5
fsub st(0), st(1)
fst stk
finit
fld peso3 ;0.4
fld stk
fdiv st(0), st(1)
fst stk
invoke WriteConsole, consoleOutHandle, addr mensagem_6, sizeof mensagem_6, addr writeCount, NULL
invoke FloatToStr, stk, addr stringEntrada
invoke WriteConsole, consoleOutHandle, addr stringEntrada, sizeof stringEntrada, addr writeCount, NULL
;-------------------------------------ver se o professor deseja adicionar outra nota----------------------------------
cadastro:
invoke WriteConsole, consoleOutHandle, addr mensagem_7, sizeof mensagem_7, addr writeCount, NULL
invoke WriteConsole, consoleOutHandle, addr mensagem_8, sizeof mensagem_8, addr writeCount, NULL
invoke ReadConsole, consoleInHandle, addr stringEntrada, sizeof stringEntrada, addr readCount, NULL
mov al, [stringEntrada]
mov al, [stringEntrada+1];
cmp stringEntrada, "s"
je start
jmp fim
;----------------funcao para converter de asc para int----------------------------------------------------------------
convertAsc:
mov esi, offset stringEntrada
prox2:
mov al, [esi]
inc esi
cmp al, 48 ; Menor que ASCII 48
jl feito2
cmp al, 58 ; Menor que ASCII 58
jl prox2
feito2:
dec esi
xor al, al
mov [esi], al
ret
;--------------------------------termino do codigo--------------------------------------------------
fim:
invoke ExitProcess, 0
end start