PROGRAMACIÓN BÁSICA Y MODULARIZACIÓN

PROGRAMACIÓN BÁSICA 

2.1 ENSAMBLADOR (Y LIGADOR) A UTILIZAR
El  termino ensamblador se refiere  a un tipo de programa informático que se encarga de traducir un fichero fuente escrito en lenguaje ensamblador, a un fichero objeto que contiene código, maquina ejecutable directamente por el microprocesador.
El programa lee el fichero escrito en lenguaje ensamblador y sustituye cada uno de los códigos técnicos que aparecen por su código de operación correspondiente en sistema binario para la plataforma que se eligió como destino en las opciones especificas del ensamblador.
Un ligado, es un programa que alcanza todos los programas o módulos obteniendo lo que denominamos programa ejecutable.
Es un programa que enlaza distintos módulos o programas que poseen subprogramas. Además incorporan las denominadas  rutinas de librerías en caso de solicitarlas en el propio programa. La generación de un módulo ejecutable a partir de una colección de procedimientos traducidos independiente mente requiere un ligado.

2.2 CICLOS NUMÉRICOS
Como en cualquier otro lenguaje de programación, hay ocasiones en las que es necesario hacer que el programa no siga una secuencia lineal, sino que repita varias veces una misma instrucción o bloque de instrucciones antes de continuar con el resto del programa, es para esto que se utilizan los ciclos.
Existen 5 tipos de ciclos predefinidos en ensamblador, aunque también se pueden crear ciclos personalizados por medio de instrucciones de salto las cuales se verán en la sección 2.6 de este manual.
Los ciclos predefinidos de ensamblador son los siguientes:
LOOP:
Esta función decrementa el valor del registro contador CX, si el valor contenido en CX es cero ejecuta la siguiente instrucción, en caso contrario transfiere el control a la ubicación definida por la etiqueta utilizada al momento de declarar el ciclo.
Ejemplo:
·         mov cx,25 :    Número de veces que se repetirá el ciclo, en este caso 25.
·         ciclo:  Etiqueta que se utilizará como referencia para el ciclo loop.
·         int 21h: Instrucción contenida dentro del ciclo (puede contener más de una instrucción).
·         loop:  Ciclo loop que transferirá el control a la línea de la etiqueta ciclo en caso de que CX no sea cero.

LOOPE:
Esta función decremento el valor del registro contador CX, si el valor contenido en CX es cero y ZF es diferente de uno ejecuta la siguiente instrucción, en caso contrario transfiere el control a la ubicación definida por la etiqueta utilizada al momento de declarar el ciclo.
Ejemplo:
·         ciclo: Etiqueta que se utilizará como referencia para el ciclo loope.
·         int 21h: Instrucción contenida dentro del ciclo (puede contener más de una instrucción).
·         loope: Ciclo loope que transferirá el control a la línea de la etiqueta ciclo en caso de que CX no sea cero y ZF sea igual a uno.

LOOPNE:
Esta función decrementa el valor del registro contador CX, si el valor contenido en CX es cero y ZF es diferente de cero ejecuta la siguiente instrucción, en caso contrario transfiere el control a la ubicación definida por la etiqueta utilizada al momento de declarar el ciclo, esta es la operación contraria a loope.
Ejemplo:
·         ciclo: Etiqueta que se utilizará como referencia para el ciclo loopne.
·         int 21h: Instrucción contenida dentro del ciclo (puede contener más de una instrucción).
·         loopne: Ciclo loopne que transferirá el control a la línea de la etiqueta ciclo en caso de que CX no sea cero y ZF sea igual a cero

LOOPZ:
Esta función decrementa el valor del registro contador CX, si el valor contenido en CX es cero y ZF es diferente de uno ejecuta la siguiente instrucción, en caso contrario transfiere el control a la ubicación definida por la etiqueta utilizada al momento de declarar el ciclo.
Ejemplo:
·         ciclo: Etiqueta que se utilizará como referencia para el ciclo loopz.
·         int 21h: Instrucción contenida dentro del ciclo (puede contener más de una instrucción).
·         loopz: Ciclo loopz que transferirá el control a la línea de la etiqueta ciclo en caso de que CX no sea cero y ZF sea igual a uno.


LOOPNZ:
Esta función decrementa el valor del registro contador CX, si el valor contenido en CX es cero y ZF es diferente de cero ejecuta la siguiente instrucción, en caso contrario transfiere el control a la ubicación definida por la etiqueta utilizada al momento de declarar el ciclo, esta es la operación contraria a loopz.
Ejemplo:
·         ciclo: Etiqueta que se utilizará como referencia para el ciclo loopnz.
·         int 21h: Instrucción contenida dentro del ciclo.
·         loopnz: Ciclo loopnz que transferirá el control a la línea de la etiqueta ciclo en caso de que CX no sea cero y ZF sea igual a cero.

2.3 CAPTURA BÁSICA DE CADENAS
Dentro del lenguaje ensamblador no existe el tipo de dato cadena (string en otros lenguajes), por lo que para utilizarla es necesario tratar a las cadenas como un conjunto de caracteres reservados bajo el nombre de una sola variable.
El lenguaje ensamblador cuenta con instrucciones que por su naturaleza sirven para el manejo de cadenas, estas son:
MOVSB:
Mueve un byte desde una localidad de memoria hasta otra.
MOVSW:
Mueve una palabra desde una localidad de memoria hasta otra.
LODSB:
Carga en la parte baja del registro acumulador (AL) el valor de la localidad de memoria determinada por DS:SI.
LODSW:
Carga en el registro acumulador (AX) el valor de la localidad de memoria determinada por DS:SI.
Ejemplo:



2.4 COMPARACION Y PRUEBA
La comparación y prueba son instrucciones especiales con las que cuenta el microprocesador, estas son CMP y TEST respectivamente.
Comparación (CMP):
Esta instrucción compara los dos valores que se le den como parámetros y modifica las banderas de signo (SF), de cero (ZF) y de acarreo (CF) según sea necesario.

Ejemplo:
CMP ah,10h: Compara el valor almacenado en el registro ah con el valor 10 hexadecimal.

Prueba (TEST): Verifica que los valores que se le introduzcan como parámetros sean iguales relizando la operación lógica AND, no almacena ningún resultado pero modifica banderas según sea necesario.
Ejemplo:
TEST al, 1: Verifica que el valor almacenado en al sea 1.


2.5 SALTOS
Las instrucciones de salto permiten realizar saltos en el flujo de control de un programa, es decir, permiten transferir el control del programa, alterando bruscamente el flujo de control del mismo. Existen cuatro tipos de instrucciones de salto:

  • interrumpir (romper, salir, terminar,...)
  • continuar
  • ir_a
  • volver
Cuando en un programa se utiliza una instrucción de salto, la secuencia normal de su ejecución se rompe, transfiriéndose el control del programa a otro lugar dentro del mismo.

Las instrucciones de control de salto (en especial la instrucción ir_a) son un lastre de los orígenes de la programación. De hecho, en 
programación estructurada, todos los programas se pueden escribir utilizando tres tipos de estructuras de control: secuencial, de selección (alternativas) y de iteración (repetitivas).

Así pues, todos los programas que utilizan instrucciones de salto, pueden ser reescritos sin hacer uso de ellas y, aunque, casi todos los lenguajes de programación permiten codificar las instrucciones de salto, el hacer uso de ellas se considera una práctica de programación pobre y nefasta
2.6 CICLOS  CONDICIONALES
Un condicional, como su nombre lo indica, es una condición para discernir entre una opción u otra, y en el proceso mental normalmente se manifiesta con un “Si”; por ejemplo: Si (va a llover), coge el paraguas. Es una estructura de control que permite que se ejecute repetidamente un conjunto de instrucciones, bien sea un número predeterminado de veces, o bien sea hasta que se verifique una determinada condición.

2.7 INCREMENTO Y DECREMENTO
El operador de incremento aumenta el valor de su operando en 1. El operando debe ser un tipo de dato aritmético o puntero, y debe hacer referencia a un objeto modificable. Similar mente, el operador de decremento disminuye el valor de su operando en 1. El valor de los punteros se incrementa (o disminuye) por una cantidad que hace que apunte al siguiente (o anterior) elemento adyacente en memoria.
En lenguajes que admiten ambas versiones de los operadores, los operadores de pre-incremento y pre-decremento aumentan (o disminuyen) sus operan dos en 1, y el valor de la expresión es el resultado del incremento (o decremento). En contraste, los operadores de pos-incremento y post-decremento incrementan (o decrementan) el valor de sus operados en 1, pero el valor de la expresión es el valor original de su operando antes del incremento (o decremento). En lenguajes donde el incremento/decremento no es una expresión, sólo se necesita una versión (en el caso de, solo post operadores).
Dado que el operador de incremento/decremento modifica su operando, el uso de más de una vez dentro de la misma expresión puede producir resultados no definidos. Por ejemplo, en expresiones tales como x - --x, no está claro en qué orden se deben realizar la resta y el operador de incremento. Situaciones como esta son aún peores cuando se aplican optimizaciones por el compilador, lo que podría dar lugar a un orden de ejecución de operaciones diferente de lo que pretende el programador.
Los siguientes fragmentos de código ilustran las diferencias entre operadores de pre y post incremento/decremento:
int  x;
int  y;

// Operadores de incremento
x = 1;
y = ++x;    // x es ahora 2, y es también 2
y = x++;    // x es ahora 3, y es 2

// Operadores de decremento
x = 3;
y = x--;    // x es ahora 2, y es 3
y = --x;    // x es ahora 1, y es también 1

2.8 captura de cadenas con formato
El capturar cadenas con formato permite el movimiento, comparación o búsqueda rápida entre bloques de datos, las instrucciones son las siguientes:
MOVC:
Esta instrucción permite transferir un carácter de una cadena.
MOVW:
Esta instrucción permite transferir una palabra de una cadena.
CMPC:
Este comando es utilizado para comparar un carácter de una cadena.
CMPW:
Esta instrucción es utilizada para comparar una palabra de una cadena.
SCAC:
Esta instrucción permite buscar un carácter de una cadena.
SCAW:
Esta instrucción se utiliza para buscar una palabra de una cadena.
LODC:
Esta instrucción permite cargar un carácter de una cadena.
LODW:
Esta instrucción es utilizada para cargar una palabra de una cadena.
STOC:
Esta instrucción permite guardar un carácter de una cadena.
STOW:
Esta instrucción es utilizada para guardar  una palabra de una cadena

2.9 INSTRUCCIONES ARITMÉTICAS
Dentro de ensamblador se pueden llevar a cabo las 4 instrucciones aritméticas básicas, cada una de ellas cuenta con su propia función:
Instrucción de Suma ADD:
Suma los operandos que se le dan y guarda el resultado en el primer operando.
Ejemplo
·         ADD al, bl: Suma los valores guardados en los registros al y bl, almacenando el resultado en al.
Instrucción de Resta SUB:
Resta el primer operando al segundo y almacena el resultado en el primero.
Ejemplo:
·         SUB al, bl: Resta el valor de AL al de BL y almacena el resultado en AL.
Instrucción de multiplicación MUL:
Multiplica el contenido del acumulador por el operando, a diferencia de los métodos anteriores, solo es necesario indicar el valor por el que se multiplicará, ya que el resultado siempre es almacenado en el registro AX.
Ejemplo:
·         MUL DX: Multiplica el valor del registro acumulador (AX) por el de DX.
Instrucción de división DIV:
Divide un numero contenido en el acumulador entre el operando fuente, el cociente se guarda en AL o AX y el resto en AH o DX según el operando sea byte o palabra respectivamente. Es necesario que DX o AH sean cero antes de la operación por lo que es necesario utilizar el ajuste de división antes del la instrucción DIV.
Ejemplo:
·         AAM: Ajuste ASCII para la división.
·         DIV  bl: Instrucción que divide los valores en ax y bl

2.10 MANIPULACION DE LA PILA
La pila es un grupo de localidades de memoria que se reservan con la finalidad de proporcionar un espacio para el almacenamiento temporal de información.

La pila de los programas es del tipo LIFO (Last In First Out, Ultimo en entrar, Primero en salir).
Para controlar la pila el microprocesador cuenta con dos instrucciones básicas:
Push (Meter) y Pop (sacar).

El formato de estas instrucciones es el siguiente:
·                     Push operando
·                     Pop operando 
Cuando se ejecuta la instrucción Push, el contenido del operando se almacena en la ultima posición de la pila. Por ejemplo, si AX se carga previamente con el valor 5, una instrucción Push AX almacenaría el valor 5 en la última posición de la pila.

Por otro lado la instrucción Pop saca el último dato almacenado en la pila y lo coloca en el operando.
Siguiendo el ejemplo anterior, la instrucción Pop BX obtendría el número 5 y lo almacenaría en el registro BX. El siguiente ejemplo muestra como implementar la instrucción XCHG por medio de las instrucciones Push y Pop. Recuerde que la instrucción XCHG intercambia el contenido de sus dos operandos. 

.COMMENT
Programa: PushPop.ASM
Descripción: Este programa demuestra el uso de las instrucciones para el manejo de la pila, implementando la instrucción XCHG con Push y Pop
MODEL tiny
.CODE
Inicio: ;Punto de entrada al programa
Mov AX,5 ;AX=5
Mov BX,10 ;BX=10
Push AX ;Pila=5
Mov AX,BX ;AX=10
Pop BX ;BX=5
Mov AX,4C00h ;Terminar programa y salir al DOS
Int 21h ;
END Inicio
END
-ROT (a b c – c a b) Rota hacia atrás. 
-2ROT (ab cd ef – ef ab cd) Rota hacia atrás. 
NIP ( a b – b) Quita a de la pila. 
OUTK (... n -- ..) Elimina el elemento n. 
TUCK (a b -- b a b) Inserta una copia de b. 
2?DUP (ab – ab ab) Duplica si ab <> 0. 
2DROP (ab -- ) Elimina 2 de encima. 
2DUP ( ab – ab ab) Duplica los elementos. 
2NIP (ab cd – cd) Elimina elementos. 
2OUTK (::: n -- ::) Elimina el elemento n 
2OVER (ab cd – ab cd ab) Inserta una copia de ab. 
2PICK (:: n -- :::) Copia el elemento n 
encima de la pila. 
2ROLL (::: n -- :::) Quita el elemento n y 
lo deja arriba de la pila. 
2ROT (ab cd ef – cd ef ab) Rota los elementos 
2TUCK (ab cd – cd ab cd) Inserta una copia de cd. 
2SWAP (ab cd – cd ab) Rota los elementos.

2.11 OBTENCION DE CADENA CON REPRESENTACION DECIMAL

En este modo, los datos son proporcionados directamente como parte de la instrucción.
Ejemplo:
Mov AX,34h ;Copia en AX el número 34h hexadecimal
Mov CX,10 ;Copia en CX el número 10 en decima

2.12 INSTRUCCIONES LOGICAS
Ensamblador cuenta con un grupo de cuatro instrucciones lógicas a nivel de bit, las cuales con excepción de la primera requieren de dos operandos, estas son las siguientes:
NOT:
La instrucción NOT o negación requiere un solo operando y su función es cambiar el estado de los bits del mismo, es decir, cambiar los ceros por unos y los unos por ceros.
Ejemplo:
NOT ax  Se aplica la negación al valor del registro ax.
AND:
Esta instrucción también conocida como producto lógico requiere de dos operandos y su valor será igual a uno cuando los bits que se comparen ambos sean uno.
Ejemplo:
AND ax,bx  Se aplica el producto lógico a los valores de ax y bx.
OR:
La instrucción OR también conocida como suma lógica requiere de dos operandos y su valor será uno si alguno de los bits que compara es uno.
Ejemplo:
OR ax,bx Se aplica la suma lógica a los valores de ax y bx.
XOR:
La instrucción XOR o suma lógica exclusiva requiere dos operandos, los cuales se comparan y el resultado obtenido es uno cuando uno de los bits es uno y el otro cero.
Ejemplo:
XOR ax,bx  Se aplica la instrucción XOR a los valores de ax y bx.



2.13 DESPLAZAMIENTO Y ROTACION
Las instrucciones de desplazamiento son cuatro: shl, shr, sar y sal; y su objetivo es desplazar los bits de un operando un determinado número de posiciones a la izquierda o a la derecha. La estructura de los operandos manejados por estas instrucciones y su significado es idéntica para las cuatro instrucciones.
·         SHL (Shift Left = desplazamiento a la izquierda)
 Se desplazan a la izquierda los bits del operando destino tantas posiciones como indique el operando fuente. El desplazamiento de una posición se realiza de la siguiente forma: el bit de mayor peso del operando se desplaza al bit CF del registro de estado, el resto de los bits se desplazan una posición hacia la izquierda, y la posición de menor peso se rellena con un 0
·             SAL (Shift Arithmetic Left = desplazamiento aritmético a la izquierda)
 El objetivo de un desplazamiento aritmético a la izquierda es multiplicar un operando, interpretado con signo, por una potencia de 2.
Para llevar a cabo este tipo de desplazamiento, hay que desplazar los bits del operando hacia la izquierda introduciendo ceros por su derecha.
 Nota:   En realidad, este tipo de desplazamiento es idéntico al llevado a cabo por la instrucción shl; por tanto, sal y shl son de hecho la misma instrucción y se codifican con el mismo código máquina.
·         SHR (Shift Right = desplazamiento a la derecha) 
 La instrucción shr funciona de la misma forma que shl, pero desplazando los bits a la derecha en lugar de a la izquierda.
·         SAR (Shift Arithmetic Right = desplazamiento aritmético a la derecha)
 Esta instrucción desplaza los bits del operando destino a la derecha tantos bits como indique el operando fuente. Esta forma de funcionamiento es similar a la de la instrucción shr; sin embargo, ambas instrucciones se diferencian en que sar, en vez introducir ceros por la izquierda del operando, replica el bit de mayor peso (bit de signo) en cada desplazamiento.

2.14 OBTENCIÓN DE UNA CADENA CON LA REPRESENTACIÓN HEXADECIMAL


La conversión entre numeración binaria y hexadecimal es sencilla. Lo primero que se hace para una conversión de un número binario a hexadecimal es dividirlo en grupos de 4 bits, empezando de derecha a izquierda. En caso de que el último
grupo (el que quede más a la izquierda) sea menor de 4 bits se rellenan los faltantes con ceros.


15 Captura y almacenamiento de datos numéricos

Esta representación está basada en la notación científica, esto es, representar un número en dos partes: su mantisa y su exponente. 

2.14 OBTENCIÓN DE UNA CADENA CON LA REPRESENTACIÓN HEXADECIMAL

La conversión entre numeración binaria y hexadecimal es sencilla. Lo primero que se hace para una conversión de un número binario a hexadecimal es dividirlo en grupos de 4 bits, empezando de derecha a izquierda. En caso de que el último
grupo (el que quede más a la izquierda) sea menor de 4 bits se rellenan los faltantes con ceros.


15 Captura y almacenamiento de datos numéricos

Esta representación está basada en la notación científica, esto es, representar un número en dos partes: su mantisa y su exponente. 

MODULARIZACIÓN

3.1 PROCEDIMIENTOS
Un procedimiento es una secuencia de instrucciones que en conjunto llevan a cabo una tarea específica.
En programación un procedimiento es un segmento de código que cuenta con instrucciones a las cuales se puede acceder desde cualquier parte del programa y una vez se termina la ejecución de estas, el programa continua con su ejecución normal, tomando el control la siguiente línea después de la llamada al procedimiento. Los procedimientos tienden a ser grupos de instrucciones que se necesitara ejecutar más de una vez dentro de un programa, ya que un procedimiento puede ser llamado en cualquier momento durante la ejecución del programa principal, la cantidad de veces que sea necesario sin necesidad de reescribir el código.
En ensamblador los procedimientos están conformados por las siguientes partes:
Declaración del procedimiento:
Los procedimientos en ensamblador se declaran mediante la sintaxis nombreprocedimiento Proc [far/near] dependiendo de si es un procedimiento cercano o lejano.
Código del procedimiento:
Dentro del procedimiento se escribe el código de ensamblador que se quiere utilizar.
Directiva de regreso:
Antes del final de un procedimiento en ensamblador se escribe la directiva de regreso ret,, la cual regresa el control a la línea desde donde fue llamado el procedimiento.
Terminación del procedimiento:
Para terminar un procedimiento se escribe el nombre del procedimiento seguido de la palabra reservaba endp.
Existen dos tipos de procedimientos que pueden utilizarse dentro de ensamblador, estos son los internos y los externos.
Procedimientos Internos:
Estos procedimientos son aquellos que son declarados dentro del mismo archivo de programa que serán llamados, también se les llama procedimientos locales.
Para utilizarlos basta con escribir la palabra reservada call seguida del nombre del procedimiento a utilizar.

Procedimientos Externos:
Los procedimientos externos se crean de la misma forma que los internos pero tienen la diferencia de que están en archivos separados al programa de donde el procedimiento es llamado, por lo que se necesitan instrucciones extra para poder utilizarlos, las cuales son las siguientes:
PUBLIC:
Es necesario declarar como publico el procedimiento que se desea utilizar para que sea posible acceder a él desde otro programa.
EXTRN:
Permite abrir procedimientos desde otro programa aunque no se encuentre enlazado directamente.
INCLUDE:
Enlaza el programa que llama el procedimiento con el que lo contiene, permitiendo utilizarlo como si fuera un procedimiento propio.
Ejemplo:
public imprime              
      Procedimiento dentro del primero archivo declarado como                                                                         público.
imprime proc far
                        Declaración del procedimiento.
mov ah,09h
                                  Código del procedimiento
int 21h
ret
                                                 Directiva de regreso.
imprime endp
                            Fin del procedimiento.
extrn imprime:near                  Se incluye el procedimiento externo imprime en el                                                                                           segundo archivo.
call imprime                   
             Se llama al procedimiento como si fuera local

3.2 MACROS
Una macro es un conjunto de instrucciones que pueden ser llamadas utilizando su nombre para ejecutarse dentro de un programa, estas solo se escriben una vez dentro del código y pueden utilizarse las veces que sea necesario.
En ensamblador la diferencia entre los procedimientos y las macros es que las macros tienen la posibilidad de utilizar parámetros por lo que pueden llevar a cabo tareas que los procedimientos no podrían.
Las macros constan de tres partes que las definen:
Declaración:
El inicio de una macro se declara escribiendo el nombre que tendrá, seguido de la palabra reservada MACRO y opcionalmente, puede contener parámetros después.
Cuerpo:
Contiene todas las instrucciones que ejecutara la macro cuando sea llamada dentro del programa en ejecución.
Fin:
Toda macro debe terminar con la palabra reservada ENDM para indicar el fin de la misma.
Al igual que con los procedimientos, existen dos tipos de macros que son externas e internas, pero son muy fáciles de utilizar de cualquiera de las dos formas, si se desea utilizar una macro externa se escribe la palabra Include seguida del nombre del archivo de texto donde están guardadas las macros antes del código del programa.
Ejemplo:
Include Macro.txt                                Se enlaza con el archivo Macro.txt.
.model small                                         Declaración del tamaño del programa.
.stack 64                                                  Declaración de la pila.
.Data                                                      Inicio del segmento de datos.
.Code                                                     Inicio del segmento de código.
Macro1                                                 Se llama a la macro Macro1.
.Exit                                                         Inicio del segmento final.
End                                                         Fin del programa.


3.1 PROCEDIMIENTOS
Un procedimiento es una secuencia de instrucciones que en conjunto llevan a cabo una tarea específica.
En programación un procedimiento es un segmento de código que cuenta con instrucciones a las cuales se puede acceder desde cualquier parte del programa y una vez se termina la ejecución de estas, el programa continua con su ejecución normal, tomando el control la siguiente línea después de la llamada al procedimiento. Los procedimientos tienden a ser grupos de instrucciones que se necesitara ejecutar más de una vez dentro de un programa, ya que un procedimiento puede ser llamado en cualquier momento durante la ejecución del programa principal, la cantidad de veces que sea necesario sin necesidad de reescribir el código.
En ensamblador los procedimientos están conformados por las siguientes partes:
Declaración del procedimiento:
Los procedimientos en ensamblador se declaran mediante la sintaxis nombreprocedimiento Proc [far/near] dependiendo de si es un procedimiento cercano o lejano.
Código del procedimiento:
Dentro del procedimiento se escribe el código de ensamblador que se quiere utilizar.
Directiva de regreso:
Antes del final de un procedimiento en ensamblador se escribe la directiva de regreso ret,, la cual regresa el control a la línea desde donde fue llamado el procedimiento.
Terminación del procedimiento:
Para terminar un procedimiento se escribe el nombre del procedimiento seguido de la palabra reservaba endp.
Existen dos tipos de procedimientos que pueden utilizarse dentro de ensamblador, estos son los internos y los externos.
Procedimientos Internos:
Estos procedimientos son aquellos que son declarados dentro del mismo archivo de programa que serán llamados, también se les llama procedimientos locales.
Para utilizarlos basta con escribir la palabra reservada call seguida del nombre del procedimiento a utilizar.

Procedimientos Externos:
Los procedimientos externos se crean de la misma forma que los internos pero tienen la diferencia de que están en archivos separados al programa de donde el procedimiento es llamado, por lo que se necesitan instrucciones extra para poder utilizarlos, las cuales son las siguientes:
PUBLIC:
Es necesario declarar como publico el procedimiento que se desea utilizar para que sea posible acceder a él desde otro programa.
EXTRN:
Permite abrir procedimientos desde otro programa aunque no se encuentre enlazado directamente.
INCLUDE:
Enlaza el programa que llama el procedimiento con el que lo contiene, permitiendo utilizarlo como si fuera un procedimiento propio.
Ejemplo:
public imprime              
      Procedimiento dentro del primero archivo declarado como                                                                         público.
imprime proc far
                        Declaración del procedimiento.
mov ah,09h
                                  Código del procedimiento
int 21h
ret
                                                 Directiva de regreso.
imprime endp
                            Fin del procedimiento.
extrn imprime:near                  Se incluye el procedimiento externo imprime en el                                                                                           segundo archivo.
call imprime                   
             Se llama al procedimiento como si fuera local

3.2 MACROS
Una macro es un conjunto de instrucciones que pueden ser llamadas utilizando su nombre para ejecutarse dentro de un programa, estas solo se escriben una vez dentro del código y pueden utilizarse las veces que sea necesario.
En ensamblador la diferencia entre los procedimientos y las macros es que las macros tienen la posibilidad de utilizar parámetros por lo que pueden llevar a cabo tareas que los procedimientos no podrían.
Las macros constan de tres partes que las definen:
Declaración:
El inicio de una macro se declara escribiendo el nombre que tendrá, seguido de la palabra reservada MACRO y opcionalmente, puede contener parámetros después.
Cuerpo:
Contiene todas las instrucciones que ejecutara la macro cuando sea llamada dentro del programa en ejecución.
Fin:
Toda macro debe terminar con la palabra reservada ENDM para indicar el fin de la misma.
Al igual que con los procedimientos, existen dos tipos de macros que son externas e internas, pero son muy fáciles de utilizar de cualquiera de las dos formas, si se desea utilizar una macro externa se escribe la palabra Include seguida del nombre del archivo de texto donde están guardadas las macros antes del código del programa.
Ejemplo:
Include Macro.txt                                Se enlaza con el archivo Macro.txt.
.model small                                         Declaración del tamaño del programa.
.stack 64                                                  Declaración de la pila.
.Data                                                      Inicio del segmento de datos.
.Code                                                     Inicio del segmento de código.
Macro1                                                 Se llama a la macro Macro1.
.Exit                                                         Inicio del segmento final.
End                                                         Fin del programa.

Comentarios