Procedimientos en assembler emu8086 [facil]

Iniciado por ErielSinh, Diciembre 10, 2020, 01:27:50 AM

Tema anterior - Siguiente tema

0 Miembros y 2 Visitantes están viendo este tema.

Diciembre 10, 2020, 01:27:50 AM Ultima modificación: Diciembre 16, 2020, 09:39:31 PM por ErielSinh
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
Código: php

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
Código: php

;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
Código: php

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
Código: php

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