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
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.
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.
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
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.
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
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
Publicar un comentario