Scripts de ensamblador

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

 

Autor: elgame DescargarDescargar

Comentarios en "Calculadora de 32bits suma, resta, multiplica, divide en ensamblador"

Table 'programa_programas.t_comentarios' doesn't exist