mikrocontroller.net

Forum: PC-Programmierung Segment und Offset berechnen


Autor: Lefkowitz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lefkowitz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Bartli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Physikalische Adresse = Segment * 16(dezimal) + Offset

Wo ist das Problem?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.