En muchos lenguajes de programacion utilizamos las funciones, despues de declarar una funcion la invocacion n veces en la funcion principal, en assembler el equivalente a esto son los procedimientos, empezamos con un ejemplo facil
Programa para imprimir n veces una cadena en assembler utilizando un procedimiento
include 'emu8086.inc'
org 100h
; utilizaremos un loop para imprimir 5 veces nuestro procedimiento
mov cx,5 ;movemos el valor 5 a cx para que el loop se repita 5 veces
repetir:
call programita ; llamamos a nuestro procedimiento
loop repetir
ret
programita proc; creamos un procedimiento llamado programita
mov ax,2 ; movemos a ax el valor de 2
call pthis ;
db 13,10,'mensaje',0 ; imprimimos la cadena 'mensaje'
ret
programita endp ; terminamos el procedimiento con endp
DEFINE_PTHIS
DEFINE_PRINT_STRING
DEFINE_SCAN_NUM
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS
END
podemos repetir n veces nuestro procedimiento cuando lo necesitemos lo que nos permite ahorrar mucho codigo en programas grandes
ejecutamos en emu8086
seguimos con otro ejemplo, la practica hace al maestro
Programa para imprimir una lista de n valores mediante procedimientos
;imprimir una lista de n valores mediante procedimientos
include 'emu8086.inc'
org 100h
; DEFINIMOS VARIABLES
mov bx,0
print 'ejercicio 2'
printn ''
print 'ingrese el tamaño de la lista: '
call scan_num ;el se guarda en cx
printn ''
suma:
call ejercicio2
printn ''
loop suma
ret
ejercicio2 proc
mov ax,lista[bx]
print '['
call print_num
print ']'
add bx,2
ret
ejercicio2 endp
DEFINE_PTHIS
DEFINE_PRINT_STRING
DEFINE_SCAN_NUM
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS
lista dw 8,1,2,5,4
END
ejecutamos en emu8086
Otro ejercicio
Imprimir el mayor de una lista mediante procedimientos en assembler
include 'emu8086.inc'
org 100h
mov bx,0
print 'ejercicio 3'
printn ''
call ejercicio3
ret
ejercicio3 proc
mov cx,5;definir tamaño de la lista
recorrer:
mov ax,lista[bx]
;call print_num
;printn ''
cmp ax,mayor
jg cambiar
jmp continuar
cambiar:
mov mayor,ax
continuar:
add bx,2
loop recorrer
mov ax,mayor
print 'el numero mayor de la lista es: '
call print_num
ret
ejercicio3 endp
lista dw 3,1,2,5,4
mayor dw 0
DEFINE_PTHIS
DEFINE_PRINT_STRING
DEFINE_SCAN_NUM
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS
END
otro ejemplo
Buscar un numero en un vector con procedimientos en assembler
include 'emu8086.inc'
org 100h
mov bx,0
print 'ejercicio 4'
printn ''
print 'ingrese un numero a buscar en el vector '
call scan_num
printn ''
call ejercicio4
fin:
ret
ejercicio4 proc
mov acomparar,cx
mov cx,5
recorrer:
mov ax,lista[bx]
call print_num
print ' '
add bx,2
cmp ax,acomparar
je esIgual
loop recorrer
printn ''
printn ' el numero no esta en la lista'
jmp fin
ejercicio4 endp
esIgual proc
lea si,mensaje1
printn ''
call print_string
ret
jmp fin
esIgual endp
lista dw 3,1,2,5,4
acomparar dw 0
DEFINE_PTHIS
DEFINE_PRINT_STRING
DEFINE_SCAN_NUM
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS
mensaje1 db 13,10,' el valor buscado esta en el vector '
END
haciendo la prueba en emu8086