Sunteți pe pagina 1din 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 10,13,'ÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉ'
DB 10,13,'ÈÉÊË BIENVENIDO!!! ÊËÈÉ'
DB 10,13,'ÈÉÊË ÊËÈÉ'

7
Proyecto Final de Informática Básica Trimestre: Invierno 2008

DB 10,13,'ÈÉÊË ESTE PROGRAMA PUEDE CALCULAR EL FACTORIAL DE UN NUMERO ÊËÈÉ'


DB 10,13,'ÈÉÊË DENTRO DEL RANGO DE 0 A 16. ÊËÈÉ'
DB 10,13,'ÈÉÊË ÊËÈÉ'
DB 10,13,'ÈÉÊË RECUERDE QUE EL NUMERO INGRESADO DEBE SE ENTERO Y POSITIVO. ÊËÈÉ'
DB 10,13,'ÈÉÊË ÊËÈÉ'
DB 10,13,'ÈÉÊË ÊËÈÉ'
DB 10,13,'ÈÉÊË DESPUES DE TECLEAR EL NUMERO PRESIONE ENTER PARA QUE EL ÊËÈÉ'
DB 10,13,'ÈÉÊË PROGRAMA LO ACEPTE. ÊËÈÉ'
DB 10,13,'ÈÉÊË ÊËÈÉ'
DB 10,13,'ÈÉÊË ÊËÈÉ'
DB 10,13,'ÈÉÊË POR EJEMPLO PARA CALCULAR 9! TECLEE 9 ÊËÈÉ'
DB 10,13,'ÈÉÊË PARA CALCULAR 12! TECLEE 12 ÊËÈÉ'
DB 10,13,'ÈÉÊË ÊËÈÉ'
DB 10,13,'ÈÉÊË ÊËÈÉ'
DB 10,13,'ÈÉÊË <<-PRESIONE UNA TECLA PARA CONTINUAR, PRESIONE ESC PARA SALIR-->>ÊËÈÉ'
DB 10,13,'ÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉ'
DB 10,13,'ÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉÊËÈÉ$'

MSGE DB '**************************************************************************'
DB 10,13,'**************************************************************************'
DB 10,13,'**** ****'
DB 10,13,'**** ****'
DB 10,13,'**** SE HA PROVOCADO UN ERROR, EL NUMERO QUE INGRESO NO ESTA DENTRO ****'
DB 10,13,'**** DEL RANGO PERMITIDO (0 A 16) O BIEN HA TECLEADO ****'
DB 10,13,'**** CARACTERES INVALIDOS. VUELVA A INTERNTARLO... ****'
DB 10,13,'**** ****'
DB 10,13,'**** <<-PRESIONE UNA TECLA PARA CONTINUAR, PRESIONE ESC PARA SALIR-->>****'
DB 10,13,'**************************************************************************'
DB 10,13,'**************************************************************************$'

MSGC 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:

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 ;INICIALIZA COLOR DE FONDO
MOV BL,COLOR ;LO INICIALIZA EN EL COLOR PEDIDO
INT 10H
ENDM

11
Proyecto Final de Informática Básica Trimestre: Invierno 2008

;LEER UNA TECLA CON ECO

LEER_ECO MACRO
MOV AH,01H
INT 21H
ENDM

;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 MACRO X,Y


XOR BH,BH
MOV DL,X
MOV DH,Y
MOV AH,02H
INT 10H
ENDM

;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 Trimestre: Invierno 2008

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

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

S-ar putea să vă placă și