Macros y Procedimientos
Macros y Procedimientos
Macros y Procedimientos
Macros y procedimientos
Lenguaje ensamblador
Macros y procedimientos1
Una macro es un conjunto de instrucciones que realizan una tarea específica. Las macros reciben
parámetros y son llamadas como si fueran una instrucción, es decir, se comportan como funciones.
Un procedimiento es también un conjunto de instrucciones que hacen alguna tarea repetitiva, pero
es llamada a través de una directiva y representa un salto en el listado de instrucciones. Su
comportamiento depende de los valores almacenados en los registros y pila al momento de ser
llamado.
El reúso de código es una práctica común de los programadores para aumentar su productividad y
para tener control de su propiedad intelectual sobre el código. En el caso de ensamblador la
definición de procedimientos y macros permite la creación de librerías con subrutinas y funciones
auxiliares.
Estos procedimientos y macros permiten además que el código fuente del programa sea más legible
y por consecuencia sea más sencillo hacer mantenimiento y encontrar errores, es decir, depurar.
Permite, además, crear ejecutables más compactos y probablemente más veloces, pues al crear las
subrutinas optimiza el manejo de memoria.
Macros
Las macros son subrutinas que pueden recibir parámetros. Pueden representar una función que se ejecuta en
un programa en diversas ocasiones con parámetros diferentes. Si se define una macro sin parámetros de
entrada se le llama simplemente con su nombre, como si fuera una nueva instrucción de ensamblador.
Cuando una macro recibe parámetros, éstos se le pasan al momento de llamarla separados por coma. Se
utilizan las directivas MACRO, ENDM y LOCAL. La estructura para definir una macro es la siguiente:
Por ejemplo, la función para esperar una tecla (getche) se puede implementar de manera muy sencilla como:
1
Unidad 6. Macros y procedimientos
Lenguaje ensamblador
INCLUDE Milibreria.lib
getche ; llamar a la macro
La creación de macros permite, además de construir de forma estructurada, macros complejas, pues una
macro puede mandar llamar a otras macros permitiendo conservar la legibilidad del programa principal y de la
librería y sin pérdida de velocidad en el procesamiento. El siguiente código compila algunas macros que
podrían ser útiles para graficar cosas sencillas:
2
Unidad 6. Macros y procedimientos
Lenguaje ensamblador
pushr
MOV BH,0H
MOV DH,y ; renglón
MOV DL,x ; columna
MOV AH,02H ; colocar cursor
INT 10H
popr
ENDM
;**********************************
3
Unidad 6. Macros y procedimientos
Lenguaje ensamblador
;**********************************
popr
ENDM
;*************************************
4
Unidad 6. Macros y procedimientos
Lenguaje ensamblador
5
Unidad 6. Macros y procedimientos
Lenguaje ensamblador
Con esta librería ya podríamos definir un programa compacto con un manejo de gráficos (en modo texto)
básico:
INCLUDE libreria.lib
main PROC
; ** inicializar segmentos
MOV AX, @DATA
MOV DS,AX
MOV ES,AX
cls
marco 0,79,0,24 ; marco grande
marco 1,38,6,22 ; marco medio izquierda
marco 39,78,6,22 ; marco medio derecha
gotoxy 14,2
muestra TEXTO1
gotoxy 26,3
muestra TEXTO2
gotoxy 35,5
muestra TEXTO3
getche
cls
6
Unidad 6. Macros y procedimientos
Lenguaje ensamblador
main ENDP
Procedimientos
Los procedimientos son subrutinas que contienen un bloque de comandos que se desea llamar como una sola
instrucción. Los procedimientos son usados para partes de código que se repiten con mucha frecuencia, como
los procesos de ajuste de valores o que representan tareas auxiliares, como mandar a la pantalla. Cuando se
hace una llamada a un procedimiento en realidad el procesador hace un salto al segmento de memoria en el
que radica el procedimiento y al finalizar regresa a la siguiente instrucción de la lista. Todo el contenido de los
registros y la pila está accesible al procedimiento, pues éste es equivalente a tener sus instrucciones escritas
en el punto en que se le llamó. Lo que quiere decir que los procedimientos también pueden modificar los
valores en registros, variables y memoria en general, por ello se debe tener cuidado cuando se llama a un
procedimiento que escribe o usa registros en los que posiblemente tengamos datos que queramos conservar.
El formato de un procedimiento usa las directivas PROC, ENDP, RET y CALL. La definición de un
procedimiento tiene la estructura:
Nombre PROC
*
* Conjunto de instrucciones *
*
RET
Nombre ENDP
Donde nombre es la etiqueta con que se conocerá al procedimiento. En un programa los procedimientos
pueden escribirse al principio o, como es costumbre, hasta el final.
7
Unidad 6. Macros y procedimientos
Lenguaje ensamblador
CALL nombre
Donde nombre sea un procedimiento. Veamos ahora una segunda versión del programa que mostraba ciertas
operaciones en pantalla. En este caso usando procedimientos. Note que ahora debemos definir al programa
principal con main PROC para que el sistema sepa cual procedimiento es el que debe de ejecutar dado que
los demás procedimientos pueden residir en el mismo archivo de código.
main PROC
MOV BL,TEXTO1
8
Unidad 6. Macros y procedimientos
Lenguaje ensamblador
; ** 3) Operaciones
; ** 3.1) multiplicación
MOV AL,BH
MOV CL,BL
MUL CL
PUSH AX
; ** 3.2) suma
MOV AX,0000H
MOV AL,BH
ADD AL,BL
PUSH AX
9
Unidad 6. Macros y procedimientos
Lenguaje ensamblador
; ** 3.3) división
MOV AL,BH
MOV CL,BL
DIV CL
MOV AH, 00H
; ** 4) Mostrar resultados
; ** 4.1) letrero
MOV BX,AX ; Guardar resultado de la división
call MosCu
POP AX
call MosCu
POP AX
call MosCu
main ENDP
10
Unidad 6. Macros y procedimientos
Lenguaje ensamblador
; ************************************************
; **** PROCEDIMIENTOS UTILIZADOS *****************
; ************************************************
dosc PROC
MOV DL,BH
MOV AH, 06H ;06H imprimir ASCII que está en DL
INT 21H
MOV DL,BL
MOV AH, 06H ;06H imprimir ASCII que está en DL
INT 21H
RET
dosc ENDP
; **************************************************************
dosv PROC
11
Unidad 6. Macros y procedimientos
Lenguaje ensamblador
RET
dosv ENDP
;*******************************************************
AjuMyC PROC
MOV DX,0000H
MOV CX,100
DIV CX ; AX/CX= AX/100 (centenas)
AAM ;ajuste de las centenas
ADD AX,3030H ; ajustes ASCII centenas
MOV BX,AX
MOV CX,DX
RET
AjuMyC ENDP
; ******************************************************
AjuDyU PROC
RET
AjuDyU ENDP
; *******************************************************
12
Unidad 6. Macros y procedimientos
Lenguaje ensamblador
MosCu PROC
call AjuMyC
call dosc
call AjuDyU
MOV BX,AX
call dosc
call espacio ;imprime un espacio
RET
MosCu ENDP
; ********************************************************
END
13