Problem mit Addressierung in C
-
hi,
also ich mache folgendes:
unsigned char *ptr; asm mov ax, 2000h asm mov es, ax asm mov bx, 0h asm mov ah, 65 asm mov es:bx, ah ptr = 0x20000; printchar(*ptr);
aber ich bekomme nicht den inhalt von 2000:0000 ausgegeben sondern den inhalt von 1000:0000. Hat das vielleicht irgendwas damit zu tun das in ds auf 1000h steht?
MFG Marcel
-
Ist das ganez ein DOS-Programm? Wenn ja, dürfte ptr = 0x20000; den Effekt haben, dass ptr auf 0 gesetzt wird, passen ja nur 16 Bit dann rein. Sofern DS auf 1000 liegt, wird der pointer dann als 1000:0000 interpretiert. Soweit zur Ursache, mehr kann ich nicht aushelfen, ahbe nie unetr DOS C gecodet.
-
mach mal mov ptr,2000h
dann sollte es gehen...
oder mov prt,2000h:0000h
-
wenn ich
asm mov [ptr], 2000h
mache hat es den selben effekt als ptr = 0x2000;
und wenn ichasm mov [ptr], 2000:0000
mache bekomm ich die fehlermeldung "illegal memory reference"
Marcel
-
Jup, du müsstest dafür schon ds ändern. also z.B. vorher
push ds
mov ax, 0x2000
mov ds, axund danach
pop ds
oder so. Wenns ein DOS-Compiler ist soltle der aber auch was für FAR-pointer haben.
-
imho müsste ptr dann mit dem Modifizierer far deklariert werden.
mfg
-bg-
-
und wenn ich ptr als far pointer deklariere kann ich seine adresse auf 0x20000 setzen?
Marcel
-
Original erstellt von <Marcel>:
**und wenn ich ptr als far pointer deklariere kann ich seine adresse auf 0x20000 setzen?
**Das wäre der Sinn von far pointern. Welchen compielr benutzt du eigentlich? das könnte sonst helfen.
-
ich verwend tcc 2.01
kann ich dann einfachunsigned char far *ptr = 0x20000;
machen? oder muss ich noch irgendwas beachten
Marcel
-
Entscheident is auch ob der Code im PMode oder im RMode ausgeführt wird.
Der Realmode ist unter Dos, und "emuliert" in den Dos-Boxen von Windows vorhanden.
im PMode schlägt der Versuch einen Wert in ein Segmentregister zu laden mit großer Wahrscheinlichkeit fehl und eindet in einer Exception, dafür kannst du aber ein 32bit Register zum adressieren nutzen.
Eine Auskunft über das Ziel OS wäre daher wohl hilfreich. (kann mir unter tcc 2.1 nicht so viel vorstellen)mfg
-bg-
-
HI,
des ganze läuft im realmode unter keinem OS.
also wie weiße ich meinem far-pointer jetzt die adresse 2000:0000 zu?MFG Marcel