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
(https://i.ibb.co/T8bjqH5/etnedenr8.jpg)
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
(https://i.ibb.co/J30nLQy/etnedenr9.jpg)
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
(https://i.ibb.co/r37rtYH/etnedenr10.jpg)
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
(https://i.ibb.co/swJhWVp/etnedenr14.jpg)