Forum: PC-Programmierung Segment und Offset berechnen


von Lefkowitz (Gast)


Lesenswert?

Hallo,

habe folgendes Problem. Ich möchte (in C, DOS-Programmierung) überprüfen 
ob ein bestimmter Speicher existiert. Dazu will ich in die 
Speicheradressen 0x40000, 0x80000 und 0xFFFFF etwas hineinschreiben und 
dann wieder herauslesen um dann durch den Vergleich herauszufinden ob 
der Speicher existiert. Nun wäre dies kein Problem, wenn ich das Segment 
und den Offset der Speicheradressen kennen würde. Ich könnte mit MK_FP 
einen Far-Pointer erzeugen und die Speicherstellen abtesten.

Meine Frage ist nun, wie man aus den von mir genannten Speicheradressen 
den Segmentanteil und den Offsetanteil "herausrechnen" kann. 
Offensichtlich kann es sich ja nicht um 0004:0000, 0008:0000 und 
000F:FFFF handeln.

Vielen Dank!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Im Realmode --und um den geht es ja wohl-- sind Segment und Offset um 
vier Bit verschoben.

Addr = ABCDE

       A = Segment, Bit 15..12
       B = Summe aus Segment, Bit 11..8 und Offset, Bit 15..12
       C = Summe aus Segment, Bit 7..4 und Offset, Bit 11..8
       D = Summe aus Segment, Bit 3..0 und Offset, Bit 7..4
       E = Offset, Bit 3..0

Am einfachsten ist die Chose, wenn man normierte Adressen verwendet, 
bei diesen beträgt der Offset maximal 0xF.


0x40000 = 4000:0000

0xFFFFF = FFFF:000F

Hier mal ein paar Beispiele für nichtnormierte, aber identische 
Adressen:

        = F000:FFFF
        = FF00:0FFF
        = FFF0:00FF

von Lefkowitz (Gast)


Lesenswert?

Hallo,

danke erst einmal für die rasche Antwort. Die von mir genannten Adressen 
sind ja recht trivial aufgebaut. Wie sieht es bspw. mit 0xB07C2 aus? 
B000:07C2 wäre doch hier nicht korrekt, oder? Mir fehlt so ein wenig die 
Methode um die Anteile auszurechnen.

Danke!

von Bartli (Gast)


Lesenswert?

Physikalische Adresse = Segment * 16(dezimal) + Offset

Wo ist das Problem?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Wie sieht es bspw. mit 0xB07C2 aus?
> B000:07C2 wäre doch hier nicht korrekt, oder?

Doch, ist es. Genauso wie B07C:0002 und B070:00C2 oder B050:02C2.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.