Scripts de ensamblador

« 1 2/2 »

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

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

 

Autor: elgame
Es una mejora del convertidor de 2 dígitos, este programa convierte cadenas de 8 dígitos a números utilizando registros de 32bits (extendidos), el programa convierte de cadena a numero y de numero a cadena. 
;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

 

Autor: elgame

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

 

Autor: elgame

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

 

Autor: elgame

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

 

Autor: elgame

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

 

Autor: elgame

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 
Autor: elgame

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
Autor: elgame
« 1 2/2 »