C64-Projekt für die FH

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

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).
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

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:

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
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 :)
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Ich glaube, ich habe zumindest teilweise verstanden, was du meinst. Den Rest werd ich hoffentlich morgen kapieren, wenn ich ausgeschlafen bin... :)
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Haha, nun gibt's auch die "gecrackte" Version, da haben welche ein Intro eingefügt und einen Trainer eingebaut :mrgreen: :mrgreen: :mrgreen:

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

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