Вы находитесь на странице: 1из 13

3.2.- Procedimientos.

3.2.1 Procedimientos internos. 3.2.2 Procedimientos externos, Definicin de procedimientos Un procedimiento es un conjunto de instrucciones que tienen la finalidad de ejecutar una tarea especifica dentro de un programa. Los procedimientos son muy similares a las macros. Un procedimiento se declara una sola vez en el codigo fuente y cuando el programa se ensambla y ejecuta, el procedimiento se coloca en memoria para que pueda ser utilizado por el programa. Acontinuacin se presentan los pasos necesarios para ejecutar 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. Un rocedimiento se declara de la siguiente forma: PROC nombre instruccin instruccin... RET ENDP NOMBRE

3.2.1 Procedimientos internos.


Los procedimientos internos son aquellos que se declaran y semismo programa, tambin son llamados procedimientos locales. Un ejemplo de procedimiento interno es el siguiente: ;Procedimiento: GotoXY ;Descripcin: Coloca el cursor una posicin especifica de la pantalla ;Parmetros: Dl=X,Dh=Y ;********************************************************************** PROC GotoXY xor bh,bh mov ah,02h int 10h ret endp GotoXY Arriba.

3.2.2 Procedimientos externos.


Los procedimientos externos, a diferencia de los internos, se declaran en mdulos o programas separados al programa donde el procedimiento es llamado, en otras palabras, la llamada al procedimiento se encuentra en un programa y el procedimiento en otro. Para poder utilizar procedimientos externos, es necesario que sean declarados como pblicos en el programa donde se encuentran y que sean llamados como externos en el programa donde sern usados. Se debe contar con tres directivas de ensamble: .PUBLIC para declarar los procedimientos como pblicos, .EXTERN para indicar que el procedimiento que se va a usar est fuera del programa y .INCLUDE para enlazar el programa que contiene los procedimientos con el programa que los llama.

PUBLIC PROC1 ; Se define como pblico PROC1 PROC FAR ; comienzo del procedimiento (lejano) (instrucciones) ; Instrucciones del procedimiento RET ;Instruccin para retornar PROC1 ENDP ; Final del procedimiento Para llamar a un procedimiento se utiliza la instruccin CALL: CALL nombre_procedimiento Por ejemplo Este programa muestra la forma de utilizar procedimientos y datos externos en los programas por medio de las directivas de inclusin include y public. .MODEL TINY .INCLUDE proc2.ASM ;Incluir el archivo proc2.asm ;el cual contiene la variable de cadena ;Cad1 y los procedimientos externos ;usados en este programa. .DATA Cad2 db 'Esta es una cadena de prueba 2...',13,10,'$' .CODE INICIO: ;Punto de entrada al programa Mov Dl,20 ;X=20 Mov Dh,10 ;Y=10 Call GotoXY ;GotoXY 20,10 Lea DX,Cad2 ;DX->Cad2 en Proc3.asm Call Imprime_Cad ;Imprime Cad2 Lea DX,Cad1 ;DX->Cad1 en Proc2.asm Call Imprime_Cad ;Imprime Cad1 Mov AX,04C00h ;Fin del programa Int 21h ; END INICIO END

.1.-Directivas para compilacin hbrida.

Introduccin.
La programacin hibrida es utilizada en los casos en donde el cdigo en ensamblador dificulta la estructuracin del programa, proporciona un mecanismo por medio del cual podemos aprovechar las ventajas del lenguaje ensamblador y los lenguajes de alto nivel, todo esto con el fin escribir programas ms rpidos y eficientes. Ejemplo de un programa con un bloque de instrucciones en ensamblador: Este programa muestra como se construye un programa hbrido utilizando un bloque Asm... End; en Turbo Pascal. El programa solicita que se introduzcan dos nmero, despus calcula la suma por medio de la instruccin Add de ensamblador y finalmente imprime el resultado en la pantalla. Program hibrido; Procedure Limpia_Pantalla; Assembler; Asm Mov AX, 0600h Mov BH, 18h Mov CX, 0000h Mov DX, 184Fh Int 10h End;. En fin podemos mezclar el cdigo ensamblador con el cdigo de cualquier otro lenguaje que admita este procedimiento. En pascal antes de escribir el cdigo en ensamblador ay que poner Asm y al final de nuestro cdigo End. Por otro lado, Asm nos permite incluir bloques de instrucciones en lenguaje ensamblador en cualquier parte del programa sin necesidad de escribir procedimientos completos en ensamblador. Al trabajar con un lenguaje de alto nivel, en ocasiones nos encontramos con el problema de que necesitamos que haga determinada funcin o trabajo pero desafortunadamente sta solo existe en otro lenguaje que no es el que necesitamos utilizar, o simplemente, no encontramos esa funcin en ningn lenguaje de alto nivel.

En este momento el lenguaje ensamblador constituye una herramienta no solo eficaz, sino simple para producir un parche para el compilador de nuestro lenguaje preferido. Tal vez el mayor problema con el que nos enfrentemos sea el de cmo conectar ambos programas (el de alto y el de bajo niveles) y cmo pasar variables de un programa al otro. Para conseguir nuestro objetivo se utilizan pseudo-operadores, es decir, instrucciones que aparecen en el cdigo fuente del ensamblador pero que no generan ninguna instruccin de mquina, pero proporcionan directivas para que el ensamblador pueda operar con datos, ramificaciones condicionales, generacin de listados y con macros durante el proceso de ensamble. PUBLIC El pseudo-operador que nos interesa es del tipo de pseudooperadores para datos y se conoce como PUBLIC, el cual permite que smbolos en el cdigo fuente sean enlazados por otros programas que se van a enlazar juntos. Para esto, la informacin es pasada al linker (enlazador). PUBLIC permite el intercambio de informacin intersegmentos. El formato de este pseudo-operador es PUBLIC nmero, variable o rtulo Ejemplo de uso de PUBLIC: PUBLIC nombre Instrucciones RET nombre ENDP

4.2.- Funciones en Ensamblador.


Para llamar a las interrupciones es conveniente conocer antes ciertas estructuras y uniones.

struct WORDREGS { unsigned int cx, dx, si, di, cflag, flags; }; struct BYTEREGS { unsigned char bl, bh, cl, ch, dl, dh; }; union REGS { struct struct BYTEREGS h; };

ax, bx,

al, ah,

WORDREGS x;

struct unsigned int cs; struct

SREGS { unsigned int ss; };

unsigned int es; unsigned int ds; r_ax, r_bx, unsigned

REGPACK { r_cx, r_dx;

unsigned

r_bp, r_si, r_di, r_ds, r_es, r_flags; };

A continuacin, se listan las funciones que permiten invocar las interrupciones:


int int86(int interrupcin, union REGS *salida); int int86x(int interrupcin, union REGS *salida, struct REGS void intr(int interrupcin, struct REGS *entrada, union REGS *entrada, union *rsegmento); REGPACK *registros);

Las dos primeras funciones se basan en la declaracin de dos uniones: una para entrada y otra para salida, que simbolizan los valores iniciales (antes de llamar a la interrupcin) y finales (tras la llamada) en los registros. Si se desea que la misma unin que indica los valores iniciales devuelva los finales, se puede indicar por duplicado:
union REGS regs; regs.h.ah = 0; regs.h.al = 0x13; /* VGA 320x200 - 256 colores */ int86 (0x10, &regs, &regs); /* cambiar modo de vdeo */

LLAMADAS DESDE UN PROGRAMA ESCRITO EN C Las llamadas desde C varan sensiblemente de las de Pascal. Lo primero que hay que tener en cuenta es que el orden de los

parmetros es el inverso. Se leen de derecha a izquierda en la declaracin de la funcin o procedimiento. Otra caracterstica es que el compilador de C aade al principio del nombre de la funcin o procedimiento el carcter de subrayado, por lo que es necesario hacerlo tambin en el mdulo ensamblador. La ltima es que el retorno de la funcin se debe hacer simplemente con RET , sin parmetros. El compilador de C se encarga de aadir el cdigo necesario para eliminar los parmetros de la pila: Test( i , j , 1); se traducira en: mov ax,1 push ax push WORD PTR DGROUP:_j push WORD PTR DGROUP:_i call NEAR PTR_Test add sp, En las versiones ms modernas del compilador se admiten las llaves '{' y '}' para agrupar varias sentencias asm:
asm { push ax; push cx; mov cx,dato1 mov ax,0h } mult: asm { add ax,dato2 loop mult mov resultado,ax pop cx; pop ax; }

4.3.- Operadores.
Operadores Aritmticos: Pueden emplearse libremente (+), (-), (*) y (/). En este ltimo caso la divisin es siempre entera. Tambin se admiten los operadores MOD (resto de la divisin) y SHL/SHR (desplazar a la izquierda/derecha cierto nmero de bits). Operadores Lgicos: Pueden ser el AND, OR, XOR y NOT. Realizan las operaciones lgicas en las expresiones.

Operadores relacionales: Devuelven condiciones de cierto (0FFFFh o 0FFh) o falso (0) evaluando una expresin. Pueden ser: EQ (igual), NE (no igual), LT (menor que), GT (mayor que), LE (menor o igual que), GE (mayor o igual que). Operador PTR: Redefine el atributo de tipo (BYTE, WORD, DWORD, QWORD, TBYTE) o el de distancia (NEAR o FAR) de un operando de memoria. Por ejemplo, si se tiene una tabla definida de la siguiente manera: Tabla DW 10 DUP (0) ; 10 palabras a 0 Para colocar en AL el primer byte de la misma, la instruccin MOV AL, tabla es incorrecta, ya que tabla (una cadena 10 palabras) no cabe en el registro AL. Lo que desea el programador debe indicirselo en este caso explcitamente al ensamblador de la siguiente manera: MOV AL,BYTE PTR tabla Los operadores de memoria son operadores unarios que devuelven el resultado de una operacin directa de memoria. Estos operadores se utilizan principalmente para depurar cdigo en lenguaje ensamblador.
{BY | WO | DW} address

El operador BY devuelve un entero corto que contiene el primer byte de la direccin (address). Este operador simula BYTE PTR. El operador WO devuelve un entero corto que contiene el valor de la palabra, dos bytes, de la direccin (address). Este operador simula la operacin WORD PTRde Microsoft Macro Assembler. El operador DW devuelve un entero largo que contiene el valor de los cuatro primeros bytes de la direccin (address). Este operador simula DWORD PTR. El especificador de formato x que se utiliza en algunos de estos ejemplos hace que el resultado se muestre en hexadecimal.
Ejemplos

Para mostrar el primer byte en la direccin de la variable sum:

BY sum

Para mostrar la primera palabra en la direccin de la variable new_set: WO new_set

Para mostrar la palabra doble en la direccin de sum: DW sum

Para mostrar el byte al que apunta el registro EBP con un desplazamiento de 6: BY ebp+6,x

Para mostrar la palabra a la que apunta el puntero de pila, la ltima palabra insertada en la pila: WO esp,x

Para mostrar la palabra doble a la que apunta el registro ESI: DW esi,x

4.3.- Operadores.
Operadores Aritmticos: Pueden emplearse libremente (+), (-), (*) y (/). En este ltimo caso la divisin es siempre entera. Tambin se admiten los operadores MOD (resto de la divisin) y SHL/SHR (desplazar a la izquierda/derecha cierto nmero de bits). Operadores Lgicos: Pueden ser el AND, OR, XOR y NOT. Realizan las operaciones lgicas en las expresiones. Operadores relacionales: Devuelven condiciones de cierto (0FFFFh o 0FFh) o falso (0) evaluando una expresin. Pueden ser: EQ (igual), NE (no igual), LT (menor que), GT (mayor que), LE (menor o igual que), GE (mayor o igual que).

Operador PTR: Redefine el atributo de tipo (BYTE, WORD, DWORD, QWORD, TBYTE) o el de distancia (NEAR o FAR) de un operando de memoria. Por ejemplo, si se tiene una tabla definida de la siguiente manera: Tabla DW 10 DUP (0) ; 10 palabras a 0 Para colocar en AL el primer byte de la misma, la instruccin MOV AL, tabla es incorrecta, ya que tabla (una cadena 10 palabras) no cabe en el registro AL. Lo que desea el programador debe indicirselo en este caso explcitamente al ensamblador de la siguiente manera: MOV AL,BYTE PTR tabla Los operadores de memoria son operadores unarios que devuelven el resultado de una operacin directa de memoria. Estos operadores se utilizan principalmente para depurar cdigo en lenguaje ensamblador.
{BY | WO | DW} address

El operador BY devuelve un entero corto que contiene el primer byte de la direccin (address). Este operador simula BYTE PTR. El operador WO devuelve un entero corto que contiene el valor de la palabra, dos bytes, de la direccin (address). Este operador simula la operacin WORD PTRde Microsoft Macro Assembler. El operador DW devuelve un entero largo que contiene el valor de los cuatro primeros bytes de la direccin (address). Este operador simula DWORD PTR. El especificador de formato x que se utiliza en algunos de estos ejemplos hace que el resultado se muestre en hexadecimal.
Ejemplos

Para mostrar el primer byte en la direccin de la variable sum: BY sum

Para mostrar la primera palabra en la direccin de la variable new_set:

WO new_set

Para mostrar la palabra doble en la direccin de sum: DW sum

Para mostrar el byte al que apunta el registro EBP con un desplazamiento de 6: BY ebp+6,x

Para mostrar la palabra a la que apunta el puntero de pila, la ltima palabra insertada en la pila: WO esp,x

Para mostrar la palabra doble a la que apunta el registro ESI: DW esi,x

4.4.- Integrar mdulos de ensamblador en lenguajes de alto nivel.


LA SENTENCIA ASM

La sentencia asm permite incluir cdigo ensamblador dentro del programa C, utilizando los mnemnicos normales del ensamblador. Sin embargo, el uso de esta posibilidad est ms o menos limitado segn la versin del compilador. En Turbo C 2.0, los programas que utilizan este mtodo es necesario salir a la lnea de comandos para compilarlos con el tradicional compilador de lnea, lo cual resulta poco atractivo. En Turbo C++ 1.0, se puede configurar adecuadamente el compilador para que localice el Turbo Assembler y lo utilice automticamente para ensamblar, sin necesidad de salir del entorno integrado. Sin embargo, es a partir del Borland C++ cuando se puede trabajar a gusto: en concreto, la versin Borland C++ 2.0 permite ensamblar sin rodeos cdigo ensamblador incluido dentro del listado C. El nico inconveniente es la limitacin del hardware disponible: para un PC/XT, el Turbo C 2.0 es el nico compilador aceptablemente rpido. Sin embargo, en un 286 es ms recomendable el Turbo C++, mientras que en un 386 modesto (o incluso en un 286 potente) resulta ms interesante emplear el

Borland C++ 2.0: las versiones 3.X de este compilador son las ms adecuadas para un 486 o superior (bajo DOS). La sintaxis de asm se puede entender fcilmente con un ejemplo. El propsito del siguiente programa: Eliminar archivos dando la direccion de donde se encuentra el archivo que se decea borrar y la extencion del mismo, si no te mandara un error : #include <stdio.h> #include <conio.h> int main(){ int orror=0; char * dir; clrscr(); printf("Direccion del archivo:\n"); scanf("%s",dir); _asm{ asm mov ah,0041h asm mov dx,dir asm int 21h asm jc oorror asm jmp continuar } oorror: asm mov orror, ax continuar: if(orror){ printf("!Error de Archivo!"); } else{ printf("!Exito al eliminar Archivo!"); } getch(); return -1; } Otro ejemplo es la elaboracin de de un programa, es la elaboracin de un reloj hibrido, como se muestra acontinuacin:
# include <stdio.h> # include <conio.h> void main (void) { char bandera, horas, minutos, segundos, centesimas;

clrscr(); bandera=0; for (;;) { _asm{ mov ah,2ch int 21h mov horas,ch mov minutos,cl mov segundos,dh mov centesimas,dl } if (segundos!=bandera) { printf ("\n%i:%i:%i. %i",horas,minutos,segundos,centesimas); bandera=segundos; } } getch(); }

Вам также может понравиться