Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

...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

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

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

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

Des ist genau das was ich gesucht habe. Super. Probiere das gleich mal aus. Hoffungsvoll...

MVg

need-some-blood

  • 2 Wochen später...

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.