Calculadora que permite realizar las operaciones básicas (sumar, restar, multiplicar y dividir) con números de 8 dígitos, utiliza procedimientos para reducir el código y el tamaño del programa.
;este programa es una calculadora con las operaciones basicas
;suma,resta,multi y divicion, utiliza registros de 32bits
;los extendidos y puede hacer operaciones con 8 digitos
.model tiny
.stack
.data
numstr db 8 dup ('0'),'$'
numstr2 db ' $'
numero dd 0
posi dd 10000000,1000000,100000,10000,1000,100,10,1
opc1 db "1.- Sumar 2 No",10,13,"$"
opc2 db "2.- Restar 2 No",10,13,"$"
opc3 db "3.- Mul. 2 No",10,13,"$"
opc4 db "4.- Div. 2 No",10,13,"$"
opc5 db "5.- Salir",10,13,"$"
opc6 db "Elige una opc => $"
salt db 10,13,"$"
num1 db "No 1 => $"
num2 db "No 2 => $"
res db "Resultado => $"
resi db " Residuo => $"
.386
.code
.startup
clear_cad proto c, cad_dir:ptr byte, car:byte, count:byte
write proto c, dir_cad:ptr byte
writec proto c, car:byte
jmp repite
suma: ;sumar dos numeros
;mensaje del primer valor
invoke write, addr salt
invoke write, addr num1
call leer ;lee un numero
mov Ebx,numero ;muevo al a bl
;mensaje del segundo valor
invoke write, addr salt
invoke write, addr num2
call leer ;lee otro numero
add Ebx,numero ;sumo bx + numero 2
mov numero,Ebx ;respaldo
;mensaje del resultado
invoke write, addr salt
invoke write, addr res
call mostrar ;muestra el resultado
call readc ;espero a que pecione tecla
jmp repite
resta: ;restar dos numeros
invoke write, addr salt
invoke write, addr num1 ;mensaje del primer valor
call leer ;lee un numero
mov Ebx,numero ;muevo al a bl
invoke write, addr salt
invoke write, addr num2 ;mensaje del segundo valor
call leer ;lee un numero
sub Ebx,numero ;sumo bl - al
mov numero,Ebx
invoke write, addr salt
invoke write, addr res ;mensaje del resultado
call mostrar ;muestra el resultado
call readc ;espero a que pecione tecla
jmp repite
multi: ;multiplicar dos numeros
invoke write, addr salt
invoke write, addr num1 ;mensaje del primer valor
call leer ;lee un numero
mov Ebx,numero ;muevo al a bl
invoke write, addr salt
invoke write, addr num2 ;mensaje del segundo valor
call leer ;lee un numero
mov Eax,numero
mul Ebx ;sumo bl * al
mov numero,Eax ;respaldo
invoke write, addr salt
invoke write, addr res ;mensaje del resultado
call mostrar ;muestra el resultado
call readc ;espero a que pecione tecla
jmp repite
divide: ;divide dos numeros
invoke write, addr salt
invoke write, addr num1 ;mensaje del primer valor
call leer ;lee un numero
mov Ebx,numero ;muevo al a bl
invoke write, addr salt
invoke write, addr num2 ;mensaje del segundo valor
call leer ;lee un numero
mov Eax,Ebx
mov Ebx,numero
div Ebx ;sumo bl / al
mov numero,Eax ;respaldo
mov Ebx,Edx
invoke write, addr salt
invoke write, addr res ;mensaje del resultado
call mostrar ;muestra el resultado
invoke write, addr resi ;mensaje de residuo
mov numero,Ebx
call mostrar ;muestra el residuo
call readc ;espero a que pecione tecla
jmp repite
repite: ;ciclo principal del programa
mov ah,00h ;limpiamos pantalla
mov al,03h
int 10h
invoke write, addr opc1
invoke write, addr opc2
invoke write, addr opc3
invoke write, addr opc4
invoke write, addr opc5
invoke write, addr opc6
mov ah,01h ;01h lee un caracter
int 21h
cmp al,31h ;compara si es 1
je suma ;salta a sumar
cmp al,32h
je resta
cmp al,33h
je multi
cmp al,34h ;compara si es 4
je divide ;salta a dividir
cmp al,35h ;si es 5 se sale
jne repite
.exit
;escribir una cadena
write proc c, dir_cad:ptr byte
mov ah,09h
mov dx,dir_cad
int 21h
ret
write endp
;escribe un caracter
writec proc c, car:byte
mov ah,02h
mov dl,car
int 21h
ret
writec endp
;leer un caracter
readc proc near
mov ah,01h
int 21h
ret
readc endp
leer proc near ;Macro lee los numeros del teclado
mov si,0
limpia:
mov numstr2[si],' '
mov numstr[si],'0'
inc si
cmp si,8
jne limpia
mov numero,0
mov si,0 ;leemos los numeros del teclado
lee:
mov ah,01h ;01h lee un caracter
int 21h
cmp al,13 ;si el caracter es enter
je recore ;salta a recorer los numeros
mov numstr[si],al ;almacenamos el caracter
inc si ;incrementamos el indice si
cmp si,8 ;si si es 8
jne lee ;si no lee otro caracter
je continua ;si si salta a continua
recore:
mov di,8
recorre: ;recorremos los numeros a la derecha
dec si
dec di
mov al,numstr[si]
mov numstr[di],al
mov numstr[si],30h
cmp si,0
jne recorre
continua:
mov si,0 ; convierte de cadena a numero
mov di,0
convierte:
sub EDX,EDX
mov EAX,0
mov al,numstr[si]
sub EAX,48
mov ecx,posi[di]
mul ecx
add numero,EAX
inc si
add di,4
cmp si,8
jne convierte
ret
leer endp
mostrar proc near ;muestra el resultado de la operacion
mov si,0 ;convierte de numero a cadena
mov di,0
mov EAX,numero
convierte2:
mov EDX,0
div posi[di]
add EAX,48
mov numstr2[si],al
mov EAX,EDX
inc si
add di,4
cmp si,8
jne convierte2
invoke write, addr numstr2
ret
mostrar endp
end
Descargar