C64-Projekt für die FH
- hardfalcon
- Beiträge: 3447
- Registriert: 29.08.2004 20:46
Könnte vielleicht bei Gelegenheit mal jemand nen Beispiel-Sourcecode eines selbstmodifiziernden Programms veröffentlichen? Ich kann mir im Moment nämlich gar nicht vorstellen, wie sie das Programm selber verändert (bzw. das den großen Unterschied macht, ob da jetzt einfach ein JMP verwendet, oder ob man Maschinencode von irgendwo vor die aktuelle Sprungaddresse (so nennt man doch die Stelle, an der sich der Opcode befindet, der grade abgearbeitet wird, oder?) kopiert wird, und dann ausgeführt wird).
Also bei mir wurde das hauptsächlich zur einfacheren Realisierung von Zählern eingesetzt, z.B. wenn die Register knapp wurden.
Das kann dann so aussehen:
Hier wird nun erstmal ein Startwert in Register A geladen (lda #STARTWERT) und anschließend an die Stelle .o1 +1 geschrieben. Dabei handelt es sicher erstmal um ein selbst definiertes Label (.o1 (o steht dabei für overwrite, das war so meine Konvention damit ich es übersichtlich habe)), und wir addieren auf die entsprechende Adresse eine 1, weil sich direkt am Label ja die Operation befindet (lda) und wir ja den dahinter befindlichen Wert überschreiben wollen (hier im Code $FF).
Nun steht also zur Laufzeit nicht mehr lda $FF dran, sondern das $FF wurde durch den tatsächlichen Schleifenstartwert ersetzt, z.B. $3a oder sowas. Danach geschieht irgendwas innerhalb der Schleife, und schließlich wird genau dieser Wert noch dekrementiert (mit dec .o1 +1). Anschließend wird geprüft, ob der Wert noch positiv ist (bpl = branch if plus), und wenn ja, springt das Programm nochmal zum Beginn der Schleife.
Es wird also kein Register und auch keine "normale" Variable verwendet, sondern die Anweisung selbst ist sozusagen die "Variable". Ich hoffe ich konnte das einigermaßen verständlich erklären
Das kann dann so aussehen:
Code: Alles auswählen
lda #STARTWERT
sta .o1 +1
.o1 lda $FF
; tu irgendwas krasses mit dem geladenen wert
dec .o1 +1
bpl .o1
; schleife vorbei
Nun steht also zur Laufzeit nicht mehr lda $FF dran, sondern das $FF wurde durch den tatsächlichen Schleifenstartwert ersetzt, z.B. $3a oder sowas. Danach geschieht irgendwas innerhalb der Schleife, und schließlich wird genau dieser Wert noch dekrementiert (mit dec .o1 +1). Anschließend wird geprüft, ob der Wert noch positiv ist (bpl = branch if plus), und wenn ja, springt das Programm nochmal zum Beginn der Schleife.
Es wird also kein Register und auch keine "normale" Variable verwendet, sondern die Anweisung selbst ist sozusagen die "Variable". Ich hoffe ich konnte das einigermaßen verständlich erklären



ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
- hardfalcon
- Beiträge: 3447
- Registriert: 29.08.2004 20:46
Haha, nun gibt's auch die "gecrackte" Version, da haben welche ein Intro eingefügt und einen Trainer eingebaut

http://noname.c64.org/csdb/release/?id=77932



http://noname.c64.org/csdb/release/?id=77932


ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.