You are on page 1of 18

Manual Técnico – Práctica 4 201114438

UNIVERSIDAD DE SAN CARLOS DE GUATEMALA

FACULTAD DE INGENIERIA

ESCUELA DE CIENCIAS Y SISTEMAS

ARQUITECTURA DE COMPUTADORAS Y ENSAMBLADORES 1

SECCION A

Aux. JORGE GUTIERRES

MANUAL TÉCNICO PRACTICA #4


ASSEMBLER

Erick Daniel Hernández Tó

201114438

CIUDAD GUATEMALA 07 DE SEPTIEMBRE DE 2017


Manual Técnico – Práctica 4 201114438

INTRODUCCIÓN

El presente documento le proporcionará una vista rápida y sólida del funcionamiento del diseño del
programa, con él podrá guiarse acerca de cómo es el funcionamiento, además se le proporciona el
código comentado adjunto como hipervínculo de descarga en este documento (incrustado al
documento).

Este documento contiene información de alta importancia para el programador para poder
modificar, actualizar, optimizar o implementar nuevas operaciones dentro del programa. Se le
presenta también una breve e importante historia acerca de los acontecimientos acerca del útil
lenguaje a bajo nivel Ensamblador (assembly), código explicado y también una lista de
interrupciones utilizadas en el programa.

Esperando que le sea de su agrado, utilidad y le aporte nuevos conocimientos y guías:

201114438 Erick Daniel Hernández Tó


Manual Técnico – Práctica 4 201114438

Ensamblador FASM

FASM - ensamblador plano - ensamblador rápido y eficiente para sistemas DOS, Windows y Unix,
como Linux (nativo) o BSD (libc estándar).

Fue desarrollado por Tomasz Grysztar, es un programa gratuito y gratuito, basado en la licencia BSD,
con la condición de que no se puede cambiar a otro (por ejemplo, GNU GPL - BSD formalmente no
requiere tal requisito). Soporta actualmente todas las instrucciones del procesador 8080-80486 /
Pentium con MMX, 3DNow !, SSE, SSE2, SSE3, SSSE3, SSE4, AVX, AVX2 y XOP [2]. También, reconoce
instrucciones del VMX, SVM, SMX, XSAVE, RDRAND, FSGSBASE, INVPCID, HLE, RTM [2]. Genera
código en arquitectura de 16 bits, 32 bits y 64 bits (AMD64 y EM64T).

Puede generar código binario, así como código en MZ, PE, COFF y formatos ELF. Contiene un extenso
lenguaje de macro constructor que no sólo construye el código, sino que también genera el código
(de ahí la falta de opciones de línea de comandos) en principio: el mismo archivo - el mismo
resultado. El tamaño del código resultante se optimiza gracias al proceso de multiprocesamiento.

FASM está constantemente siendo desarrollado activamente y tiene un grupo relativamente grande
y activo de usuarios que están involucrados en su desarrollo e intercambio de experiencia en la
programación de bajo nivel. También tiene su puerto para arquitectura ARM [3], y también se utiliza
para crear un sistema operativo MenuetOS escrito exclusivamente en lenguaje ensamblador.
Manual Técnico – Práctica 4 201114438

Lista de Interrupciones Utilizadas:

No Propiedades Interrupción No. De Función CODIGO OP


Assembler Interrupción
AH = 00h
16H Obtiene el carácter MOV AH,00H
1 Return:
AH = BIOS scan code
ascii de la tecla
AL = ASCII character
INT 16H
presionada por el
usuario
AH = 02h
2 DL = character to write 21H Escribe un carácter MOV AH,02H
CONTROL HOSTESS i/ISA DEBUGGER - directamente en la INT 21H
GET SEGMENT FOR CONTROL

Return:
PROGRAM USE pantalla DOS
AL = last character output (despite the
official docs which state
AH = 09h
3 DS:DX -> '$'-terminated string 21H Escribe MOV AH,09H
Return:
AL = 24h (the '$' terminating the string, directamente en INT 21H
despite official docs whichstate that nothing
is returned) (at least DOS 2.1-7.0 and NWDOS) pantalla una cadena.

AH = 0Ah
4 DS:DX -> buffer (see #01344) 21H Lee una cadena MOV AH,0AH
Return:
ingresada por el
Buffer filled with user input
Notes: ^C/^Break are checked, and INT 23 is
INT 21H
called if either detected. Reads from standard usuario y la
input, which may be redirected under DOS 2+. If
the maximum buffer size (see #01344) is set to almacena en un
00h, this call returns immediately without
reading any input
buffer.
AH = 0Fh
5 DS:DX -> unopened File Control Block (see 21H Crea un manejador MOV AH,0fh
#01345,#01346)
Return: de archivo para que INT 21H
AL = status 00h successful
FFh file not found or access denied se pueda abrir un
Notes: (DOS 3.1+) file opened for read/write in
compatibility mode. An unopened FCB has the archivo y leer su
drive, filename, and extension fields filled in
and all other bytes cleared. Not supported by
contenido
MS Windows 3.0 DOSX.EXE DOS extender. DR DOS
checks password attached with AX=4303h. (FAT32
posteriormente, o
drive) this function will only succeed for
creating a volume label; FAT32 does not support
medicarlo.
FCBs for file I/O

AH = 3Fh
6 BX = file handle 21H Lee el contenido de MOV AH,3fh
CX = number of bytes to read
DS:DX -> buffer for data un archivo y lo INT 21H
Return:
CF clear if successful guarda en el registro
AX = number of bytes actually read (0 if at EOF
before call) DX
CF set on error
AX = error code (05h,06h) (see #01680 at
AH=59h/BX=0000h)

AH = 3Eh
7 BX = file handle 21H Cierra el manejador MOV AH,3eh
Return: de archivo INT 21H
CF clear if successful
AX destroyed proporcionado al
CF set on error abrir una archivo
AX = error code (06h) (see #01680 at
AH=59h/BX=0000h)
Manual Técnico – Práctica 4 201114438

CÓDIGO UTILIZADO EN LA APLICACIÓN

A continuación, se le presenta el código utilizado y el uso para cada uno de ellos, se proporcionará
por cada segmento.

Segmento .DATA:

Este es el segmento en donde se guarda toda aquella información que será útil dentro del tiempo
de ejecución del programa, en ella se encuentra almacenada directamente en memoria los
mensajes de error, los mensajes de menú, las variables utilizadas y los valores almacenados por
instrucciones de registros para su posterior uso. (Recuerde que el código contiene su comentario).

*Recuerde que:

DB – data Byte (8 bits)

DW- data Word (16 bits) o Palabra

DD – data Doble Word (32 bits) * No utilizado en la aplicación

*Observaciones:

El símbolo de $ es obligatorio para poder mostrar mensajes en pantalla de lo contrario se


imprimirá basura en pantalla (basura = bits con información no correcta).

Se ingresan los valores 10,13 para poder hacer un salto de línea

Se declaran los símbolos específicos del lenguaje en este caso son +01….9;

Se define el archivo de entrada.

Se define las cadenas de los menus

data segment ;SEGMENTO DE DATOS


CERROARCHIVO DB "SE CERRO EL ARCHIVO CORRECTAMENTE",10,13,"$"
MENSAJE DB "Ingrese el nombre del archivo:",10,13,"$"
MENSAJEERROR DW "NO EXISTE EL ARCHIVO CON EL NOMBRE ESCRITO",10,13,"$"
MENSAJEERRORMAS DW "SE ESPERABA UN MAS +",10,13,"$"
MENSAJEERRORPYC DW "FALTA EL PUNTO Y COMA AL FINAL DEL ARCHIVO",10,13,"$"
MENSAJEERRORNUM DW "SE ESPERABA UN NUMERO O UN MAS DE APERTURA",10,13,"$"
MENSAJEERRORCHR DW "--ESTE ES UN CARACTER QUE NO DEBERIA ESTAR EN EL ARCHIVO",10,13,"$"
MENSAJEERRORFDA DW "EL ARCHIVO TERMINO DE FORMA INESPERADA!!",10,13,"$"
MENSAJEERROR0AH DW "SE ESPERABA UN CARACTER DE SALTO DE LINEA",10,13,"$"
ARCHIVO DW 'archivo2.txt',0
FX DW "AT.ARQ",0
U DW "UNIVERSIDAD DE SAN CARLOS DE GUATEMALA",10,13,"$"
F DW "FACULTAD DE INGENIERIA",10,13,"$"
E DW "INGENIERIA EN CIENCIAS Y SISTEMAS",10,13,"$"
C DW "ARQUITECTURA DE COMPUTADORAS Y COMPILADORES 1 A",10,13,"$"
A DW "SEGUNDO SEMESTRE 2017",10,13,"$"
N DW "ERICK DANIEL HERNANDEZ TO",10,13,"$"
CA DW "2011-14438",10,13,"$"
M0 DW "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",10,13,"$"
Manual Técnico – Práctica 4 201114438

M1 DW "@@@@@@@@@@@@@@@@@@--MENU--@@@@@@@@@@@@@@@@@@@@",10,13,"$"
M2 DW "@ 1. Cargar Archivo @",10,13,"$"
M3 DW "@ 2. SALIR @",10,13,"$"
M4 DW "@@@@@@@@@@@@@@@@@@--MENU--@@@@@@@@@@@@@@@@@@@@",10,13,"$"
M5 DW "@Ingrese la opcion que desea hacer: @",10,13,"$"
M6 DW "@ @",10,13,"$"
GUARDADO DB "$"
HANDLE DW ?
AUX DB "$"
CONT DB 0
VERIFICACION DB 0
CARACTERES DB 2BH,30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,3BH,0AH,0DH ;CARACTERS ADMITIDOS DEL LENGUAJE EN HEX
DIGITOS DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
NUMEROSGUARDADOS DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
CANTIDADCHARUSADOS DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
CANTNUMEROS DB 0
POSINUMEROS DB 0
MENU2L0 DW "%%%%%%%%%%%%%%%%%%%%%%%%%%%%" ,10,13,"$"
MENU2L1 DW "%%%%%%% MENU PRINCIPAL %%%%%" ,10,13,"$"
MENU2L2 DW "%%%%%%%%%%%%%%%%%%%%%%%%%%%%" ,10,13,"$"
MENU2L3 DW "%% 1. Obtener Pares %%" ,10,13,"$"
MENU2L4 DW "%% 2. Obtener Impares %%" ,10,13,"$"
MENU2L5 DW "%% 3. Obtener Espejos %%" ,10,13,"$"
MENU2L6 DW "%% 4. Obtener Palindromos %%" ,10,13,"$"
MENU2L7 DW "%% 5. Obtener Split %%" ,10,13,"$"
MENU2L8 DW "%% 6. Lista Ascendente %%" ,10,13,"$"
MENU2L9 DW "%% 7. Lista Descendente %%" ,10,13,"$"
MENU2L10 DW "%% 8. Crear Reporte %%" ,10,13,"$"
MENU2L11 DW "%% 9. Salir %%" ,10,13,"$"
MENU2L12 DW "%%%%%%%%%%%%%%%%%%%%%%%%%%%%" ,10,13,"$"
MENU2L13 DW "INGRESE LA OPCION A PROCESAR:" ,10,13,"$"
MSGPAR DW "PAR",10,13,"$"
MSGIMPAR DW "IMPAR",10,13,"$"
ends

Segmento de Código:

Acá se definen las instrucciones que realizará en cada paso de reloj, estas instrucciones incluyen
movimientos de memoria y registros, incremento, decremento, interrupciones, etc.

Mostrar el Menú Principal: Muestra el menú principal dentro de la consola de DOS


mov ax, data
mov ds, ax
mov es, ax

MENU: ;MUESTRO EL MENU QUE SE ENCUENTRA EN .DATA

LEA DX,U
MOV AH,9
INT 21H
LEA DX,F
MOV AH,9
INT 21H
LEA DX,E
MOV AH,9
INT 21H
Manual Técnico – Práctica 4 201114438

LEA DX,C
MOV AH,9
INT 21H
LEA DX,A
MOV AH,9
INT 21H
LEA DX,N
MOV AH,9
INT 21H
LEA DX,CA
MOV AH,9
INT 21H
LEA DX,M0
MOV AH,9
INT 21H
LEA DX,M1
MOV AH,9
INT 21H
LEA DX,M2
MOV AH,9
INT 21H
LEA DX,M3
MOV AH,9
INT 21H
LEA DX,M4
MOV AH,9
INT 21H
LEA DX,M5
MOV AH,9
INT 21H
LEA DX,M6
MOV AH,9
INT 21H
JMP PEDIRNUMERO ; SALTO SI SON IGUALES A PEDIRNUMERO

Pedir Número: Este código sirve para poder ingresar la opción para cargar el archivo acá se utiliza
la interrupción 16h
PEDIRNUMERO:
MOV AH,00H ; MUEVO A AH LA FUNCION DE PEDIRNUMERO CARACTER CON ECO
INT 16H ; EJECUTO LA INSTRUCCION CON 21H SE PUEDE PEDIR CON 16H
CMP AL,'1' ; COMPARO SI AL TIENE EL VALOR ASCII DE 1
JE ABRIRARCHIVO ; ME VOY A LA ETIQUETA DE ABRIR ARCHIVO
JNE SALIR ; SI SON INGRESO OTRO NUMERO SALTO A VERIFICAR LA SEGUNDA OPCION

Abrir Archivo: Este código sirve para poder abrir un archivo con la dirección que se ha guardado en
la parte de segment DATA, utiliza la interrupción 21h
ABRIRARCHIVO:
LEA DX, MENSAJE ;MUESTRO EL MENSAJE PARA QUE ESCRIBA EL NOMBRE DEL ARCHIVO
MOV AH,09 ;LE INDICO QUE QUIERO IMPRIMIR EL CONTENIDO DEL ARCHIVO
INT 21H ;EJECUTO LA INTERRUPCION 21H
MOV AH,0AH ;COLOCO EL CODIGO PARA LEER UNA CADENA
INT 21H ;EJECUTO LA INTERRUPCION 21H
MOV AH,3DH ;COLOCO EN AH EL CODIGO DE INTERRUPCION PARA ABRIRARCHIVO
MOV VERIFICACION,0 ;COLOCO LA VERIFICACION EN 0 ;MOV ARCHIVO,DX
LEA DX,FX ;MUEVO A DX EL NOMBRE DEL ARCHIVO EL QUE QUIERO ABRIR
MOV AL,0H ;MUEVO EL VALOR 0H AL REG AL PARA INDICARLE QUE SOLO ES LECTURA
INT 21H ;EJECUTO LA OPERACION CON LA INTERRUPCION 21H
JC MSJERROR ;EN CASO DE QUE NO EXISTA EL ARCHIVO SALGO AL MENU
Manual Técnico – Práctica 4 201114438

mov HANDLE,AX ;MUEVO EL HANDLE DE LA FUNCION DE LECTURA Y LA COLOCO EN BX


;LEA SI,CADENACOMPLETA ;JNC PROCESARARCHIVO
JNC VERIFICARARCHIVO
JMP SALIR

Verificar Archivo: Sirve para verificar errores en el archivo ya sea errores de caracteres o de sintaxis,
en caso de algún error se le notificará al usuario el error.
VERIFICARARCHIVO:
mov BX, handle ;COLOCO EL MANEJADOR A BX
mov CX, 1 ;COLOCO QUE QUIERO LEER SOLO UN BYTE DEL ARCHIVO
mov DX, offset GUARDADO ;DIRECCIONO DX A EL DB GUARDADO
mov AH,3fh ;COLOCO EN AH EL CODIGO DE INSTRUCCION PARA LEER ARCHIVO
mov CX,1 ;INDICO CUANTOS BYTES DESEO LEER
int 21h ;EJECUTO LA INTERRUPCION 21H
cmp AX, 0 ;ax queda en 0 cuando llega a EOF
JC MSJERROR ;EN CASO DE QUE HALLA ERROR MUESTRA EL MENSAJE
;JZ PRUEBADEPILA ;EN CASO DE QUE AX SEA 0 ES PORQUE TERMINO EL ARCHIVO
JZ PROCESARARCHIVO
;MOV BL,VERIFICACION
;JZ FIN
;EN CASO QUE EJECUTE ESTE JZ ES PORQUE EL ARCHIVO NO TIENE ERRORES DE CARACTERES
MOV DL, GUARDADO[0] ;MUEVO EL BYTE 0 DE GUARDADO A DL 8BITS
;MOV CADENACOMPLETA[SI],DL
;INC SI
;PUSH DX
;MOV DL,CADENACOMPLETA
;MOV AH,09
;INT 21H
;POP DX
;PUSH CX ;RESGUARDO A CX A LA PILA
CALL VERIFICARCHAR ;LLAMO AL PROCEDIMIENTO VERIFICARCHAR PARA VER SI EL CHAR PERTENECE AL LENGUAJE
;POP CX ;SACO EL VALOR DE LA PILA Y SE LO COLOCO A CX
;jmp DOWN ;si no es espacio entonces ir a abajo

DOWN:
MOV AUX, DL ;GUARDA EN AUX EL CARACTER A COMPARAR EN LA PROXIMA LLAMADA
JMP VERIFICARARCHIVO ;LLAMA A VERIFICAR EL ARCHIVO CON EL PROXIMO CARACTER

ERRORESDEARCHIVO: ;SIRVE PARA MOSTRAR EL ERROR DEL ARCHIVO CHAR NO PERTENECE AL LENGUAJE
MOV AH,02 ;COLOCO EL CODIGO EN AH PARA MOSTRAR UN CARACTER
INT 21H ;LLAMO A LA INTERRUPCION 21H PARA EJECUTAR EL CODIGO
LEA DX,MENSAJEERRORCHR ;MUEVE A DX EL MENSAJE DE ERROR DEL CHAR QUE NO PERTENECE AL ARCHIVO
MOV AH,9 ;COLOCA EN AH EL NUMERO 9 PARA MOSTRAR EN PANTALLA EL MENSJE
INT 21H ;EJECUTA LA INTERRUPCION 21H PARA MOSTRAR EL MENSAJE
JMP ABRIRARCHIVO ;LLAMA A ABRIR ARCHIVO PARA COMENZAR DE NUEVO

HAYIGUAL:
INC VERIFICACION ;SI HAY UN CARACTER IGUAL LLAMADO DESDE VERIFICARCHAR
;POP CX ;COLOCA A CX DESDE LA PILA
PUSH DX
JMP DOWN ;LLAMA A DOWN PARA SEGUIR CON LA VERIFICACION DEL ARCHIVO

Verificar Char: Verifica si el carácter ascii colocado en el archivo pertenece a los configurados en la
aplicación, se le notificará al usuario si este contiene un carácter no válido.

VERIFICARCHAR PROC ; INICIA EL PROCESO PARA VERIFICAR UN CHAR CON LOS CHAR ADMITIDOS
MOV BX,0 ;COLOCO EL REGISTRO BX CON UN VALOR O ESTE SE USA PARA CONTAR
CICLO: ;CICLO QUE SERVIRA PARA RECORRER EL ARREGLO DB
Manual Técnico – Práctica 4 201114438

;LEA SI, CARACTERES


CMP DL, CARACTERES[BX] ;COMPARA SI DL QUE CONTIENE CARACTER ES IGUAL AL CARACTER EN CARACTERES[POSICIONBX]
JE HAYIGUAL ;SI HAY UNO IGUAL SE VA A LA ETIQUETA HAYIGUAL
;PUSH DX
;mov AH,02h
;Int 21h
;MOV DL, CARACTERES[BX]
;mov AH,02h
;Int 21h
;POP DX
INC BX ;EN CASO DE NO HABER SE VA A INCREMENTAR EL REGISTRO BX
;INC VERIFICACION ;SE INCREMENTA LA VERIFIACION EN 1
CMP BX,14 ;SE COMPARA SI BX LLEGO A LOS 14 COMPARAR LOS 14 CHARS ADMITIDOS
JNE CICLO ;SI NO HA LLEGADO A 14 VUELVE A HACER EL CICLO
JE ERRORESDEARCHIVO ;EN CASO DE HABER COMPARADO LOS 14 Y NO HABER NINGUNO IGUAL ES ERROR
ret
ENDP

Prueba de Pila: Prueba ingresar todos los elementos de la cadena a la pila para después mostrarlos

PRUEBADEPILA:
INC VERIFICACION
MOV CL,VERIFICACION
DEC CL

PROBAR:
POP DX ;SACO DE LA PILA EL CARACTER EN TEORIA DEBERIA DE SER ;
MOV AH,02H ;COLOCO EL CODIGO PARA IMPIRMIR UN CARACTER EN LA PANTALLA
INT 21H
CMP CL,0
DEC CL
POP DX
JNE PROBAR
JMP FIN

Procesar Archivo: sirve para verificar la sintaxis del archivo si ocurre algún error se notifica al
usuario.
PROCESARARCHIVO:
LEERDEPILA:
MOV BL,VERIFICACION ;MUEVO VERIFICACION A BL
CMP BL,0 ;COMPARO SI BL ES IGUAL A CERO
JBE ERRORFINARCHIVO ;COMPARO SI EL NUMERO ES IGUAL O MENOR QUE CERO EN ESTE CASO TERMINO EL ARCHIVO DE
MANERA INESPERADA
POP DX ;SACO DE LA PILA EL CARACTER EN TEORIA DEBERIA DE SER ;
MOV AH,02H ;COLOCO EL CODIGO PARA IMPIRMIR UN CARACTER EN LA PANTALLA
DEC VERIFICACION ;QUITO UNO POR EL MAS
INT 21H ;EJECUTO LA INTERRUPCION 21H
CMP DL,3BH ;COMPARO DL CON EL CARACTER
JE COMPARARMASCIERRE ;SI ES IGUAL PROSIGO CON EL SIGUIENTE CARACTER +
JNE ERRORPC ;SI NO ES IGUAL PASO A MOSTRAR EL ERROR Y REGRESAR A PEDIR EL ARCHIVO
JMP FIN

ERRORPC: ;CONTIENE EL MENSAJE DE ERROR QUE FALTA EL ; EN EL ARCHIVO


LEA DX,MENSAJEERRORPYC ;DIRECCIONO DX A EL MENSAJE DE ERROR
MOV AH,09H ;COLOCO EL CODIGO PARA MOSTRAR MENSAJES EN PANTALLA
INT 21H ;EJECUTO LA INTERRUPCION 21H
JMP FIN ;SALGO DEL PROGRAMA
Manual Técnico – Práctica 4 201114438

COMPARARMASCIERRE:

POP DX ;SACO DE LA PILA BASURA DE DH


MOV BL,VERIFICACION ;MUEVO VERIFICACION A BL
CMP BL,0 ;COMPARO SI EL
DEC VERIFICACION ;QUITO UNO POR EL MAS
JBE ERRORFINARCHIVO ;COMPARO SI EL NUMERO ES IGUAL O MENOR QUE CERO EN ESTE CASO TERMINO EL ARCHIVO DE
MANERA INESPERADA
POP DX ;SACO DE LA PILA EL SIGUIENTE CARACTER EN TEORIA +
MOV AH,02H ;CODIGO PARA MOSTRAR CARACTER EN PANTALLA
INT 21H ;EJECUTO LA INTERRUPCION 21H
CMP DL,2BH ;COMPARO DL CON EL EL CARACTER +
MOV POSINUMEROS,0 ;COLOCO LA CANTIDAD DE POSICIONES EN 0
JE COMPARARNUMEROS ;SI ES CORRECTO VOY A COMPARAR NUMEROS
JNE ERRORMAS ;SI NO ES CORRECTO VOY A EL ERROR DEL MAS

ERRORMAS:
LEA DX,MENSAJEERRORMAS ;DIRECCIONO A DX PARA EL MENSAJE DE ERROR
MOV AH,09H ;COLOCO EL CODIGO PARA IMPRIMIR EN PANTALLA
INT 21H ;EJECUTO LA INTERRUPCION 21H
JMP FIN ;SALGO DE EL ANALIZADOR Y PIDO EL NOMBRE DE NUEVO

COMPARARNUMEROS:
DEC VERIFICACION
COMPARANUM:
POP DX ;SACO DE LA PILA BASURA DE DH
MOV BL,VERIFICACION ;MUEVO VERIFICACION A BL
CMP BL,0 ;COMPARO SI EL
;QUITO UNO POR EL MAS
JBE ERRORFINARCHIVO ;COMPARO SI EL NUMERO ES IGUAL O MENOR QUE CERO EN ESTE CASO TERMINO EL ARCHIVO DE
MANERA INESPERADA
POP DX ;SACO DE LA PILA EL SIGUIENTE CARACTER EN TEORIA SERIA EL NUMERO
MOV AH,02H ;CODIGO PARA MOSTRAR CARACTER EN PANTALLA
INT 21H ;EJECUTO LA INTERRUPCION 21H
CMP DL,30H ;COMPARO DL CON EL EL CARACTER 0
JE ESCERO ;SALTO A ESUNO SI EL CARACTER ES 0
CMP DL,31H ;COMPARO DL CON EL EL CARACTER 1
JE ESUNO ;SALTO A ESUNO SI EL CARACTER ES 1
CMP DL,32H ;COMPARO DL CON EL EL CARACTER 2
JE ESDOS ;SALTO A ESUNO SI EL CARACTER ES 2
CMP DL,33H ;COMPARO DL CON EL EL CARACTER 3
JE ESTRES ;SALTO A ESUNO SI EL CARACTER ES 3
CMP DL,34H ;COMPARO DL CON EL EL CARACTER 4
JE ESCUATRO ;SALTO A ESUNO SI EL CARACTER ES 4
CMP DL,35H ;COMPARO DL CON EL EL CARACTER 5
JE ESCINCO ;SALTO A ESUNO SI EL CARACTER ES 5
CMP DL,36H ;COMPARO DL CON EL EL CARACTER 6
JE ESSEIS ;SALTO A ESUNO SI EL CARACTER ES 6
CMP DL,37H ;COMPARO DL CON EL EL CARACTER 7
JE ESSIETE ;SALTO A ESUNO SI EL CARACTER ES 7
CMP DL,38H ;COMPARO DL CON EL EL CARACTER 8
JE ESOCHO ;SALTO A ESUNO SI EL CARACTER ES 8
CMP DL,39H ;COMPARO DL CON EL EL CARACTER 9
JE ESNUEVE ;SALTO A ESUNO SI EL CARACTER ES 9
CMP DL,2BH ;COMPARO DL CON EL EL CARACTER +
JE ESMASABRE ;SALTO A ESUNO SI EL CARACTER ES +
JNE ERRORNUMEROS ;SI NO HAY UN NUMERO O SIGNO MAS MANDARA ERROR

ERRORNUMEROS:
Manual Técnico – Práctica 4 201114438

LEA DX,MENSAJEERRORNUM ;DIRECCIONO A DX PARA EL MENSAJE DE ERROR


MOV AH,09H ;COLOCO EL CODIGO PARA IMPRIMIR EN PANTALLA
INT 21H ;EJECUTO LA INTERRUPCION 21H
JMP FIN ;SALGO DE EL ANALIZADOR Y PIDO EL NOMBRE DE NUEVO

ESCERO PROC

MOV BL,CANTNUMEROS ;LE COLOCO A BL LA CANTIDAD DE NUMEROS GUARDADOS AL INICIO ES INDICE 0


MOV CL,POSINUMEROS ;LE COLOCO A CL SI ES DE UNIDADES, DECENAS, CENTENAS, MILES...ETC.
CMP CX,0 ;COMPARO SI CX ES DE UNIDADES O DE MAS POSICIONES
JE AGREGARNUMERO0 ;SI ES CERO SOLO LE AGREGO UNO A LA CANTIDAD INICIAL
MOV AX,1 ;MUEVO A AX 10 PARA PODER HACER 10^1, 10^2(10X10)...ETC
MOV DX,10 ;LE COLOCO EL VALOR DE 10 A DX, ESTE NUMERO ESTA EN DECIMAL
MULTIPLO0: ;COMIENZO A MULTIPLICAR HASTA QUE CX LLEGUE A 0
MUL DX ;MULTIPLICO AX*10 LAS VECES QUE DIGA LA POSICION DE NUMEROS
MOV DX,10 ;LE VUELVO A COLOCAR EL VALOR DE 10 A DX PORQUE LA MULTIPLICACION LO BORRA
LOOP MULTIPLO0 ;REPITO LLAMANDO A LA ETIQUETA MULTIPLO HASTA QUE CX LLEGUE A 0
MOV DX,0 ;COLOCO EL VALOR DE 1 A DX
MUL DX ;MULTIPLICO EL RESULTADO DE LA MULTI. QUE ESTA EN X POR EL NUMERO ESCOGIDO
ADD NUMEROSGUARDADOS[BX],AX ;SUMO A EL NUMERO QUE ESTA EN LA POSICION BX LO QUE TENGA AX
MOV DX,NUMEROSGUARDADOS[BX] ;MUEVO EL CONTENIDO DE EL NUMERO GUARDADO EN MEMORIA EN POSICION BX A DX
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
;SACO DE LA PILA BASURA DE DH
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
AGREGARNUMERO0: ;ETIQUETA PARA AGREGAR DIRECTAMENTE EL NUMERO EN LAS UNIDADES
ADD NUMEROSGUARDADOS[BX],1 ;SUMO EL NUMERO DIRECTAMENTE A EL NUMERO QUE ESTA EN BX
;INC CANTNUMEROS ;INCREMENTO LA CANTIDAD DE NUMEROS GUARDADOS EN MEMORIA
MOV DX,NUMEROSGUARDADOS[BX] ;GUARDO EN DX EL NUMERO QUE ESTA EN LA POSICION BX
;SACO DE LA PILA BASURA DE DH
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
JMP SALIR
RET
ENDP

ESUNO PROC
MOV BL,CANTNUMEROS ;LE COLOCO A BL LA CANTIDAD DE NUMEROS GUARDADOS AL INICIO ES INDICE 0
MOV CL,POSINUMEROS ;LE COLOCO A CL SI ES DE UNIDADES, DECENAS, CENTENAS, MILES...ETC.
CMP CX,0 ;COMPARO SI CX ES DE UNIDADES O DE MAS POSICIONES
JE AGREGARNUMERO1 ;SI ES CERO SOLO LE AGREGO UNO A LA CANTIDAD INICIAL
MOV AX,1 ;MUEVO A AX 10 PARA PODER HACER 10^1, 10^2(10X10)...ETC
MOV DX,10 ;LE COLOCO EL VALOR DE 10 A DX, ESTE NUMERO ESTA EN DECIMAL
MULTIPLO1: ;COMIENZO A MULTIPLICAR HASTA QUE CX LLEGUE A 0
MUL DX ;MULTIPLICO AX*10 LAS VECES QUE DIGA LA POSICION DE NUMEROS
MOV DX,10 ;LE VUELVO A COLOCAR EL VALOR DE 10 A DX PORQUE LA MULTIPLICACION LO BORRA
LOOP MULTIPLO1 ;REPITO LLAMANDO A LA ETIQUETA MULTIPLO HASTA QUE CX LLEGUE A 0
MOV DX,1 ;COLOCO EL VALOR DE 1 A DX
MUL DX ;MULTIPLICO EL RESULTADO DE LA MULTI. QUE ESTA EN X POR EL NUMERO ESCOGIDO
ADD NUMEROSGUARDADOS[BX],AX ;SUMO A EL NUMERO QUE ESTA EN LA POSICION BX LO QUE TENGA AX
MOV DX,NUMEROSGUARDADOS[BX] ;MUEVO EL CONTENIDO DE EL NUMERO GUARDADO EN MEMORIA EN POSICION BX A DX
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
;SACO DE LA PILA BASURA DE DH
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
AGREGARNUMERO1: ;ETIQUETA PARA AGREGAR DIRECTAMENTE EL NUMERO EN LAS UNIDADES
ADD NUMEROSGUARDADOS[BX],1 ;SUMO EL NUMERO DIRECTAMENTE A EL NUMERO QUE ESTA EN BX
;INC CANTNUMEROS ;INCREMENTO LA CANTIDAD DE NUMEROS GUARDADOS EN MEMORIA
MOV DX,NUMEROSGUARDADOS[BX] ;GUARDO EN DX EL NUMERO QUE ESTA EN LA POSICION BX
;SACO DE LA PILA BASURA DE DH
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
Manual Técnico – Práctica 4 201114438

JMP SALIR
RET
ENDP

ESDOS PROC ;**


MOV BL,CANTNUMEROS ;LE COLOCO A BL LA CANTIDAD DE NUMEROS GUARDADOS AL INICIO ES INDICE 0
MOV CL,POSINUMEROS ;LE COLOCO A CL SI ES DE UNIDADES, DECENAS, CENTENAS, MILES...ETC.
CMP CX,0 ;COMPARO SI CX ES DE UNIDADES O DE MAS POSICIONES
JE AGREGARNUMERO2 ;** ;SI ES CERO SOLO LE AGREGO UNO A LA CANTIDAD INICIAL
MOV AX,1 ;MUEVO A AX 10 PARA PODER HACER 10^1, 10^2(10X10)...ETC
MOV DX,10 ;LE COLOCO EL VALOR DE 10 A DX, ESTE NUMERO ESTA EN DECIMAL
MULTIPLO2: ;** ;COMIENZO A MULTIPLICAR HASTA QUE CX LLEGUE A 0
MUL DX ;MULTIPLICO AX*10 LAS VECES QUE DIGA LA POSICION DE NUMEROS
MOV DX,10 ;LE VUELVO A COLOCAR EL VALOR DE 10 A DX PORQUE LA MULTIPLICACION LO BORRA
LOOP MULTIPLO2 ;** ;REPITO LLAMANDO A LA ETIQUETA MULTIPLO HASTA QUE CX LLEGUE A 0
MOV DX,2 ;** ;COLOCO EL VALOR DE 1 A DX
MUL DX ;MULTIPLICO EL RESULTADO DE LA MULTI. QUE ESTA EN X POR EL NUMERO ESCOGIDO
ADD NUMEROSGUARDADOS[BX],AX ;SUMO A EL NUMERO QUE ESTA EN LA POSICION BX LO QUE TENGA AX
MOV DX,NUMEROSGUARDADOS[BX] ;MUEVO EL CONTENIDO DE EL NUMERO GUARDADO EN MEMORIA EN POSICION BX A DX
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
;SACO DE LA PILA BASURA DE DH
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
AGREGARNUMERO2: ;** ;ETIQUETA PARA AGREGAR DIRECTAMENTE EL NUMERO EN LAS UNIDADES
ADD NUMEROSGUARDADOS[BX],1 ;SUMO EL NUMERO DIRECTAMENTE A EL NUMERO QUE ESTA EN BX
;INC CANTNUMEROS ;INCREMENTO LA CANTIDAD DE NUMEROS GUARDADOS EN MEMORIA
MOV DX,NUMEROSGUARDADOS[BX] ;GUARDO EN DX EL NUMERO QUE ESTA EN LA POSICION BX
;SACO DE LA PILA BASURA DE DH
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
JMP SALIR
RET
ENDP

ESTRES PROC ;**


MOV BL,CANTNUMEROS ;LE COLOCO A BL LA CANTIDAD DE NUMEROS GUARDADOS AL INICIO ES INDICE 0
MOV CL,POSINUMEROS ;LE COLOCO A CL SI ES DE UNIDADES, DECENAS, CENTENAS, MILES...ETC.
CMP CX,0 ;COMPARO SI CX ES DE UNIDADES O DE MAS POSICIONES
JE AGREGARNUMERO3 ;** ;SI ES CERO SOLO LE AGREGO UNO A LA CANTIDAD INICIAL
MOV AX,1 ;MUEVO A AX 10 PARA PODER HACER 10^1, 10^2(10X10)...ETC
MOV DX,10 ;LE COLOCO EL VALOR DE 10 A DX, ESTE NUMERO ESTA EN DECIMAL
MULTIPLO3: ;** ;COMIENZO A MULTIPLICAR HASTA QUE CX LLEGUE A 0
MUL DX ;MULTIPLICO AX*10 LAS VECES QUE DIGA LA POSICION DE NUMEROS
MOV DX,10 ;LE VUELVO A COLOCAR EL VALOR DE 10 A DX PORQUE LA MULTIPLICACION LO BORRA
LOOP MULTIPLO3 ;** ;REPITO LLAMANDO A LA ETIQUETA MULTIPLO HASTA QUE CX LLEGUE A 0
MOV DX,3 ;** ;COLOCO EL VALOR DE 1 A DX
MUL DX ;MULTIPLICO EL RESULTADO DE LA MULTI. QUE ESTA EN X POR EL NUMERO ESCOGIDO
ADD NUMEROSGUARDADOS[BX],AX ;SUMO A EL NUMERO QUE ESTA EN LA POSICION BX LO QUE TENGA AX
MOV DX,NUMEROSGUARDADOS[BX] ;MUEVO EL CONTENIDO DE EL NUMERO GUARDADO EN MEMORIA EN POSICION BX A DX
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
;SACO DE LA PILA BASURA DE DH
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
AGREGARNUMERO3: ;** ;ETIQUETA PARA AGREGAR DIRECTAMENTE EL NUMERO EN LAS UNIDADES
ADD NUMEROSGUARDADOS[BX],1 ;SUMO EL NUMERO DIRECTAMENTE A EL NUMERO QUE ESTA EN BX
;INC CANTNUMEROS ;INCREMENTO LA CANTIDAD DE NUMEROS GUARDADOS EN MEMORIA
MOV DX,NUMEROSGUARDADOS[BX] ;GUARDO EN DX EL NUMERO QUE ESTA EN LA POSICION BX
;SACO DE LA PILA BASURA DE DH
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
JMP SALIR
RET
ENDP
Manual Técnico – Práctica 4 201114438

ESCUATRO PROC ;**


MOV BL,CANTNUMEROS ;LE COLOCO A BL LA CANTIDAD DE NUMEROS GUARDADOS AL INICIO ES INDICE 0
MOV CL,POSINUMEROS ;LE COLOCO A CL SI ES DE UNIDADES, DECENAS, CENTENAS, MILES...ETC.
CMP CX,0 ;COMPARO SI CX ES DE UNIDADES O DE MAS POSICIONES
JE AGREGARNUMERO4 ;** ;SI ES CERO SOLO LE AGREGO UNO A LA CANTIDAD INICIAL
MOV AX,1 ;MUEVO A AX 10 PARA PODER HACER 10^1, 10^2(10X10)...ETC
MOV DX,10 ;LE COLOCO EL VALOR DE 10 A DX, ESTE NUMERO ESTA EN DECIMAL
MULTIPLO4: ;** ;COMIENZO A MULTIPLICAR HASTA QUE CX LLEGUE A 0
MUL DX ;MULTIPLICO AX*10 LAS VECES QUE DIGA LA POSICION DE NUMEROS
MOV DX,10 ;LE VUELVO A COLOCAR EL VALOR DE 10 A DX PORQUE LA MULTIPLICACION LO BORRA
LOOP MULTIPLO4 ;** ;REPITO LLAMANDO A LA ETIQUETA MULTIPLO HASTA QUE CX LLEGUE A 0
MOV DX,4 ;** ;COLOCO EL VALOR DE 1 A DX
MUL DX ;MULTIPLICO EL RESULTADO DE LA MULTI. QUE ESTA EN X POR EL NUMERO ESCOGIDO
ADD NUMEROSGUARDADOS[BX],AX ;SUMO A EL NUMERO QUE ESTA EN LA POSICION BX LO QUE TENGA AX
MOV DX,NUMEROSGUARDADOS[BX] ;MUEVO EL CONTENIDO DE EL NUMERO GUARDADO EN MEMORIA EN POSICION BX A DX
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
;SACO DE LA PILA BASURA DE DH
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
AGREGARNUMERO4: ;** ;ETIQUETA PARA AGREGAR DIRECTAMENTE EL NUMERO EN LAS UNIDADES
ADD NUMEROSGUARDADOS[BX],1 ;SUMO EL NUMERO DIRECTAMENTE A EL NUMERO QUE ESTA EN BX
;INC CANTNUMEROS ;INCREMENTO LA CANTIDAD DE NUMEROS GUARDADOS EN MEMORIA
MOV DX,NUMEROSGUARDADOS[BX] ;GUARDO EN DX EL NUMERO QUE ESTA EN LA POSICION BX
;SACO DE LA PILA BASURA DE DH
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
JMP SALIR
RET
ENDP

ESCINCO PROC ;**


MOV BL,CANTNUMEROS ;LE COLOCO A BL LA CANTIDAD DE NUMEROS GUARDADOS AL INICIO ES INDICE 0
MOV CL,POSINUMEROS ;LE COLOCO A CL SI ES DE UNIDADES, DECENAS, CENTENAS, MILES...ETC.
CMP CX,0 ;COMPARO SI CX ES DE UNIDADES O DE MAS POSICIONES
JE AGREGARNUMERO5 ;** ;SI ES CERO SOLO LE AGREGO UNO A LA CANTIDAD INICIAL
MOV AX,1 ;MUEVO A AX 10 PARA PODER HACER 10^1, 10^2(10X10)...ETC
MOV DX,10 ;LE COLOCO EL VALOR DE 10 A DX, ESTE NUMERO ESTA EN DECIMAL
MULTIPLO5: ;** ;COMIENZO A MULTIPLICAR HASTA QUE CX LLEGUE A 0
MUL DX ;MULTIPLICO AX*10 LAS VECES QUE DIGA LA POSICION DE NUMEROS
MOV DX,10 ;LE VUELVO A COLOCAR EL VALOR DE 10 A DX PORQUE LA MULTIPLICACION LO BORRA
LOOP MULTIPLO5 ;** ;REPITO LLAMANDO A LA ETIQUETA MULTIPLO HASTA QUE CX LLEGUE A 0
MOV DX,5 ;** ;COLOCO EL VALOR DE 1 A DX
MUL DX ;MULTIPLICO EL RESULTADO DE LA MULTI. QUE ESTA EN X POR EL NUMERO ESCOGIDO
ADD NUMEROSGUARDADOS[BX],AX ;SUMO A EL NUMERO QUE ESTA EN LA POSICION BX LO QUE TENGA AX
MOV DX,NUMEROSGUARDADOS[BX] ;MUEVO EL CONTENIDO DE EL NUMERO GUARDADO EN MEMORIA EN POSICION BX A DX
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
;SACO DE LA PILA BASURA DE DH
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
AGREGARNUMERO5: ;** ;ETIQUETA PARA AGREGAR DIRECTAMENTE EL NUMERO EN LAS UNIDADES
ADD NUMEROSGUARDADOS[BX],1 ;SUMO EL NUMERO DIRECTAMENTE A EL NUMERO QUE ESTA EN BX
;INC CANTNUMEROS ;INCREMENTO LA CANTIDAD DE NUMEROS GUARDADOS EN MEMORIA
MOV DX,NUMEROSGUARDADOS[BX] ;GUARDO EN DX EL NUMERO QUE ESTA EN LA POSICION BX
;SACO DE LA PILA BASURA DE DH
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
JMP SALIR
RET
ENDP

ESSEIS PROC ;**


MOV BL,CANTNUMEROS ;LE COLOCO A BL LA CANTIDAD DE NUMEROS GUARDADOS AL INICIO ES INDICE 0
Manual Técnico – Práctica 4 201114438

MOV CL,POSINUMEROS ;LE COLOCO A CL SI ES DE UNIDADES, DECENAS, CENTENAS, MILES...ETC.


CMP CX,0 ;COMPARO SI CX ES DE UNIDADES O DE MAS POSICIONES
JE AGREGARNUMERO6 ;** ;SI ES CERO SOLO LE AGREGO UNO A LA CANTIDAD INICIAL
MOV AX,1 ;MUEVO A AX 10 PARA PODER HACER 10^1, 10^2(10X10)...ETC
MOV DX,10 ;LE COLOCO EL VALOR DE 10 A DX, ESTE NUMERO ESTA EN DECIMAL
MULTIPLO6: ;** ;COMIENZO A MULTIPLICAR HASTA QUE CX LLEGUE A 0
MUL DX ;MULTIPLICO AX*10 LAS VECES QUE DIGA LA POSICION DE NUMEROS
MOV DX,10 ;LE VUELVO A COLOCAR EL VALOR DE 10 A DX PORQUE LA MULTIPLICACION LO BORRA
LOOP MULTIPLO6 ;** ;REPITO LLAMANDO A LA ETIQUETA MULTIPLO HASTA QUE CX LLEGUE A 0
MOV DX,6 ;** ;COLOCO EL VALOR DE 1 A DX
MUL DX ;MULTIPLICO EL RESULTADO DE LA MULTI. QUE ESTA EN X POR EL NUMERO ESCOGIDO
ADD NUMEROSGUARDADOS[BX],AX ;SUMO A EL NUMERO QUE ESTA EN LA POSICION BX LO QUE TENGA AX
MOV DX,NUMEROSGUARDADOS[BX] ;MUEVO EL CONTENIDO DE EL NUMERO GUARDADO EN MEMORIA EN POSICION BX A DX
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
;SACO DE LA PILA BASURA DE DH
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
AGREGARNUMERO6: ;** ;ETIQUETA PARA AGREGAR DIRECTAMENTE EL NUMERO EN LAS UNIDADES
ADD NUMEROSGUARDADOS[BX],1 ;SUMO EL NUMERO DIRECTAMENTE A EL NUMERO QUE ESTA EN BX
;INC CANTNUMEROS ;INCREMENTO LA CANTIDAD DE NUMEROS GUARDADOS EN MEMORIA
MOV DX,NUMEROSGUARDADOS[BX] ;GUARDO EN DX EL NUMERO QUE ESTA EN LA POSICION BX
;SACO DE LA PILA BASURA DE DH
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
JMP SALIR
RET
ENDP

ESSIETE PROC ;**


MOV BL,CANTNUMEROS ;LE COLOCO A BL LA CANTIDAD DE NUMEROS GUARDADOS AL INICIO ES INDICE 0
MOV CL,POSINUMEROS ;LE COLOCO A CL SI ES DE UNIDADES, DECENAS, CENTENAS, MILES...ETC.
CMP CX,0 ;COMPARO SI CX ES DE UNIDADES O DE MAS POSICIONES
JE AGREGARNUMERO7 ;** ;SI ES CERO SOLO LE AGREGO UNO A LA CANTIDAD INICIAL
MOV AX,1 ;MUEVO A AX 10 PARA PODER HACER 10^1, 10^2(10X10)...ETC
MOV DX,10 ;LE COLOCO EL VALOR DE 10 A DX, ESTE NUMERO ESTA EN DECIMAL
MULTIPLO7: ;** ;COMIENZO A MULTIPLICAR HASTA QUE CX LLEGUE A 0
MUL DX ;MULTIPLICO AX*10 LAS VECES QUE DIGA LA POSICION DE NUMEROS
MOV DX,10 ;LE VUELVO A COLOCAR EL VALOR DE 10 A DX PORQUE LA MULTIPLICACION LO BORRA
LOOP MULTIPLO7 ;** ;REPITO LLAMANDO A LA ETIQUETA MULTIPLO HASTA QUE CX LLEGUE A 0
MOV DX,7 ;** ;COLOCO EL VALOR DE 1 A DX
MUL DX ;MULTIPLICO EL RESULTADO DE LA MULTI. QUE ESTA EN X POR EL NUMERO ESCOGIDO
ADD NUMEROSGUARDADOS[BX],AX ;SUMO A EL NUMERO QUE ESTA EN LA POSICION BX LO QUE TENGA AX
MOV DX,NUMEROSGUARDADOS[BX] ;MUEVO EL CONTENIDO DE EL NUMERO GUARDADO EN MEMORIA EN POSICION BX A DX
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
;SACO DE LA PILA BASURA DE DH
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
AGREGARNUMERO7: ;** ;ETIQUETA PARA AGREGAR DIRECTAMENTE EL NUMERO EN LAS UNIDADES
ADD NUMEROSGUARDADOS[BX],1 ;SUMO EL NUMERO DIRECTAMENTE A EL NUMERO QUE ESTA EN BX
;INC CANTNUMEROS ;INCREMENTO LA CANTIDAD DE NUMEROS GUARDADOS EN MEMORIA
MOV DX,NUMEROSGUARDADOS[BX] ;GUARDO EN DX EL NUMERO QUE ESTA EN LA POSICION BX
;SACO DE LA PILA BASURA DE DH
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
JMP SALIR
RET
ENDP

ESOCHO PROC ;**


MOV BL,CANTNUMEROS ;LE COLOCO A BL LA CANTIDAD DE NUMEROS GUARDADOS AL INICIO ES INDICE 0
MOV CL,POSINUMEROS ;LE COLOCO A CL SI ES DE UNIDADES, DECENAS, CENTENAS, MILES...ETC.
Manual Técnico – Práctica 4 201114438

CMP CX,0 ;COMPARO SI CX ES DE UNIDADES O DE MAS POSICIONES


JE AGREGARNUMERO8 ;** ;SI ES CERO SOLO LE AGREGO UNO A LA CANTIDAD INICIAL
MOV AX,1 ;MUEVO A AX 10 PARA PODER HACER 10^1, 10^2(10X10)...ETC
MOV DX,10 ;LE COLOCO EL VALOR DE 10 A DX, ESTE NUMERO ESTA EN DECIMAL
MULTIPLO8: ;** ;COMIENZO A MULTIPLICAR HASTA QUE CX LLEGUE A 0
MUL DX ;MULTIPLICO AX*10 LAS VECES QUE DIGA LA POSICION DE NUMEROS
MOV DX,10 ;LE VUELVO A COLOCAR EL VALOR DE 10 A DX PORQUE LA MULTIPLICACION LO BORRA
LOOP MULTIPLO8 ;** ;REPITO LLAMANDO A LA ETIQUETA MULTIPLO HASTA QUE CX LLEGUE A 0
MOV DX,8 ;** ;COLOCO EL VALOR DE 1 A DX
MUL DX ;MULTIPLICO EL RESULTADO DE LA MULTI. QUE ESTA EN X POR EL NUMERO ESCOGIDO
ADD NUMEROSGUARDADOS[BX],AX ;SUMO A EL NUMERO QUE ESTA EN LA POSICION BX LO QUE TENGA AX
MOV DX,NUMEROSGUARDADOS[BX] ;MUEVO EL CONTENIDO DE EL NUMERO GUARDADO EN MEMORIA EN POSICION BX A DX
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
;SACO DE LA PILA BASURA DE DH
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
AGREGARNUMERO8: ;** ;ETIQUETA PARA AGREGAR DIRECTAMENTE EL NUMERO EN LAS UNIDADES
ADD NUMEROSGUARDADOS[BX],1 ;SUMO EL NUMERO DIRECTAMENTE A EL NUMERO QUE ESTA EN BX
;INC CANTNUMEROS ;INCREMENTO LA CANTIDAD DE NUMEROS GUARDADOS EN MEMORIA
MOV DX,NUMEROSGUARDADOS[BX] ;GUARDO EN DX EL NUMERO QUE ESTA EN LA POSICION BX
;SACO DE LA PILA BASURA DE DH
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
JMP SALIR
RET
ENDP

ESNUEVE PROC ;**


MOV BL,CANTNUMEROS ;LE COLOCO A BL LA CANTIDAD DE NUMEROS GUARDADOS AL INICIO ES INDICE 0
MOV CL,POSINUMEROS ;LE COLOCO A CL SI ES DE UNIDADES, DECENAS, CENTENAS, MILES...ETC.
CMP CX,0 ;COMPARO SI CX ES DE UNIDADES O DE MAS POSICIONES
JE AGREGARNUMERO9 ;** ;SI ES CERO SOLO LE AGREGO UNO A LA CANTIDAD INICIAL
MOV AX,1 ;MUEVO A AX 10 PARA PODER HACER 10^1, 10^2(10X10)...ETC
MOV DX,10 ;LE COLOCO EL VALOR DE 10 A DX, ESTE NUMERO ESTA EN DECIMAL
MULTIPLO9: ;** ;COMIENZO A MULTIPLICAR HASTA QUE CX LLEGUE A 0
MUL DX ;MULTIPLICO AX*10 LAS VECES QUE DIGA LA POSICION DE NUMEROS
MOV DX,10 ;LE VUELVO A COLOCAR EL VALOR DE 10 A DX PORQUE LA MULTIPLICACION LO BORRA
LOOP MULTIPLO9 ;** ;REPITO LLAMANDO A LA ETIQUETA MULTIPLO HASTA QUE CX LLEGUE A 0
MOV DX,9 ;** ;COLOCO EL VALOR DE 1 A DX
MUL DX ;MULTIPLICO EL RESULTADO DE LA MULTI. QUE ESTA EN X POR EL NUMERO ESCOGIDO
ADD NUMEROSGUARDADOS[BX],AX ;SUMO A EL NUMERO QUE ESTA EN LA POSICION BX LO QUE TENGA AX
MOV DX,NUMEROSGUARDADOS[BX] ;MUEVO EL CONTENIDO DE EL NUMERO GUARDADO EN MEMORIA EN POSICION BX A DX
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
;SACO DE LA PILA BASURA DE DH
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
AGREGARNUMERO9: ;** ;ETIQUETA PARA AGREGAR DIRECTAMENTE EL NUMERO EN LAS UNIDADES
ADD NUMEROSGUARDADOS[BX],1 ;SUMO EL NUMERO DIRECTAMENTE A EL NUMERO QUE ESTA EN BX
;INC CANTNUMEROS ;INCREMENTO LA CANTIDAD DE NUMEROS GUARDADOS EN MEMORIA
MOV DX,NUMEROSGUARDADOS[BX] ;GUARDO EN DX EL NUMERO QUE ESTA EN LA POSICION BX
;SACO DE LA PILA BASURA DE DH
INC POSINUMEROS ;INCREMENTO PARA DECENAS,CENTENAS...ETC
JMP COMPARARNUMEROS ;VOY A COMPARARNUMEROS PARA SABER SI HAY MAS NUMEROS
JMP SALIR
RET
ENDP

ERRORSALTODELINEA:
LEA DX,MENSAJEERROR0AH ;DIRECCIONO A DX PARA EL MENSAJE DE ERROR
MOV AH,09H ;COLOCO EL CODIGO PARA IMPRIMIR EN PANTALLA
INT 21H ;EJECUTO LA INTERRUPCION 21H
JMP FIN ;SALGO DE EL ANALIZADOR Y PIDO EL NOMBRE DE NUEVO
Manual Técnico – Práctica 4 201114438

ESMASABRE PROC ;**


INC CANTNUMEROS
POP DX
MOV BL,VERIFICACION ;MUEVO VERIFICACION A BL
CMP BL,4 ;COMPARO SI LA VERIFICACION ES 0
JBE MENU2 ;SI EL CONTADOR DE CARACTERES ES 0 ES PORQUE TERMINO BIEN EL ARCHIVO
POP DX
;DEC VERIFICACION ;QUITO UNO POR EL MAS
MOV BL,VERIFICACION ;MUEVO VERIFICACION A BL
CMP DL,0AH
JE ESSALTODELINEA
JNE ERRORSALTODELINEA
JMP SALIR
RET
ENDP

ESSALTODELINEA PROC

MOV BL,VERIFICACION ;MUEVO VERIFICACION A BL


CMP BL,0 ;COMPARO SI LA VERIFICACION ES 0
JBE MENU2 ;SI EL CONTADOR DE CARACTERES ES 0 ES PORQUE TERMINO BIEN EL ARCHIVO
POP DX
POP DX
DEC VERIFICACION ;QUITO UNO POR EL MAS
CMP BL,0 ;COMPARO SI LA VERIFICACION ES 0
JE ERRORFINARCHIVO ;DECREMENTO UNO AL INICIO PORQUE SE CONTO EL EOF
JNE COMPARARMASCIERRE
JMP SALIR

ENDP

Numero Palíndromo: Coloca los números palíndromos en el archivo


push SI ;Guarda el indice, del caracter actualmente leido de los datos, en pila
mov DI,larNum ;Asigna el largo de la cadena a DI
dec DI ;Regresa a la posicion final de la cadena
mov SI,00h ;Inicia a SI en 0
mov AL,00h ;Inicia el registro AX en 0
mov BL,00h
loopPalin:
mov AL,numTemp[SI] ;Suma al registro AL los digitos de la izquierda
mov BL,numTemp[DI] ;Suma al registro BL los digitos de la derecha
cmp AL,BL ;Compara los digitos izquierda y derecha
jne salirPalin ;Si no son Iguales, no es palindromo, salir
dec DI ;Corre el indice derecho a la siguiente posicion
inc SI ;Corre el indice izquierdo a la siguiente posicon
cmp SI,DI ;Compara los limites izquierdo y derecho
ja agregarPalin ;Si se traslaparon llego a la mitad, salta a agregar Palindromos
loop loopPalin
ESPALINDROMO:
MOV DI,LARNUM ;REGRESA EL VALOR ORIGINAL DE DI
MOV CX,DI ;INICIA CX (CONTADOR) EN DI (LARGO DEL NUMERO)
MOV SI,IPALIN ;INICIA SI, EN LA POSICION VACIA DEL BUFFER
Manual Técnico – Práctica 4 201114438

MOV DI,00H
LOOPADDPALIN:
MOV AL,NUMTEMP[DI] ;AGREGA UN DIGITO A AL
MOV LISTAPALIN[SI],AL ;AGREGA EL DIGITO EN AL A LA LISTA DE PALINDROMOS
INC SI
INC DI
LOOP LOOPADDPALIN
MOV LISTAPALIN[SI],2CH ;AGREGA UNA COMA DESPUES DEL NUMERO AGREGADO
INC SI
MOV IPALIN,SI ;DEJA EL INDICE DE ESPEJO EN LA PROXIMA POSICION VACIA
SALIRPALIN:
POP SI

Numeros Split: Calcula los números Split del archivo


PUSH SI ;GUARDA EL INDICE, DEL CARACTER ACTUALMENTE LEIDO DE LOS DATOS, EN PILA
MOV LARNUM,DI
DEC DI ;REGRESA A LA POSICION FINAL DE LA CADENA
MOV SI,00H ;INICIA A SI EN 0
MOV AL,00H ;INICIA EL REGISTRO AX EN 0
MOV BL,00H
LOOPSPLIT:
ADD AL,NUMTEMP[SI] ;SUMA AL REGISTRO AL LOS DIGITOS DE LA IZQUIERDA
ADD BL,NUMTEMP[DI] ;SUMA AL REGISTRO BL LOS DIGITOS DE LA DERECHA
DEC DI ;CORRE EL INDICE DERECHO A LA SIGUIENTE POSICION
INC SI ;CORRE EL INDICE IZQUIERDO A LA SIGUIENTE POSICON
CMP SI,DI ;COMPARA LOS LIMITES IZQUIERDO Y DERECHO
JA AGREGARSPLIT ;SI SE TRASLAPARON LLEGO A LA MITAD, SALTA A AGREGAR SPLIT
LOOP LOOPSPLIT
AGREGARSPLIT: ;AGREGA EL NUMERO A LA LISTA DE SPLIT
MOV DI,LARNUM ;REGRESA EL VALOR ORIGINAL DE DI
CMP AL,BL ;COMPARA AL Y BL (LAS SUMAS)
JNE SALIRSPLIT ;SI NO SON IGUALES SALTA A SALIR. SI LO SON CONTINUA
MOV CX,DI ;INICIA CX (CONTADOR) EN DI (LARGO DEL NUMERO)
MOV SI,ISPLIT ;INICIA SI, EN LA POSICION VACIA DEL BUFFER
MOV DI,00H
LOOPADDSPLIT:
MOV AL,NUMTEMP[DI] ;AGREGA UN DIGITO A AL
MOV LISTASPLIT[SI],AL ;AGREGA EL DIGITO EN AL A LA LISTA DE SPLIT
INC SI
INC DI
LOOP LOOPADDSPLIT
MOV LISTASPLIT[SI],2CH ;AGREGA UNA COMA DESPUES DEL NUMERO AGREGADO
INC SI
MOV ISPLIT,SI ;DEJA EL INDICE DE ESPEJO EN LA PROXIMA POSICION VACIA
SALIRSPLIT:
POP SI

NUMEROS ESPEJO: calcula los ascii de los numeros espejo.


PUSH SI ;GUARDA EL INDICE, DEL CARACTER ACTUALMENTE LEIDO DE LOS DATOS, EN PILA
MOV DI,LARNUM ;REGRESA EL VALOR ORIGINAL DE DI
MOV CX,DI ;INICIA CX (CONTADOR) EN DI (LARGO DEL NUMERO)
DEC DI ;REGRESA AL ULTIMO DIGITO DEL NUMERO
MOV SI,IESPEJO ;INICIA SI, EN LA POSICION VACIA DEL BUFFER
LOOPADDESPEJO:
MOV AL,NUMTEMP[DI] ;AGREGA UN DIGITO A AL
MOV LISTAESPEJO[SI],AL ;AGREGA EL DIGITO EN AL A LA LISTA ESPEJO
INC SI
DEC DI
LOOP LOOPADDESPEJO
Manual Técnico – Práctica 4 201114438

MOV LISTAESPEJO[SI],2CH ;AGREGA UNA COMA DESPUES DEL NUMERO AGREGADO


INC SI
MOV IESPEJO,SI ;DEJA EL INDICE DE ESPEJO EN LA PROXIMA POSICION VACIA
POP SI

You might also like