Underc0de

Programación General => ASM => Mensaje iniciado por: ErielSinh en Diciembre 10, 2020, 01:27:50 AM

Título: Procedimientos en assembler emu8086 [facil]
Publicado por: ErielSinh en Diciembre 10, 2020, 01:27:50 AM
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)