need-some-blood Geschrieben 11. Juni 2004 Geschrieben 11. Juni 2004 Hallo, hab ein kleines Prob möchte einen Wert in einem Speichersegment auslesen. Weiß aber nicht wie ich das mache. Wert liegt bei EX:BX. Wie kann ich nun darauf zugreifen? Ich weiß,ich muss den Segmentzeiger verschieben, aber wie? MVg need-some-blood Zitieren
nic_power Geschrieben 11. Juni 2004 Geschrieben 11. Juni 2004 Hallo, kannst Du das noch etwas genauer beschreiben? Was ist in dem Register enthalten, ein Pointer auf eine Speicherstelle die ausgelesen werden soll oder direkt der auzulesende Wert? Mit Standard-C wirst Du das gewünschte Ergebniss nicht erreichen, allerdings gibt es die Möglichkeit inline Assembler einzubinden (wobei das wiederum Compiler-Abhängig ist, mit welchem Compiler arbeitest Du)? Sofern Du einen Zeiger innerhalb eines C-Programms hast, kannst Du alternativ auch mit memory mapped files arbeiten (zumindes unter Unix/Linux). Nic Zitieren
need-some-blood Geschrieben 11. Juni 2004 Autor Geschrieben 11. Juni 2004 ...Der Fehlerzustand wird im Puffer bei ES:BX abgelegt... Quelle das Handbuch Also wird der direkte Wert dort abgelegt. Arbeite mit BC3.1 for DOS. das ganze soll auf RDos aufsetzen. Und es muss 80186 kompatibel sein. Die Kiste ist der BC660 von Beck. klickste hier Momentan weiß ich echt net weiter. MVg need-some-blood Zitieren
kLeiner_HobBes Geschrieben 14. Juni 2004 Geschrieben 14. Juni 2004 int far* fehlerzustand; int segment; int offset; /* Aufruf deiner Funktion */ asm { mov segment,es; mov offset,bx; } fehlerzustand = (segment << 0x10) & offset; weiß aber net, ob das funzt, d.h. ob nach dem aufruf der Funktion es und bx wirklich noch nicht von anderem Code überschrieben worden sind. test it Zitieren
need-some-blood Geschrieben 14. Juni 2004 Autor Geschrieben 14. Juni 2004 Kann ich nicht durch die Registerstrukturen (Regs, Sregs) darauf zugreifen. Laut Hilfe schon. nur praktisch weiß ich nicht wie. Kann da jemand helfen? MVg need-some-blood Zitieren
kLeiner_HobBes Geschrieben 14. Juni 2004 Geschrieben 14. Juni 2004 Also, wenn du schon borland nimmst, dann kannst du auch folgendes machen: int far * fehlerzustand; /* funktionsaufruf */ bla(); fehlerzustand = _ES << 0x10 & _BX; Wie rufst du eigentlich diese Funktion auf? ist es ne C-Funktion? Oder ein Interrupt? Wenn es ein Interrupt ist, dann gehts auch so: #include <dos.h> ... union REGS generic; union SREGS segment; int far * fehlerzustand; generic.ax = blabla; /* Parameter setzen */ . . /* Interruptaufruf mit int86x(). Deklaration: int int86x (int nr, union REGS *in, union REGS *out, struct SREGS *seg) */ int86x(interruptnummer,&generic,&generic,&segment); fehlerzustand = segment.es << 0x10 & generic.bx; /* bzw: */ fehlerzustand = MK_FP(segment.es,generic.bx); /* in dos.h definiert */ /* Über den Zeiger fehlerzustand kannst du jetzt auf den Wert zugreifen */ Hope this helps Zitieren
need-some-blood Geschrieben 15. Juni 2004 Autor Geschrieben 15. Juni 2004 Des ist genau das was ich gesucht habe. Super. Probiere das gleich mal aus. Hoffungsvoll... MVg need-some-blood Zitieren
need-some-blood Geschrieben 25. Juni 2004 Autor Geschrieben 25. Juni 2004 So einfach gehts /*************************************************** -= Analogeingang lesen =- Funktionsaufruf : ReadAnIn(Eingangsadresse "0..2"); Rueckgabewert: -KEINER- ***************************************************/ int GetAnIn (unsigned char AnIn) { union REGS inregs, outregs; struct SREGS segregs; int buffer; inregs.h.ah = 0xd0; inregs.x.dx = 0x0500; segregs.es = FP_SEG(&buffer); inregs.x.bx = FP_OFF(&buffer); inregs.h.cl = AnIn; int86x(SRV_INT, &inregs, &outregs, &segregs); cout <<"Eingang lesen: Kanal "<<inregs.h.cl<<",wert: "<<buffer<<",Fehler: "<<outregs.x.ax<<endl; return buffer; } MVG need-some-blood Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.