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
Este programita es el que convierte de número a cadena, permite convertir hasta números de 8 dígitos a cadena.
;pro-gramas.com
;programa que convierte de numero a cadena de 8 digitos
.model small
.stack
.data
numero dd 44334334
posi dd 10000000,1000000,100000,10000,1000,100,10,1
numstr db ' $'
.386
.code
.startup
mov si,0
mov di,0
mov EAX,numero
convierte2:
mov EDX,0
div posi[di]
add EAX,48
mov numstr[si],al
mov EAX,EDX
inc si
add di,4
cmp si,8
jne convierte2
lea dx,numstr
mov ah,09h
int 21h
.exit
end
;elgame
;programa que lee hasta 8 caracteres y los convierte a
;un numero para manipularlo con operaciones + - / *
;o cualquier otra utilidad
.model small
.stack
.data
numstr db 8 dup ('0'),'$'
numstr2 db ' $'
numero dd 0
posi dd 10000000,1000000,100000,10000,1000,100,10,1
.386 ;emular con registros de 32bits
.code
.startup
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
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
mov ah,09h
lea dx,numstr2
int 21h
.exit
end
Este programa permite convertir números en carácter a números, esta un poco limitado ya que solo puedes convertir números de dos dígitos, en otro post tenemos un programa que convierte números de 8 dígitos.
;programa que convierte No cadena en No
;de dos caracteres
;pro-gramas.com
.model tiny
.stack
.data
num db 0
posi db 10,1
cuantos dw 2
cad db 2
.code
.startup
mov SI,0
ciclo:
mov ah,01h
int 21h
sub al,30h
mov cad[SI],al
inc SI
cmp SI,cuantos
jne ciclo
mov num,0
mov SI,0
ciclo2:
mov al,cad[SI]
mov dl,posi[SI]
mul dl
add num,al
inc SI
cmp SI,cuantos
jne ciclo2
mov ah,00h
mov al,num
mov bl,posi[0]
div bl
mov bx,ax
mov ah,02h
mov dl,bl
add dl,30h
int 21h
mov dl,bh
add dl,30h
int 21h
.exit
end
El programa en si es un macro que recibe dos parámetros (fila, columna) y con la interrupción 02h de la 10h (manejo de pantalla) posiciona el cursor en la fila y columna que especifiquemos.
;www.pro-gramas.com
;programa que realiza el gotoxy en ensamblador
;utilizando macros para simplificar
.model tiny
.data
ms db 'Elgame - www.pro-gramas.com$'
.code
gotoxy macro fil,col
mov ah,02h ;posiciona el cursor
mov dh,fil ;fila
mov dl,col ;columna
mov bh,0 ;pagina de video
int 10h
endm
.startup
gotoxy 10,10 ;macro gotoxy
mov ah,09h ;mostramos la cadena
lea Dx,ms
int 21h
mov ah,01h ;pedimos un caracter
int 21h ;para esperar el resultado
.exit
end
En este pequeño programa en ensamblador, limpia la pantalla; este programa te ilustra el uso de macros en ensamblador, y el uso de la interrupción 00h de la 10h (manejo de pantalla).
;www.pro-gramas.com
;programa que limpia la pantalla, usamos macros
;para utilizarlo en cualquier programa
.model tiny
.data
.code
clear macro
mov ah,00h ;limpia la pantalla
mov al,03h
int 10h
endm
.startup
clear ;macro clear
mov ah,01h ;pedimos un caracter
int 21h ;para esperar el resultado
.exit
end
En este pequeño programa en ensamblador, podremos aprender o comprender el funcionamiento de los ciclos loop, además de leer caracteres sin eco del teclado con 08h de la 21h y mostrarlos en pantalla con 02h de la 21h.
;www.pro-gramas.com
;programa que lee 5 caracteres del teclado sin eco y
;posteriormente lo imprime
.model tiny
.stack
.data
.code
.startup
mov CX,5
otro:
mov ah,08h ;lee un caracter desde el teclado sin echo
int 21h
mov ah,02h ;imprimir el caracter leido desde el teclado
mov dl,al
int 21h
loop otro ;ciclo loop
.exit
end
Para comenzar en ensamblador, el siguiente programa muestra el contenido de ciertas variables previamente declaradas, nos permite aprender a imprimir en pantalla cadenas de caracteres con la interrupción 09h de la 21h.
;programa que contiene variables declaradas y
;muestra su contenido en pantalla.
.model tiny
.stack
.data
msg db 'Nombre: Elgame',10,13,'$'
msg2 db 'Domicilio: Av. niños herues 890',10,13,'$'
msg3 db 'CP: 28750',10,13,'$'
msg4 db 'Tel: 3087696',10,13,'$'
.code
.startup
mov ah,09h ; imprime una cadena de caracteres en pantalla
LEA DX,msg
int 21h
LEA DX,msg2
int 21h
LEA DX,msg3
int 21h
LEA DX,msg4
int 21h
.exit
end
Puedes descargar el archivo .asm al final.
;programa que suma dos numeros cada uno de dos digitos ;y le aplica el ajuste en ascii para separar en bcd el ;resultado .model tiny .stack .data msg db 'Echame los numeros a sumar $' .code .startup mov ah,09h ;interrupcion para imprimir una cadena lea dx,msg ;ontenemos la direccion de memoria de ms int 21h ;ejecutamos la interrupcion mov ah,01h ;interr. lee el caracter 1 del numero 1 int 21h ;ejecutamos la interrupcion sub al,30h ;hacemos el aguste de caracter a numero mov bl,al ;guardamos el numero en bl int 21h ;lee el caracter 2 del numero 1 sub al,30h ;ajustamos el numero mov cl,al ;copeamos a cl int 21h ;lee el caracter 1 del numero 2 sub al,30h ;ajustamos el numero add bl,al ;lo sumamos a las decenas int 21h ;lee el caracter 2 del numero 2 sub al,30h ;ajustamos el numero add cl,al ;sumamos a las unidades mov ax,cx ;pasamos el R para convertirlo BCD aaa ;convierte BCD mov cx,ax ;respaldamos el resultado separado add bl,ch ;sumamos el acarreo a las decenas mov ax,bx ;pasamos ax para convertir a BCD aaa ;convertimos BCD separado mov bx,ax ;respaldamos el resultado mov dl,bh ;muevo las centenas a dl add dl,30h ;ajusto las centenas mov ah,02h ;interr. mostrar un caracter int 21h ;muestra las sentenas en pantalla mov dl,bl ;muevo las decenas a dl add dl,30h ;ajusto las decenas int 21h ;muestro las decenas mov dl,cl ;muevo las unidades a dl add dl,30h ;ajusto las unidades int 21h ;muestro las unidades .exit end