An bestimmte Speicherstelle schreiben
-
Hallo,
möchte gerne an folgende Speicherstellen eine 0x01 schreiben: 0x40000, 0x80000 und 0xFFFFF. Danach möchte ich von den genannten Speicherstellen lesen um dann durch einen Vergleich zu ermitteln ob geschriebener Wert mit dem gelesenen Wert übereinstimmt. Wie kann man das am besten machen? Dachte da an nen Zeiger, welchen ich auf die bestimmte Adresse setze. Wie aber kann ich einem Zeiger die Adresse explizit zuweisen?
So vielleicht?
long int *p; p = 0x40000
Danke.
-
int* p = (int*)0x40000;
-
Danke danke. Nochma ne andere Frage. Falls ich nur einen Zeiger deklariere und diesem über Dereferenzierung einen Wert zuweisen möchte, so scheitert dies (Programm stürzt ab).
Beispiel:
int *p; p = (int *)0x40000; *p = 2;
Hat dies damit zu tun, dass eben nur ein Zeiger vorhanden ist und keine Variable, in welcher der Wert gespeichert werden muss? Falls dies so ist, wie kann denn direkt in den Speicher geschrieben werden, ohne Variable?
-
Eher nicht - sonst würde das nicht abkack***.
Die Speicherstelle sollte schon im Datensegment Deines Programms liegen.
-
Achso. Nun ist es ja so, dass die Adresse 0x40000 nicht im Format 0000:0000H (Segment:Offset) vorliegt. Gibt es eine Methode um das Segment und den Offset zu berechnen oder ist dies aufgrund des Hex-Formats einfach 0004:0000?
-
Sharkoon schrieb:
Achso. Nun ist es ja so, dass die Adresse 0x40000 nicht im Format 0000:0000H (Segment:Offset) vorliegt. Gibt es eine Methode um das Segment und den Offset zu berechnen oder ist dies aufgrund des Hex-Formats einfach 0004:0000?
Segment und Offset gibt es bei modernen Betriebssystemen schon seit über 10 Jahren nicht mehr. Programmierst Du DOS?
-
Ja, sorry, hatte vergessen dies zu erwähnen, verdammt ;).
-
LordJaxom schrieb:
Segment und Offset gibt es bei modernen Betriebssystemen schon seit über 10 Jahren nicht mehr.
speichersegmentierung zwingt einem mehr die prozessorarchitektur auf, weniger das betriebssystem. prozessoren übrigens, die sowas nötig haben, sind oft nachträglich krampfhaft aufgemotzte konstruktionen, deren ursprüngliche entwickler zu kurzsichtig waren.
-
Hat keine ne Ahnung? Hatte versucht es rückwärts zu rechnen, d.h. von physikalischer Adresse auf das Segment und den Offset zu kommen. Leider haut das nicht wirklich hin.
-
Sharkoon schrieb:
Hat keine ne Ahnung? Hatte versucht es rückwärts zu rechnen, d.h. von physikalischer Adresse auf das Segment und den Offset zu kommen. Leider haut das nicht wirklich hin.
für welchen prozessor? bei x86 wars, glaub ich so, dass der segment-wert 4 mal links geshiftet werden muss und dann der offset dazu addiert werden kann, um die physikalische adresse zu berechnen.
-
Ja, für x86. Wie die Berechnung der physikalischen Adresse vonstatten geht weis ich auch. Bloß wie gelange ich von der physikalischen Adresse zum Segment-Anteil bzw. dem Offsetanteil?
Beispiel:
Segmentanteil * 16 B0720hex + Offsetanteil 00A2hex = phy. Adresse B07C2hex
Wenn ich nun B07C2 zu 000B:07C2 "umbaue" wäre dies ja falsch.
-
^^ du machst einfach 'ne ganzzahldivision durch 16 (fürs segmant) und der rest ist dann der offset. wenn die werte anders aussehen als die ursprünglichen werte, dann ist das egal. es gibt ja mehrere möglichkeiten, eine physikalische adresse als seg:offs darzustellen.
-
Nur nochmal nachfragen: Du bist dir sicher, dass du fuer den RealMode (!= fuer DOS) programmierst?
Falls das mit seg:Offs so nicht hin haut, waere es sicher hilfreich, wenn du mal genauer schilderst, was du da eigentlich wie bastelst, bevor hier noch 2 Seiten kluge Ratschlaege in die falsche Richtung folgen.
-
Hallo,
ja ich bin mir sicher. Das Thema hat sich aber nunmehr erledigt, da ich mein Problem lösen konnte.
Danke.