Sie sind auf Seite 1von 18

10/05/2014

PROCEDIMIENTOS Y MACROS

INTRODUCCIN

Una de las principales desventajas de la programacin en lenguaje ensamblador

es la repeticin constante de ciertos grupos de instrucciones. Por ejemplo el


siguiente conjunto de instrucciones nos permite imprimir una variable de tipo
cadena en la pantalla:
Lea DX,Cadena

;Direccionar la cadena

Mov AH,09h

;funcin 09h para imprimir cadenas

Int 21h

;llamada a la interrupcin 21h del DOS

10/05/2014

PROGRAMACIN MODULAR

El diseo modular es una de las piedras angulares de la programacin

estructurada.
Un programa modular contiene bloques de cdigo con puntos de entrada y de

salida individuales. Es posible volver a utilizar secciones de cdigo bien escritas


en otros programas o en otras secciones de un programa existente. Si se
reutiliza un segmento de cdigo existente, no es necesario disear, cdigo, ni
depurar esa seccin de cdigo ya que (presumiblemente) se ha hecho ya

PROCEDIMIENTOS

La unidad bsica de un ambiente procedural es el procedimiento


Un Procedimiento es una parte de cdigo que puede ser llamada desde un

programa con el fin de realizar alguna tarea especfica. Los procedimientos hacen
el programa ms estructural y ms fcil de entender. Generalmente un
procedimiento vuelve al mismo punto desde donde fue llamado.
Un procedimiento se declara una sola vez en el cdigo fuente y cuando el

programa se ensambla y ejecuta, el procedimiento se coloca en memoria para


que pueda ser utilizado por el programa

10/05/2014

VENTAJAS

Las principales ventajas en el uso de procedimientos son: permiten una

codificacin ms limpia y compacta, es decir el cdigo fuente es ms pequeo;


tambin permiten el ahorro de memoria, esto es porque un mismo
procedimiento puede ser llamado varias veces en el mismo programa y slo
requiere memoria una vez.

DESVENTAJAS

Los procedimientos tienen la desventaja de que reducen la velocidad de

ejecucin de los programas, esto se debe a la forma en que los procedimientos


se ejecutan

10/05/2014

SINTAXIS DECLARACIN DE UN
PROCEDIMIENTO
name PROC
; aqui va el cdigo
; de el procedimiento...
RET
name ENDP
Name es el nombre del procedimiento
La instruccin RET es usada para retornar de un procedimiento de tipo near
PROC y ENDP son directivas para que el compilador recuerde la direccin del

procedimiento

INSTRUCCIN CALL
Transfiere el control a un procedimiento, la direccin de retorno (IP) es

empujada a la pila.
Sintaxis
CALL operando

Asume que el operando se encuentra en el mismo segmento de codigo, el operando


es el nombre del procedimiento

10/05/2014

PASOS EN LA EJECUCIN DE UN
PROCEDIMIENTO

1.- Se encuentra la llamada Call


2.- El microprocesador almacena en la Pila el contenido del IP
3.- Se coloca en el IP el valor del desplazamiento correspondiente al

Procedimiento
4.- El microprocesador ejecuta las instrucciones del procedimiento
5.- El procedimiento termina cuando se encuentra la instruccin Ret
6.- Se saca de la pila el valor original del IP y se continua el flujo del programa

EJEMPLO
CALL mm1
MOV AX, 2
JMP salir

; go to the end of program.

mm1 PROC
MOV
RET

BX, 5
; return to caller.

mm1 ENDPD
The above example calls procedure m1, does MOV BX, 5, and returns to the next
instruction after CALL: MOV AX, 2.

10/05/2014

SUGERENCIAS PARA EL DISEO MODULAR


Guardar en el stack y restaurar todos los registros que se modificaran dentro

del procedimiento, excepto aquellos en los que se devolvern valores por el


procedimiento.

Ser consistente acerca de que registros se utilizaran para pasar informacin a un

procedimiento, por ejemplo:

DL,DX - Mandar valores, bytes y palabras.


AL,AX - Regresar valores, bytes y palabras.
BX:AX - Regresar valores, palabras dobles.
CX - Contadores, o repetidores.

OTRAS CARACTERSTICAS

Los procedimientos siempre estarn en el segmento de cdigo y la ltima

instruccin del mismo ser la de retorno RET para la familia del 8086.
Si el procedimiento va a ser llamado desde otro segmento de cdigo, se deber

declarar de tipo FAR, pudindose especificar NEAR o no en caso contrario.


En la fase de ensamblado, automticamente se sustituye la instruccin RET por

RETF si el procedimiento es lejano.


La llamada a un procedimiento se hace de a travs de la instruccin CALL:

call nombre_proc

10/05/2014

EJEMPLO
Crear un procedimiento para imprimir cadenas
Crear un procedimiento para pedir cadenas
Crear un procedimiento que eleve un numero a un potencia

Proc.asm
Proc2.asm

EJERCICIOS

Realice los ejercicios de la clase anterior utilizando procedimientos

10/05/2014

LA PILA

La Pila es un rea de memoria para guardar los datos temporales. La Pila es

utilizada por la instruccin CALL para mantener la direccin de retorno para un


procedimiento, la instruccin RET obtiene este valor de la pila y vuelve al
desplazamiento. Tambin podemos utilizar la pila para guardar cualquier otro
dato

INSTRUCCIONES PUSH Y POP


PUSH - almacena valores de16 bit en la pila
POP - Obtiene valores de 16 bit de la pila.

Sintaxis

PUSH operand
POP operand

Donde el operando generalmente es un registro a guardar u obtener

10/05/2014

USO DE LA PILA
La pila utiliza el algoritmo LIFO(Last In First Out)
Es importante realizar el mismo numero de PUSHs y POPs

de lo contrario la pila podra verse corrupta y sera imposible


retornar el control al sistema operativo

PUSH y POP son muy tiles debido a que no tenemos muchos


registros para operar, por ello podemos hacer los siguiente
1.

Almacenar el valor original del registro en la pila

2.

Usar el registro para cualquier propsito

3.

Restaurar el valor original del registro desde la pila usando POP

EJEMPLO

ORG

100h

MOV

AX, 1234h

PUSH

AX

; store value of AX in stack.

MOV

AX, 5678h

; modify the AX value.

POP

AX

; restore the original value of AX.

RET
END

10/05/2014

INTERCAMBIANDO VALORES
ORG

100h

MOV

AX, 1212h

; store 1212h in AX.

MOV

BX, 3434h

; store 3434h in BX

PUSH

AX

; store value of AX in stack.

PUSH

BX

; store value of BX in stack.

POP

AX

; set AX to original value of BX.

POP

BX

; set BX to original value of AX.

RET
END

EJEMPLO

Pasar por la pila los valores capturados en el programa de calculo de potencia

Proc3.asm

10

10/05/2014

GUARDANDO EL ESTADO DE LA
MAQUINA
mov cx, 10
Loop0:

call PrintSpaces
loop Loop0

PrintSpaces proc near

Cual es el
problema en esta
rutina?

mov al,
mov cx, 40
PSLoop:

putc
loop PSLoop

ret
PrintSpaces endp

SOLUCIN
mov cx, 10
Loop0: call PrintSpaces
loop Loop0
PrintSpaces proc near
push cx
mov al,
mov cx, 40
PSLoop:

putc
loop PSLoop
pop cx

ret
PrintSpaces endp

11

10/05/2014

MACROS

Las macros son igual que los procedimientos, pero no realmente. Las macros se

parecen a los procedimientos, pero slo existen hasta que se compila el cdigo,
despus de la compilacin todas las macros son reemplazadas con las
instrucciones reales. Si se declar una macro y nunca se utiliz en el cdigo, el
compilador simplemente la ignorar. La macro emu8086.inc es un buen ejemplo
de cmo se pueden utilizar las macros, este archivo contiene varias macros para
hacer la codificacin ms fcil de programar.

DIRECTIVA INCLUDE

Sustituye la directiva por el contenido del archivo (a

la manera del #include de c)

12

10/05/2014

DEFINICIN DE UNA MACRO

name

MACRO

[parameters,...]

<instructions>
ENDM

Donde name es el nombre de la macro


MACRO y ENDM son directivas que indican la direccin de memoria de la macro

DIFERENCIA CON UN PROCEDIMIENTO


A diferencia de los procedimientos, las macros deben definirse arriba del cdigo que

lo utiliza, por ejemplo:

MyMacro

MACRO

p1, p2, p3

MOV AX, p1
MOV BX, p2
MOV CX, p3
ENDM
ORG 100h

MyMacro 1, 2, 3
MyMacro 4, 5, DX
RET

13

10/05/2014

EL CDIGO ANTERIOR SE EXPANDE EN

MOV
MOV
MOV
MOV
MOV
MOV

AX,
BX,
CX,
AX,
BX,
CX,

00001h
00002h
00003h
00004h
00005h
DX

ALGUNOS DATOS IMPORTANTES ACERCA DE


LAS MACROS Y PROCEDIMIENTOS:

Cuando se utiliza un procedimiento se debe usar la instruccin CALL, por

ejemplo: CALL MyProc


Cuando se desea utilizar una macro, puede simplemente escribir su nombre. Por

ejemplo: MyMacro

14

10/05/2014

ALGUNOS DATOS IMPORTANTES ACERCA DE


LAS MACROS Y PROCEDIMIENTOS:
Un Procedimiento se encuentra en alguna direccin especfica en memoria, y si

se utiliza el mismo procedimiento 100 veces, la CPU transferir el control a esta


parte de la memoria. El control ser devuelto de nuevo al programa por la
instruccin RET. La pila se utiliza para guardar la direccin de retorno. La
instruccin CALL toma alrededor de 3 bytes, por lo que el tamao del archivo
ejecutable de salida crece muy insignificante, no importa cuntas veces se utiliza
el procedimiento.
Una Macro se expande directamente en el cdigo del programa. As que si usted

usa los mismos macro 100 veces, el compilador expande las macros 100 veces,
por lo que el archivo ejecutable de salida se hace ms grande y ms grande, cada
vez que se insertan todas las instrucciones de una macro.

ALGUNOS DATOS IMPORTANTES ACERCA DE


LAS MACROS Y PROCEDIMIENTOS:
Se debe utilizar la pila o cualquier registro de propsito general para pasar

parmetros a un procedimiento.
Para pasar parmetros a una macro, pueden escribirse despus del nombre de la

macro. Por ejemplo:


MiMacro 1, 2, 3
Para marcar el final de la directiva macro ENDM es suficiente.
Para marcar el final del procedimiento, debe escribir el nombre del

procedimiento antes de la directiva ENDP.

15

10/05/2014

DECLARACIONES DUPLICADAS

Las macros se expanden directamente en el cdigo, por lo tanto, si hay etiquetas

dentro de la definicin de la macro puede obtener error de


"Declaraciones duplicadas cuando se utiliza la macro dos veces o ms. Para
evitar tal problema, utilice la directiva LOCAL seguido de los nombres de las
variables, etiquetas o nombres de procedimientos. Por ejemplo:

EJEMPLO - DECLARACIONES DUPLICADAS


MyMacro2
MACRO
LOCAL label1, label2
CMP AX, 2
JE label1
CMP AX, 3
JE label2
label1:
INC AX
label2:
ADD AX, 2
ENDM
ORG 100h
MyMacro2
MyMacro2
RET

16

10/05/2014

ARCHIVOS EXTERNOS

Si se tiene previsto utilizar las macros en varios programas, puede ser una buena

idea colocar todas las macros en un archivo separado. Coloque el archivo en la


carpeta Inc y el uso de directiva INCLUDE nombre de archivo para usar macros.
Ver Biblioteca de funciones comunes - La macro emu8086.inc para un ejemplo

de tal archivo.

EJEMPLO

Crear una macro para imprimir una cadena


Crear una macro para imprimir un carcter
Crear un macro para elevar un numero a una potencia

Macro.asm
Libe.inc

17

10/05/2014

EJERCICIOS

Modificar la macro para imprimir una cadena, pero en lugar de usar el servicio 9

con int 21h, utilizar el servicio 0Eh con int 10h


Programa que encuentre un carcter en una cadena usando una macro, y que

devuelva la posicin en AL

18

Das könnte Ihnen auch gefallen