Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: elfish_rider am 18. July 2005, 18:41

Titel: Darf der Compiler?
Beitrag von: elfish_rider am 18. July 2005, 18:41
Ich kopiere mit Zeigern eine Struktur in eine andere:

void GetTSS(WORD TaskID, struct TSS* TaskStateSegment)
{
struct TSS* Base = (struct TSS*)(0x20000 + TaskID*100);
*TaskStateSegment = *Base;
}


Der Compiler (gcc 3.4.3) kompiliert das natürlich fehlerfrei, jedoch sagt mir der Linker:

cpu.o(.text+0x16):cpu.c: undefined reference to `_memcpy'


Wieso um alles in der Welt will der eine Funktion der Standardbibliothek aufrufen, wo ich doch "Freestanding-Code" erzeuge???

Kann mir wer sagen, wie ich diese memcpy-Funktion deklarieren soll bzw. wie ich dieses Problem anders lösen könnte...
Titel: Darf der Compiler?
Beitrag von: Jidder am 18. July 2005, 19:19
er will memcpy() aufrufen, weil du ein struct (=großes dings) kopieren willst.

memcpy:
void * memcpy(void * dest, const void * src, size_t num)
{
char *_dest = (char*)dest, *_src = (char*)src;
while(num--)
*_dest++ = *_src++;

return dest;
}


und dann würde ich explizit den aufruf hinschreiben:

void GetTSS(WORD TaskID, struct TSS* TaskStateSegment)
{
   struct TSS* Base = (struct TSS*)(0x20000 + TaskID*100);
   memcpy((void*)TaskStateSegment, (void*)Base, sizeof(struct TSS));
}


anders lösen: einfach jedes member einzeln kopieren:

void GetTSS(WORD TaskID, struct TSS* TaskStateSegment)
{
   struct TSS* Base = (struct TSS*)(0x20000 + TaskID*100);
   TaskStateSegment->eax = Base->eax;
   TaskStateSegment->ebx = Base->ebx;
   TaskStateSegment->ecx = Base->ecx;
   /* usw */
}