Selbstmodifizierender Code



Mit der Bezeichnung Selbstmodifizierender – Code (engl: Selbstmodifizierender Code ) Wird ein Abschnitt Eines Computerprogramm bezeichnet, das zur Lösung der Programmaufgabe Teile des Eigene Programmcodes während der Ausführung Gezielt Verändert. Unter der Bezeichnung „freier Rechenplan“ hatte schon Konrad Zuse selbstmodifizierenden – Code als möglichkeit in Würfel von IHM entworfene Programmiersprache Plankalkülaufgenommen.

Dieses Programm ist in Kleinbuchstaben verfügbar, und im Maschinencode werden Sie andere Maschinenbefehle zu sehen bekommen. Bei Hohen Programmiersprachen (z. B. APL ) manipuliert das Programm die Quellcode als Zeichenkette ( Textzeichenfolge ).

Selbstmodifizierender Code kann verwöhnt worden sein, das geht möglicherweise nicht, und Sie können das Programm nicht ändern, Sie können es nur programmieren.

Die Methode, Code sich selbst modifizieren zu lassen, stammt Hauptsächlich Aus einer Zeit, in der Ressourcen (CPU-Zeit, Speicher) noch sehr knapp Guter Waren – es wurde auch oftmals Eine Optimierung des Laufzeitverhaltens oder Speicherverbrauchs angestrebt. Sogenannte Laufzeitpackerentkomprimieren Profilierung mittels Wacholder Hilfsroutine das eigentlich Programm, Bevor sie es starten. Sowohl stirbt Laufzeitoptimierung Profilierung mittels Selbstmodifikation Als Auch stirbt Speicherbedarfsreduktion Ist mittlerweile nur noch äußerst selten Notwendig (z. B. beim „Retro computing“, WENN du auch auf sehr alte Systeme Wurde Programmierer). Ein Anderer Grund zur Selbstmodifikation Krieg, wo Schutz Geist Eigentümer, um sterben tatsächlichen Algorithmus zu verbergen. Bei der Prüfung des in dem historic Motivation zum Schreiben von selbstmodifizierendem-Code sollte das Vorhandensein von Solchem-Code nicht alleine nach Modernen Maßstäben zur Bemessung von Codequalität bewertet Werden, Sondern auch immer sterben (historic und / oder technische) Umstände berücksichtigt Werden.

Die Veränderungen Dezember Programmcodes ist nur in Einer von-Neumann-Architektur Möglich, wo Programm und Daten seiner Elbe Adressraum Teilen. In Prozessor mit Harvard Architektur ist das Modifizieren von Programm – Code der während Laufzeit nicht Vorgesehen, und da ein normales Programm Keinen Compiler Enthält, sterben direkt in Einander Modifikation Maschinensprache ausgeführt Werden. Bei Hohen Programmiersprachen Sind in der Regel interpretiert (auch nicht compilierende) Systeme Notwendig. Aus Diesem Beide Grunde ist a Portierung von selbstmodifizierendem – Code Auf einem Beliebers Prozessorsolide nicht Möglich. Mittlerweile verfügen viele Prozessorarchitekturen , Eigentlich Von-Neumann Spaß aufgebaut Ist, uber Methoden, das Schreiben in Codebereichen sterben Sowie das ausführen von Datenbereichen zu verhindern (z. B. NX-Bit ), als Schutzmaßnahme gegen Pufferüberlauf -Angriffe.

Der Code of Change ändert die Programmscharniere mit dem Lernen der Verbesserungsprogramme . Selbstmodifizierende Programm, sterben sterben Hochsprache des Programm modifizieren, Sind in der Zukunft möglicherweise hilfreich, sterben Maschinenintelligenz zu steigern.

Beispiele

Videospiel

In Einem Video Tennis -Spiel Können im Programmteil, das Vorschaltgerät Steuert, ein Erhöhungsschritt -Befehl Durch EINE Abnahme -Befehl Ersetzt Werden, WENN eine die Wand prallt ist, stirbt Characterized Wird Bewegungsrichtung umgekehrt.

Die Bytes , sterben die Koordinaten des Balles Knochen halten, so can im Speicher abgelegt Werden that sie gleichzeitig als direkter Parameter Eines Kommandos interpretiert Werden. Ein Pfleger ich beispielsweise EIN befehl vor, der dazu Führt that die halben Eine Stelle Bestimmt angezeigt Wird. Statt Nonne stirbt Beiden Argumente „X-Position“ und „Y – Position“ indirekt als die Variable anzusprechen, Infos finden Sie direkt so im Speicher abgelegt sein, Dass sie Teil des Befehls „Stell Kugel dar“ ist.

Kombination beider Beispiele als Pseudoprogramm:

  • , ideal für eine halben vertikale Wand geprallt ist und im Programm-Code Steht, Schreiber Dann „inkrementierte X-Koordinate“ an den entsprechende Speicherstelle des befehls für „dekrementierte X-Koordinate“ und über läuft der Nächste befehl
  • , ideal für eine halbe vertikale Wand geprallt ist und im Programm-Code „dekrementiere X-Koordinate“ steht, Dann Schreiber ein sterben entsprechende Speicherstelle der befehl für „inkrementiere X-Koordinate“
  • WENN halber horizontale Wand geprallt ist und im Programm-Code „inkrementierte Y-Koordinate“ steht, Dann Schreiber An den entsprechende Speicherstelle des befehl für „dekrementieren Y-Koordinate“ und über läuft der Nächste befehl
  • Wenn Ball ein horizontaler Zauberstab ist und im Programmcode „Dekremente y-Koordinate“ steht, dann schreibe an die Speicherstelle den Befehl für „inkrementelle y-Koordination“
  • inkrementelle x-Koordinate des Balldarstellungsbefehls
  • inkrementelle y-Koordinate des Ballardarstellungsbefehls
  • Stellen Sie den Ball auf Position 1, 1 und fangen Sie unsere

Beide Befehle sind inkrementell, da die Koordinatoren „1.1“ in solchen Beispiel-Anfangswerte stellen, die automatisch modifiziert wurden.

Mathematik-Programm

In Microsoft BASIC auf Commodore die Computer (zB PET, VC 20, C64 ) war es über ein kurzzeit Anhalten Eines Programme effektiv Möglich, Eine über die INPUT – befehl im Programm abgefragte Benutzerfunktion (z. B. „SIN (X)“) ein den Applikationen – Editor zu übergeben wo Eine Zeile im BASIC – Anwendungen entsprechend Veränderte, das Programm ohne Worauf vERLUST wo Variable Information ( Profilierung mittels GOTO befehl ) wieder fortgesetzt Wurde und sterben neue Zeile für Berechnungen Nutzen Könnte. Dies geschieht Durch Ausdruck der Neues gewünscht Programmzeile in der Oberst Bildschirmzeile (unter benutzung des Microsoft BASIC Ausdruck “ DEF FN‚) Und Ausgabe des Befehl „GOTO xxx“ zum Rücksprung ins Programm in dem Zweite Bildschirmzeile. Voll des Tastaturpuffer mit den Zeichen HOME und mehrere Steuerzeichen für Wagenrücklauf sorgt Dafür that nach DEM STOP – befehl des System Programm Editor stirbt zuvor ausgegebene Programmzeile bearbeitete und bei Motivation und andere Mentalität Dezember GOTO Befehl (ausgelöst Durch Die Wagenrücklauf-Zeichen) die BASIC-programmierbare wieder ausführt.

Kopierroutinen (6502 CPU)

Ein Sölch Unter Anwendungen Bekommen Start Adresse, Zieladresse und Größe in Byte oder Speicherseite (je 256 Byte) übergibt. Die normale Art und Weise zu kopieren Bevölkerung Darin steigen, stirbt Adresse in two Zeigern Innerhalb der Zero-Seite zu speichern, Und dann indirekt Null Seite adressierbare Gebühr und Speicherbefehle mit Indexzugriff zu Verwenden. This Brauch aber auf die 6502-CPU Zwei Taktzyklen mehr als absolut adressierbaren sterben. There Trick Zur Steigerung der Geschwindigkeit besteht, Absolut Addressable Befehle zu verwenden. Bei of this Art des selbstmodifizierenden Codes Werden nicht das Index Register und sterben Zeigeradressen hochgezählt, Sondern sterben Adresse im Programm-Code Hinter dem Opcode, wo absolut adressierbaren Gebühr und Speicherbefehle. Damit schweissen sich richtig beschleunigen.

Vorteile

  1. Bei bestimmten Aufgabenstellungen kann ein sehr kompaktes Programm erstellt werden.
  2. Die gefundene Programmlösung Kann elegant Erscheinen.
  3. Dieses Programm kann für unser Reverse Engineering verwendet werden .

Nachteile

  1. The Erschaffung von selbstmodifizierendem Code wird von Compilern nicht unterstützt.
  2. Dort Programmcode ist verfügbar oder nicht möglich.
  3. Da ist Maschinencode schnell nachzuvollziehen.
  4. Dort wird CPU-Entwurf deutlich komplizierter; mitunter komm es bei anderen CPU-Version zu Fehlern. [Anmerkung 1]

Bemerkungen

  1. Hochspringen↑ SelbstmodifizierenderCode Wurde zB used, um die Intel 8088 vom Intel 8086 zu unterscheiden, dann Drücker Einer Eine Befehlspipeline Besass: Der Prozessor mit der Kurzen Pipeline gefolgtwo Änderungdem Prozessor mit der Drücker Pipeline Führt jedoch weiterhin die „alten“ befehl aus wenn of this BEREITS in der Pipeline Gespeichert Krieg.