Sie sind auf Seite 1von 17

PROGRAMACIN HBRIDA

EXTRN Indica al ensamblador que el elemento llamado un dato procedimiento o etiqueta esta definido en otro ensamblado. EXTRN nombre : tipo [, ] Puede definir mas de un nombre, hasta el final de la lnea, o bien codificar instrucciones adicionales EXTRN El otro modulo a su vez debe definir el nombre e identificarlo como PUBLIC La entrada tipo puede ser ABS (una constante), BYTE, DWORD, FAR, NEAR, WORD o por un nombre definido por un EQU BYTE, WORD, DWORD identifican datos a los que hace referencia un modulo, pero otro modulo los define NEAR, FAR identifican un procedimiento o etiqueta

EXTRN MAINPROG PROC ... CALL ... MAINPROG ENDP ------------------------------------PUBLIC SUBPROG PROC ... ... RET SUBPROG ENDP

SUBPROG:FAR FAR SUBPROG

SUBPROG FAR

PUBLIC Indica al ensamblador y al enlazador que la direccin de un smbolo especificado definido en el ensamblado actual estar disponible para otros mdulos. PUBLIC smbolo[, ] Puede definir mas de un smbolo, hasta el final de la lnea, o bien codificar instrucciones adicionales PUBLIC La entrada smbolo puede ser una etiqueta (incluyendo etiquetas PROC), una variable o un numero Entradas no validas incluyen nombres de registros y smbolos EQU que definen valores de dos bytes

TITLE

P23MAIN1 LLAMA AL SUBPROGRAMA EXTRN P23SUB1:FAR ;------------------------------------------STACKSG SEGMENT PARA STACK 'Stack' DW 64 DUP(?) STACKSG ENDS ;------------------------------------------DATASG SEGMENT PARA 'Data' QTY DW 0140H PRICE DW 2500H DATASG ENDS ;------------------------------------------CODESG SEGMENT PARA Code' BEGIN PROC FAR ASSUME SS:STACKSG,DS:DATASG,CS:CODESG MOV AX,DATASG ;Se asigna direccin de DATASG MOV DS,AX ; en registro DS MOV AX,PRICE MOV BX,QTY CALL P23SUB1 MOV AX,4C00H ; salida a DOS INT 21H BEGIN CODESG ENDP ENDS END ;Fin procedimiento ;Fin segmento ;Fin de programa

BEGIN

TITLE

P23SUB1 SUBPROGRAMA LLAMADO PUBLIC P23SUB1 ;------------------------------------------CODESG SEGMENT PARA 'Code' P23SUB1 PROC FAR ASSUME CS:CODESG MUL BX ;AX=precio, BX=cant RET ;DX:AX = producto P23SUB1 ENDP ;Fin procedimiento CODESG ENDS ;Fin segmento END P23SUB1 ;Fin de programa

ENLAZANDO PROGRAMAS EN C Y EN ENSAMBLADOR

El problema con la descripcin del enlace de programas en C a programas en ensamblador es que las versiones de C tienen diferentes convenciones...
Para versiones de C que son sensibles al uso de maysculas y minsculas, el nombre de los mdulos en lenguaje ensamblador debe ser escrito exactamente igual que en la referencia del programa en C.

La mayora de las versiones en C pasan los parmetros a la pila en una secuencia inversa que la de otros lenguajes. Ejemplo: Adds(m,n); La instruccin guarda en la pila n y despus la m en ese orden, y luego llama a Adds. Al regresar del modulo llamado, el modulo en C (no el modulo en lenguaje ensamblador) suma 4 al SP para desechar los parmetros pasados. El procedimiento comn en el modulo de lenguaje ensamblador llamado para accesar los dos parmetros pasados es como sigue: PUSH MOV MOV MOV .. POP RET BP BP,SP DH,[BP+4] DL,[BP+6] BP

Algunas versiones de C necesitan que un modulo en ensamblador que cambia los registros DI y SI los guarde en pila al entrar y los saque al salir del subprograma en ensamblador El modulo en ensamblador debe regresar los valores, si se necesitan, como una palabra en el AX o dos palabras en el par DX : AX En algunas versiones de C, un programa en ensamblador que pone en uno la bandera DF (bandera de direccin )debe ponerla en cero (CLD) antes de regresar

Enlace de Turbo C con Turbo Assembler Compatibilidad de los tipos de datos

TIPO DE DATO EN C TIPO DE DATO EN ASM char DB unsigned short/int DW int, short DW unsigned long DD long DD

Valores regresados: El modulo en ensamblador llamado utiliza los registros siguientes para cualquier valor regresado: TIPO DE DATO EN C REGISTRO char AL short,near,int (16 bits) AX short,near,int (32 bits) EAX long, far (16 bits) DX:AX long, far (32 bits) EDX:EAX

Interfaces del lenguaje (TURBO C y TURBO ASSEMBLER) Mdulos separados: Hacer programa en C Hacer programa en ensamblador Utilice TCC para compilar el modulo de C TASM para ensamblar el modulo de ensamblador y, TLINK para enlazarlos Cdigo ensamblado en lnea Compilar el programa en C con TCC.EXE Inserte las instrucciones en ensamblador, precedidas por la palabra asm, en el cdigo fuente, p.e. asm INC WORD PTR FLDX

Segmentos El segmento de cdigo debe ser llamado _TEXT. El segmento de datos (dos, si se necesitan) son llamados _DATA para datos que se inicializaran a la entrada del bloque y _BSS para datos no inicializados Convencin de nombres Los mdulos en Turbo Assembler deben utilizar la convencin de nombres para segmentos y variables que sea compatible con la de Turbo C. Todas las referencias a funciones y nombres en el modulo de C deben iniciar con un carcter de subrayado (_) C es sensible a maysculas y minsculas, el ensamblado debe usar el mismo tipo de letra (may o min) para cualesquiera nombres de variables en comn con el modulo C

Registros Puede usar libremente los registros AX,BX,CX y DX, ES y de las banderas Para los registros BP,SP,CS,DS,SS,DI y SI, debe guardarlos en la pila y despus restaurarlos Paso de parmetros Turbo C pasa los parmetros por valor. Si hay mas de un parmetro, los guarda en la pila de derecha a izquierda Regreso El programa en ensamblador solo utiliza RET para regresar al modulo en C

Ejemplo: #include <stdio.h> int main (void) { int temp_row, temp_col; Printf ("Enter cursor row: "); scanf ("%d",&temp_row); Printf ("Enter cursor column: "); scanf ("%d",&temp_col); set_curs(temp_row,temp_col); Printf ("New cursor location\n"); }

Ejemplo:

-------------------------------------------------; utilice modelo de memoria pequea para C: codigo y datos cercanos ; utilice nombres de segmentos y directivas de grupo 'estandar _DATA segment word 'DATA' row equ [bp+4] ;parametros col equ [bp+6] ;(argumentos) _DATA ENDS _TEXT SEGMENT BYTE PUBLIC 'CODE' DGROUP GROUP _DATA ASSUME CS:_TEXT, DS:DGROUP, SS:DGROUP PUBLIC NEAR PUSH MOV _set_curs BP BP, SP ;registro BP al que llama ;apunta alos parametros

_set_curs

PROC

MOV MOV MOV MOV INT


POP RET _set_curs _TEXT ENDP ENDS END

AH,02H BX,0 DH, row DL, col 10H


BP

;peticion para colocar el cursor ;pgina de video ;renglon de BP+4 ;columna de BP+6 ;llama al BIOS
;restaura BP ;regresa a donde fue llamado

Bibliografa

Barry B. Brey. Microprocesadores Intel (7a Edicin). Prentice Hall (2006) Peter Abel. Lenguaje Ensamblador y Programacin para PC IBM y compatibles (3 edicin). Pearson Education Medina Ramn. Programacin Avanzada en Lenguaje Ensamblador

Das könnte Ihnen auch gefallen