www.wikidata.de-de.nina.az
Dieser Artikel oder Abschnitt bedarf einer grundsatzlichen Uberarbeitung Naheres sollte auf der Diskussionsseite angegeben sein Bitte hilf mit ihn zu verbessern und entferne anschliessend diese Markierung Der gesamte Artikel ist nicht hinreichend mit Belegen beispielsweise Einzelnachweisen ausgestattet Angaben ohne ausreichenden Beleg konnten demnachst entfernt werden Bitte hilf Wikipedia indem du die Angaben recherchierst und gute Belege einfugst Februar 2017 Mit der Bezeichnung Selbstmodifizierender Code englisch Self Modifying Code wird ein Abschnitt eines Computerprogramms bezeichnet das zur Losung der Programmaufgabe Teile des eigenen Programmcodes wahrend der Ausfuhrung gezielt verandert Unter der Bezeichnung freier Rechenplan hatte schon Konrad Zuse selbstmodifizierenden Code als Moglichkeit in die von ihm entworfene Programmiersprache Plankalkul aufgenommen Das Programm muss dabei in der Lage sein im Maschinencode bestimmte Befehle durch sinnvolle andere Maschinenbefehle zu ersetzen Bei hoheren Programmiersprachen z B APL manipuliert das Programm meist den Quellcode als Zeichenkette Selbstmodifizierender Code kann unter anderem da verwendet werden wo es moglich ist mehrere nur an wenigen Stellen unterschiedliche Programmteile zu einem einzigen zusammenzufassen Der selbstmodifizierende Code eines Programms hat meist nichts mit Lernen oder der Verbesserung eines Programmes zu tun Selbstmodifizierende Programme die die Hochsprache des Programms modifizieren sind in der Zukunft moglicherweise hilfreich die Maschinenintelligenz zu steigern Inhaltsverzeichnis 1 Motivation 2 Architektur und Sprachabhangigkeit 3 Vorteile 4 Nachteile 5 Beispiele 5 1 Videospiel 5 2 Mathematikprogramm 5 3 Kopierroutinen 6502 CPU 6 AnmerkungenMotivation BearbeitenDie Methode Code sich selbst modifizieren zu lassen stammt hauptsachlich aus einer Zeit in der Ressourcen CPU Zeit Speicher noch sehr knappe Guter waren es wurde also oftmals eine Optimierung des Laufzeitverhaltens oder Speicherverbrauchs angestrebt Sogenannte Laufzeitpacker dekomprimieren mittels einer Hilfsroutine das eigentliche Programm bevor sie es starten Sowohl die Laufzeitoptimierung mittels Selbstmodifikation als auch die Speicherbedarfsreduktion sind mittlerweile nur noch ausserst selten notwendig z B beim Retro computing wenn also auf sehr alten Systemen programmiert wird Ein anderer Grund zur Selbstmodifikation war der Schutz geistigen Eigentums um die tatsachlichen Algorithmen zu verbergen In Anbetracht der historischen Motivationen zum Schreiben von selbstmodifizierendem Code sollte das Vorhandensein von solchem Code nicht alleine nach modernen Massstaben zur Bemessung von Codequalitat bewertet werden sondern auch immer die historischen und oder technischen Umstande berucksichtigt werden Architektur und Sprachabhangigkeit BearbeitenDie In Memory Veranderung eines Maschinensprachen Programmcodes ist in einer Von Neumann Architektur einfach moglich da Programmteile zeitweise als Daten betrachtet werden konnen spater dann wieder als Programmteile bei der Von Neumann Architektur besitzen Programm und Daten denselben Adressraum In Prozessoren mit Harvard Architektur ist das Modifizieren von Maschinencode wahrend der Laufzeit nicht vorgesehen Programm und Daten haben getrennte Adressraume Evtl stehen spezielle Befehle fur das Ubertragen von Informationen zwischen den Adressraumen zur Verfugung oder es mussen Umwege ausserhalb des Arbeitsspeichers beschritten werden Hohere Programmiersprachen konnen in das normale Programm einen Compiler einbetten dann mussen die Modifikation ggf nicht direkt in Maschinensprache ausgefuhrt werden Hilfreich ist wenn die Sprache Homoikonizitat besitzt Selbst Abbildbarkeit die Eigenschaft einer Programmiersprache dass Programme gleichzeitig Datenstrukturen derselben Sprache sind sein konnen in solchen Sprachen ist es einfach Programme zu schreiben die Programme schreiben Die Portierung von selbstmodifizierendem Maschinencode auf einen beliebigen Prozessor ist fast nicht moglich Mittlerweile verfugen viele Prozessorarchitekturen die eigentlich Von Neumann artig aufgebaut sind uber Methoden das Schreiben in Maschinen Codebereiche sowie das Ausfuhren von Datenbereichen zu verhindern z B NX Bit als Schutzmassnahme gegen Pufferuberlauf Angriffe Bei hoheren Programmiersprachen sind fur selbstmodifizierenden Code in der Regel interpretierende also nicht kompilierende Systeme notwendig Vorteile BearbeitenBei bestimmten Aufgabenstellungen kann ein sehr kompaktes Programm konstruiert werden Die gefundene Programmlosung kann elegant erscheinen Das Programm kann vor Reverse Engineering besser geschutzt werden Nachteile BearbeitenDie Erstellung von selbstmodifizierendem Code wird von Compilern nicht unterstutzt Der Programmcode ist schwierig oder gar nicht portierbar Der Maschinencode ist schwierig nachzuvollziehen Der CPU Entwurf wird deutlich komplizierter mitunter kommt es bei anderen CPU Versionen zu Fehlern Anmerkung 1 Beispiele BearbeitenVideospiel Bearbeiten In einem Videotennis Spiel kann im Programmteil das den Ball steuert ein Inkrement Befehl durch einen Dekrement Befehl ersetzt werden wenn er an die Wand prallt dadurch wird die Bewegungsrichtung umgekehrt Die Bytes die die Koordinaten des Balles beinhalten konnen so im Speicher abgelegt werden dass sie gleichzeitig als direkte Parameter eines Kommandos interpretiert werden Man stelle sich beispielsweise einen Befehl vor der dazu fuhrt dass der Ball an einer bestimmten Stelle angezeigt wird Statt nun die beiden Argumente X Position und Y Position indirekt als Variablen anzusprechen konnen sie direkt so im Speicher abgelegt sein dass sie Teil des Befehls Stelle Ball dar sind Kombination der beiden Beispiele als Pseudo Programm wenn Ball an vertikale Wand geprallt ist und im Programmcode inkrementiere x Koordinate steht dann schreibe an die entsprechende Speicherstelle den Befehl fur dekrementiere x Koordinate und uberspringe den nachsten Befehl wenn Ball an vertikale Wand geprallt ist und im Programmcode dekrementiere x Koordinate steht dann schreibe an die entsprechende Speicherstelle den Befehl fur inkrementiere x Koordinate wenn Ball an horizontale Wand geprallt ist und im Programmcode inkrementiere y Koordinate steht dann schreibe an die entsprechende Speicherstelle den Befehl fur dekrementiere y Koordinate und uberspringe den nachsten Befehl wenn Ball an horizontale Wand geprallt ist und im Programmcode dekrementiere y Koordinate steht dann schreibe an die entsprechende Speicherstelle den Befehl fur inkrementiere y Koordinate inkrementiere x Koordinate des Balldarstellungsbefehls inkrementiere y Koordinate des Balldarstellungsbefehls Stelle den Ball dar an Position 1 1 und fange von vorne anSowohl die beiden Befehle zum Inkrementieren als auch die Koordinaten 1 1 stellen in diesem Beispiel lediglich Anfangswerte dar die vom Programm selbst modifiziert werden Mathematikprogramm Bearbeiten In Microsoft BASIC auf Commodore Computern z B PET VC 20 C64 war es uber ein kurzzeitiges Anhalten eines Programms effektiv moglich eine uber den INPUT Befehl im Programm abgefragte Benutzerfunktion z B SIN X an den Programmeditor zu ubergeben der eine Zeile im BASIC Programm entsprechend veranderte worauf das Programm ohne Verlust der Variableninformation mittels GOTO Befehl wieder fortgesetzt wurde und die neue Zeile fur Berechnungen nutzen konnte Dies geschah durch Ausdruck der gewunschten neuen Programmzeile in der obersten Bildschirmzeile unter Benutzung des Microsoft BASIC Ausdrucks DEF FN und Ausgabe des Befehls GOTO xxx zum Rucksprung ins Programm in der zweiten Bildschirmzeile Fullen des Tastaturpuffers mit den Zeichen HOME und mehreren Steuerzeichen fur Wagenrucklauf sorgte dafur dass nach dem STOP Befehl der systemeigene Programmeditor die zuvor ausgegebene Programmzeile bearbeitete und bei Erreichen des GOTO Befehls ausgelost durch die Wagenrucklauf Zeichen das BASIC Programm wieder ausfuhrte Kopierroutinen 6502 CPU Bearbeiten Ein solches Unterprogramm bekam Startadresse Zieladresse und Grosse in Byte oder Speicherseiten je 256 Byte ubergeben Die normale Art und Weise zu kopieren bestand darin die Adressen in zwei Zeigern innerhalb der Zeropage zu speichern und dann indirekt zeropage adressierbare Lade und Speicherbefehle mit Indexzugriff zu verwenden Diese brauchen aber auf der 6502 CPU zwei Taktzyklen mehr als die absolut adressierbaren Der Trick zur Steigerung der Geschwindigkeit besteht darin absolut adressierbare Befehle zu verwenden Bei dieser Art des selbst modifizierenden Codes werden nicht das Indexregister und die Zeigeradressen hochgezahlt sondern die Adressen im Programmcode hinter dem Opcode der absolut adressierbaren Lade und Speicherbefehle Damit lassen sich Kopierroutinen deutlich beschleunigen Anmerkungen Bearbeiten Selbstmodifizierender Code wurde z B verwendet um den Intel 8088 vom Intel 8086 zu unterscheiden da einer eine langere Befehlspipeline besass Der Prozessor mit der kurzen Pipeline folgte der Anderung der Prozessor mit der langeren Pipeline fuhrte jedoch weiterhin den alten Befehl aus da dieser bereits in der Pipeline gespeichert war Abgerufen von https de wikipedia org w index php title Selbstmodifizierender Code amp oldid 236455665