An welcher Adresse laufe ich?

Es gibt 24 Antworten in diesem Thema, welches 2.915 mal aufgerufen wurde. Der letzte Beitrag (21. Juli 2023 um 20:28) ist von Mike.

  • Ein solches Programm läuft ja - egal ob mit oder ohne diese gefragte Überprüfung - nur mit relativen Sprüngen bzw. ganz ohne Sprünge.

    Ja richtig.

    Mit relativen Sprüngen alleine wäre es relocatibel.

    Eine Sprungweite von +-127 Byte ist halt bitter.

    Aber damit könnte ich leben, aber ohne JSR ist es halt nicht lustig ... :D

    Bitte melde dich an, um diesen Link zu sehen. --- Bitte melde dich an, um diesen Link zu sehen. --- Bitte melde dich an, um diesen Link zu sehen.

  • ...oder es patcht sich einfach selbst entsprechend, nachdem es wie hier beschrieben die eigene Ladeadresse herausgefunden hat. Wär ne spannende Fingerübung, so einen Patcher zu basteln. :)

    Das wäre gar nicht mal so wild.

    Wenn man erst mal weiß, wo man läuft, errechnet sich leicht ein Offset.

    Wenn man eine Tabelle aller absoluten Adressen hat, kann man sich selbst relativ einfach patchen.

    Aber so weit muss man ja gar nicht gehen.

    Im Grunde genügt es, sich selbst in den Zieladressbereich zu verschieben und neu zu starten.

    Bitte melde dich an, um diesen Link zu sehen. --- Bitte melde dich an, um diesen Link zu sehen. --- Bitte melde dich an, um diesen Link zu sehen.

  • Im Grunde genügt es, sich selbst in den Zieladressbereich zu verschieben und neu zu starten.

    Wär das einfacher? Schneller? Ginge auch nur, wenn Programmgröße < 1/2 freies RAM ist oder der Versatz < Programmgröße.

    Bei "Überlappungen" von gewollter und tatsächlicher Position im RAM:

    Offset < 0 - man müsste von "hinten" anfangen zu verschieben,

    Offset > 0 - man müsste von "vorn" anfangen,

    sonst Datenverlust.

    Wenn es ein sehr kleines Programm ist, dann ist vielleicht einfacher, auf Sprünge zu verzichten. :D

  • Man könnte an eine (bekannte) Adresse im ROM springen, an der ein RTS steht. Setzt natürlich ein (sichtbares und inhaltlich bekanntes) ROM voraus.

    Mit dem Kernal könnte es so aussehen:

    Allerdings frage ich mich, wie genau sich das Problem ergeben soll. Wenn es durch was auch immer für Umstände an die falsche Adresse gelangen sollte, kann es aufgrund unbekannter Einsprungadresse nicht aufgerufen werden. Wenn es jemand aus unerfindlichen Gründen manuell an eine andere Adresse lädt und dann dort aufruft, dann gehe ich davon aus, dass er weiß, was er tut, und dann muss er sich nicht wundern, warum es nicht funktioniert. Aber selbst für diesen Fall bräuchte man einfach nur die letzte SYS-Adresse auslesen, und die Endadresse steht normalerweise auch noch in $2d/$2e.

  • Ich bring hier gerade mal mein Beispiel aus dem Denial-Forum (jetzt vollständig) an:

    Der Code ist jetzt exemplarisch nach $2000 assembliert worden. Es spielt aber keine Rolle, wohin man ihn (in freien Speicher) lädt - er läuft überall! Das darf jeder gerne mit einem Monitor des eigenen Vertrauens und dessen L- und T-Befehle überprüfen.

    In ähnlicher Weise, wie hier die zwei Adressen für das Operanden-Feld des Trampolins und die eigentliche Startadresse der IRQ-Routine durch konstante Offsets von der "Ich bin hier!"-Adresse abgeleitet wurden, kann man auch Zugriffe auf Tabellen, Sprünge und Unterprogrammaufrufe synthetisieren. Das geht alles, es ist nur halt super-umständlich.