-
Notifications
You must be signed in to change notification settings - Fork 0
/
FACILO~1.ASM
544 lines (516 loc) · 14.4 KB
/
FACILO~1.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
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
#make_COM# ; create ".com" executable (DOS 1.0 compatible).
INCLUDE "emu8086.inc"
org 100h ; add +100h to all addresses (required for .com file).
;--------------------------------------
; Sistema de procesamiento de datos |
; Profesor Nicanor Casas |
; Trabajo Practico Facilongo |
; Realizado por Carlos Menaier |
; 2° Cuatrimestre 2013 |
;--------------------------------------
.DATA
; ================================================
; Frases
; ================================================
Titulo DB 13,10,"PROGRAMA PARA ORDENAR FRASES$"
Lineas DB 13,10,"----------------------------$"
Pedido DB "INGRESE LA FRASE: $"
errorjnl DB 13,10,"LIMITE DE CARACTERES ALCANZADO$"
resulline DB 13,10,"-= RESULTADO =- : $"
processing DB 13,10,"PROCESANDO FRASE...$"
espcharline DB 13,10,13,10, "CARACTERES ESPECIALES REMOVIDOS: CHAR | POS$"
espcharnone DB 13,10,13,10, "NINGUN CARACTER ESPECIAL REMOVIDO.$"
SEMICOLUMN DB " | $"
ENTER DB 10,13," $"
ENTERSE DB 10,13,"$"
RESTART DB "PRESIONES CUALQUIER TECLA PARA REININCIAR EL PROGRAMA.$"
ENTER1 DB 10,13,10,13,"ERROR, NINGUN CARACTER INGRESADO.$"
; ================================================
; ================================================
; Variables
; ================================================
orig DW 21 DUP ('$') ; FRASE INGRESADA
resul DW 21 DUP ('$') ; FRASE ORDENADA
espchar DW 21 DUP ('$') ; CARACTERES ESPECIALES REMOVIDOS
esppos DW 21 DUP ('$') ; POSICION DE LOS CHAR ESPECIALES REMOVIDOS
posesp DW 1 ; POSICION A GRABAR EN esppos
cantch DW 1 ; CANTIDAD TOTAL DE CARACTERES DE LA FRASE INGRESADA
cantchr DW 1 ; CANTIDAD DE CHARS DEL RESULTADO
contch DW 1 ; CANTIDAD DE CARACTERES YA PROCESADOS
cantesp DW 1 ; CANTIDAD DE CARACTERES ESPECIALES REMOVIDOS
endchar DB 1
backup1 DW 1
backup2 DW 1
; ================================================
.CODE
JMP MAIN
; ================================================
; Funciones
; ================================================
TITULOS PROC ; IMPRIME TITULO
MOV AH, 9 ; FUNCION OUTPUT
LEA DX, Titulo ; CARGAR DIRECCION
INT 21h
LEA DX, Lineas ; CARGAR DIRECCION
INT 21h
MOV AH, 2 ; RETORNO DE CARRO
MOV DL, 0Dh
INT 21H
MOV DL, 0Ah ; ENTER
INT 21H
MOV DL, 0Ah ; ENTER
INT 21H
MOV AH, 9 ; FUNCION OUTPUT
LEA DX, Pedido ; CARGAR DIRECCION
INT 21h
RET ; VUELVE A MAIN
TITULOS ENDP
; ================================================
INPUT PROC ; PIDE INGRESO DE UNA FRASE
LEA SI, orig ; MOVER DIRECCION DE ORIG A SI
MOV CX,0 ; PONER CONTADOR EN 0
MOV DH,0 ; LIMPIAR DH
MOV AH,1 ; INTERRUPCION INGRESO TECLADO
VERIF:
MOV BX,39 ; LIMITE CARACTERES
CMP CX,BX ; COMPARA NUMERO DE CARACTERES CON LIMITE
JNL NOTLESS ; NO HAY LUGAR
INT 21h ; PIDE INGRESO
MOV DL,AL ;
MOV BX,0Dh ; ENTER EN ASCII
CMP BX,DX ; COMPARA INGRESO CON ENTER
JNE VA ; SI NO ES ENTER SALTA
JMP FIN ; SI ES ENTER SALTA
VA:
MOV [SI],DX ; COPIAR CARACTER INGRESADO A STRING
INC SI ; SIGUIENTE POS EN STRING
INC CX ; AUMENTA CONTADOR
JMP VERIF ; WHILE VERIF MIENTRAS NO SE INGRESE ENTER O SE LLEGUE AL LIMITE
FIN:
MOV cantch,CX ; COPIO CANTIDAD DE CHARS DE LA FRASE INGRESADA EN cantch
MOV BX,0
CMP BX,CX
JE ENTERFIRST
MOV AH,9 ; INTERRUPCION OUTPUT
LEA DX, Pedido ; CARGAR DIRECCION DE FRASE
INT 21h ; SACAR FRASE
LEA DX, orig ; CARGAR DIRECCION DE FRASE
INT 21h ; SACAR FRASE
RET ; VOLVER A MAIN
INPUT ENDP
; ================================================
NOTLESS PROC ; IMPRIME CARTEL DE ERROR EN CASO DE SUPERAR EL LIMITE DE CARACTERES PERMITIDO (40)
MOV cantch,CX ; COPIO CANTIDAD DE CHARS DE LA FRASE INGRESADA EN cantch
LEA DX, errorjnl ; CARGAR DIRECCION
MOV AH, 9 ; INTERRUPCION OUTPUT
INT 21h ; SACAR POR PANTALLA
RET ; VOLVER A MAIN
NOTLESS ENDP
; ================================================
ENTERFIRST PROC
LEA DX,ENTER1
MOV AH,9
INT 21h
JMP ENTERPRIM
RET
ENTERFIRST ENDP
; ================================================
SACARCHARS PROC ; SACA LOS CARACTERES ESPECIALES CORRESPONDIENTES
LEA DX,processing
INT 21h
POP BX
MOV backup1,BX ; GUARDO DIRECCION PARA RETURN
MOV BX,0
MOV contch,BX ; PONGO EN 0 contch
MOV cantesp,BX ; PONGO EN 0 cantesp
MOV cantchr,BX ; PONGO EN 0 cantchr
MOV CX,cantch
LEA DX,esppos ; COPIO LA DIRECCION DE esppos EN DX
MOV posesp,DX ; COPIO DX EN posesp
LEA SI, orig ; COPIO LA DIRECCION DE orig EN SI
LEA DI,espchar ; COPIO LA DIRECCION DE espchar EN DI
SACAR:
MOV DL,[SI] ; COPIO CHAR A DL
MOV DH,0 ; LIMPIO DH
MOV AX,20h ; 20h=ESPACIO
CMP AX,DX ; COMPARO CHAR CON ESPACIO
JE NORMAL ; PASO A 'NORMAL' PARA PASAR AL SIGUIENTE CHAR
MOV AX,00 ; 00h=ESPACIO VACIO
CMP AX,DX ; COMPARO CHAR CON CERO
JE NORMAL ; VOLVER A MAIM SI ES CERO
CALL CHARBD ; PROCESA EL CHAR
MOV AL,2
CMP AL,AH
JNE NORMAL
CALL ESPECIAL ; ESPECIAL GUARDA CHAR EN VECTOR DE CHARS ESPECIALES
MOVERCHARS: ; MOVERCHARS CORRER CHARS DE LA DERECHA LUEGO DE SACAR EL CHAR ESPECIAL
INC DI ; DI=SI+1
MOV BL,[DI] ; MUEVE CONTENIDO DE DIRECCION DE DI A BL
MOV [SI],BL ; MUEVE BL A DIRECCION DE SI
INC SI
LOOP MOVERCHARS
CALL GUARDARPOS ; GUARDAR POS DEL CHAR ESPECIAL
JMP UNIFICACION
NORMAL:
INC SI ; SI ES NORMAL PASO AL SIGUIENTE CHAR
UNIFICACION:
MOV BX,contch ;
INC BX ; INCREMENTO contch
MOV contch,BX ;
LOOP SACAR
VOLVER:
MOV AX,cantch ;
MOV BX,cantesp ; CALCULO LA CANTIDAD DE CHARS EN resul
SUB AX,BX ;
MOV cantchr,AX
MOV BX, backup1 ; SACO DIRECCION PARA RETURN
PUSH BX
RET ; VOLVER A MAIN
SACARCHARS ENDP
; ================================================
ESPECIAL PROC ; GUARDA EL CHAR ESPECIAL REMOVIDO EN OTRO VECTOR
POP BX
MOV backup2,BX ; GUARDO DIRECCION PARA RETURN
INC SI
MOV AL,[SI] ;
DEC SI
MOV AH,0 ;
MOV BL,20h ; VERIFICO SI EL SIGUIENTE CHAR ES ESPACIO O '0'
CMP AL,BL ; SI ES ASI EL CHAR SE DEJA EN EL LUGAR
JE NORMAL ;
MOV BL,00h ;
CMP AL,BL ;
JE NORMAL ;
MOV [DI],DX ; MOVER CHAR ESPECIAL A VECTOR ESPCHAR
INC DI
PUSH CX ;
PUSH DI ; GUARDO VALORES EN LA PILA
PUSH SI ;
MOV CX,cantesp ;
INC CX ; INCREMENTO CANTIDAD DE CHARS ESPECIALES
MOV cantesp,CX ;
MOV CX,cantch ; CANTIDAD TOTAL DE CHARS
MOV BX,contch ; CHARS YA PROCESADOS
SUB CX,BX ; CX = CANT TOTAL - YA PROCESADOS
MOV DI,SI ; PREPARO PUNTEROS PARA MOVERCHARS
MOV BX,backup2 ; SACO DIRECCION PARA RETURN
PUSH BX
RET ; VOLVER A SACARCHARS
ESPECIAL ENDP
; ================================================
GUARDARPOS PROC ; GUARDA LA POSICION DEL CHAR ESP REMOVIDO
POP BX
MOV backup2,BX ; GUARDO DIRECCION PARA RET
MOV SI,posesp ; DIRECCION A GUARDAR EN LA POSICION
MOV CX,contch ; POSICION (CANT CHARS YA PROCESADOS)
INC CX
MOV [SI],CX ; GUARDAR POS EN SI
INC SI ; APUNTO A LA SIGUIENTE DIRECCION
MOV posesp,SI ; GUARDO POS A GRABAR EL PROXIMO CHAR ESP
POP SI ;
POP DI ; RESTORO LOS VALORES SACANDOLOS DE LA PILA
POP CX ;
MOV BX,backup2 ; SACO DIRECCION PARA RETUNR
PUSH BX
RET ; VOLVER A SACARCHARS
GUARDARPOS ENDP
; ================================================
ORDENAR PROC ; ORDENA LAS LETRAS DE LA FRASE INGRESADA
LEA SI,orig ; FRASE INGRESADA
LEA DI,resul ; FRASE ORDENADA
MOV CX,cantchr ; CANTIDAD DE CHARS FRASE ORDENADA
MOV AH,0
ORDENARLETRAS:
MOV DL,[SI]
MOV BL,20h ;
CMP DL,BL ; SALTO ESPACIOS
JNE NOTESP ; Y LOS GUARDO EN RESUL
MOV BL,61h ; PONE endchar EN 'a' PARA COMPARACION
MOV endchar,BL ;
MOV [DI],DL ; SI NO ES ESPACIO SALTO A NOTESP
INC DI ;
INC SI ;
LOOP ORDENARLETRAS
JMP ENDING3
NOTESP:
CALL CHARBD
MOV DH,1 ;
CMP AH,DH ; COMPRUEBA SI ES VOCAL O CONSONANTE
MOV DH,0 ;
JE CONSONANTE
MOV BL,61h ; PONE endchar EN 'a' PARA COMPARACION
MOV endchar,BL ;
PUSH SI
MOV [DI],DL ; GUARDO EN resul
INC DI ; PASO A LA SIGUIENTE POSICION DE RESUL
CALL ORDENARVOC ; COPIO VOCALES
POP SI
CALL ORDENARCON ; COPIO CONSONANTES
MOV BL,61h
MOV BH,endchar
CMP BH,BL
JE MOVEON
MOV [DI],BH ; COPIO CHAR ESPECIAL A resul
INC DI
MOVEON:
MOV BL,61h
MOV endchar,BL
LOOP ORDENARLETRAS ; LOOP AL TERMINAR LETRAS DE LA PALABRA ORDENANDO VOC PRIMERO
JMP ENDING3
CONSONANTE:
MOV BL,61h
MOV endchar,BL
PUSH SI
MOV [DI],DL ; MUEVO CHAR A resul
INC DI
CALL ORDENARCON ; ORDENAR CONSONANTE
POP SI
CALL ORDENARVOC ; ORDENAR VOCAL
MOV BL,61h
MOV BH,endchar ; COMPARO SI ES 'a' endchar
CMP BH,BL ; SI ES SALTA A MOVEON2
JE MOVEON2
MOV [DI],BH ; MUEVO endchar A resul
INC DI ; SIGUIENTE POSICION DE resul
MOVEON2:
MOV BL,61h
MOV endchar,BL
LOOP ORDENARLETRAS ; LOOP AL TERMINAR LETRAS DE LA PALABRA ORDENANDO CON PRIMER
ENDING3:
RET
ORDENAR ENDP
; ================================================
ORDENARVOC PROC
BEGINNING:
INC SI
MOV DL,[SI] ; COPIA CHAR EN DL
MOV BL,20h ;
CMP BL,DL ; SI ES ESPACIO VA AL FINAL
JE ENDING ;
MOV BL,00 ;
CMP BL,DL ; SI ES '0' VA AL FINAL
JE ENDING ;
CALL CHARBD ; COMPRUEBA QUE TIPO DE CHAR ES
MOV BL,0
CMP BL,AH ;
JE MOVEVOC ; SI EL CHAR ES VOCAL VA A MOVEVOC
MOV BL,1
CMP BL,AH
JE BEGINNING ; SI ES CONSONANTE PASA AL SIGUIENTE CHAR
MOV endchar,DL ; SI ES CHAR ESP LO GUARDA EN endchar
JMP BEGINNING
MOVEVOC:
MOV [DI],DL ; COPIA LA VOCAL EN resul
INC DI ; PASA A LA SIGUIENTE POSICION EN resul
DEC CX
JMP BEGINNING
ENDING:
RET
ORDENARVOC ENDP
; ================================================
ORDENARCON PROC
BEGINNING2:
INC SI
MOV DL,[SI] ; COPIO CHAR EN DL
MOV BL,20h
CMP BL,DL
JE ENDING2 ; SI ES ESPACIO VA AL FINAL
MOV BL,00
CMP BL,DL ; SI ES '0' VA AL FINAL
JE ENDING2
CALL CHARBD ; COMPRUEBA QUE TIPO DE CHAR ES
MOV BL,1
CMP BL,AH
JE MOVECON ; SI EL CHAR ES CONS VA A MOVECON
MOV BL,0
CMP BL,AH
JE BEGINNING2
MOV endchar,DL ; SI ES CHAR ESP LO GUARDA EN endchar
JMP BEGINNING2
MOVECON:
MOV [DI],DL ; MUEVE LA CONSONANTE EN resul
INC DI
DEC CX
JMP BEGINNING2
ENDING2:
RET
ORDENARCON ENDP
; ================================================
CHARBD PROC ; DEVUELVE '0' SI EL CHAR ES VOCAL, '1' SI ES CONSONANTE Y '2' SI ES CHAR ESPECIAL
MOV AL,00F1h ; F1='ñ'
CMP AL,DL
JE ESCON
MOV AL,41h ; 41h='A'
CMP AL,DL ; COMPARA CHAR CON 'A'
JG ESP ; SI ES MENOR SALTA A ESP
MOV AL,7Ah ; 7Ah='z'
CMP AL,DL ; COMPARA CHAR CON 'z'
JL ESP ; SI ES MENOR SALTA A ESP
MOV AL,5Ah ; 5Ah='Z'
CMP AL,DL ; COMPARA CHAR CON 'Z'
JL VERIFESP ; SI ES MAYOR SALTA A VERIFESP
JMP LETRA ; SI NO EL CHAR NO ES ESP Y SALTA A LETRA
VERIFESP:
MOV AL,61h ; 61h='a'
CMP AL,DL ; COMPARA CHAR CON 'a'
JG ESP ; SI ES MENOR SALTA A ESP
LETRA:
MOV AL,41h ; 41h='A'
CMP DL,AL
JE VOCAL
MOV AL,45h ; 45h='E'
CMP DL,AL
JE VOCAL
MOV AL,49h ; 49h='I'
CMP DL,AL
JE VOCAL
MOV AL,4Fh ; 4Fh='O'
CMP DL,AL
JE VOCAL
MOV AL,55h ; 55h='U'
CMP DL,AL
JE VOCAL
MOV AL,61h ; 61h='a'
CMP DL,AL
JE VOCAL
MOV AL,65h ; 65h='e'
CMP DL,AL
JE VOCAL
MOV AL,69h ; 69h='i'
CMP DL,AL
JE VOCAL
MOV AL,6Fh ; 6Fh='o'
CMP DL,AL
JE VOCAL
MOV AL,75h ; 75h='u'
CMP DL,AL
JE VOCAL
ESCON:
MOV AH,1 ; SI NO VOC NI ESPECIAL ES CONSONANTE
RET
VOCAL:
MOV AH,0 ; ES VOCAL
RET
ESP:
MOV AH,2 ; ES CHAR ESPECIAL
RET
CHARBD ENDP
; ================================================
RESULTADO PROC ; MUESTRA FRASE RESULTANTE
MOV AH, 9 ; INTERRUPCION OUTPUT STRING
LEA DX, resulline
INT 21h
LEA SI,resul ; CARGAR DIRECCION
MOV AH,2h ; INTERRUPCION SACAR CARACTER
MOV DH,0 ; LIMPIO DH
MOV CX,cantchr ; MUEVO CANTIDAD DE CARACTERES DE LA FRASE A CX PARA EL LOOP
RESULT24:
PUSH CX
MOV CX,1 ; CANTIDAD DE VECES QUE SE IMPRIME EL CHAR
MOV DL,[SI] ; CARACTER A DL
INC SI ; PARA PROXIMO CHAR
INT 21h ; SACAR CARACTER
POP CX
LOOP RESULT24
RET
RESULTADO ENDP
; ================================================
ESPRES PROC ; MUESTRA CHARS ESP REMOVIDOS Y SU POSICION ORIGINAL
MOV CX,cantesp ; MUEVO A CX LA CANTIDAD TOTAL
MOV BX,0
CMP CX,BX ; SI ES CERO NO SE SACO NINGUN CARACTER
JE NINGUN
MOV AH,9
LEA DX,espcharline ; MOSTRAR FRASE
INT 21h
LEA SI,espchar ; MOVER A SI LA DIRECCION DEL VECTOR DE CHARS REMOVIDOS
LEA DI,esppos ; MOVER A DI LA DIRECCION DEL VECTOR DE POSICIONES DE CARACTERES REMOVIDOS
LISTARCHARS:
MOV AH,9
LEA DX,ENTER ; DEJAR LINEA EN BLANCO
INT 21h
MOV AH,2h ; INTERRUPCION OUTPUT
PUSH CX
MOV CX,1
MOV DL,[SI] ; SACAR CARACTER
INT 21h ; OUTPUT
MOV AX,9
POP CX
MOV AH,9 ; INTERRUPCION OUTPUT STRING
LEA DX,SEMICOLUMN ; SEPARADOR
INT 21h ; OUTPUT
MOV DX,[DI] ; POSICION
MOV AX,DX ; MOVER A AL LA POSICION
MOV AH,0 ; LIMPIAR AH
CALL PRINT_NUM ; SACAR NUMERO EN DECIMAL
INC SI ; MUEVE SI A SIGUIENTE CHAR
INC DI ; MUEVE DI A SIGUIENTE POS
LOOP LISTARCHARS
JMP FINFAN
NINGUN:
MOV AH,9
LEA DX,espcharnone ; EN CASO DE QUE NO SE HAYA SACADO NINGUN CARACTER SALE ESTE CARTEL
INT 21h
FINFAN:
RET
ESPRES ENDP
; ================================================
BEGRESTART PROC
MOV BX,0
MOV cantch,BX
CALL CLEAR_SCREEN
LEA SI,orig
CALL SUPERRESTART
LEA SI,resul
CALL SUPERRESTART
LEA SI,espchar
CALL SUPERRESTART
LEA SI,esppos
CALL SUPERRESTART
JMP HYPERRESTART
RET
BEGRESTART ENDP
; ================================================
SUPERRESTART PROC ; LIMPIA LAS VARIABLES resul y orig
MOV CX,21
LIMPIARVARS:
MOV BL,24h
MOV [SI],BL
INC SI
MOV BL,0
MOV [SI],BL
INC SI
LOOP LIMPIARVARS
RET
SUPERRESTART ENDP
; ================================================
; ================================================
; Main
; ================================================
MAIN:
MOV AX, @DATA ; INICIALIZAR DS
MOV DS, AX
HYPERRESTART:
CALL TITULOS ; IMPRIME TITULOS
CALL INPUT ; PEDI INGRESO DE FRASE Y LA GUARDA EN orig
CALL SACARCHARS ; SACA LOS CHARS ESP QUE SE DEBEN SACAR Y LOS GUARDA AL IGUAL QUE SU POSICION EN OTRO VECTOR
CALL ORDENAR ; ORDENA LA FRASE orig EN resul
CALL RESULTADO ; MUESTRA LA FRASE ORDENADA DE resul
CALL ESPRES ; MUESTRA LOS CHARS ESP REMOVIDOS Y SU POSICION
ENTERPRIM:
MOV AH,9 ;
LEA DX, ENTERSE ;
INT 21h ;
INT 21h ; PREPARA EL PROGRAMA PARA REINICIARSE
LEA DX, RESTART ;
INT 21h ;
LEA DX,ENTERSE ;
MOV AH,1 ; INTERRUPCION INGRESO TECLADO
INT 21h ; PIDE INGRESO
CALL BEGRESTART ; REINICIA EL PROGRAMA
HLT
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS
DEFINE_CLEAR_SCREEN
END
; ================================================