Absolute Adresse

Hallo,

Gibt es in C eine Möglichkeit eine Variable ueber einen bestimmten Speicherbereich zu legen ?

Wer sich jetzt fragt „Wofür ?“, dem sei hier mal ein Stück Pascal-Code gegönnt:

Var
X : Array[0…1999] of Word absolute $b800:blush:0;

Bin fuer jede Antwort dankbar.

Lars

Hallo Lars,

Gibt es in C eine Möglichkeit eine Variable ueber einen
bestimmten Speicherbereich zu legen ?

Wer sich jetzt fragt „Wofür ?“, dem sei hier mal ein Stück
Pascal-Code gegönnt:

Var
X : Array[0…1999] of Word absolute $b800:blush:0;

z.B.

int *Array[2000] = {(int *) 0x800}
*Array[3]=3;

oder so etwas:
(*(int *) (0x800)) = 5;

eine andere Variante ist die Variable in ein eigenes Modul zu packen und dann die gewünschte Adresse mit dem Linker festzulegen, ist aber etwas komplizierter.

MfG Peter(TOO)

Hallo,

[…]

Wer sich jetzt fragt „Wofür ?“, dem sei hier mal ein Stück
Pascal-Code gegönnt:

Var
X : Array[0…1999] of Word absolute $b800:blush:0;

Ich frage mich immmer noch, wofür?

Gruß

Fritze

Hi Lars.

Gibt es in C eine Möglichkeit eine Variable ueber einen
bestimmten Speicherbereich zu legen ?

Es gibt eine Möglichkeit, aber nur für DOS, da unter Windows der Speicher etwas anders gehandhabt wird.

In DOS.H sind folgende Makros definiert:

#define MK\_FP(seg,ofs) ((void \_seg \*)(seg) + (void near \*)(ofs))
#define FP\_SEG(fp) ((unsigned)(void \_seg \*)(void far \*)(fp))
#define FP\_OFF(fp) ((unsigned)(fp))

Mit MK_FP kannst du einen beliebigen Far Pointer erzeugen, mit FP_SEG und FP_OFF kannst du die Segment- und Offset-Adresse rauskriegen.

Um dein Beispiel zu nehmen:

Var X : Array[0…1999] of Word absolute $b800:blush:0;

WORD \*x = MK\_FP(0xB800, 0x0);

Dann könntest du x als Array behandeln ( x[0] bis x[1999] und darüber hinaus :wink:

Ich würde aber eine andere Definition für einen Far Pointer verwenden, die ohne den _seg Modifier auskommt:

#define MK\_FP(seg,ofs)
 ((void far \*)((((long)(seg) & 0xFFFF) 
(Ohne Gewähr, ich habs aus dem Kopf einfach hingeschrieben...)

cu
Klaus

Autsch, da hab ich doch glatt nen Anfängerfehler gemacht… :wink:

#define MK\_FP(seg,ofs)
 ((void far \*)((((long)(seg) & 0xFFFF) && 0xFFFF)))

ist falsch, da muss & statt && stehen:

#define MK\_FP(seg,ofs)
 ((void far \*)((((long)(seg) & 0xFFFF) & 0xFFFF)))