Programas con Uso de Librerías en Ensamblador

Referencias externas al módulo

Sirve para poder particionar un programa en varios archivos fuentes o módulos. Son imprescindibles si se hace un programa en alto nivel con procedimientos en assembler. Hay tres: PUBLIC, EXTRN e INCLUDE.
  • PUBLIC nombre[, nombre...]: Estos nombres simbólicos se escriben en el archivo objeto. Durante una sesión con el linker, los símbolos en diferentes módulos pero con los mismos nombres tendrán la misma dirección.
  • EXTRN nombre:tipo [,nombre:tipo...]: Define una variable externa con el nombre y tipo (NEAR, FAR, BYTE, WORD, DWORD o ABS (número constante especificado con la directiva EQU o =)) especificado. El tipo debe ser el mismo que el del ítem indicado con la directiva PUBLIC en otro módulo.
  • INCLUDE nombre_de_archivo: Ensambla las sentencias indicadas en dicho archivo.
Para facilitar la programación, hay algunas funciones comunes que pueden incluirse en un programa. Para hacer que nuestros programas usen funciones definidas en otro archivo, debe usar INCLUDE seguido de un nombre de archivo. El compilador busca automáticamente el archivo en la misma carpeta donde se encuentra el archivo de origen, y si no puede encontrar el archivo allí, busca en la carpeta Inc.

Para usar cualquiera de las funciones en emu8086.inc, debe tener la siguiente línea al comienzo de su archivo fuente: include 'emu8086.inc'

emu8086.inc define las siguientes macros:
  • PUTC char: imprime un solo caracter
  • GOTOXY col, row: coloca el cursor en las coordenadas solicitadas
  • PRINT string: Imprime una cadena
  • PRINTN string: Imprime una cadena y tras imprimirla hace un salto de linea.
Veamos unos ejemplos prácticos:



Este código fue tomado del siguiente vídeo:


Codigo:

name "suma de dos numeros"
include "emu8086.inc"
org 100h

.data
suma db 2 dup (?)
.code
sumas proc
    print " Introduce el primer numero: "
    call scan_num
    mov suma[0],cl 
    printn " " 
    print " Introduce el segundo numero: "
    call scan_num
    mov suma[1],cl
    xor ax,ax
    add al,suma[0]
    add al,suma[1]
    printn " "
    print " La suma es: "
    call print_num
sumas endp
exit:
    print " "
    printn " "
    print "Presiona enter para salir..."
    mov ah,0  ;servicio de pulsación de teclado
    int 16h   ;invoca a servicios de taclado
    ret
define_print_string
define_print_num
define_print_num_uns
define_scan_num
end

Resultado:






El siguiente programa compara la cantidad de años de una persona avisando si eres mayor o menor de edad.

Codigo:

.model small
.stack
.data                        
include "emu8086.inc"            
num1 db 0; variable para la edad
.code
inicio proc far
    
    ;poner el primer letrero
    print " Ingrese su edad: "
    
    ;lectura del valor
    call scan_num
    mov num1,cl
    
    ;lectura segundo valor
    

    xor ax,ax
    mov al,num1
    cmp al,18d ;Si lo que se encuentra en al>18 
    JGE mayor ;salta a mayor
    JMP menor ;sino ve a menor  
    
    mayor:
        printn " "
        print "Eres mayor de edad"
        jmp final
    menor:
        printn " "
        print "Eres menor de edad"
               
        jmp final
           
           
    final:  
         print " "
         printn " "
         print "Presiona enter para salir..."
         mov ah,0 ;servicios de lectura de una pulsación de teclado
         int 16h  ;Invoca a servicios de teclado
         mov ah,4ch
         int 21h
         ret
define_print_string
define_print_num
define_print_num_uns
define_scan_num
endp inicio

end

Resultado:





El siguiente programa nos permitirá algo similar al anterior, sin embargo, nos permitirá mostrar si hemos aprobado o reprobado una asignatura en base a una calificación.

Usaremos en este caso gotoxy en este programa:

.MODEL SMALL
.STACK 64
.DATA  
    include "emu8086.inc"
    
    nota db 0

    
.CODE   
OPERACIONES PROC FAR ;DECLARACION DE PROCEDIMIENTO    
 
    ;MUESTRO EL MENSAJE         
    print " "
    print "Ingrese la calificacion: "
    
    call scan_num    ;Leo el numero
    mov nota,cl      ;lo guardo en nota
    
    xor ax,ax        ;borro el contenido de ax
    mov al,nota      ;muevo nota a al
    
    CMP AL,70d       ;comparo al con 70
    JGE MAYOR        ;si es mayor o igual pasa a mayor
    JMP MENOR        ;si no a menor
        
   MAYOR:
    printn " "    
    print "Aprobado"
    JMP SALIR 
        
   MENOR:   
    printn " "    
    print "Reprobado"
    JMP SALIR
    
   SALIR:
         print " "
         printn " "
         gotoxy 10,10  ;coloco el cursor en las coordenadas 10x,10y
         print "Presiona enter para salir..." ;imprimo despues este mensaje
         mov ah,0  ;servicio de lectura de pulsacion de tecla
         int 16h   ;invoca servicios de teclado
         mov ah,4ch
         int 21h
         ret
       
OPERACIONES ENDP   

define_print_string
define_print_num
define_print_num_uns
define_scan_num    
    
END   

Resultado:











Comentarios