You are on page 1of 7

;Autor Victor De la Rocha

;+-----------------------------------+
;| Programa que realiza la suma,
|
;| resta, multiplicacin o divisin |
;| de dos numeros del 0 al 9
|
;|
|
;+-----------------------------------+
.model small
.stack 100h
.data
main proc
mov ax,@data
mov ds,ax
menu1: call menu
mov b,0
mov e,0

;Mandamos llamar al procedimiento menu


;Inicializamos nuestras variables

call leecar
lee un caracter
cmp al,'s'
je prefin
cmp e,1
je menu1
os a menu1
mov v1,al

;Mandamos llamar al procedimiento leecar el cual

mov b,1
call leecar
lee un caracter
cmp al,'s'
je prefin
cmp e,1
je menu1
os a menu1
mov op,al

;Cambiamos el estado de nuestra bandera


;Mandamos llamar al procedimiento leecar el cual

mov b,0
call leecar
lee un caracter
cmp al,'s'
je prefin
cmp e,1
je menu1
os a menu1
mov v2,al

;Cambiamos el estado de nuestra bandera


;Mandamos llamar al procedimiento leecar el cual

cmp op,'+'
je funcsuma
cmp op,'-'
je funcresta
cmp op,'*'
je funcmulti
cmp op,'/'

;Comparamos el caracter leido con 's'


;Si es igual salimos del programa
;Comparamos la variable e con 1
;Si es igual quiere decir que hay error y saltam
;Almacenamos el numero leido en la variable v1

;Comparamos el caracter leido con 's'


;Si es igual salimos del programa
;Comparamos la variable e con 1
;Si es igual quiere decir que hay error y saltam
;Almacenamos el operador leido en la variable op

;Comparamos el caracter leido con 's'


;Si es igual salimos del programa
;Comparamos la variable e con 1
;Si es igual quiere decir que hay error y saltam
;Almacenamos el numero leido en la variable v2
;Comparamos el operador con '+'
;Si es igual saltamos a funcsuma
;Y asi con las demas comparaciones

je funcdivi
mov ah,9
lea dx,msg3
int 21h
mov ah,8
e en pantalla), crea el efecto
int 21h
jmp menu1
prefin:
e codigo pasan de los 40bytes
jmp fin
funcsuma:
call sumaproc
mov ah,9
lea dx,msg2
int 21h
call convbin
a binario
jmp menu1
que esta al inicio
funcresta:
call restaproc
mov ah,9
lea dx,msg2
int 21h
call convbin
a binario
jmp menu1
que esta al inicio
funcmulti:
call multiproc
mov ah,9
lea dx,msg2
int 21h
call convbin
a binario
jmp menu1
que esta al inicio
funcdivi:
call diviproc
mov ah,9
lea dx,msg2
int 21h
call convbin
a binario
jmp menu1
que esta al inicio

;Si no es igual a ningun operador entonces


;Imprimimos el mensaje de error de expresion
;Servicio 8 lee un caracter sin eco(no se imprim
de presiona una tecla para continuar...

;Esta etiqueta se pone porque las demas lineas d


;Esto se hace para poder llegar a fin
;Mandamos llamar el procedimiento sumaproc
;Servicio 9 para imprimir cadenas
;Seleccionamos la cadena de Resultado en Binario
;Imprimimos la cadena
;Mandamos llamar el procedimiento que convierte
;Al finalizar el procedimiento saltamos a menu1
;Mandamos llamar el procedimiento restaproc
;Servicio 9 para imprimir cadenas
;Seleccionamos la cadena de Resultado en Binario
;Imprimimos la cadena
;Mandamos llamar el procedimiento que convierte
;Al finalizar el procedimiento saltamos a menu1
;Mandamos llamar el procedimiento multiproc
;Servicio 9 para imprimir cadenas
;Seleccionamos la cadena de Resultado en Binario
;Imprimimos la cadena
;Mandamos llamar el procedimiento que convierte
;Al finalizar el procedimiento saltamos a menu1
;Mandamos llamar el procedimiento diviproc
;Servicio 9 para imprimir cadenas
;Seleccionamos la cadena de Resultado en Binario
;Imprimimos la cadena
;Mandamos llamar el procedimiento que convierte
;Al finalizar el procedimiento saltamos a menu1

fin:
mov ah,4ch
int 21h
main endp

;***********************************LEER
leecar proc near
mov ah,1
;Servicio 1 para leer un caracter

int 21h
cmp b,0
je numero
ar numero
jmp operador

;El caracter leido se almacena en al


;Comparamos nuestra variable bandera
;Si es igual a '0' cero entonces queremos captur
;Sino entonces queremos capturar un operador

numero:
cmp al,'c'
;Comparamos el caracter leido con 'c'
je borra
;Si el caracter leido es igual al caracter 'c' b
orramos todo y volvemos a iniciar
cmp al,'+'
;Comparamos el caracter leido con '+'
je error
;Si es igual hay un error en la expresion ya que
debe de ser <NUMERO><OPERADOR><NUMERO> == 2+5
cmp al,'-'
;E igual para las siguientes lineas
je error
cmp al,'*'
je error
cmp al,'/'
je error
jmp sleecar
;Si no es igual a las demas saltamos a la salida
operador:
cmp al,'c'
;Comparamos el caracter leido con 'c'
je borra
;Si el caracter leido es igual al caracter 'c' b
orramos todo y volvemos a iniciar
cmp al,'0'
;Comparamos el caracter leido con '0'
je error
;Si es igual hay un error en la expresion ya que
debe de ser <NUMERO><OPERADOR><NUMERO> == 2+5
cmp al,'1'
;E igual para las siguientes lineas
je error
cmp al,'2'
je error
cmp al,'3'
je error
cmp al,'4'
je error
cmp al,'5'
je error
cmp al,'6'
je error
cmp al,'7'
je error
cmp al,'8'
je error
cmp al,'9'
je error
jmp sleecar
;Si no es igual a las demas saltamos a la salida
borra:
mov e,1
pantalla
jmp sleecar

;Cambiamos a nuestra variable e a 1 para limpiar

error:
mov ah,9
lea dx,msg3
int 21h
;Imprimimos el mensaje de error de expresion
mov ah,8
;Servicio 8 lee un caracter sin eco(no se imprim
e en pantalla), crea el efecto de presiona una tecla para continuar...

int 21h
mov e,1
pantalla

;Y hacemos a nuestra variable e a 1 para limpiar

sleecar:
RET
leecar endp
;***************************************
;***********************************MENU
menu proc near
mov ah,9
;Servicio 9 para imprimir una cadena
lea dx,ms
;Seleccionamos la cadena ms
int 21h
;la imprimimos
lea dx,lin1
;seleccionamos la cadena lin1
int 21h
;la imprimimos
lea dx,lin2
;y asi para las demas lineas
int 21h
lea dx,lin3
int 21h
lea dx,lin4
int 21h
lea dx,lin5
int 21h
lea dx,lin6
int 21h
lea dx,lin7
int 21h
lea dx,lin8
int 21h
lea dx,lin9
int 21h
lea dx,lin10
int 21h
lea dx,lin11
int 21h
lea dx,lin12
int 21h
lea dx,lin13
int 21h
lea dx,lin14
int 21h
lea dx,lin15
int 21h
RET
menu endp
;/***********************************SUMA
sumaproc proc near
mov al,v1
;Pasamos nuestro primer valor a al
sub al,30h
;Le restamos 30h para convertirlo a numero
mov bl,al
;Y lo pasamos a bl
mov al,v2
;Pasamos nuestro segundo valor a al
sub al,30h
;Le restamos 30h para convertirlo a numero
add bl,al
;Y lo sumamos con bl que contiene el primer nume
ro
mov ah,9
lea dx,msg1

int
mov
mov
mov
add
int

21h
ah,2
dl,bl
v1,dl
dl,30h
21h

;Imprimimos el mensaje de resultado


;Servicio 2 imprime un caracter almacenado en dl
;Pasamos a dl el resultado
;Respaldamos tambien el resultado en v1
;Sumamos 30h a dl para convertirlo a caracter
;Imprimimos el resultado

RET
sumaproc endp
;/***************************************

;/**********************************RESTA
restaproc proc near
mov al,v1
;Pasamos nuestro primer valor a al
sub al,30h
;Le restamos 30h para convertirlo a numero
mov bl,al
;Y lo pasamos a bl
mov al,v2
;Pasamos nuestro segundo valor a al
sub al,30h
;Le restamos 30h para convertirlo a numero
sub bl,al
;Restamos bl - al
mov
lea
int
mov
mov
mov
add
int

ah,9
dx,msg1
21h
ah,2
dl,bl
v1,dl
dl,30h
21h

;Imprimimos el mensaje de resultado


;Servicio 2 imprime un caracter almacenado en dl
;Pasamos a dl el resultado
;Respaldamos tambien el resultado en v1
;Sumamos 30h a dl para convertirlo a caracter
;Imprimimos el resultado

RET
restaproc endp
;/***************************************

;/*************************MULTIPLICACIN
multiproc proc near
mov al,v1
;Pasamos nuestro primer valor a al
sub al,30h
;Le restamos 30h para convertirlo a numero
mov bl,al
;Y lo pasamos a bl
mov al,v2
;Pasamos nuestro segundo valor a al
sub al,30h
;Le restamos 30h para convertirlo a numero
and ah,00h
;Le aplicamos una
AX para que quede con ceros 0000
and bh,00h
;Le aplicamos una
BX para que quede con ceros 0000
mul bx
;Multiplicamos AX
mov bl,al
;El resultado que

mascara a la parte superior de


mascara a la parte superior de
con BX
esta en al lo pasamos a bl

mov ah,9
lea dx,msg1
int 21h

;Imprimimos el mensaje de resultado

mov
mov
mov
add

;Servicio 2 imprime un caracter almacenado en dl


;Pasamos a dl el resultado
;Respaldamos tambien el resultado en v1
;Sumamos 30h a dl para convertirlo a caracter

ah,2
dl,bl
v1,dl
dl,30h

int 21h
;Imprimimos el resultado
RET
multiproc endp
;/***************************************
;/*******************CONVERSION
convbin proc near
mov bl,v1
mov ah,2
mov cl,128
ara un registro de 8 bits

A BINARIO

comp:

cmp bl,cl
jae restar

;Comparamos bl con cl
;Si es mayor o igual saltamos a la etiqueta rest

mov dl,'0'
int 21h
jmp ifs

;Sino pasamos a dl el caracter 0


;y lo imprimimos
;saltamos a ifs

;Cargamos el resultado en bl
;Servicio 2 para imprimir un caracter
;Ponemos a cl en 128, que es el valor mas alto p

ar

restar: sub
en cl, esto
mov
int

bl,cl
;En la etiqueta restar restamos a bl lo que hay
para ir quitandole unos supuestamente
dl,'1'
;Pasamos a dl el caracter 1
21h
;y lo imprimimos

ifs:
shr cl,1
;Desplazamos a la derecha a cl una vez, esto hac
e el efecto de division entre 2
jz salirr
;Si la operacion anterior arroja un 0 saltamos a
salirr
jmp comp
;Sino saltamos a comp, al inicio
salirr:
mov ah,8
;Servicio 8 lee un caracter sin eco(no se imprim
e en pantalla), crea el efecto de presiona una tecla para continuar...
int 21h
RET
convbin endp
;/*******************************DIVISIN
diviproc proc near
mov al,v1
;Pasamos nuestro primer valor a al
sub al,30h
;Le restamos 30h para convertirlo a numero
mov bl,al
;Y lo pasamos a bl
mov al,v2
;Pasamos nuestro segundo valor a al
sub al,30h
;Le restamos 30h para convertirlo a numero
and ah,00h
;Le aplicamos una mascara a la parte superior de
AX para que quede con ceros 0000
and bh,00h
;Le aplicamos una mascara a la parte superior de
BX para que quede con ceros 0000
xchg ax,bx

;Intercambiamos los valores de AX con BX y vicev

ersa
cwd
;Cambiamos AX de word a dobleword para que tenga
capacidad el programa de dividir
div bx
;Dividimos.. Siempre divide AX/BX el resultado l
o almacena en AX, el residuo queda en DX
mov bx,ax
;Pasamos el resultado a bx
mov b,dl
;Pasamos el residuo a b

mov ah,9
lea dx,msg1
int 21h

;Imprimimos el mensaje de resultado

mov
mov
mov
add
int

;Pasamos a dx el resultado
;Respaldamos tambien el resultado en v1
;Sumamos 30h a dl para convertirlo a caracter
;Imprimimos el resultado

ah,2
dx,bx
v1,dl
dl,30h
21h

cmp b,0

;Comparamos la variable que contiene el residuo

con 0
jg residuo
;Si es mayor de 0 quiere decir que hay residuo y
saltamos a la etiqueta residuo
jmp dsal
;Si es igual a 0 el residuo no hay residuo y sal
tamos a la etiqueta dsal
residuo:
mov ah,9
lea dx,resi
int 21h

;Servicio 9 para imprimir cadenas


;Seleccionamos la cadena contenida en resi
;Imprimimos

mov ah,2

;Servicio 2 para imprimir un caracter contenido

mov dl,b
add dl,30h
int 21h

;Pasamos a dl el valor del residuo


;Sumamos 30h a dl para convertirlo a caracter
;Imprimimos el resultado

en dl

dsal:
RET
diviproc endp
end main