Ensamblador - Una manita con este programa

 
Vista:

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


Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Una manita con este programa

Publicado por Marta (2 intervenciones) el 15/06/2005 05:30:01
; Procedimientos o rutinas del programa
;-----------------------------------------------------------------------


Multiplica Proc Near ;inicio de procedimiento

Xor Dx, Dx ;DX = 0

Mov Ax, CantUnoR ;Primera cantidad

Mov Bx, CantDosR ;Segunda cantidad

Mul Bx ;Multiplica

Call ConvASCII ;Convierte en ASCII

Mov Dx, Offset Resulta ;Imprime mensaje del resultado

Call Imprime

Mov Dx, Offset ResultaR ;Imprime resultado

Call Imprime

Ret ;Regresa al programa principal

Multiplica Endp ;fin de procedimiento

Divide Proc Near

Mov Ax, CantUnoR ;Carga la cantidad 1 (dividendo)

Mov Bx, CantDosR ;Carga la cantidad 2 (divisor)

Cmp Bx, 0 ;Revisa que el divisor no sea cero

Jnz DIVIDE01 ;Si no es cero salta a DIVIDE01

Mov Cantidad, 3 ;Hay asi que muestra el mensaje y regresa al programa

Call HuboError

Ret

DIVIDE01:

Div Bx ;Efectua la division

Xor Dx, Dx ;Dx = 0. El residuo no es utilizado

Call ConvASCII ;Convierte en ASCII el resultado

Mov Dx, Offset Resulta ;Muestra el mensaje del resultado

Call Imprime

Mov Dx, Offset ResultaR ;Muestra el resultado

Call Imprime

Ret

Divide Endp

Suma Proc Near

Xor Dx, Dx ;DX = 0 por si existe acarreo

Mov Ax, CantUnoR ;Cantidad 1

Mov Bx, CantDosR ;Cantidad 2

Add Ax, Bx ;Realiza la suma

Jnc SUMACONV ;Si no existe acarreo salta a SUMACONV

Adc Dx,0 ;Si existe

SUMACONV:

Call ConvASCII ;Convierte en ASCII el resultado

Mov Dx, Offset Resulta ;Muestra el mensaje del resultado

Call Imprime

Mov Dx, Offset ResultaR ;Muestra el resultado

Call Imprime

Ret

Suma Endp

Resta Proc Near

Xor Dx, Dx ;Dx = 0 por si existe acarreo

Mov Ax, CantUnoR ;Ax = cantidad 1

Mov Bx, CantDosR ;Bx = cantidad 2

Sub Ax, Bx ;Realiza la resta

Jnc RESTACONV ;Si no hay acarreo salta a RESTACONV

Sbb Dx,0 ;Si hay acarreo

RESTACONV:

Call ConvASCII ;Convierte en ASCII el resultado

Mov Dx, Offset Resulta ;Muestra el mensaje del resultado

Call Imprime

Mov Dx, Offset ResultaR ;Muestra el resultado

Call Imprime

Ret

Resta Endp

Imprime Proc Near

Mov Ah, 09 ;se usa el servicio 09 de la interrupcion

Int 21h ;21h para desplegar una cadena

Ret

Imprime Endp

ObtenTecla Proc Near

Mov ah, 0 ;se usa la interrupcion 16h para

Int 16h ; leer una tecla

Ret

ObtenTecla Endp

ConvNum Proc Near

Mov Dx, 0Ah ;Multiplicador es 10

Cmp Cantidad, 0 ;Verifica si es la cantidad 1

Jnz CONVNUM01 ;No fue, entonces es cantidad 2 y salta

Mov Di, Offset CantUnoN + 1 ;Bytes leidos en la cantidad 1

Mov Cx, [Di]

Mov Si, Offset CantUnoN + 2 ;La cantidad 1

Jmp CONVNUM02

CONVNUM01:

Mov Di, Offset CantDosN + 1 ;Bytes leidos de la cantidad 2

Mov Cx, [Di]

Mov Si, Offset CantDosN + 2 ;La cantidad 2

CONVNUM02:

Xor Ch, Ch ;CH = 0

Mov Di, Offset Potencia ;Direccion de la tabla de potencias

Dec Si

Add Si, Cx

Xor Bx, Bx

Std

CONVNUM03:

Lodsb ;Carga en AL el byte cuya direccion es DS:SI

Cmp Al, 0 ;Compara el byte con el digito 0

Jb CONVNUM04 ;Si es menor es invalido y salta

Cmp Al, 9 ;Compara el byte con el digito 9

Ja CONVNUM04 ;Si es mayor es invalido y salta

Sub Al, 30h ;Convierte el digito de ASCII a binario

Cbw ;Convierte a palabra

Mov Dx, [Di] ;Obtiene la potencia a ser usada para multiplicar

Mul Dx ;Multiplica el numero

Jc CONVNUM05 ;Si hay acarreo salta (fue mayor a 65535)

Add Bx, Ax ;Suma el resultado a BX

Jc CONVNUM05 ;Si hay acarreo salta

Add Di, 2 ;Va a la siguiente potencia de 10

Loop CONVNUM03 ;salta hasta que CX sea igual a 0

Jmp CONVNUM06

CONVNUM04:

Call HuboERROR ;Hay algun error, depliega mensaje

Jmp CONVNUM06 ;salta a CONVNUM06

CONVNUM05:

Mov Cantidad, 2 ;Hay acareo en la conversion, lo que

Call HuboERROR ; significa que la cantidad es mayor a 65535

CONVNUM06:

Cld ;Regresa la bandera de direccion a su estado

Ret ; normal

ConvNum Endp

ConvASCII Proc Near

Push Dx

Push Ax ;Guarda el resultado en la pila

Mov Si, Offset ResultaR ;Inicializa la variable ResultaR

Mov Cx, 10 ; llenandola con asteriscos

Mov Al, '*'

ConvASCII01:

Mov [Si], Al

Inc Si

Loop ConvASCII01

Pop Ax

Pop Bx

Mov Bx, Ax ;Palabra baja de la cantidad

Mov Ax, Dx ;Palabra alta de la cantidad

Mov Si, Offset ResultaR ;Cadena donde se guarda el resultado

Add Si, 11

Mov Cx, 10 ;Divisor = 10

OBTENDIGITO:

Dec Si

Xor Dx, Dx ;DX contrendra el residuo

Div Cx ;Divide la palabra alta

Mov Di, Ax ;Guarda cociente en DI

Mov Ax, Bx ;Carga palabra baja en AX

Div Cx ;DX contiene registro de la division

Mov Bx, Ax ;Guarda el cociente

Mov Ax, Di ;Regresa la palabra alta

Add Dl, 30h ;Convierte residuo en ASCII

Mov [Si], Dl ;Lo almacena

Or Ax, Ax ;Si la palabra alta no es cero

Jnz OBTENDIGITO ; salta a OBTENDIGITO

Or Bx, Bx ;Si la palabra baja no es cero

Jnz OBTENDIGITO ; salta a OBTENDIGITO

Ret

ConvASCII Endp

HuboERROR Proc Near

Cmp Cantidad,0 ;Es la cantidad 1?

Jnz HUBOERROR02 ;no

Mov Dx, Offset Error1

Call Imprime

Mov ErrorCAP, 1 ;Enciende la bandera de error

Jmp HUBOERROR05

HUBOERROR02:

Cmp Cantidad, 1 ;Es la cantidad 2?

Jnz HUBOERROR03 ;no

Mov Dx, Offset Error2

Call Imprime

Mov ErrorCAP, 1

jmp HUBOERROR05

HUBOERROR03:

Cmp Cantidad, 2 ;Es una cantidad fuera de rango?

Jnz HUBOERROR04 ;no

Mov Dx, Offset Error3

Call Imprime

Mov ErrorCAP, 1

Jmp HUBOERROR05

HUBOERROR04:

Mov Dx, Offset Error4 ;Error de división por cero

Call Imprime

Mov ErrorCAP, 1

HUBOERROR05:

Ret

HuboERROR Endp

codigo ENDS

pila segment para stack

DW 512 DUP (?)

pila ENDS

END principal
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Una manita con este programa

Publicado por NIKKOCORP (1 intervención) el 29/12/2005 23:58:01
este programa no sta completo, t faltan los procs para hacer klas operaciones, deja lo hago y te digo, bye!! creo q si lo tengo, visita my web, suerte !!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

hola, yo tmb tengo este codigo.

Publicado por aLesita (2 intervenciones) el 18/04/2006 23:52:21
hola:

yo tmb andaba buscando un codigo para ke me realizara la suma, resta, la multiplicacion. . . y me encontre con una pagina de un chavo que manejaba eeste codigo para hacer tal programa, y estuve checando el ke tu tienes con el ke yo tengo y le faltan muchisisisisimas cosas. entonces no t4e desesperres por qu e no te sale, por que pues esta mal, y le faltan muchas cosas.

atte : ale
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar