Enlazar módulos
Publicado por Rafa (1 intervención) el 23/03/2007 01:18:05
Hola a todos.
Tengo un problema que me está dando algunos dolores de cabeza. Se trata de unir código C con código ensamblador. Todo el proyecto se construye bien. En C compilo para el modelo tiny de 64kBytes para código, datos y pila. El problema es que el ejecutable generado no localiza bien la zona de datos. Tengo que sumar el PSP (100h) de forma manual a todos los datos para que se direccionen de forma correcta. ¿Qué error cometo?
Como ejemplo de C, podemos poner:
main.c
---------
#include "printf.h"
int main(void)
{
my_printf("Saludos");
return 0;
}
El código de printf.c es:
-------------------------------
int printk(char *str,...)
{
char *ptr;
va_list args;
va_start(args,str);
for(ptr=str; *ptr; ptr++)
{
if(*ptr!='%')
putchar(*ptr);
else
{
switch(*(++ptr))
{
case 'd': putint(va_arg(args,int));
break;
case 'c': putchar(va_arg(args,char));
break;
default : putchar(*ptr);
}
}
}
va_end(args);
return 0;
}
COMPILACIÓN
--------------------
TASM /ml putchar.asm => putchar.obj
TASM /ml putint.asm => putint.obj
TCC -mt -c printf.c => printf.obj
TCC -mt -c main.c => main.obj
Enlazado: TLINK main.obj printf.obj putint.obj putchar.obj
Esto genera main.exe, pero no imprime la cadena "Saludos" porque no la localiza en el segmendo de datos. Está desplazada 100h bytes más.
Se agradece alguna ayuda.
Muchas gracias
Tengo un problema que me está dando algunos dolores de cabeza. Se trata de unir código C con código ensamblador. Todo el proyecto se construye bien. En C compilo para el modelo tiny de 64kBytes para código, datos y pila. El problema es que el ejecutable generado no localiza bien la zona de datos. Tengo que sumar el PSP (100h) de forma manual a todos los datos para que se direccionen de forma correcta. ¿Qué error cometo?
Como ejemplo de C, podemos poner:
main.c
---------
#include "printf.h"
int main(void)
{
my_printf("Saludos");
return 0;
}
El código de printf.c es:
-------------------------------
int printk(char *str,...)
{
char *ptr;
va_list args;
va_start(args,str);
for(ptr=str; *ptr; ptr++)
{
if(*ptr!='%')
putchar(*ptr);
else
{
switch(*(++ptr))
{
case 'd': putint(va_arg(args,int));
break;
case 'c': putchar(va_arg(args,char));
break;
default : putchar(*ptr);
}
}
}
va_end(args);
return 0;
}
COMPILACIÓN
--------------------
TASM /ml putchar.asm => putchar.obj
TASM /ml putint.asm => putint.obj
TCC -mt -c printf.c => printf.obj
TCC -mt -c main.c => main.obj
Enlazado: TLINK main.obj printf.obj putint.obj putchar.obj
Esto genera main.exe, pero no imprime la cadena "Saludos" porque no la localiza en el segmendo de datos. Está desplazada 100h bytes más.
Se agradece alguna ayuda.
Muchas gracias
Valora esta pregunta
0