Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

In C++ auf eine Speicheradresse direkt zugreifen.

Pitsch / 7 Antworten / Baumansicht Nickles

Kann mir jemand verraten, wie ich in \'C++\' eine Speicheradresse
direckt ansprechen kann (zum Beispiel \'378 Hex\' \'888 Dez\' = LPT1)
und zwar so, dass nur der wert von einem Byte (8 Bit)angesprochen wird.
Ich möchte den Wert einer Variablen dort hineinschreiben, oder den vorhandenen Wert in der Speicherstelle einer Variablen zuweisen um die nachher weiter zu verarbeiten.

Ein Müsterchen Programmcode wäre am hilfreichsten.

Besten Dank zum voraus!
Pitsch

bei Antwort benachrichtigen
Dreamforger Pitsch „In C++ auf eine Speicheradresse direkt zugreifen.“
Optionen

unsigned char *ptr; // 1 byte großer pointer
ptr = 0x378; // adresse setzen
*ptr = /*wert*/ // wert zuweisen

Das geht auch mit komplexeren typen (struct / union)

Sollte mich aber garnicht wundern wenn das in Schutzverletzungen endet. Vieleicht ist aber auch der das erste Segment das Virtuellen Speichers ein direktzugriff auf die ersten Hauptspeicherplätze...

Ausprobieren und auf das schlimmste gefasst sein.

bei Antwort benachrichtigen
lqm820 (Anonym) Dreamforger „unsigned char ptr // 1 byte großer pointer ptr 0x378 // adresse setzen ptr /...“
Optionen

Danke für die Antworten!!

Doch leider funktioniert das nicht so.

Wenn ich einen Zeiger auf eine Variable Zeigen lasse, wird der Zeigerwert irgendwie vom Compiler generiert.

Wenn ich aber versuche einem Zeiger direckt einen Wert (ob char, int oder was auch immer) zuzuweisen, hat schon der Compiler etwas zu motzen. Es wird immer ein reinterpret_cast Operator verlangt.
Ich habe schon Diverses probiert, doch nichts geht.
Darum meine Frage: Wie Spreche ich die Portregister direkt an.
LPT1 = 378 Hex Basisadresse / 1 Steuerregister = Basisadrese + 1 /
2 Steuerregister = Basisadresse + 2 ?
Ich habe schon Stundenlang die MSDN Durchsucht doch leider keine Beschreibung, die ich verwerten konte für dieses Problems gefunden.
In Qbasic von Dos war das eine einfache sache mit out() und in().
Visualbasic kennt keine Befehle zur direckten Adressierung.
In C/C++ sollte es gehen!! aber wie ??

bei Antwort benachrichtigen
thomas woelfer lqm820 (Anonym) „Danke für die Antworten!! Doch leider funktioniert das nicht so. Wenn ich einen...“
Optionen

ein zeiger auf eine beliebige adresse muss vom typ void sein, ansonsten musst du halt casten. da hat der compiler schon recht. mit void, wie gesagt, gehts aber problemlos.

wie aber ebenfalls bereits gesagt: inport/outport geht unter win32 nur im eigenen adressraum. aber eben _nicht_ auf beliebige adressen ausserhalb. das ist auch logisch, denn wenn du auf beliebige adressen lesend oder schreibend zugreifen koenntest, dann koente ja jedes anwendungsprogramm jedes andere stoeren/beeinflussen - und genau das soll ja eben nicht passieren.

um von der parallalel zu lesen brauchst du wie gesagt die ReadFile/Openfile apis.

WM_HOPETHISHELPS
thomas woelfer

this posting contains no tpyos.
bei Antwort benachrichtigen
thomas woelfer Pitsch „In C++ auf eine Speicheradresse direkt zugreifen.“
Optionen

void* p = ADRESSE;
*p = WERT;

allerdings kannst du bei einem programm das auf anwendungsebene laeuft _nur_ auf speicher zugreifen, der auch im adressraum deiner anwendung liegt.

wenn du von ports lesen wills, dann musst du die OpenFile()api verwenden oder einen geraetetreiber schreiben mit dem du dann auf anderem wege kommunizierst.

WM_HOPETHISHELPS
thomas woelfer

this posting contains no tpyos.
bei Antwort benachrichtigen
(Anonym) Pitsch „In C++ auf eine Speicheradresse direkt zugreifen.“
Optionen

Hi Pitsch,
so wie ich das verstehe willst du auf die Register des Parallelports
zugreifen. Such mal in der MSDN nach _outp. Die Funktion sollte
in der conio.h zu finden sein. Die Argumente sind (glaubich)
_outp(REGISTERADR,WERT) , wobei REGISTERADDR z.B. 0x378 (also die
Registeradresse) und WERT der auszugebende (short) Wert ist.
Hoffe das hilft dir weiter, ich kann aber nicht sagen ob das so stimmt, war nur das bischen, was ich noch in Erinnerung hatte.

PeeWee
PS: _outp funktioniert nur unter Win95/98, nicht unter NT/2000

bei Antwort benachrichtigen
(Anonym) Pitsch „In C++ auf eine Speicheradresse direkt zugreifen.“
Optionen

Hallo Pitsch + lqm820,
versuch mal die Funktion _outp aus der conio.h
z.B. _outp(0x378,WERT). Ebenso _inp (oder so ähnlich).
Geht nur unter Win98/95 nicht unter NT/2000.
Weiter so,
PeeWee

bei Antwort benachrichtigen
(Anonym) Pitsch „In C++ auf eine Speicheradresse direkt zugreifen.“
Optionen

Es gibt ´nen Universalen Port Treiber für NT basierte Systeme:
"MapMemPlus" heißt das ganze, und damit sind auch Inp und Outp auf NT und 2000 möglich.

Das ganze kann man zB hier downloaden: http://www.eivd.ch/iai/projet/mmp.htm (ist Freeware)

Viel Spaß damit

bei Antwort benachrichtigen