-
Notifications
You must be signed in to change notification settings - Fork 0
/
wndproc.asm
216 lines (182 loc) · 6.39 KB
/
wndproc.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
.386
option casemap:none
; ¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤
; WndProc
; ¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤=÷=¤
.code
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
mov eax, uMsg
cmp eax, WM_DESTROY ; messaggio WM_DSTROY
jne test_create
invoke PostQuitMessage,NULL
jmp fine
test_create:
cmp eax, WM_CREATE ; messaggio WM_CREATE
jne test_command
Invoke CreateControls, hWnd
jmp fine
test_command: ; messaggio WM_COMMAND
cmp eax, WM_COMMAND
jne gestisci_default
mov eax, wParam
and eax, 0ffffh
mov edx, eax
and edx, 0ffffh
shr edx, 16
cmp edx, BN_CLICKED
jne fine
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
; switch per decidere il pulsante, ax = ID
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
cmp eax, txtNumID ; se è la casella di testo lascia fare a winzoz
je gestisci_default
cmp eax, btn9ID ; bel trucco per decidere se è un numero
jg nonNumero ; e, se lo è, qual'è. si basa sul fatto che
sub eax, btn0ID ; gli ID dei numeri vanno da 1000 a 1009
invoke aggiungiTestoNum, eax ; e sono in ordine (0 -> 1000, 1-> 1001 ecc)
pop eax
jmp fine
nonNumero: ; pulsante "canc", toglie ultimo numero
cmp eax, btnCancID
jne prova_clear
invoke cancellaTestoNum
jmp fine
prova_clear: ; pulsante "c", ripristina il testo a "0"
cmp eax, btnClearID
jne provaSegno
invoke SetWindowText, txtNumWnd, addr txtNumText
jmp fine
provaSegno:
cmp eax, btnSegnoID
jne prova_uguale
invoke GetWindowText, txtNumWnd, addr buffer, 1023
invoke lstrcmp, addr btn0Text, addr buffer
cmp eax, 0
je fine
mov esi, offset buffer
mov al, btnMenoText
cmp al, [esi]
je CambiaSegnoInPositivo
invoke reversaStr, esi
invoke lstrcat, esi, addr btnMenoText
invoke reversaStr, esi
invoke SetWindowText, txtNumWnd, esi
jmp fine
CambiaSegnoInPositivo:
inc esi
invoke SetWindowText, txtNumWnd, esi
jmp fine
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
; se è stato premuto l'uguale fai l'operazione
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
; arrivati a questo punto il testo verrà di sicuro salvato, evita che
; txtNum.Text = NULL
prova_uguale:
push eax
invoke GetWindowText, txtNumWnd, addr buffer, 1023
cmp eax, 0
jne converti_to_string
invoke SetWindowText, txtNumWnd, addr txtNumText
invoke lstrcpy, addr buffer, addr txtNumText
converti_to_string:
invoke stringToNum, addr buffer, addr num2
pop eax
cmp eax, btnUgualeID
jne isOperazione
mov edx, operazione
mov eax, num1
cmp edx, 0
je fine
cmp edx, opSomma
jne prova_fai_differenza
add eax, num2 ; somma
jmp mostra_risultato
prova_fai_differenza:
cmp edx, opDifferenza
jne prova_fai_prodotto
sub eax, num2 ; differenza
; jc overflow
jmp mostra_risultato
prova_fai_prodotto:
cmp edx, opProdotto
jne fai_divisione
mul num2 ; prodotto
jc overflow
shl edx, 16
add eax, edx
jmp mostra_risultato
fai_divisione:
cmp edx, opQuoziente
jne fai_potenza
mov ecx, num2
cmp ecx, 0
je divByZero
xor edx, edx
div cx ; quoziente
fai_potenza:
cmp edx, opPotenza
jne fine
invoke potenza, num1, num2
mostra_risultato:
invoke numToStr, eax, addr buffer
invoke SetWindowText, txtNumWnd, addr buffer
jmp fine
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
; arrivati qui deve per forza essere una delle 4 operazioni
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
isOperazione:
push eax
invoke GetWindowText, txtNumWnd, addr buffer, 1023
invoke stringToNum, addr buffer, addr num1
invoke SetWindowText, txtNumWnd, addr txtNumText
pop eax
prova_somma: ; somma
cmp eax, btnPiuID
jne prova_differenza
push opSomma
pop operazione
jmp fine
prova_differenza: ; differenza
cmp eax, btnMenoID
jne prova_prodotto
push opDifferenza
pop operazione
jmp fine
prova_prodotto: ; prodotto
cmp eax, btnPerID
jne prova_quoziente
push opProdotto
pop operazione
jmp fine
prova_quoziente: ; quoziente
cmp eax, btnDivisoID
jne prova_potenza
push opQuoziente
pop operazione
jmp fine
prova_potenza:
cmp eax, btnPotenzaID
jne fine
push opPotenza
pop operazione
jmp fine
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
; tutti i pulsanti processati
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
gestisci_default:
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
overflow:
add esp, 4
invoke MessageBox, hWnd, addr overflowText, addr appName, MB_OK or MB_ICONSTOP
invoke SetWindowText, txtNumWnd, addr txtNumText
push dword ptr 0
pop num2
jmp fine
divByZero:
invoke MessageBox, hWnd, addr divZeroText, addr appName, MB_OK or MB_ICONSTOP
invoke SetWindowText, txtNumWnd, addr txtNumText
fine:
xor eax,eax
ret
WndProc endp