Problem mit relativen Adressen: jmp $+1



  • Hallo zusammen
    Also irgendwie verstehe ich bald gar nichts mehr! In meinem Assemblerbuch stand, dass ich relative Sprünge folgendermassen machen kann:

    mov dh,0ch
    jmp $+1
    add dh,57h
    

    Aber das klappt überhaupt nicht! Ist mir eigentlich auch klar warum, vermutlich müsste man jmp $+2 machen, weil der opcode von jmp $+1 2 Bytes lang sein dürfte. Aber das währe ja dann sehr gefährlich, denn IMHO ist nicht jeder Opbefehl gleich lang? In meinem Buch stand allerdings, dass man dies unabhängig von der Befehlslänge verwenden könne???

    Gibt es ein anderes Makro oder Assemblerdirektive, welche das gewünschte tut? Ich verwende NASM!

    Ich könnte das Ganze natürlich auch mit Labels machen, aber dann hätte ich ja am Ende 1000nde von Labels zusätzlich in meinem Programm, welche alle noch einen sinnvollen Namen haben müssten!

    Lg Ishildur



  • Aeh, ja. Normalerweise macht man das ueber Labels. Bist du echt so unkreativ, dass dir keine passenden Bezeichnungen einfallen? Dann kannst du sie notfalls auch einfach label1, label2, ..., a, b, usw. nennen.
    Spruenge aber so direkt zu kodieren ist idR. Unfug.



  • @Nobuo T

    Spruenge aber so direkt zu kodieren ist idR. Unfug.

    Aha, OK, gut zu wissen! 🙂

    Ich habe mir nun folgendes Namenssystem einfallen lassen:
    Labels haben alle das Prefix L und Prozeduren P! Auf diese Weise hoffe ich zu verhindern, dass ich versehentlich eine (P)rozedur mit jmp oder ein (L)abel mit call aufrufe. MASM konnte diese unterscheiden, aber für NASM scheinen einfach alles Labels zu sein! 😞

    Noch eine kleine Frage, ich bin damit echt am verzweifeln! Kann es sein, dass für den Interrupt 13h (Zugriff auf Disketten und Festplatten) Funktion 02h die erste Spur mit 0, der erste Sektor jedoch mit 1 beginnt?! 😮 Ich bin seit stunden daran, Sourcefiles und Speicherabbilder zu vergleichen und bin schliesslich zu eben dem Schluss gekommen! Aber wie unsinnig wäre dass denn?

    Lg Ishildur



  • Ishildur schrieb:

    Ich habe mir nun folgendes Namenssystem einfallen lassen:
    Labels haben alle das Prefix L und Prozeduren P! Auf diese Weise hoffe ich zu verhindern, dass ich versehentlich eine (P)rozedur mit jmp oder ein (L)abel mit call aufrufe.

    Hm, ich habe kein so ausgefuchstes System. Eher ueberhaupt keins. Hauptsache der Name hat irgendwie was mit der Funktion des Codes zu tun. 😃
    Ist mir irgendwie auch noch nie passiert, dass ich versehentlich call mit jmp verwechselt habe. Ansonsten kennzeichne ich Prozeduren natuerlich deutlich an Anfang und Ende mit Kommentaren.

    Ishildur schrieb:

    MASM konnte diese unterscheiden, aber für NASM scheinen einfach alles Labels zu sein! 😞

    Richtig. Macht den Code ohne ausreichende andere Strukturierung zwar etwas unuebersichtlich, aber sonst finde ich NASMs Label-System eigentlich besser als das von MASM. Wirkt irgendwie sauberer.

    Ishildur schrieb:

    Noch eine kleine Frage, ich bin damit echt am verzweifeln! Kann es sein, dass für den Interrupt 13h (Zugriff auf Disketten und Festplatten) Funktion 02h die erste Spur mit 0, der erste Sektor jedoch mit 1 beginnt?! 😮 Ich bin seit stunden daran, Sourcefiles und Speicherabbilder zu vergleichen und bin schliesslich zu eben dem Schluss gekommen! Aber wie unsinnig wäre dass denn?

    Ziemlich, ist aber aus irgendeinem Grund trotzdem so - siehe meinen Beitrag in deinem Speicher-Thread.


Anmelden zum Antworten