https://de.wikipedia.org/w/index.php?action=history&feed=atom&title=Selbstmodifizierender_Code Selbstmodifizierender Code - Versionsgeschichte 2025-05-29T21:45:48Z Versionsgeschichte dieser Seite in Wikipedia MediaWiki 1.45.0-wmf.3 https://de.wikipedia.org/w/index.php?title=Selbstmodifizierender_Code&diff=248950339&oldid=prev Skranon am 27. September 2024 um 18:00 Uhr 2024-09-27T18:00:02Z <p></p> <table style="background-color: #fff; color: #202122;" data-mw="interface"> <col class="diff-marker" /> <col class="diff-content" /> <col class="diff-marker" /> <col class="diff-content" /> <tr class="diff-title" lang="de"> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Nächstältere Version</td> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Version vom 27. September 2024, 20:00 Uhr</td> </tr><tr> <td colspan="2" class="diff-lineno">Zeile 3:</td> <td colspan="2" class="diff-lineno">Zeile 3:</td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Mit der Bezeichnung '''Selbstmodifizierender Code''' ({{enS|Self Modifying Code}}) wird ein Abschnitt eines [[Computerprogramm]]s bezeichnet, das zur Lösung der Programmaufgabe Teile des eigenen Programmcodes während der Ausführung gezielt verändert. Unter der Bezeichnung „freier Rechenplan“ hatte schon [[Konrad Zuse]] selbstmodifizierenden Code als Möglichkeit in die von ihm entworfene Programmiersprache [[Plankalkül]] aufgenommen.</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Mit der Bezeichnung '''Selbstmodifizierender Code''' ({{enS|Self Modifying Code}}) wird ein Abschnitt eines [[Computerprogramm]]s bezeichnet, das zur Lösung der Programmaufgabe Teile des eigenen Programmcodes während der Ausführung gezielt verändert. Unter der Bezeichnung „freier Rechenplan“ hatte schon [[Konrad Zuse]] selbstmodifizierenden Code als Möglichkeit in die von ihm entworfene Programmiersprache [[Plankalkül]] aufgenommen.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Das Programm muss dabei in der Lage sein, im [[Maschinensprache|Maschinencode]] bestimmte Befehle durch sinnvolle andere Maschinenbefehle zu ersetzen. Bei höheren [[Programmiersprache]]n (z.&amp;nbsp;B. [[APL (Programmiersprache)|APL]]) manipuliert das Programm meist den [[Quellcode]] als [[Zeichenkette]].</div></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Das Programm muss dabei in der Lage sein, im [[Maschinensprache|Maschinencode]] bestimmte Befehle durch sinnvolle andere Maschinenbefehle zu ersetzen. Bei höheren [[Programmiersprache]]n (z.&amp;nbsp;B. [[APL (Programmiersprache)|APL]]) manipuliert das Programm meist den [[<ins style="font-weight: bold; text-decoration: none;">Quelltext|</ins>Quellcode]] als [[Zeichenkette]].</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Selbstmodifizierender Code kann unter anderem da verwendet werden, wo es möglich ist, mehrere, nur an wenigen Stellen unterschiedliche Programmteile zu einem einzigen zusammenzufassen.</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Selbstmodifizierender Code kann unter anderem da verwendet werden, wo es möglich ist, mehrere, nur an wenigen Stellen unterschiedliche Programmteile zu einem einzigen zusammenzufassen.</div></td> </tr> <tr> <td colspan="2" class="diff-lineno">Zeile 32:</td> <td colspan="2" class="diff-lineno">Zeile 32:</td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Beispiele ==</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Beispiele ==</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>=== Videospiel ===</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>=== Videospiel ===</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>In einem [[Pong|Videotennis]]-Spiel kann im Programmteil, das den Ball steuert, ein [[Inkrement]]-Befehl durch einen [[Inkrement und Dekrement|Dekrement]]-Befehl ersetzt werden, wenn er an die Wand prallt, dadurch wird die Bewegungsrichtung umgekehrt.</div></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>In einem [[Pong|Videotennis]]-Spiel kann im Programmteil, das den Ball steuert, ein [[<ins style="font-weight: bold; text-decoration: none;">Inkrement und Dekrement|</ins>Inkrement]]-Befehl durch einen [[Inkrement und Dekrement|Dekrement]]-Befehl ersetzt werden, wenn er an die Wand prallt, dadurch wird die Bewegungsrichtung umgekehrt.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Die [[Byte]]s, die die Koordinaten des Balles beinhalten, können so im Speicher abgelegt werden, dass sie gleichzeitig als direkte Parameter eines Kommandos interpretiert werden. Man stelle sich beispielsweise einen Befehl vor, der dazu führt, dass der Ball an einer bestimmten Stelle angezeigt wird. Statt nun die beiden Argumente „X-Position“ und „Y-Position“ indirekt als Variablen anzusprechen, können sie direkt so im Speicher abgelegt sein, dass sie Teil des Befehls „Stelle Ball dar“ sind.</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Die [[Byte]]s, die die Koordinaten des Balles beinhalten, können so im Speicher abgelegt werden, dass sie gleichzeitig als direkte Parameter eines Kommandos interpretiert werden. Man stelle sich beispielsweise einen Befehl vor, der dazu führt, dass der Ball an einer bestimmten Stelle angezeigt wird. Statt nun die beiden Argumente „X-Position“ und „Y-Position“ indirekt als Variablen anzusprechen, können sie direkt so im Speicher abgelegt sein, dass sie Teil des Befehls „Stelle Ball dar“ sind.</div></td> </tr> <tr> <td colspan="2" class="diff-lineno">Zeile 48:</td> <td colspan="2" class="diff-lineno">Zeile 48:</td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>=== Mathematikprogramm ===</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>=== Mathematikprogramm ===</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>In Microsoft [[BASIC]] auf Commodore Computern (z.&amp;nbsp;B. PET, VC 20, [[C64]]) war es über ein kurzzeitiges Anhalten eines Programms effektiv möglich, eine über den INPUT-Befehl im Programm abgefragte Benutzerfunktion (z.&amp;nbsp;B. „SIN(X)“) an den Programmeditor zu übergeben, der eine Zeile im BASIC-Programm entsprechend veränderte, worauf das Programm ohne Verlust der Variableninformation (mittels [[Sprunganweisung|GOTO-Befehl]]) wieder fortgesetzt wurde</div></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>In Microsoft [[BASIC]] auf Commodore Computern (z.&amp;nbsp;B. PET, VC 20, [[<ins style="font-weight: bold; text-decoration: none;">Commodore 64|</ins>C64]]) war es über ein kurzzeitiges Anhalten eines Programms effektiv möglich, eine über den INPUT-Befehl im Programm abgefragte Benutzerfunktion (z.&amp;nbsp;B. „SIN(X)“) an den Programmeditor zu übergeben, der eine Zeile im BASIC-Programm entsprechend veränderte, worauf das Programm ohne Verlust der Variableninformation (mittels [[Sprunganweisung|GOTO-Befehl]]) wieder fortgesetzt wurde<ins style="font-weight: bold; text-decoration: none;"> und die neue Zeile für Berechnungen nutzen konnte. Dies geschah durch Ausdruck der gewünschten neuen Programmzeile in der obersten Bildschirmzeile (unter Benutzung des Microsoft-BASIC-Ausdrucks „DEF FN“) und Ausgabe des Befehls „GOTO xxx“ zum Rücksprung ins Programm in der zweiten Bildschirmzeile. Füllen des Tastaturpuffers mit den Zeichen HOME und mehreren Steuerzeichen für [[Wagenrücklauf]] sorgte dafür, dass nach dem STOP-Befehl der systemeigene Programmeditor die zuvor ausgegebene Programmzeile bearbeitete und bei Erreichen des GOTO-Befehls (ausgelöst durch die Wagenrücklauf-Zeichen) das BASIC-Programm wieder ausführte.</ins></div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>und die neue Zeile für Berechnungen nutzen konnte.</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Dies geschah durch Ausdruck der gewünschten neuen Programmzeile in der obersten Bildschirmzeile (unter Benutzung des Microsoft-BASIC-Ausdrucks „[[DEF FN]]“) und Ausgabe des Befehls „GOTO xxx“ zum Rücksprung ins Programm in der zweiten Bildschirmzeile.</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Füllen des Tastaturpuffers mit den Zeichen [[HOME]] und mehreren Steuerzeichen für [[Wagenrücklauf]] sorgte dafür, dass nach dem STOP-Befehl der systemeigene Programmeditor die zuvor ausgegebene Programmzeile bearbeitete und bei Erreichen des GOTO-Befehls (ausgelöst durch die Wagenrücklauf-Zeichen) das BASIC-Programm wieder ausführte.</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>=== Kopierroutinen (6502-CPU) ===</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>=== Kopierroutinen (6502-CPU) ===</div></td> </tr> </table> Skranon https://de.wikipedia.org/w/index.php?title=Selbstmodifizierender_Code&diff=247578369&oldid=prev 84.158.120.82: /* Architektur- und Sprachabhängigkeit */ Autor Charles Petzold hinzugefügt 2024-08-11T00:45:54Z <p><span class="autocomment">Architektur- und Sprachabhängigkeit: </span> Autor <a href="/wiki/Charles_Petzold" title="Charles Petzold">Charles Petzold</a> hinzugefügt</p> <table style="background-color: #fff; color: #202122;" data-mw="interface"> <col class="diff-marker" /> <col class="diff-content" /> <col class="diff-marker" /> <col class="diff-content" /> <tr class="diff-title" lang="de"> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Nächstältere Version</td> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Version vom 11. August 2024, 02:45 Uhr</td> </tr><tr> <td colspan="2" class="diff-lineno">Zeile 15:</td> <td colspan="2" class="diff-lineno">Zeile 15:</td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Die In-Memory-Veränderung eines Maschinensprachen-Programmcodes ist in einer [[Von-Neumann-Architektur]] einfach möglich, da Programmteile zeitweise als Daten betrachtet werden können, später 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 während der [[Laufzeit (Informatik)|Laufzeit]] nicht vorgesehen, Programm und Daten haben getrennte Adressräume. Evtl. stehen spezielle Befehle für das Übertragen von Informationen zwischen den Adressräumen zur Verfügung, oder es müssen Umwege außerhalb des Arbeitsspeichers beschritten werden.</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Die In-Memory-Veränderung eines Maschinensprachen-Programmcodes ist in einer [[Von-Neumann-Architektur]] einfach möglich, da Programmteile zeitweise als Daten betrachtet werden können, später 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 während der [[Laufzeit (Informatik)|Laufzeit]] nicht vorgesehen, Programm und Daten haben getrennte Adressräume. Evtl. stehen spezielle Befehle für das Übertragen von Informationen zwischen den Adressräumen zur Verfügung, oder es müssen Umwege außerhalb des Arbeitsspeichers beschritten werden.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Höhere Programmiersprachen können in das „normale Programm“ einen [[Compiler]] einbetten, dann müssen die Modifikation ggf. nicht direkt in [[Maschinensprache]] ausgeführt werden. Hilfreich ist, wenn die Sprache [[Homoikonizität]] besitzt (Selbst-Abbildbarkeit: die Eigenschaft einer Programmiersprache, dass Programme gleichzeitig Datenstrukturen derselben Sprache sind/sein können; in solchen Sprachen ist es einfach, Programme zu schreiben, die Programme schreiben). Die [[Portierung (Software)|Portierung]] von selbstmodifizierendem Maschinencode auf einen beliebigen [[Prozessor]] ist fast nicht möglich. Mittlerweile verfügen viele [[Prozessorarchitektur]]en, die eigentlich Von-Neumann-artig aufgebaut sind, über Methoden, das Schreiben in (Maschinen-)Codebereiche sowie das Ausführen von Datenbereichen zu verhindern (z.&amp;nbsp;B. [[NX-Bit]], [[Protected Mode]] des [[Intel 80286]]&lt;ref&gt;https://books.google.de/books?id=pDGnxFyejN4C&amp;lpg=PP1&amp;hl=de&amp;pg=PA170#v=onepage&amp;q&amp;f=false Obstracles to a grown-up operating system, PC Mag 10.Juni 1986 (englisch)&lt;/ref&gt;), als Schutzmaßnahme gegen [[Pufferüberlauf]]-Angriffe. Bei höheren Programmiersprachen sind für selbstmodifizierenden Code in der Regel [[Interpreter|interpretierende]] (also nicht kompilierende) Systeme notwendig.</div></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Höhere Programmiersprachen können in das „normale Programm“ einen [[Compiler]] einbetten, dann müssen die Modifikation ggf. nicht direkt in [[Maschinensprache]] ausgeführt werden. Hilfreich ist, wenn die Sprache [[Homoikonizität]] besitzt (Selbst-Abbildbarkeit: die Eigenschaft einer Programmiersprache, dass Programme gleichzeitig Datenstrukturen derselben Sprache sind/sein können; in solchen Sprachen ist es einfach, Programme zu schreiben, die Programme schreiben). Die [[Portierung (Software)|Portierung]] von selbstmodifizierendem Maschinencode auf einen beliebigen [[Prozessor]] ist fast nicht möglich. Mittlerweile verfügen viele [[Prozessorarchitektur]]en, die eigentlich Von-Neumann-artig aufgebaut sind, über Methoden, das Schreiben in (Maschinen-)Codebereiche sowie das Ausführen von Datenbereichen zu verhindern (z.&amp;nbsp;B. [[NX-Bit]], [[Protected Mode]] des [[Intel 80286]]&lt;ref&gt;https://books.google.de/books?id=pDGnxFyejN4C&amp;lpg=PP1&amp;hl=de&amp;pg=PA170#v=onepage&amp;q&amp;f=false Obstracles to a grown-up operating system,<ins style="font-weight: bold; text-decoration: none;"> Charles Petzold</ins> PC Mag 10.Juni 1986 (englisch)&lt;/ref&gt;), als Schutzmaßnahme gegen [[Pufferüberlauf]]-Angriffe. Bei höheren Programmiersprachen sind für selbstmodifizierenden Code in der Regel [[Interpreter|interpretierende]] (also nicht kompilierende) Systeme notwendig.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Vorteile ==</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Vorteile ==</div></td> </tr> </table> 84.158.120.82 https://de.wikipedia.org/w/index.php?title=Selbstmodifizierender_Code&diff=247578339&oldid=prev 84.158.120.82: /* Architektur- und Sprachabhängigkeit */ Verlinkung 2024-08-11T00:37:24Z <p><span class="autocomment">Architektur- und Sprachabhängigkeit: </span> Verlinkung</p> <table style="background-color: #fff; color: #202122;" data-mw="interface"> <col class="diff-marker" /> <col class="diff-content" /> <col class="diff-marker" /> <col class="diff-content" /> <tr class="diff-title" lang="de"> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Nächstältere Version</td> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Version vom 11. August 2024, 02:37 Uhr</td> </tr><tr> <td colspan="2" class="diff-lineno">Zeile 15:</td> <td colspan="2" class="diff-lineno">Zeile 15:</td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Die In-Memory-Veränderung eines Maschinensprachen-Programmcodes ist in einer [[Von-Neumann-Architektur]] einfach möglich, da Programmteile zeitweise als Daten betrachtet werden können, später 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 während der [[Laufzeit (Informatik)|Laufzeit]] nicht vorgesehen, Programm und Daten haben getrennte Adressräume. Evtl. stehen spezielle Befehle für das Übertragen von Informationen zwischen den Adressräumen zur Verfügung, oder es müssen Umwege außerhalb des Arbeitsspeichers beschritten werden.</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Die In-Memory-Veränderung eines Maschinensprachen-Programmcodes ist in einer [[Von-Neumann-Architektur]] einfach möglich, da Programmteile zeitweise als Daten betrachtet werden können, später 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 während der [[Laufzeit (Informatik)|Laufzeit]] nicht vorgesehen, Programm und Daten haben getrennte Adressräume. Evtl. stehen spezielle Befehle für das Übertragen von Informationen zwischen den Adressräumen zur Verfügung, oder es müssen Umwege außerhalb des Arbeitsspeichers beschritten werden.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Höhere Programmiersprachen können in das „normale Programm“ einen [[Compiler]] einbetten, dann müssen die Modifikation ggf. nicht direkt in [[Maschinensprache]] ausgeführt werden. Hilfreich ist, wenn die Sprache [[Homoikonizität]] besitzt (Selbst-Abbildbarkeit: die Eigenschaft einer Programmiersprache, dass Programme gleichzeitig Datenstrukturen derselben Sprache sind/sein können; in solchen Sprachen ist es einfach, Programme zu schreiben, die Programme schreiben). Die [[Portierung (Software)|Portierung]] von selbstmodifizierendem Maschinencode auf einen beliebigen [[Prozessor]] ist fast nicht möglich. Mittlerweile verfügen viele [[Prozessorarchitektur]]en, die eigentlich Von-Neumann-artig aufgebaut sind, über Methoden, das Schreiben in (Maschinen-)Codebereiche sowie das Ausführen von Datenbereichen zu verhindern (z.&amp;nbsp;B. [[NX-Bit]], [[Protected Mode]] des Intel 80286&lt;ref&gt;https://books.google.de/books?id=pDGnxFyejN4C&amp;lpg=PP1&amp;hl=de&amp;pg=PA170#v=onepage&amp;q&amp;f=false Obstracles to a grown-up operating system, PC Mag 10.Juni 1986 (englisch)&lt;/ref&gt;), als Schutzmaßnahme gegen [[Pufferüberlauf]]-Angriffe. Bei höheren Programmiersprachen sind für selbstmodifizierenden Code in der Regel [[Interpreter|interpretierende]] (also nicht kompilierende) Systeme notwendig.</div></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Höhere Programmiersprachen können in das „normale Programm“ einen [[Compiler]] einbetten, dann müssen die Modifikation ggf. nicht direkt in [[Maschinensprache]] ausgeführt werden. Hilfreich ist, wenn die Sprache [[Homoikonizität]] besitzt (Selbst-Abbildbarkeit: die Eigenschaft einer Programmiersprache, dass Programme gleichzeitig Datenstrukturen derselben Sprache sind/sein können; in solchen Sprachen ist es einfach, Programme zu schreiben, die Programme schreiben). Die [[Portierung (Software)|Portierung]] von selbstmodifizierendem Maschinencode auf einen beliebigen [[Prozessor]] ist fast nicht möglich. Mittlerweile verfügen viele [[Prozessorarchitektur]]en, die eigentlich Von-Neumann-artig aufgebaut sind, über Methoden, das Schreiben in (Maschinen-)Codebereiche sowie das Ausführen von Datenbereichen zu verhindern (z.&amp;nbsp;B. [[NX-Bit]], [[Protected Mode]] des <ins style="font-weight: bold; text-decoration: none;">[[</ins>Intel 80286<ins style="font-weight: bold; text-decoration: none;">]]</ins>&lt;ref&gt;https://books.google.de/books?id=pDGnxFyejN4C&amp;lpg=PP1&amp;hl=de&amp;pg=PA170#v=onepage&amp;q&amp;f=false Obstracles to a grown-up operating system, PC Mag 10.Juni 1986 (englisch)&lt;/ref&gt;), als Schutzmaßnahme gegen [[Pufferüberlauf]]-Angriffe. Bei höheren Programmiersprachen sind für selbstmodifizierenden Code in der Regel [[Interpreter|interpretierende]] (also nicht kompilierende) Systeme notwendig.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Vorteile ==</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Vorteile ==</div></td> </tr> </table> 84.158.120.82 https://de.wikipedia.org/w/index.php?title=Selbstmodifizierender_Code&diff=247578338&oldid=prev 84.158.120.82: /* Architektur- und Sprachabhängigkeit */ Nur i80286, der 386 musste es für DOS zumindest im VM86 Modus erlauben. 2024-08-11T00:36:49Z <p><span class="autocomment">Architektur- und Sprachabhängigkeit: </span> Nur i80286, der 386 musste es für DOS zumindest im VM86 Modus erlauben.</p> <table style="background-color: #fff; color: #202122;" data-mw="interface"> <col class="diff-marker" /> <col class="diff-content" /> <col class="diff-marker" /> <col class="diff-content" /> <tr class="diff-title" lang="de"> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Nächstältere Version</td> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Version vom 11. August 2024, 02:36 Uhr</td> </tr><tr> <td colspan="2" class="diff-lineno">Zeile 15:</td> <td colspan="2" class="diff-lineno">Zeile 15:</td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Die In-Memory-Veränderung eines Maschinensprachen-Programmcodes ist in einer [[Von-Neumann-Architektur]] einfach möglich, da Programmteile zeitweise als Daten betrachtet werden können, später 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 während der [[Laufzeit (Informatik)|Laufzeit]] nicht vorgesehen, Programm und Daten haben getrennte Adressräume. Evtl. stehen spezielle Befehle für das Übertragen von Informationen zwischen den Adressräumen zur Verfügung, oder es müssen Umwege außerhalb des Arbeitsspeichers beschritten werden.</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Die In-Memory-Veränderung eines Maschinensprachen-Programmcodes ist in einer [[Von-Neumann-Architektur]] einfach möglich, da Programmteile zeitweise als Daten betrachtet werden können, später 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 während der [[Laufzeit (Informatik)|Laufzeit]] nicht vorgesehen, Programm und Daten haben getrennte Adressräume. Evtl. stehen spezielle Befehle für das Übertragen von Informationen zwischen den Adressräumen zur Verfügung, oder es müssen Umwege außerhalb des Arbeitsspeichers beschritten werden.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Höhere Programmiersprachen können in das „normale Programm“ einen [[Compiler]] einbetten, dann müssen die Modifikation ggf. nicht direkt in [[Maschinensprache]] ausgeführt werden. Hilfreich ist, wenn die Sprache [[Homoikonizität]] besitzt (Selbst-Abbildbarkeit: die Eigenschaft einer Programmiersprache, dass Programme gleichzeitig Datenstrukturen derselben Sprache sind/sein können; in solchen Sprachen ist es einfach, Programme zu schreiben, die Programme schreiben). Die [[Portierung (Software)|Portierung]] von selbstmodifizierendem Maschinencode auf einen beliebigen [[Prozessor]] ist fast nicht möglich. Mittlerweile verfügen viele [[Prozessorarchitektur]]en, die eigentlich Von-Neumann-artig aufgebaut sind, über Methoden, das Schreiben in (Maschinen-)Codebereiche sowie das Ausführen von Datenbereichen zu verhindern (z.&amp;nbsp;B. [[NX-Bit]], [[Protected Mode]] des 80286<del style="font-weight: bold; text-decoration: none;"> und späteren Prozessoren</del>&lt;ref&gt;https://books.google.de/books?id=pDGnxFyejN4C&amp;lpg=PP1&amp;hl=de&amp;pg=PA170#v=onepage&amp;q&amp;f=false Obstracles to a grown-up operating system, PC Mag 10.Juni 1986 (englisch)&lt;/ref&gt;), als Schutzmaßnahme gegen [[Pufferüberlauf]]-Angriffe. Bei höheren Programmiersprachen sind für selbstmodifizierenden Code in der Regel [[Interpreter|interpretierende]] (also nicht kompilierende) Systeme notwendig.</div></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Höhere Programmiersprachen können in das „normale Programm“ einen [[Compiler]] einbetten, dann müssen die Modifikation ggf. nicht direkt in [[Maschinensprache]] ausgeführt werden. Hilfreich ist, wenn die Sprache [[Homoikonizität]] besitzt (Selbst-Abbildbarkeit: die Eigenschaft einer Programmiersprache, dass Programme gleichzeitig Datenstrukturen derselben Sprache sind/sein können; in solchen Sprachen ist es einfach, Programme zu schreiben, die Programme schreiben). Die [[Portierung (Software)|Portierung]] von selbstmodifizierendem Maschinencode auf einen beliebigen [[Prozessor]] ist fast nicht möglich. Mittlerweile verfügen viele [[Prozessorarchitektur]]en, die eigentlich Von-Neumann-artig aufgebaut sind, über Methoden, das Schreiben in (Maschinen-)Codebereiche sowie das Ausführen von Datenbereichen zu verhindern (z.&amp;nbsp;B. [[NX-Bit]], [[Protected Mode]] des<ins style="font-weight: bold; text-decoration: none;"> Intel</ins> 80286&lt;ref&gt;https://books.google.de/books?id=pDGnxFyejN4C&amp;lpg=PP1&amp;hl=de&amp;pg=PA170#v=onepage&amp;q&amp;f=false Obstracles to a grown-up operating system, PC Mag 10.Juni 1986 (englisch)&lt;/ref&gt;), als Schutzmaßnahme gegen [[Pufferüberlauf]]-Angriffe. Bei höheren Programmiersprachen sind für selbstmodifizierenden Code in der Regel [[Interpreter|interpretierende]] (also nicht kompilierende) Systeme notwendig.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Vorteile ==</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Vorteile ==</div></td> </tr> </table> 84.158.120.82 https://de.wikipedia.org/w/index.php?title=Selbstmodifizierender_Code&diff=247578325&oldid=prev 84.158.120.82: /* Architektur- und Sprachabhängigkeit */ Bereits der Protected Mode des 286er verhinderte selbstmodifizierenden Code. Quelle liegt bei. 2024-08-11T00:33:04Z <p><span class="autocomment">Architektur- und Sprachabhängigkeit: </span> Bereits der Protected Mode des 286er verhinderte selbstmodifizierenden Code. Quelle liegt bei.</p> <table style="background-color: #fff; color: #202122;" data-mw="interface"> <col class="diff-marker" /> <col class="diff-content" /> <col class="diff-marker" /> <col class="diff-content" /> <tr class="diff-title" lang="de"> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Nächstältere Version</td> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Version vom 11. August 2024, 02:33 Uhr</td> </tr><tr> <td colspan="2" class="diff-lineno">Zeile 15:</td> <td colspan="2" class="diff-lineno">Zeile 15:</td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Die In-Memory-Veränderung eines Maschinensprachen-Programmcodes ist in einer [[Von-Neumann-Architektur]] einfach möglich, da Programmteile zeitweise als Daten betrachtet werden können, später 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 während der [[Laufzeit (Informatik)|Laufzeit]] nicht vorgesehen, Programm und Daten haben getrennte Adressräume. Evtl. stehen spezielle Befehle für das Übertragen von Informationen zwischen den Adressräumen zur Verfügung, oder es müssen Umwege außerhalb des Arbeitsspeichers beschritten werden.</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Die In-Memory-Veränderung eines Maschinensprachen-Programmcodes ist in einer [[Von-Neumann-Architektur]] einfach möglich, da Programmteile zeitweise als Daten betrachtet werden können, später 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 während der [[Laufzeit (Informatik)|Laufzeit]] nicht vorgesehen, Programm und Daten haben getrennte Adressräume. Evtl. stehen spezielle Befehle für das Übertragen von Informationen zwischen den Adressräumen zur Verfügung, oder es müssen Umwege außerhalb des Arbeitsspeichers beschritten werden.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Höhere Programmiersprachen können in das „normale Programm“ einen [[Compiler]] einbetten, dann müssen die Modifikation ggf. nicht direkt in [[Maschinensprache]] ausgeführt werden. Hilfreich ist, wenn die Sprache [[Homoikonizität]] besitzt (Selbst-Abbildbarkeit: die Eigenschaft einer Programmiersprache, dass Programme gleichzeitig Datenstrukturen derselben Sprache sind/sein können; in solchen Sprachen ist es einfach, Programme zu schreiben, die Programme schreiben). Die [[Portierung (Software)|Portierung]] von selbstmodifizierendem Maschinencode auf einen beliebigen [[Prozessor]] ist fast nicht möglich. Mittlerweile verfügen viele [[Prozessorarchitektur]]en, die eigentlich Von-Neumann-artig aufgebaut sind, über Methoden, das Schreiben in (Maschinen-)Codebereiche sowie das Ausführen von Datenbereichen zu verhindern (z.&amp;nbsp;B. [[NX-Bit]]), als Schutzmaßnahme gegen [[Pufferüberlauf]]-Angriffe. Bei höheren Programmiersprachen sind für selbstmodifizierenden Code in der Regel [[Interpreter|interpretierende]] (also nicht kompilierende) Systeme notwendig.</div></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Höhere Programmiersprachen können in das „normale Programm“ einen [[Compiler]] einbetten, dann müssen die Modifikation ggf. nicht direkt in [[Maschinensprache]] ausgeführt werden. Hilfreich ist, wenn die Sprache [[Homoikonizität]] besitzt (Selbst-Abbildbarkeit: die Eigenschaft einer Programmiersprache, dass Programme gleichzeitig Datenstrukturen derselben Sprache sind/sein können; in solchen Sprachen ist es einfach, Programme zu schreiben, die Programme schreiben). Die [[Portierung (Software)|Portierung]] von selbstmodifizierendem Maschinencode auf einen beliebigen [[Prozessor]] ist fast nicht möglich. Mittlerweile verfügen viele [[Prozessorarchitektur]]en, die eigentlich Von-Neumann-artig aufgebaut sind, über Methoden, das Schreiben in (Maschinen-)Codebereiche sowie das Ausführen von Datenbereichen zu verhindern (z.&amp;nbsp;B. [[NX-Bit]]<ins style="font-weight: bold; text-decoration: none;">, [[Protected Mode]] des 80286 und späteren Prozessoren&lt;ref&gt;https://books.google.de/books?id=pDGnxFyejN4C&amp;lpg=PP1&amp;hl=de&amp;pg=PA170#v=onepage&amp;q&amp;f=false Obstracles to a grown-up operating system, PC Mag 10.Juni 1986 (englisch)&lt;/ref&gt;</ins>), als Schutzmaßnahme gegen [[Pufferüberlauf]]-Angriffe. Bei höheren Programmiersprachen sind für selbstmodifizierenden Code in der Regel [[Interpreter|interpretierende]] (also nicht kompilierende) Systeme notwendig.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Vorteile ==</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Vorteile ==</div></td> </tr> </table> 84.158.120.82 https://de.wikipedia.org/w/index.php?title=Selbstmodifizierender_Code&diff=245826473&oldid=prev 84.158.113.105: /* Nachteile */ 2024-06-11T13:45:36Z <p><span class="autocomment">Nachteile</span></p> <table style="background-color: #fff; color: #202122;" data-mw="interface"> <col class="diff-marker" /> <col class="diff-content" /> <col class="diff-marker" /> <col class="diff-content" /> <tr class="diff-title" lang="de"> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Nächstältere Version</td> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Version vom 11. Juni 2024, 15:45 Uhr</td> </tr><tr> <td colspan="2" class="diff-lineno">Zeile 28:</td> <td colspan="2" class="diff-lineno">Zeile 28:</td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>#Der CPU-Entwurf wird deutlich komplizierter; mitunter kommt es bei anderen CPU-Versionen zu Fehlern.&lt;ref group="Anmerkung"&gt;Selbstmodifizierender Code wurde z.&amp;nbsp;B. verwendet, um den Intel 8088 vom Intel 8086 zu unterscheiden, da einer eine längere Befehlspipeline besaß: Der Prozessor mit der kurzen Pipeline folgte der Änderung, der Prozessor mit der längeren Pipeline führte jedoch weiterhin den „alten“ Befehl aus, da dieser bereits in der Pipeline gespeichert war.&lt;/ref&gt;</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>#Der CPU-Entwurf wird deutlich komplizierter; mitunter kommt es bei anderen CPU-Versionen zu Fehlern.&lt;ref group="Anmerkung"&gt;Selbstmodifizierender Code wurde z.&amp;nbsp;B. verwendet, um den Intel 8088 vom Intel 8086 zu unterscheiden, da einer eine längere Befehlspipeline besaß: Der Prozessor mit der kurzen Pipeline folgte der Änderung, der Prozessor mit der längeren Pipeline führte jedoch weiterhin den „alten“ Befehl aus, da dieser bereits in der Pipeline gespeichert war.&lt;/ref&gt;</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>#Programmcode kann im Arbeitsspeicher nicht für mehrere Instanzen wiederverwendet werden, die erste Instanz würde den Code modifizieren, womit die spätere zweite Instanz nicht mehr korrekt funktionieren würde.&lt;ref&gt;https://learn.microsoft.com/en-us/archive/msdn-magazine/2000/july/under-the-hood-happy-10th-anniversary-windows ''Under the Hood: Happy 10th Anniversary, Windows'' von Matt Pietrek, MSDN Magazin&lt;/ref&gt;</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>#Programmcode kann im Arbeitsspeicher nicht für mehrere Instanzen wiederverwendet werden, die erste Instanz würde den Code modifizieren, womit die spätere zweite Instanz nicht mehr korrekt funktionieren würde.&lt;ref&gt;https://learn.microsoft.com/en-us/archive/msdn-magazine/2000/july/under-the-hood-happy-10th-anniversary-windows ''Under the Hood: Happy 10th Anniversary, Windows'' von Matt Pietrek, MSDN Magazin&lt;/ref&gt;</div></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>#Kurzer Selbstmodifizierender Code ist auf modernen CPUs aufgrund von deren Cache- und Pipelineverhalten wenig effizient.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Beispiele ==</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Beispiele ==</div></td> </tr> </table> 84.158.113.105 https://de.wikipedia.org/w/index.php?title=Selbstmodifizierender_Code&diff=245826358&oldid=prev 84.158.113.105: /* Nachteile */ 2024-06-11T13:42:09Z <p><span class="autocomment">Nachteile</span></p> <table style="background-color: #fff; color: #202122;" data-mw="interface"> <col class="diff-marker" /> <col class="diff-content" /> <col class="diff-marker" /> <col class="diff-content" /> <tr class="diff-title" lang="de"> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Nächstältere Version</td> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Version vom 11. Juni 2024, 15:42 Uhr</td> </tr><tr> <td colspan="2" class="diff-lineno">Zeile 27:</td> <td colspan="2" class="diff-lineno">Zeile 27:</td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>#Der Maschinencode ist schwierig nachzuvollziehen.</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>#Der Maschinencode ist schwierig nachzuvollziehen.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>#Der CPU-Entwurf wird deutlich komplizierter; mitunter kommt es bei anderen CPU-Versionen zu Fehlern.&lt;ref group="Anmerkung"&gt;Selbstmodifizierender Code wurde z.&amp;nbsp;B. verwendet, um den Intel 8088 vom Intel 8086 zu unterscheiden, da einer eine längere Befehlspipeline besaß: Der Prozessor mit der kurzen Pipeline folgte der Änderung, der Prozessor mit der längeren Pipeline führte jedoch weiterhin den „alten“ Befehl aus, da dieser bereits in der Pipeline gespeichert war.&lt;/ref&gt;</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>#Der CPU-Entwurf wird deutlich komplizierter; mitunter kommt es bei anderen CPU-Versionen zu Fehlern.&lt;ref group="Anmerkung"&gt;Selbstmodifizierender Code wurde z.&amp;nbsp;B. verwendet, um den Intel 8088 vom Intel 8086 zu unterscheiden, da einer eine längere Befehlspipeline besaß: Der Prozessor mit der kurzen Pipeline folgte der Änderung, der Prozessor mit der längeren Pipeline führte jedoch weiterhin den „alten“ Befehl aus, da dieser bereits in der Pipeline gespeichert war.&lt;/ref&gt;</div></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>#Programmcode kann im Arbeitsspeicher nicht für mehrere Instanzen wiederverwendet werden, die erste Instanz würde den Code modifizieren, womit die spätere zweite Instanz nicht mehr korrekt funktionieren würde.&lt;ref&gt;https://learn.microsoft.com/en-us/archive/msdn-magazine/2000/july/under-the-hood-happy-10th-anniversary-windows ''Under the Hood: Happy 10th Anniversary, Windows'' von Matt Pietrek, MSDN Magazin&lt;/ref&gt;</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Beispiele ==</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Beispiele ==</div></td> </tr> </table> 84.158.113.105 https://de.wikipedia.org/w/index.php?title=Selbstmodifizierender_Code&diff=244324894&oldid=prev Aka: Tippfehler entfernt, typografische Anführungszeichen, Links normiert 2024-04-23T09:58:34Z <p><a href="/wiki/Benutzer:Aka/Tippfehler_entfernt" title="Benutzer:Aka/Tippfehler entfernt">Tippfehler entfernt</a>, typografische Anführungszeichen, Links normiert</p> <table style="background-color: #fff; color: #202122;" data-mw="interface"> <col class="diff-marker" /> <col class="diff-content" /> <col class="diff-marker" /> <col class="diff-content" /> <tr class="diff-title" lang="de"> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Nächstältere Version</td> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Version vom 23. April 2024, 11:58 Uhr</td> </tr><tr> <td colspan="2" class="diff-lineno">Zeile 46:</td> <td colspan="2" class="diff-lineno">Zeile 46:</td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>=== Mathematikprogramm ===</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>=== Mathematikprogramm ===</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>In Microsoft [[BASIC]] auf Commodore Computern (z.&amp;nbsp;B. PET, VC 20, [[C64]]) war es über ein kurzzeitiges Anhalten eines Programms effektiv möglich, eine über den INPUT-Befehl im Programm abgefragte Benutzerfunktion (z.&amp;nbsp;B. <del style="font-weight: bold; text-decoration: none;">"SIN</del>(X)<del style="font-weight: bold; text-decoration: none;">"</del>) an den Programmeditor zu übergeben, der eine Zeile im BASIC-Programm entsprechend veränderte, worauf das Programm ohne Verlust der Variableninformation (mittels [[Sprunganweisung|GOTO-Befehl]]) wieder fortgesetzt wurde</div></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>In Microsoft [[BASIC]] auf Commodore Computern (z.&amp;nbsp;B. PET, VC 20, [[C64]]) war es über ein kurzzeitiges Anhalten eines Programms effektiv möglich, eine über den INPUT-Befehl im Programm abgefragte Benutzerfunktion (z.&amp;nbsp;B. <ins style="font-weight: bold; text-decoration: none;">„SIN</ins>(X)<ins style="font-weight: bold; text-decoration: none;">“</ins>) an den Programmeditor zu übergeben, der eine Zeile im BASIC-Programm entsprechend veränderte, worauf das Programm ohne Verlust der Variableninformation (mittels [[Sprunganweisung|GOTO-Befehl]]) wieder fortgesetzt wurde</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>und die neue Zeile für Berechnungen nutzen konnte.</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>und die neue Zeile für Berechnungen nutzen konnte.</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Dies geschah durch Ausdruck der gewünschten neuen Programmzeile in der obersten Bildschirmzeile (unter Benutzung des Microsoft-BASIC-Ausdrucks <del style="font-weight: bold; text-decoration: none;">"</del>[[DEF FN]]<del style="font-weight: bold; text-decoration: none;">"</del>) und Ausgabe des Befehls <del style="font-weight: bold; text-decoration: none;">"GOTO</del> <del style="font-weight: bold; text-decoration: none;">xxx"</del> zum Rücksprung ins Programm in der zweiten Bildschirmzeile.</div></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Dies geschah durch Ausdruck der gewünschten neuen Programmzeile in der obersten Bildschirmzeile (unter Benutzung des Microsoft-BASIC-Ausdrucks <ins style="font-weight: bold; text-decoration: none;">„</ins>[[DEF FN]]<ins style="font-weight: bold; text-decoration: none;">“</ins>) und Ausgabe des Befehls <ins style="font-weight: bold; text-decoration: none;">„GOTO</ins> <ins style="font-weight: bold; text-decoration: none;">xxx“</ins> zum Rücksprung ins Programm in der zweiten Bildschirmzeile.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Füllen des Tastaturpuffers mit den Zeichen [[HOME]] und mehreren Steuerzeichen für [[Wagenrücklauf]] sorgte dafür, dass nach dem STOP-Befehl der systemeigene Programmeditor die zuvor ausgegebene Programmzeile bearbeitete und bei Erreichen des GOTO-Befehls (ausgelöst durch die Wagenrücklauf-Zeichen) das BASIC-Programm wieder ausführte.</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Füllen des Tastaturpuffers mit den Zeichen [[HOME]] und mehreren Steuerzeichen für [[Wagenrücklauf]] sorgte dafür, dass nach dem STOP-Befehl der systemeigene Programmeditor die zuvor ausgegebene Programmzeile bearbeitete und bei Erreichen des GOTO-Befehls (ausgelöst durch die Wagenrücklauf-Zeichen) das BASIC-Programm wieder ausführte.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td colspan="2" class="diff-lineno">Zeile 54:</td> <td colspan="2" class="diff-lineno">Zeile 54:</td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Ein solches Unterprogramm bekam Startadresse, Zieladresse und Größe in Byte oder Speicherseiten (je 256&amp;nbsp;Byte) übergeben. 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 [[MOS Technology 6502|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&amp;shy;modifizierenden Codes werden nicht das Indexregister und die Zeigeradressen hochgezählt, sondern die Adressen im Programmcode hinter dem Opcode der absolut adressierbaren Lade- und Speicherbefehle. Damit lassen sich Kopierroutinen deutlich beschleunigen.</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Ein solches Unterprogramm bekam Startadresse, Zieladresse und Größe in Byte oder Speicherseiten (je 256&amp;nbsp;Byte) übergeben. 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 [[MOS Technology 6502|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&amp;shy;modifizierenden Codes werden nicht das Indexregister und die Zeigeradressen hochgezählt, sondern die Adressen im Programmcode hinter dem Opcode der absolut adressierbaren Lade- und Speicherbefehle. Damit lassen sich Kopierroutinen deutlich beschleunigen.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>=== BitBlt der 16-Bit<del style="font-weight: bold; text-decoration: none;"> </del>Windows<del style="font-weight: bold; text-decoration: none;"> </del>Versionen ===</div></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>=== BitBlt der 16-Bit<ins style="font-weight: bold; text-decoration: none;">-</ins>Windows<ins style="font-weight: bold; text-decoration: none;">-</ins>Versionen ===</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Für die 16-Bit Versionen von [[Microsoft Windows]], einschließlich der 16-/32-<del style="font-weight: bold; text-decoration: none;"> </del>Bit<del style="font-weight: bold; text-decoration: none;"> </del>Hybride [[<del style="font-weight: bold; text-decoration: none;">Windows_9x</del>|Windows 95/98/Me]] wurde für die [[Bit blit|BitBlt]]-Funktion ein selbstmodifizierender Code verwendet.&lt;ref&gt;{{Internetquelle |url=https://devblogs.microsoft.com/oldnewthing/20180209-00/?p=97995 |autor=Raymond Chen |titel=Optimizing BitBlt by generating code on the fly |werk=The Old New Thing |hrsg=Microsoft |datum=2018-02-09 |sprache=en |abruf=2024-04-01}}&lt;/ref&gt;</div></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Für die 16-Bit Versionen von [[Microsoft Windows]], einschließlich der 16-/32-Bit<ins style="font-weight: bold; text-decoration: none;">-</ins>Hybride [[<ins style="font-weight: bold; text-decoration: none;">Windows 9x</ins>|Windows 95/98/Me]] wurde für die [[Bit blit|BitBlt]]-Funktion ein selbstmodifizierender Code verwendet.&lt;ref&gt;{{Internetquelle |url=https://devblogs.microsoft.com/oldnewthing/20180209-00/?p=97995 |autor=Raymond Chen |titel=Optimizing BitBlt by generating code on the fly |werk=The Old New Thing |hrsg=Microsoft |datum=2018-02-09 |sprache=en |abruf=2024-04-01}}&lt;/ref&gt;</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Anmerkungen ==</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Anmerkungen ==</div></td> </tr> </table> Aka https://de.wikipedia.org/w/index.php?title=Selbstmodifizierender_Code&diff=243903090&oldid=prev Pentachlorphenol: Änderungen von Mathbueb (Diskussion) auf die letzte Version von Rolf acker zurückgesetzt 2024-04-09T13:13:06Z <p>Änderungen von <a href="/wiki/Spezial:Beitr%C3%A4ge/Mathbueb" title="Spezial:Beiträge/Mathbueb">Mathbueb</a> (<a href="/wiki/Benutzer_Diskussion:Mathbueb" title="Benutzer Diskussion:Mathbueb">Diskussion</a>) auf die letzte Version von <a href="/wiki/Benutzer:Rolf_acker" title="Benutzer:Rolf acker">Rolf acker</a> zurückgesetzt</p> <table style="background-color: #fff; color: #202122;" data-mw="interface"> <col class="diff-marker" /> <col class="diff-content" /> <col class="diff-marker" /> <col class="diff-content" /> <tr class="diff-title" lang="de"> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Nächstältere Version</td> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Version vom 9. April 2024, 15:13 Uhr</td> </tr><tr> <td colspan="2" class="diff-lineno">Zeile 1:</td> <td colspan="2" class="diff-lineno">Zeile 1:</td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>{{Überarbeiten}}</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>{{Überarbeiten}}</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>{{Belege fehlen|2=Der gesamte Artikel|1=&lt;small&gt;(Februar 2017)&lt;/small&gt;}}</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>{{Belege fehlen|2=Der gesamte Artikel|1=&lt;small&gt;(Februar 2017)&lt;/small&gt;}}</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Mit der Bezeichnung<del style="font-weight: bold; text-decoration: none;">:</del> '''Selbstmodifizierender Code''' ({{enS|Self Modifying Code}}) wird ein Abschnitt eines [[Computerprogramm]]s bezeichnet, das zur Lösung der Programmaufgabe Teile des eigenen Programmcodes während der Ausführung gezielt verändert. Unter der Bezeichnung „freier Rechenplan“ hatte schon [[Konrad Zuse]] selbstmodifizierenden Code als Möglichkeit in die von ihm entworfene Programmiersprache [[Plankalkül]] aufgenommen.</div></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Mit der Bezeichnung '''Selbstmodifizierender Code''' ({{enS|Self Modifying Code}}) wird ein Abschnitt eines [[Computerprogramm]]s bezeichnet, das zur Lösung der Programmaufgabe Teile des eigenen Programmcodes während der Ausführung gezielt verändert. Unter der Bezeichnung „freier Rechenplan“ hatte schon [[Konrad Zuse]] selbstmodifizierenden Code als Möglichkeit in die von ihm entworfene Programmiersprache [[Plankalkül]] aufgenommen.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Das Programm muss dabei in der Lage sein, im [[Maschinensprache|Maschinencode]] bestimmte Befehle durch sinnvolle andere Maschinenbefehle zu ersetzen. Bei höheren [[Programmiersprache]]n (z.&amp;nbsp;B. [[APL (Programmiersprache)|APL]]) manipuliert das Programm meist den [[Quellcode]] als [[Zeichenkette]].</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Das Programm muss dabei in der Lage sein, im [[Maschinensprache|Maschinencode]] bestimmte Befehle durch sinnvolle andere Maschinenbefehle zu ersetzen. Bei höheren [[Programmiersprache]]n (z.&amp;nbsp;B. [[APL (Programmiersprache)|APL]]) manipuliert das Programm meist den [[Quellcode]] als [[Zeichenkette]].</div></td> </tr> <tr> <td colspan="2" class="diff-lineno">Zeile 7:</td> <td colspan="2" class="diff-lineno">Zeile 7:</td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Selbstmodifizierender Code kann unter anderem da verwendet werden, wo es möglich ist, mehrere, nur an wenigen Stellen unterschiedliche Programmteile zu einem einzigen zusammenzufassen.</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Selbstmodifizierender Code kann unter anderem da verwendet werden, wo es möglich ist, mehrere, nur an wenigen Stellen unterschiedliche Programmteile zu einem einzigen zusammenzufassen.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Der selbstmodifizierende Code<del style="font-weight: bold; text-decoration: none;">,</del> 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 möglicherweise hilfreich, die [[Künstliche Intelligenz|Maschinenintelligenz]] zu steigern.</div></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>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 möglicherweise hilfreich, die [[Künstliche Intelligenz|Maschinenintelligenz]] zu steigern.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Motivation ==</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Motivation ==</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Die Methode, Code sich selbst modifizieren zu lassen, stammt hauptsächlich aus einer Zeit, in der Ressourcen (CPU-Zeit, Speicher) noch sehr knappe Güter waren – es wurde also oftmals<del style="font-weight: bold; text-decoration: none;">,</del> eine Optimierung des Laufzeitverhaltens oder Speicherverbrauchs angestrebt. Sogenannte [[Kompression ausführbarer Programmdateien|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 äußerst selten notwendig (z.&amp;nbsp;B. beim „Retro computing“, wenn also auf sehr alten Systemen programmiert wird). Ein anderer Grund zur Selbstmodifikation war der Schutz geistigen Eigentums, um die tatsächlichen Algorithmen zu verbergen. In Anbetracht der historischen Motivationen 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 die (historischen und/oder technischen) Umstände berücksichtigt werden.</div></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Die Methode, Code sich selbst modifizieren zu lassen, stammt hauptsächlich aus einer Zeit, in der Ressourcen (CPU-Zeit, Speicher) noch sehr knappe Güter waren – es wurde also oftmals eine Optimierung des Laufzeitverhaltens oder Speicherverbrauchs angestrebt. Sogenannte [[Kompression ausführbarer Programmdateien|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 äußerst selten notwendig (z.&amp;nbsp;B. beim „Retro computing“, wenn also auf sehr alten Systemen programmiert wird). Ein anderer Grund zur Selbstmodifikation war der Schutz geistigen Eigentums, um die tatsächlichen Algorithmen zu verbergen. In Anbetracht der historischen Motivationen 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 die (historischen und/oder technischen) Umstände berücksichtigt werden.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Architektur- und Sprachabhängigkeit ==</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Architektur- und Sprachabhängigkeit ==</div></td> </tr> </table> Pentachlorphenol https://de.wikipedia.org/w/index.php?title=Selbstmodifizierender_Code&diff=243903080&oldid=prev Mathbueb: Kommas gesetzt 2024-04-09T13:12:41Z <p>Kommas gesetzt</p> <table style="background-color: #fff; color: #202122;" data-mw="interface"> <col class="diff-marker" /> <col class="diff-content" /> <col class="diff-marker" /> <col class="diff-content" /> <tr class="diff-title" lang="de"> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Nächstältere Version</td> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Version vom 9. April 2024, 15:12 Uhr</td> </tr><tr> <td colspan="2" class="diff-lineno">Zeile 1:</td> <td colspan="2" class="diff-lineno">Zeile 1:</td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>{{Überarbeiten}}</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>{{Überarbeiten}}</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>{{Belege fehlen|2=Der gesamte Artikel|1=&lt;small&gt;(Februar 2017)&lt;/small&gt;}}</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>{{Belege fehlen|2=Der gesamte Artikel|1=&lt;small&gt;(Februar 2017)&lt;/small&gt;}}</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Mit der Bezeichnung '''Selbstmodifizierender Code''' ({{enS|Self Modifying Code}}) wird ein Abschnitt eines [[Computerprogramm]]s bezeichnet, das zur Lösung der Programmaufgabe Teile des eigenen Programmcodes während der Ausführung gezielt verändert. Unter der Bezeichnung „freier Rechenplan“ hatte schon [[Konrad Zuse]] selbstmodifizierenden Code als Möglichkeit in die von ihm entworfene Programmiersprache [[Plankalkül]] aufgenommen.</div></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Mit der Bezeichnung<ins style="font-weight: bold; text-decoration: none;">:</ins> '''Selbstmodifizierender Code''' ({{enS|Self Modifying Code}}) wird ein Abschnitt eines [[Computerprogramm]]s bezeichnet, das zur Lösung der Programmaufgabe Teile des eigenen Programmcodes während der Ausführung gezielt verändert. Unter der Bezeichnung „freier Rechenplan“ hatte schon [[Konrad Zuse]] selbstmodifizierenden Code als Möglichkeit in die von ihm entworfene Programmiersprache [[Plankalkül]] aufgenommen.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Das Programm muss dabei in der Lage sein, im [[Maschinensprache|Maschinencode]] bestimmte Befehle durch sinnvolle andere Maschinenbefehle zu ersetzen. Bei höheren [[Programmiersprache]]n (z.&amp;nbsp;B. [[APL (Programmiersprache)|APL]]) manipuliert das Programm meist den [[Quellcode]] als [[Zeichenkette]].</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Das Programm muss dabei in der Lage sein, im [[Maschinensprache|Maschinencode]] bestimmte Befehle durch sinnvolle andere Maschinenbefehle zu ersetzen. Bei höheren [[Programmiersprache]]n (z.&amp;nbsp;B. [[APL (Programmiersprache)|APL]]) manipuliert das Programm meist den [[Quellcode]] als [[Zeichenkette]].</div></td> </tr> <tr> <td colspan="2" class="diff-lineno">Zeile 7:</td> <td colspan="2" class="diff-lineno">Zeile 7:</td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Selbstmodifizierender Code kann unter anderem da verwendet werden, wo es möglich ist, mehrere, nur an wenigen Stellen unterschiedliche Programmteile zu einem einzigen zusammenzufassen.</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Selbstmodifizierender Code kann unter anderem da verwendet werden, wo es möglich ist, mehrere, nur an wenigen Stellen unterschiedliche Programmteile zu einem einzigen zusammenzufassen.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>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 möglicherweise hilfreich, die [[Künstliche Intelligenz|Maschinenintelligenz]] zu steigern.</div></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Der selbstmodifizierende Code<ins style="font-weight: bold; text-decoration: none;">,</ins> 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 möglicherweise hilfreich, die [[Künstliche Intelligenz|Maschinenintelligenz]] zu steigern.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Motivation ==</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Motivation ==</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Die Methode, Code sich selbst modifizieren zu lassen, stammt hauptsächlich aus einer Zeit, in der Ressourcen (CPU-Zeit, Speicher) noch sehr knappe Güter waren – es wurde also oftmals eine Optimierung des Laufzeitverhaltens oder Speicherverbrauchs angestrebt. Sogenannte [[Kompression ausführbarer Programmdateien|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 äußerst selten notwendig (z.&amp;nbsp;B. beim „Retro computing“, wenn also auf sehr alten Systemen programmiert wird). Ein anderer Grund zur Selbstmodifikation war der Schutz geistigen Eigentums, um die tatsächlichen Algorithmen zu verbergen. In Anbetracht der historischen Motivationen 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 die (historischen und/oder technischen) Umstände berücksichtigt werden.</div></td> <td class="diff-marker" data-marker="+"></td> <td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Die Methode, Code sich selbst modifizieren zu lassen, stammt hauptsächlich aus einer Zeit, in der Ressourcen (CPU-Zeit, Speicher) noch sehr knappe Güter waren – es wurde also oftmals<ins style="font-weight: bold; text-decoration: none;">,</ins> eine Optimierung des Laufzeitverhaltens oder Speicherverbrauchs angestrebt. Sogenannte [[Kompression ausführbarer Programmdateien|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 äußerst selten notwendig (z.&amp;nbsp;B. beim „Retro computing“, wenn also auf sehr alten Systemen programmiert wird). Ein anderer Grund zur Selbstmodifikation war der Schutz geistigen Eigentums, um die tatsächlichen Algorithmen zu verbergen. In Anbetracht der historischen Motivationen 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 die (historischen und/oder technischen) Umstände berücksichtigt werden.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Architektur- und Sprachabhängigkeit ==</div></td> <td class="diff-marker"></td> <td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Architektur- und Sprachabhängigkeit ==</div></td> </tr> </table> Mathbueb