Una manita con este programa
Publicado por Marta (2 intervenciones) el 15/06/2005 05:29:13
Buenas a todos
Quiza sea un poco exagerado poner todo este código, pero eske no se lo que falla. Me explico.
Este programa tiene que hacer la suma, resta, division y multiplicacion entre dos numeros menores que 65535. Lo que pasa es que al meter cualquier numero me salta error siempre, aunque el numero que meta sea mas bajo que el mencionado. No se donde esta el fallo por mas que miro.
Os agradeceria una ayudita please =)
.MODEL SMALL ; Define el modelo de memoria
Datos Segment ; Define el segmentos de datos
ErrorCAP DB 0 ;Bandera de error en la captura de las cantidades
Cantidad DB 0 ;Cantidad sobre la que se opera. Si es 0 la cantidad será la 1, y si es 1 será la 2.
CantUnoR DW 0 ;Guardara la cantidad 1 convertida en binario
CantDosR DW 0 ;Guardara la cantidad 2 convertida en binario
CantUnoN DB 6,0,6 DUP(?) ;Variable que almacena la cantidad 1
CantDosN DB 6,0,6 DUP(?) ;Variable que almacena la cantidad 2
Funcion DB 0 ;Variable que almacena la opcion a realizar
Resulta DB 13,10,'Resultado: $'
ResultaR DB 11 DUP(?)
Mensaje DB 13,10,'Operaciones basicas entre dos numeros'
DB 13,10,13,10,'$'
Pregunta DB 13,10,'Presione: ',13,10
DB ' 1 -> Multiplicacion ',13,10
DB ' 2 -> Division ',13,10
DB ' 3 -> Suma ',13,10
DB ' 4 -> Resta ',13,10
DB ' 5 -> Salir ',13,10,'$'
Error DB 7,13,10,'Selección invalida (1-5)',13,10,'$'
Error1 DB 7,13,10,'Cantidad 1 invalida. ',13,10,'$'
Error2 DB 7,13,10,'Cantidad 2 invalida. ',13,10,'$'
Error3 DB 7,13,10,'Cantidad fuera de rango (65535) ',13,10,'$'
Error4 DB 7,13,10,'Intento de división por cero. ',13,10,'$'
CantUnoM DB 13,10,'Introduzca la cantidad 1 (Menor a 65535): $'
CantDosM DB 13,10,'Introduzca la cantidad 2 (Menor a 65535): $'
; Tabla de potencias para conversión binaria/ASCII
Potencia DW 0001h, 000Ah, 0064h, 03E8h, 2710h
PotenciaF DW $
Datos ENDS
Codigo Segment para ;Define el área de código
assume cs:codigo,ds:datos,ss:pila
Principal proc far ;Inicio del programa principal
Empieza: ;Etiqueta de inicio del programa
Mov AH, 0Fh ;Obtiene modo de video actual
Int 10h
Mov AH, 00 ;Cambia el modo de video al mismo anterior
Int 10h ; para que se borre la pantalla
Mov AX, Datos ;Obtiene la direccion del segmento de datos
Mov DS, AX ;Inicializa a DS con esa dirección
Mov DX, Offset Mensaje ;Despliega el titulo del programa
Call Imprime ;Llama al procedimiento de imprimir
Mov Si, Offset ResultaR ;Inicializa la variable ResultaR
Add Si,11
Mov AL,'$'
Mov [Si],AL
OTRA:
Mov DX,Offset Pregunta ;Despliega menu de opciones
Call Imprime
Call ObtenTecla ;Espera a que se presione la opcion
Cmp Al,49 ;Compara la selección con el digito 1 ASCII
JAE SIGUE ;Si la opción es mayor a 1 salta a SIGUE
Mov DX,Offset Error ;Muestra mensaje de error
Call Imprime
JMP OTRA ;Salta a OTRA para volver a preguntar
SIGUE:
Cmp AL,53 ;Compara la selección con el digito 5 ASCII
JBE TODOBIEN ;Si es menor a 5 salta a TODOBIEN, sino continua
Mov DX, Offset Error ;Si la opcion fue mayor a 5 muestra el error
Call Imprime
JMP OTRA
TODOBIEN:
CMP Al,53 ;Compara la seleción con el digito 5 ASCII
JNZ CHECATODO ;Si no es igual salta a CHECATODO
JMP FUNCION5 ;Si es igual salta a FUNCION5 para terminar
CHECATODO:
Mov Funcion,AL ;Guarda el numero de funcion a realizar
CAPCANT01:
Mov DX,Offset CantUnoM ;Mensaje de captura de la cantidad 1
Call Imprime
Mov AH,0Ah ;Captura la cantidad (hasta 8 digitos)
Mov DX,Offset CantUnoN
Int 21h
Mov ErrorCAP,0 ;Supone que no hay errores y que se esta
Mov Cantidad,0 ; operando sobre la cantidad 1
Call ConvNUM ;Convierte cantidad 1 a binario
Cmp ErrorCAP,1 ;Verifica si hubo error
JZ CAPCANT01 ;En caso afirmativo regresa a la captura
Mov CantUnoR,BX ;Guarda el resultado de la conversion
CAPCANT02:
Mov ErrorCAP,0 ;Supone que no hay error
Mov Cantidad,1 ;Indica a ConvNUM que se trabajara con cantidad 2
Mov DX,Offset CantDosM ;Mensaje de captura de cantidad 2
Call Imprime
Mov AH,0Ah ;Captura de la cantidad 2
Mov DX,Offset CantDosM
Int 21H
Call ConvNum ;Convierte la cantidad 2 a binario
CMP ErrorCAP,1 ;Verifica si existe algun error
JZ CAPCANT02 ;En caso afirmativo regresa a la captura
Mov CantDosR,BX ;Almacena el valor binario de cantidad 2
;La siguiente parte es el proceso de seleccion de la operacion
;Que se realizara:
Mov AL,Funcion ;Carga en AL la funcion que seleccione el usuario
Cmp AL,31h ;Revisa si es 1
JNE FUNCION2 ;Si no es salta a FUNCION2
Call Multiplica ;Multiplica las cantidades
Jmp OTRA ;Regresa al menu principal
FUNCION2:
Cmp Al,32h ;Revisa si es 2
JNE FUNCION3 ;Si no es salta a FUNCION3
Call Divide ;Divide las cantidades
Jmp OTRA
FUNCION3:
CMP Al,33h ;Revisa si es 3
JNE FUNCION4 ;Si no es salta a FUNCION4
Call Suma ;Suma las cantidades
JMP OTRA
FUNCION4:
CMP Al, 34h ;Revisa si es 4
JNE FUNCION5 ;Si no es salta a FUNCION5
Call Resta ;Resta las cantidades
JMP OTRA
FUNCION5:
MOV Ax, 4C00h ;Funcion que termina
INT 21h ; el programa
Principal ENDP
Quiza sea un poco exagerado poner todo este código, pero eske no se lo que falla. Me explico.
Este programa tiene que hacer la suma, resta, division y multiplicacion entre dos numeros menores que 65535. Lo que pasa es que al meter cualquier numero me salta error siempre, aunque el numero que meta sea mas bajo que el mencionado. No se donde esta el fallo por mas que miro.
Os agradeceria una ayudita please =)
.MODEL SMALL ; Define el modelo de memoria
Datos Segment ; Define el segmentos de datos
ErrorCAP DB 0 ;Bandera de error en la captura de las cantidades
Cantidad DB 0 ;Cantidad sobre la que se opera. Si es 0 la cantidad será la 1, y si es 1 será la 2.
CantUnoR DW 0 ;Guardara la cantidad 1 convertida en binario
CantDosR DW 0 ;Guardara la cantidad 2 convertida en binario
CantUnoN DB 6,0,6 DUP(?) ;Variable que almacena la cantidad 1
CantDosN DB 6,0,6 DUP(?) ;Variable que almacena la cantidad 2
Funcion DB 0 ;Variable que almacena la opcion a realizar
Resulta DB 13,10,'Resultado: $'
ResultaR DB 11 DUP(?)
Mensaje DB 13,10,'Operaciones basicas entre dos numeros'
DB 13,10,13,10,'$'
Pregunta DB 13,10,'Presione: ',13,10
DB ' 1 -> Multiplicacion ',13,10
DB ' 2 -> Division ',13,10
DB ' 3 -> Suma ',13,10
DB ' 4 -> Resta ',13,10
DB ' 5 -> Salir ',13,10,'$'
Error DB 7,13,10,'Selección invalida (1-5)',13,10,'$'
Error1 DB 7,13,10,'Cantidad 1 invalida. ',13,10,'$'
Error2 DB 7,13,10,'Cantidad 2 invalida. ',13,10,'$'
Error3 DB 7,13,10,'Cantidad fuera de rango (65535) ',13,10,'$'
Error4 DB 7,13,10,'Intento de división por cero. ',13,10,'$'
CantUnoM DB 13,10,'Introduzca la cantidad 1 (Menor a 65535): $'
CantDosM DB 13,10,'Introduzca la cantidad 2 (Menor a 65535): $'
; Tabla de potencias para conversión binaria/ASCII
Potencia DW 0001h, 000Ah, 0064h, 03E8h, 2710h
PotenciaF DW $
Datos ENDS
Codigo Segment para ;Define el área de código
assume cs:codigo,ds:datos,ss:pila
Principal proc far ;Inicio del programa principal
Empieza: ;Etiqueta de inicio del programa
Mov AH, 0Fh ;Obtiene modo de video actual
Int 10h
Mov AH, 00 ;Cambia el modo de video al mismo anterior
Int 10h ; para que se borre la pantalla
Mov AX, Datos ;Obtiene la direccion del segmento de datos
Mov DS, AX ;Inicializa a DS con esa dirección
Mov DX, Offset Mensaje ;Despliega el titulo del programa
Call Imprime ;Llama al procedimiento de imprimir
Mov Si, Offset ResultaR ;Inicializa la variable ResultaR
Add Si,11
Mov AL,'$'
Mov [Si],AL
OTRA:
Mov DX,Offset Pregunta ;Despliega menu de opciones
Call Imprime
Call ObtenTecla ;Espera a que se presione la opcion
Cmp Al,49 ;Compara la selección con el digito 1 ASCII
JAE SIGUE ;Si la opción es mayor a 1 salta a SIGUE
Mov DX,Offset Error ;Muestra mensaje de error
Call Imprime
JMP OTRA ;Salta a OTRA para volver a preguntar
SIGUE:
Cmp AL,53 ;Compara la selección con el digito 5 ASCII
JBE TODOBIEN ;Si es menor a 5 salta a TODOBIEN, sino continua
Mov DX, Offset Error ;Si la opcion fue mayor a 5 muestra el error
Call Imprime
JMP OTRA
TODOBIEN:
CMP Al,53 ;Compara la seleción con el digito 5 ASCII
JNZ CHECATODO ;Si no es igual salta a CHECATODO
JMP FUNCION5 ;Si es igual salta a FUNCION5 para terminar
CHECATODO:
Mov Funcion,AL ;Guarda el numero de funcion a realizar
CAPCANT01:
Mov DX,Offset CantUnoM ;Mensaje de captura de la cantidad 1
Call Imprime
Mov AH,0Ah ;Captura la cantidad (hasta 8 digitos)
Mov DX,Offset CantUnoN
Int 21h
Mov ErrorCAP,0 ;Supone que no hay errores y que se esta
Mov Cantidad,0 ; operando sobre la cantidad 1
Call ConvNUM ;Convierte cantidad 1 a binario
Cmp ErrorCAP,1 ;Verifica si hubo error
JZ CAPCANT01 ;En caso afirmativo regresa a la captura
Mov CantUnoR,BX ;Guarda el resultado de la conversion
CAPCANT02:
Mov ErrorCAP,0 ;Supone que no hay error
Mov Cantidad,1 ;Indica a ConvNUM que se trabajara con cantidad 2
Mov DX,Offset CantDosM ;Mensaje de captura de cantidad 2
Call Imprime
Mov AH,0Ah ;Captura de la cantidad 2
Mov DX,Offset CantDosM
Int 21H
Call ConvNum ;Convierte la cantidad 2 a binario
CMP ErrorCAP,1 ;Verifica si existe algun error
JZ CAPCANT02 ;En caso afirmativo regresa a la captura
Mov CantDosR,BX ;Almacena el valor binario de cantidad 2
;La siguiente parte es el proceso de seleccion de la operacion
;Que se realizara:
Mov AL,Funcion ;Carga en AL la funcion que seleccione el usuario
Cmp AL,31h ;Revisa si es 1
JNE FUNCION2 ;Si no es salta a FUNCION2
Call Multiplica ;Multiplica las cantidades
Jmp OTRA ;Regresa al menu principal
FUNCION2:
Cmp Al,32h ;Revisa si es 2
JNE FUNCION3 ;Si no es salta a FUNCION3
Call Divide ;Divide las cantidades
Jmp OTRA
FUNCION3:
CMP Al,33h ;Revisa si es 3
JNE FUNCION4 ;Si no es salta a FUNCION4
Call Suma ;Suma las cantidades
JMP OTRA
FUNCION4:
CMP Al, 34h ;Revisa si es 4
JNE FUNCION5 ;Si no es salta a FUNCION5
Call Resta ;Resta las cantidades
JMP OTRA
FUNCION5:
MOV Ax, 4C00h ;Funcion que termina
INT 21h ; el programa
Principal ENDP
Valora esta pregunta


0