Seite 2 von 2
Verfasst: 13.02.2009 00:12
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).
Verfasst: 13.02.2009 00:35
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

Verfasst: 13.02.2009 01:06
von hardfalcon
Ich glaube, ich habe zumindest teilweise verstanden, was du meinst. Den Rest werd ich hoffentlich morgen kapieren, wenn ich ausgeschlafen bin...

Verfasst: 23.04.2009 20:08
von ZeHa