Autor Thema: Darf der Compiler?  (Gelesen 2225 mal)

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« 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...

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 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 */
}
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen