You are on page 1of 13

Proyecto Final de Informática Básica

Trimestre: Invierno 2008

PROGRAMA PARA CALCULAR EL FACTORIAL DE UN NÚMERO

El programa está desarrollado y programado totalmente en lenguaje ensamblador 8086. Fue ensamblado usando el ensamblador “Turbo Assembler” (TASM) y enlazado con el “Turbo Linker” (TLINK) ambos de Borland. El Archivo de extensión .asm que contiene el código fuente tiene el nombre (fact41.asm), una vez ensamblado con el TASM se genero un archivo objeto (fact41.obj) a partir del cual se obtuvo el programa ejecutable (fact41.exe). Para ejecutar el programa basta llamarlo desde la ventana de símbolo del sistema (debidamente direccionada) dando doble clic sobre el icono de fact41.exe. El programa tiene incorporada la función de autentificación del usuario y contraseña, por lo que al momento de ejecutarlo en la ventana del programa se le pedirá que ingrese un usuario y contraseña válidos con el fin de ingresar al “sistema” en donde podrá hacer uso de la función de calcular factoriales:

Se deberá de presionar la tecla de “ENTER” después de escribir el usuario para que el programa lo acepte. Enseguida el programa nos pedirá la contraseña, después de escribirla deberemos presionar también “ENTER”. Se dispone de tres intentos para ingresar al sistema, si se ingresaran datos incorrectos en los tres intentos el sistema de bloqueará y deberá volver a ejecutarlo para poder intentar nuevamente ingresar al sistema.

1

Proyecto Final de Informática Básica

Trimestre: Invierno 2008

Nota: El nombre de usuario para poder entrar al sistema es: EXAMEN y la contraseña es FINAL, ambos deben de ser en mayúsculas. Si se ingresan datos incorrectos el programa avisará sobre el caso y se pedirá que intente nuevamente, se dispone de un contador que indicará los intentos aún disponibles:

Si el sistema se llegara a bloquear aparecerá un mensaje avisándonos de lo sucedido y pidiéndonos presionar una tecla para terminar, al hacerlo el programa se cerrará:

Si los datos en cambio fuesen correctos el programa nos avisará y podremos ingresar al “sistema”:

2

Proyecto Final de Informática Básica

Trimestre: Invierno 2008

Si presionamos alguna tecla se mostrará enseguida la pantalla de presentación:

Tal como se nos indica, si presionamos la tecla ESC, el programa se cerrara y si presionamos cualquier otra pararemos a la siguiente pantalla donde se muestran las instrucciones generales:

3

Proyecto Final de Informática Básica

Trimestre: Invierno 2008

Nuevamente se tiene la opción de cerrar el programa presionando ESC. Presionando cualquier otra tecla pasaremos a la parte donde podemos hacer uso de la función para calcular factoriales:

Se deberá presionar ENTER después de teclear el numero para que el programa lo acepte, momento en el cual (si el numero ingresado se encuentra dentro del rango y no se han presionado caracteres inválidos) se nos devolverá el factorial y se nos dará un aviso de que debemos hacer si queremos calcular otro factorial o si queremos salir del programa:

4

Proyecto Final de Informática Básica

Trimestre: Invierno 2008

Si presionaremos ESC el programa se cerrará, si presionamos alguna otra tecla se nos pedirá nuevamente un número. Si en algún momento ingresaremos un número que se encuentre fuera del rango o si hubiésemos tecleado otros caracteres se nos dará un aviso de error:

5

Proyecto Final de Informática Básica

Trimestre: Invierno 2008

6

Proyecto Final de Informática Básica

Trimestre: Invierno 2008

Listado del código fuente del archivo fact41.asm:
;PROYECTO FINAL: PROGRAMA QUE CALCULA EL FACTORIAL DE UN NUMERO ;ALUMNOS: ;Alumno1 ;Alumno2 ;FECHA DE INICIO: 28 DE FEBRERO DEL 2008 ;FECHA DE ENTREGA: 2 DE ABRIL DEL 2008 ;PROFESOR: ;ING. .MODEL SMALL INCLUDE MACROS.INC .STACK .DATA N DB 2 DUP (0) M DB 14 DUP (0) F DB 14 DUP (0) A DB 14 DUP (0) MSGP DB 'ÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉ' DB 10,13,'ÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉ' DB 10,13,'ÈÉÊË ÊËÈÉ' DB 10,13,'ÈÉÊË UNIVERSIDAD DE GUANAJUATO ÊËÈÉ' DB 10,13,'ÈÉÊË ÊËÈÉ' DB 10,13,'ÈÉÊË FACULTAD DE INGENIERIA MECANICA, ELECTRICA Y ELECTRONICA ÊËÈÉ' DB 10,13,'ÈÉÊË ÊËÈÉ' DB 10,13,'ÈÉÊË INFORMATICA BASICA ÊËÈÉ' DB 10,13,'ÈÉÊË ÊËÈÉ' DB 10,13,'ÈÉÊË PROYECTO FINAL: ÊËÈÉ' DB 10,13,'ÈÉÊË PROGRAMA PARA CALCULAR EL FACTORIAL DE UN NUMERO ÊËÈÉ' DB 10,13,'ÈÉÊË ÊËÈÉ' DB 10,13,'ÈÉÊË MAESTRO: NOMBRE DEL MAESTRO ÊËÈÉ' DB 10,13,'ÈÉÊË ÊËÈÉ' DB 10,13,'ÈÉÊË ALUMNOS: ALUMNO1 ÊËÈÉ' DB 10,13,'ÈÉÊË ALUMNO2 ÊËÈÉ' DB 10,13,'ÈÉÊË ÊËÈÉ' DB 10,13,'ÈÉÊË <<-PRESIONE UNA TECLA PARA CONTINUAR, PRESIONE ESC PARA SALIR-->>ÊËÈÉ' DB 10,13,'ÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉ' DB 10,13,'ÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉ$' MSGI DB DB DB DB 'ÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉ' 10,13,'ÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉ' 10,13,'ÈÉÊË BIENVENIDO!!! ÊËÈÉ' 10,13,'ÈÉÊË ÊËÈÉ'

7

Proyecto Final de Informática Básica
DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB MSGE DB DB DB DB DB DB DB DB DB DB DB

Trimestre: Invierno 2008

10,13,'ÈÉÊË ESTE PROGRAMA PUEDE CALCULAR EL FACTORIAL DE UN NUMERO ÊËÈÉ' 10,13,'ÈÉÊË DENTRO DEL RANGO DE 0 A 16. ÊËÈÉ' 10,13,'ÈÉÊË ÊËÈÉ' 10,13,'ÈÉÊË RECUERDE QUE EL NUMERO INGRESADO DEBE SE ENTERO Y POSITIVO. ÊËÈÉ' 10,13,'ÈÉÊË ÊËÈÉ' 10,13,'ÈÉÊË ÊËÈÉ' 10,13,'ÈÉÊË DESPUES DE TECLEAR EL NUMERO PRESIONE ENTER PARA QUE EL ÊËÈÉ' 10,13,'ÈÉÊË PROGRAMA LO ACEPTE. ÊËÈÉ' 10,13,'ÈÉÊË ÊËÈÉ' 10,13,'ÈÉÊË ÊËÈÉ' 10,13,'ÈÉÊË POR EJEMPLO PARA CALCULAR 9! TECLEE 9 ÊËÈÉ' 10,13,'ÈÉÊË PARA CALCULAR 12! TECLEE 12 ÊËÈÉ' 10,13,'ÈÉÊË ÊËÈÉ' 10,13,'ÈÉÊË ÊËÈÉ' 10,13,'ÈÉÊË <<-PRESIONE UNA TECLA PARA CONTINUAR, PRESIONE ESC PARA SALIR-->>ÊËÈÉ' 10,13,'ÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉ' 10,13,'ÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉ$' '**************************************************************************' 10,13,'**************************************************************************' 10,13,'**** ****' 10,13,'**** ****' 10,13,'**** SE HA PROVOCADO UN ERROR, EL NUMERO QUE INGRESO NO ESTA DENTRO ****' 10,13,'**** DEL RANGO PERMITIDO (0 A 16) O BIEN HA TECLEADO ****' 10,13,'**** CARACTERES INVALIDOS. VUELVA A INTERNTARLO... ****' 10,13,'**** ****' 10,13,'**** <<-PRESIONE UNA TECLA PARA CONTINUAR, PRESIONE ESC PARA SALIR-->>****' 10,13,'**************************************************************************' 10,13,'**************************************************************************$'

DB 10,13,'--------------------------------------------------------------------------' DB 10,13,'--------------------------------------------------------------------------' DB 10,13,'-------' DB 10,13,'-------' DB 10,13,'---- SI DESEA PROBAR CON OTRO NUMERO PRESIONE UNA TECLA ----' DB 10,13,'-------' DB 10,13,'-------' DB 10,13,'-------' DB 10,13,'---<<-PRESIONE ESC PARA SALIR-->>----' DB 10,13,'--------------------------------------------------------------------------' DB 10,13,'--------------------------------------------------------------------------$' MSGN DB 'INGRESE UN NUMERO: $' MSGF DB 'EL FACTORIAL ES: $' .CODE INICIO: ;CARGAMOS EL SEGMENTO DE DATOS MOV AX,@DATA MOV DS,AX ;LLAMAR A LA MACRO QUE CONTIENE LAS FUNCIONES NECESARIAS PARA VALIDAR EL USURIO Y SU CONTRASEÑA password ;LLAMAMOS A LA MACRO PARA LIMPIAR LA PANTALLA LIMPIAR_PANTALLA ;PONEMOS LA PRESENTACION DEL PROGRAMA DEL PROGRAMA IMPRIMIR_CAD MSGP ;HACEMOS UNA PAUSA HASTA QUE SE PREIONE UNA TECLA LEER_SIN_ECO CMP AL,1BH ;IDENTIFICAMOS SI LA TECLA PREIONADA FUE ESC JE SALIROP ;HACEMOS UNA PAUSA HASTA QUE SE PRESIONE UNA TECLA LIMPIAR_PANTALLA ;PONEMOS LAS INSTRUCCIONES DEL PROGRAMA IMPRIMIR_CAD MSGI LEER_SIN_ECO CMP AL,1BH ;IDENTIFICAMOS SI LA TECLA PREIONADA FUE ESC JE SALIROP PREPARAR: XOR DI,DI CICLO_LIMPIAR:

MSGC

8

Proyecto Final de Informática Básica

Trimestre: Invierno 2008

MOV F[DI],00H MOV M[DI],00H MOV N[DI],00H INC DI CMP DI,14 JBE CICLO_LIMPIAR LIMPIAR_PANTALLA GOTOXY 8,5 ;LLAMAMOS A LA MACRO QUE IMPRIME LOS MENSAJES, PIDIENDOLE QUE IMPRIMA EL MENSAJE PIDIENDO UN ;NUMERO IMPRIMIR_CAD MSGN XOR DI,DI ;LEEMOS EL NUMERO INGRESADO, LE RESTAMOS 30H Y LO GUARDAMOS EN N[DI] CICLO_LEER: LEER_ECO CMP AL,0DH ;IDENTIFICAR TECLA ENTER JE INICIALIZACION SUB AL,30H MOV N[DI],AL INC DI JMP CICLO_LEER INICIALIZACION: ;SE COMPROBARA QUE EL NUMERO INGRESADO NO TENGA MAS DE DOS DIGITOS, DE SER ASI SE MANDARA EL ;MENSAJE DE ERROR, SI TIENE 1 DIGITO O 2 SE COMPROBARA QUE ESTEN EN EL RANGO VALIDO CMP DI,02H JA ERROR JE DOS_DIGITOS CMP DI,00H JE ERROR UN_DIGITO: CMP DI,09H JA ERROR JMP FACTORIAL SALIROP: JMP SALIR DOS_DIGITOS: CMP N[0],01H JA ERROR CMP N[1],06H JA ERROR XOR AX,AX XOR BX,BX ;HACEMOS UN AJUSTE CON EL FIN DE "CONVERTIR" EL NUMERO DECIMAL DE DOS DIGITOS INGRESADO EN UNO ;HEXADECIMAL DE UN SOLO DIGITO MOV AL,N[0] MOV BL,0AH MUL BL ADD N[1],AL MOV AL,N[1] MOV N[0],AL JMP FACTORIAL ;EL PROGRAMA LLEGARA A LA ETIQUETA DE ERROR SI ES QUE EL NUMERO INGRESADO ESTA FUERA DEL RANGO ;O SI LO QUE SE TECLEO SON CARACTERES INVALIDOS ERROR: LIMPIAR_PANTALLA IMPRIMIR_CAD MSGE LEER_SIN_ECO CMP AL,1BH JE SALIROP JMP PREPARAR FACTORIAL: ;CL ES EN CONTADOR QUE SE VA INCREMENTANDO EN 1 PARA HACER EL FACTORIAL MOV CL,01H MOV M[0],01H XOR BX,BX XOR AX,AX XOR SI,SI XOR DI,DI

9

Proyecto Final de Informática Básica

Trimestre: Invierno 2008

;EN ESTE CICLO SE MULTIPLICA CL POR CADA UNO DE LOS DIGITOS DE M,ES DECIR MULTIPLICA CL POR EL ;NUMERO DE ;14 DIGITOS M, EL RESULTADO SE VA GUARDANDO EN A, EN A[SI] LA PRIMERA CIFRA DEL RESULTADO DE LA ;MULTIPLICACION DE M[SI] Y EN A[SI+1] LA SEGUNDA CIFRA, POR LO QUE A[SI+1] ES UNA ESPECIE DE ;ACARREADOR. ;LUEGO EL RESULTADO TOTAL, YA CONDIREANDO LOS ACARREOS SE PASA A F MEDIANTE SUMAS, SE HACE UN ;AJUSTE EN LAS SUMAS Y F[SI+1] SE CONVIERTE EN UN ACARREADOR PARA ESAS SUMAS. CICLO1: MOV AL,CL MUL M[SI] AAM MOV A[SI],AL MOV A[SI+1],AH XOR AX,AX MOV AL,A[SI] ADD AL,F[SI] AAA MOV F[SI],AL ADD A[SI+01H],AH MOV AL,A[SI+01H] ADD F[SI+01H],AL INC SI INC BL CMP BL,0DH JBE CICLO1 MOV SI,00H MOV BL,00H ;LUEGO DEL PRIMER CICLO SE PASA A ESTE EN DONDE SE TRANSFIRE TODO EL VALOR DE F A M, TAMBIEN SE VA ;LIMPIANDO M VOLVIENDO A PONER TODOS SUS DIGITOS EN CERO. CICLO2: MOV AL,F[SI] MOV M[SI],AL MOV AL,00H MOV F[SI],AL INC SI INC BL CMP BL,0DH JBE CICLO2 MOV SI,00H MOV BL,00H INC CL CMP CL,N[DI] JBE CICLO1 JMP RESULTADO PREPARAROP: JMP PREPARAR RESULTADO: GOTOXY 8,6 ;LLAMAMOS A LA MACRO PARA IMPRIMIR EL MENSAJE DE RESULTADO IMPRIMIR_CAD MSGF ;IMPRIMIMOS EL FACTORIAL MOV SI,0EH ;EL RESULTADO DEL FACTORIAL QUEDA AL ULTIMO ALMACENADO EN M, ESTE CICLO SIRVE PARA IMPRIMIR TODOS

10

Proyecto Final de Informática Básica

Trimestre: Invierno 2008

;LOS DIGITOS DE M. CICLO_RESULTADO: DEC SI IMPRIMIR_CAR M[SI] CMP SI,00H JNE CICLO_RESULTADO ;EN ESTA ETIQUETA SE HACE QUE EL PROGRAMA IMPRIMA EL LETRERO DE QUE HACER SI SE DESEA CALCULAR ;OTRO FACTORIAL O SI SE DESEA SALIR. CONTINUAR: IMPRIMIR_CAD MSGC LEER_SIN_ECO CMP AL,1BH ;IDENTIFICAMOS SI LA TECLA PREIONADA FUE ESC JNE PREPARAROP SALIR: MOV AH,4CH INT 21H END INICIO

El programa hace uso de un archivo llamado MACROS.INC, en el cual se encuentran definidas las macros necesarias para el funcionamiento, esto se ha hecho con el fin de que el código fuente sea lo más corto posible. El listado de archivo MACROS.INC es el siguiente:
;SE INCLUYEN DISTINTAS MACROS UTILES PARA DIVERSOS PROGRAMAS ;IMPRIMIR UNA CADENA IMPRIMIR_CAD MACRO CADENA MOV DX,OFFSET CADENA MOV AH,09H INT 21H ENDM ;IMPRIMIR UN CARACTER, INCLUYE EL AJUSTE ASCII IMPRIMIR_CAR MACRO CARACTER MOV DL,CARACTER ADD DL,30H MOV AH,02H INT 21H ENDM ;LIMPIAR PANTALLA (VERSION SIMPLE) LIMPIAR_PANTALLA MACRO MOV AH,00H MOV AL,03H INT 10H ENDM ;LIMPIAR PANTALLA (SEGUNDA VERSION) LIMPIAR_PANTALLA2 MACRO MOV AX,0600H MOV BH,17H MOV CX,0000H MOV DX,1484FH INT 10H ENDM COLOR_PANTALLA MACRO COLOR MOV AH,00 MOV BL,COLOR INT 10H ENDM

;INICIALIZA COLOR DE FONDO ;LO INICIALIZA EN EL COLOR PEDIDO

11

Proyecto Final de Informática Básica
;LEER UNA TECLA CON ECO LEER_ECO MACRO MOV AH,01H INT 21H ENDM

Trimestre: Invierno 2008

;LEER UNA TECLA SIN ECO, PUEDE EMPLEARSE PARA SIMULAR EL INGRESO DE CONTRASEÑAS O PARA HACER UNA PAUSA EN EL PROGRAMA LEER_SIN_ECO MACRO MOV AH,07H INT 21H ENDM ;POSICIONAR EL PROMPT EN LAS COORDENADAS (X,Y) GOTOXY XOR MOV MOV MOV INT ENDM MACRO X,Y BH,BH DL,X DH,Y AH,02H 10H

;LA COMPONENTE DEL PROGRAMA QUE VALIDA EL USUARIO Y CONTRASEÑA DEFINIDA COMO UNA MACRO password macro .data msgtitulo db '*** INGRESO AL SISTEMA ***',13,10,'' db 10,13,'PARA ENTRAR AL SISTEMA INGRESE UN NOMBRE DE USUARIO Y CONTRASENNA VALIDOS' db 10,13,'ADVERTENCIA: AL HACER 3 INTENTOS ERRONEOS EL SISTEMA SE BLOQUEARA',13,10,'$' msgusuario db 10,13,'INGRESE EL NOMBRE DE USUARIO: $' msgcontra db 10,13,'INGRESE LA CONTRASENA: $' msgcorrecto db 10,13,'<<<DATOS CORRECTOS, AHORA ESTA DENTRO DEL SISTEMA>>>$' msgincorrecto db 10,13,'DATOS INCORRECTOS$' msgnuevamente db ', INTENTE NUEVAMENTE. <>INTENTOS SOBRANTES: $' msgbloq db 10,13,'<<<EL SISTEMA SE HA BLOQUEADO>>>$' msgpausa db 10,13,'PRESIONE UNA TECLA PARA CONTINUAR$' msgsalir db 10,13,'PREIONE UNA TECLA PARA TERMINAR$' datosok db 'E','X','A','M','E','N','F','I','N','A','L' t db ? y db ? .code main: mov ax,@data mov ds,ax mov t,3 limpiar_pantalla xor si,si xor ax,ax gotoxy 24,1 imprimir_cad msgtitulo inic: Imprimir_cad msgusuario Usuario: leer_eco cmp al,0dh ;Identificar tecla "enter" je Ready mov y[si],al inc si jmp Usuario Ready: Imprimir_cad msgcontra Contrasena: leer_sin_eco cmp al,0dh ;Identificar tecla "enter" je inic_checar

12

Proyecto Final de Informática Básica
mov y[si],al mov al, '*' sub al,30h imprimir_car al inc si jmp contrasena inic_checar: xor si,si xor cl,cl Ciclo_checar: mov al,datosok[si] cmp y[si], al jne invalido inc si inc cl cmp cl,0ah jbe ciclo_checar jmp correcto INIC2: imprimir_cad msgnuevamente imprimir_car t imprimir_cad msgpausa leer_sin_eco limpiar_pantalla JMP INIC invalido: Imprimir_cad msgincorrecto dec t cmp t, 0 ja inic2 Imprimir_cad msgbloq imprimir_cad msgsalir leer_sin_eco jmp salir correcto: Imprimir_cad msgcorrecto imprimir_cad msgpausa leer_sin_eco ende

Trimestre: Invierno 2008

La función del programa para validar el usuario y contraseña esta definida como una macro y contenida en el archivo MACROS.INC

13