name "Calculador"
;Se define la macro a usar en el programa.
PUTC MACRO char
PUSH AX
MOV AL, char
MOV AH, 0Eh
INT 10h
POP AX
ENDM
org 100h
jmp start; Salta al arranque.
; Se definen variables
msg0 db "Solo se admiten numeros enteros, y las operaciones + - * /...$"
msg1 db 0Dh,0Ah, 0Dh,0Ah," $"
msg2 db " $"
msg3 db 0Dh,0Ah,"_______________________", 0Dh,0Ah, 0Dh,0Ah, '$'
msg4 db 0dh,0ah ,'Fin de la ejecucion...pulse una tecla...', 0Dh,0Ah, '$'
err1 db "Operador erroneo!", 0Dh,0Ah , '$'
smth db " Aproximadamente... $"
opr db '?'
; Se crea espacio para los operadores numericos.
num1 dw ?
num2 dw ?
;Bloque de arranque
start:
mov dx, offset msg0; Envia mensaje de inicio.
mov ah, 9
int 21h
lea dx, msg1; Envia mensaje 1...en este caso un salto de linea con espacio.
mov ah, 09h
int 21h
call scan_num; Llama al macro de lectura para capturar el numero de varias cifras.
mov num1, cx; Guarda el valor de cx en num1
;Salto para recargar el espacio de trabajo.
putc 0Dh
putc 0Ah
; captura el operador
mov ah, 1
int 21h
mov opr, al
;Salto para recargar el espacio de trabajo.
putc 0Dh
putc 0Ah
;Compara el operador par validarlo.
cmp opr, '*'; Compara para nulo.
jb error
cmp opr, '/'; Compara para caracteres no validos.
ja error
lea dx, msg2; Envia mensaje 2...en este caso un espacio.
mov ah, 09h
int 21h
; Llama al macro de lectura para capturar el numero de varias cifras.
call scan_num
; Guarda el valor de cx en num2
mov num2, cx
lea dx, msg3
mov ah, 09h ; Lanza la raya de resultado.
int 21h
;compara para saber que operacion realizar.
cmp opr, '+'
je suma
cmp opr, '-'
je resta
cmp opr, '*'
je multiplica
cmp opr, '/'
je divide
;Bloque de error
error:
lea dx, err1
mov ah, 09h ; Lanza el menaje de error
int 21h
;Bloque de finalizacion
exit:
lea dx, msg4; Lanza el mensaje de finalizacion.
mov ah, 09h
int 21h
mov ah, 0; Espera que se pulse una tecla
int 16h
ret; Retorna al SO.
;Bloque de suma
suma:
lea dx, msg2; Envia mensaje 2...en este caso un espacio.
mov ah, 09h
int 21h
mov ax, num1; Carga en ax el valor de num1.
add ax, num2; Realiza la operacion.
call print_num; Llama a la macro para imprimir el resultado.
jmp exit
;Boque de resta
resta:
lea dx, msg2
mov ah, 09h
int 21h
mov ax, num1
sub ax, num2
call print_num
jmp exit
;Bloque de multiplicasion
multiplica:
lea dx, msg2
mov ah, 09h
int 21h
mov ax, num1
imul num2 ; (dx ax) = ax * num2.
call print_num ; print ax value.
; dx is ignored (calc works with tiny numbers only).
jmp exit
;Bloque de division
divide:
lea dx, msg2
mov ah, 09h
int 21h
mov dx, 0
mov ax, num1
idiv num2 ; Verifica que la divicion se exacta o no.
cmp dx, 0
jnz aprox
call print_num
jmp exit
;Bloque de division aproximada
aprox:
call print_num
lea dx, smth
mov ah, 09h ; Envia mensaje de de aproximacion.
int 21h
jmp exit