MASM nach NASM übersetzen ...



  • Hier mal wie sich eine Adresse zusammensetzt (20Bit)

    [Segmentselektor: CS,DS,SS,...] 
       |15        |11                |0
    
                  [Offset: Register und/oder imm16]
    +             |15                             |0
    --------------------------------------------------
       [             20 Bit Adresse               ]
       |20                                        |0
    

    Wenn man also die echte Adresse ausrechnen will, muss man den Inhalt des Segmentregisters um 4 nach links shiften und dann das Offset dazu addieren:
    p = ([CS,DS,SS...] << 4) + Offset

    Das Offset kann sowohl durch ein Register/Registerkombination und/oder einem 16Bit immediate (Zahlenwert)gegeben sein.
    Hieraus ergibt sich im Übrigen auch, dass man Ein und die Selbe Adresse durch verschieden paare von Segmentregister und Offset Bilden kann.



  • @masm
    Nicht böse gemeint, aber habe ich dem in irgendeiner Art und Weise widersprochen?



  • da hab ich deinen letzten Beitrag falsch verstanden 🙂



  • FrEEzE2046 schrieb:

    phys. (lineare) Adresse = Segment * 16 + Offset = Segment << 4 + Offset
    

    Macht für mich halt nur keinen Sinn, warum in den Beispielen von euch immer das Offset shl 1 gemacht wurde.
    Aber da habt ihr euch wohl von meiner Umrechnung vom Index auf die 16-Bit Adresse aus meinem Beispeil irre machen lassen.



  • Ok, ich sehe ein es war ein Fehler, dein Beispiel aufzugreifen, da es offenbar nur noch mehr Verwirrung gestiftet hat.

    Die Formel zur Berechnung der physikalischen Adresse im RM hast du da jetzt korrekt gepostet.

    Zu der Sache mit dem shift bleibt sonst nur nochmal festzuhalten, dass es in 16Bit-Adressen keine Registerskalierung (*2, *4, etc.) oder -summanden gibt und du deshalb in so einem Fall entsprechende Berechnungen extra ausfuehren musst:

    mov ax, [di * 2] ; Skalierung funktioniert mit 16Bit-Adressen nicht!
    
    ;stattdessen aequivalent:
    shl di, 1
    mov ax, [di]
    

    Das hat dir "masm" bereits ganz zu Anfang geschrieben, worauf dein eigenartiges Beispiel folgte...



  • Nobuo T schrieb:

    worauf dein eigenartiges Beispiel folgte...

    Okay, ich habe ein falsches Beispiel gepostet (bzgl shl 1, statt 4) und du hast die Berechnung im Real Mode falsch beschrieben. Es ist schließlich nicht vorgesehen den Offset immer * 2 (shl 1) zu rechnen. Dass hatte im übrigen nichts mit meinem Beispiel von oben zu tun, wo ich den Index auf die Adresse (16-Bit) anpassen musste.
    Irgendwo haben wir doch eh das selbe gemeint, aber hatten Schwierigkeiten es auch so auszudrücken. Thema erledigt.



  • FrEEzE2046 schrieb:

    du hast die Berechnung im Real Mode falsch beschrieben.

    Wo denn? 😕



  • Nobuo T schrieb:

    Wo denn? 😕

    Hier:

    Nobuo T schrieb:

    Dh. dein Beispiel muesste korrekt so lauten:
    pAddr = (0x0040 << 1) + (0x1000 << 4) = 0x10080

    Mein Beispiel war:

    FrEEzE2046 schrieb:

    Angenommen:
    Segment = 0x1000
    Offset = 0x0040



  • FrEEzE2046 schrieb:

    Nobuo T schrieb:

    Wo denn? 😕

    Hier:

    Nobuo T schrieb:

    Dh. dein Beispiel muesste korrekt so lauten:
    pAddr = (0x0040 << 1) + (0x1000 << 4) = 0x10080

    Mein Beispiel war:

    FrEEzE2046 schrieb:

    Angenommen:
    Segment = 0x1000
    Offset = 0x0040

    Da hast du wohl was falsch verstanden.
    Das ist, wie im zitierten Beitrag steht, meine Interpretation deines Beispiels (warum postest du eigentlich ueberhaupt nur diesen kleinen nichtssagenden Ausschnitt desselben?)?
    Moeglich, dass ich deine Frage mit dem Beispiel falsch interpraetiert habe, allerdings habe ich nirgendwo geschrieben, dass der Teil, den du hier zitierst, die allgemeine Formel fuer die physikalische Adressberechnung im RM sei - die steht naemlich direkt darueber.



  • @ Nobuo T

    Du hast einfach die beiden Beispiele zusammen "gewurschtelt". Daher auch die Missverständnise.
    Die Formel für die Berechnung der phys. Adresse hast du darüber richtig gepostet, dass stimmt natürlich.


Anmelden zum Antworten