-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconvertidor.Asm
283 lines (223 loc) · 4.45 KB
/
convertidor.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
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
format PE GUI 4.0
entry inicio
include 'c:/fasm/include/win32ax.inc'
; ******************** MACROS ********************
macro deshabilitar id {
invoke GetDlgItem,[hWnd],id
invoke EnableWindow,eax,FALSE
}
macro habilitar id {
invoke GetDlgItem,[hWnd],id
invoke EnableWindow,eax,TRUE
}
macro radioCheck id,etq {
invoke IsDlgButtonChecked,[hWnd],id
cmp eax,BST_CHECKED
je etq
}
macro listCheck id,etq {
invoke IsDlgButtonChecked,[hWnd],id
cmp eax,BST_CHECKED
jne etq
}
macro convert base {
local ciclo_base,ciclo,ciclo_sig,ciclo_fin
push eax ebx ecx edx
mov eax,base
mov ebx,base
call tamBuffer
cmp ecx,0
je ciclo_fin
dec ecx
ciclo_base:
mul ebx
loop ciclo_base
xor ecx,ecx
lea esi,[buffer]
ciclo:
cmp byte [esi],0
je ciclo_fin
mov edx,0
div ebx
xor edx,edx
mov dl,[esi]
sub dl,30h
cmp dl,9
jbe ciclo_sig
sub dl,7
ciclo_sig:
push eax
mul edx
add ecx,eax
pop eax
inc si
jmp ciclo
ciclo_fin:
mov [number],ecx
pop edx ecx ebx eax
}
macro convert2K var,i,x {
local ciclo,ciclo_sig,ciclo_fin
push ebx ecx edx
mov bl,0
mov cl,20h
sub cl,i
add cl,x
lea esi,[var]
ciclo:
cmp bl,20h
jae ciclo_fin
mov edx,[number]
push ecx
mov cl,bl
shl edx,cl
pop ecx
shr edx,cl
cmp dl,0Ah
jb ciclo_sig
add dl,7
ciclo_sig:
add dl,30h
mov [esi],dl
add bl,i
inc esi
jmp ciclo
ciclo_fin:
pop edx ecx ebx
}
; ******************** CONSTANTES ********************
main = 1
id_input = 1001
id_btn_in_bi = 1003
id_btn_in_oc = 1004
id_btn_in_de = 1005
id_btn_in_he = 1006
id_btn_out_bi = 1008
id_btn_out_oc = 1009
id_btn_out_de = 1010
id_btn_out_he = 1011
id_btn_convert = 1012
id_out_bi = 1019
id_out_oc = 1020
id_out_de = 1021
id_out_he = 1022
; ******************** CODIGO ********************
section '.code' code readable executable
inicio:
invoke GetModuleHandle,0
mov [Ist],eax
invoke DialogBoxParam,eax,main,0,DlgProc,0
fin:
invoke ExitProcess,0
proc DlgProc uses edi esi ebx,hWnd,uMsg,wParam,lParam
mov eax,[uMsg]
cmp eax,WM_COMMAND
je jCOMMAND
cmp eax,WM_INITDIALOG
je jINITDIALOG
cmp eax,WM_CLOSE
je jCLOSE
xor eax,eax
jmp finish
jINITDIALOG:
mov eax,[hWnd]
mov [pWnd],eax
deshabilitar id_btn_convert
mov eax,1
jmp finish
jCOMMAND:
mov eax,[wParam]
cmp eax,id_btn_convert
je convertir
cmp eax,id_btn_in_bi
jae habilitar_convertir
habilitar_convertir:
cmp eax,id_btn_in_he
ja jCOMMAND_finish
habilitar id_btn_convert
jCOMMAND_finish:
xor eax,eax
jmp finish
convertir:
invoke GetDlgItemText,[hWnd],id_input,buffer,33
radioCheck id_btn_in_bi,in_bi
radioCheck id_btn_in_oc,in_oc
radioCheck id_btn_in_de,in_de
convert 10h
jmp convertir_sig
in_bi:
convert 02h
jmp convertir_sig
in_oc:
convert 08h
jmp convertir_sig
in_de:
convert 0Ah
convertir_sig:
call desmarcar
listCheck id_btn_out_bi,out_bi_sig
out_bi:
convert2K binario,1,0
invoke SetDlgItemText,[pWnd],id_out_bi,binario
out_bi_sig:
listCheck id_btn_out_oc,out_oc_sig
out_oc:
convert2K octal,3,1
invoke SetDlgItemText,[pWnd],id_out_oc,octal
out_oc_sig:
listCheck id_btn_out_de,out_de_sig
out_de:
invoke wsprintf,decimal,'%d',[number]
invoke SetDlgItemText,[pWnd],id_out_de,decimal
out_de_sig:
listCheck id_btn_out_he,out_he_sig
out_he:
convert2K hexadecimal,4,0
invoke SetDlgItemText,[pWnd],id_out_he,hexadecimal
out_he_sig:
jmp jCOMMAND_finish
jCLOSE:
invoke EndDialog,[hWnd],0
mov eax,1
finish:
ret
endp
; ******************** PROCEDIMIENTOS ********************
proc desmarcar
invoke SetDlgItemText,[pWnd],id_out_bi,0
invoke SetDlgItemText,[pWnd],id_out_oc,0
invoke SetDlgItemText,[pWnd],id_out_de,0
invoke SetDlgItemText,[pWnd],id_out_he,0
ret
endp
proc tamBuffer uses esi
lea esi,[buffer]
xor ecx,ecx
ciclo:
cmp byte [esi],0
je ciclo_fin
inc si
inc ecx
jmp ciclo
ciclo_fin:
ret
endp
; ******************** VARIABLES ********************
section '.data' data readable writeable
Ist dd 0
pWnd dd 0
number dd 0
buffer db 256 dup(?)
binario db 33 dup(?)
octal db 12 dup(?)
decimal db 11 dup(?)
hexadecimal db 9 dup(?)
; ******************** RECURSOS ********************
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL',\
gdi32,'GDI32.DLL'
include 'c:/fasm/include/api\kernel32.inc'
include 'c:/fasm/include/api\user32.inc'
include 'c:/fasm/include/api\gdi32.inc'
section '.rsrc' resource from 'convertidor.res' data readable