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
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
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
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
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
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
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
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
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden