Кіріспе
Компьютерлік ғылымда өзін-өзі өзгерту коды (SMC немесе SMoC) – өзінің нұсқауларын орындалып жатқанда өзгертетін код. Бұл әдетте нұсқаулар орындалу жолының ұзындығын қысқарту және өнімділікті арттыру үшін, немесе әйтпесе қайталанатын ұқсас кодты азайту арқылы техникалық қызмет көрсетуді жеңілдету үшін қолданылады. Бұл термин әдетте өзін-өзі өзгерту қасақана жасалған кодқа ғана қолданылады, кодтың буфер асып кету сияқты қатеге байланысты кездейсоқ түрде өзгеруіне емес. Өзін-өзі өзгерту коды қолданыстағы нұсқауларды жаңа нұсқаулармен жабуды немесе орындалу кезінде жаңа кодты жасауды және басқаруды осы кодқа беруді қамтиды. Өзін-өзі өзгерту, шартты бағдарлама тармақталуына және "жалаушаны орнату" әдісіне балама ретінде қолданылуы мүмкін, бұл негізінен шартты тексеру қажеттілігін азайту үшін пайдаланылады. Бұл әдіс жиі, әрбір кіріс/шығыс циклі үшін қосымша есептеу шығындарын қажет етпей, сынақ/түзету кодтарын шартты түрде шақыру үшін қолданылады. Өзгерістер: тек бастапқы параметрлерге негізделген инициализация кезінде ғана жасалуы мүмкін (егер процесс бағдарламалық құрал ретінде сипатталса және аппараттық тұрғыдан баспалы схема тақталары үшін селекторларды орнатуға ұқсас болса). Бағдарламаға кіру нүктелерін өзгерту – өзін-өзі өзгертудің баламалы, жанама әдісі, бірақ бағдарламаның көлемін ұлғайтатын бір немесе бірнеше баламалы нұсқау жолдарының болуын қажет етеді. орындалу кезінде ("ұшқында") – орындалу барысында қол жеткен нақты бағдарламалық күйлерге негізделген. Екі жағдайда да өзгерістер машиналық кодтың нұсқауларына тікелей жасалуы мүмкін, жаңа нұсқауларды қолда бар нұсқаулардың үстіне жабу арқылы (мысалы: салыстыру және тармақталуды шартсыз тармақталуға немесе "NOP" нұсқаулығына өзгерту). IBM System/360 архитектурасында және z/Architecture-ға дейінгі оның ізбасарларында EXECUTE (EX) нұсқаулығы логикалық түрде мақсатты нұсқаудың екінші байтын 1-тіркеменің кіші 8 битімен жабады. Бұл өзін-өзі өзгерту эффектін береді, бірақ сақтаудағы нақты нұсқаулар өзгермейді.
In computer science, self modifying code (SMC or SMoC) is code that alters its own instructions while it is executing – usually to reduce the instruction path length and improve performance or simply to reduce otherwise repetitively similar code, thus simplifying maintenance. The term is usually only applied to code where the self modification is intentional, not in situations where code accidentally modifies itself due to an error such as a buffer overflow. Self modifying code can involve overwriting existing instructions or generating new code at run time and transferring control to that code. Self modification can be used as an alternative to the method of "flag setting" and conditional program branching, used primarily to reduce the number of times a condition needs to be tested. The method is frequently used for conditionally invoking test/debugging code without requiring additional computational overhead for every input/output cycle. The modifications may be performed:
only during initialization – based on input parameters (when the process is more commonly described as software 'configuration' and is somewhat analogous, in hardware terms, to setting jumpers for printed circuit boards). Alteration of program entry pointers is an equivalent indirect method of self modification, but requiring the co existence of one or more alternative instruction paths, increasing the program size. throughout execution ("on the fly") – based on particular program states that have been reached during the execution
In either case, the modifications may be performed directly to the machine code instructions themselves, by overlaying new instructions over the existing ones (for example: altering a compare and branch to an unconditional branch or alternatively a 'NOP'). In the IBM System/360 architecture, and its successors up to z/Architecture, an EXECUTE (EX) instruction logically overlays the second byte of its target instruction with the low order 8 bits of register 1. This provides the effect of self modification although the actual instruction in storage is not altered.
Ассамблея тілі
Ассемблер тілінде өздігінен өзгеретін кодты іске асыру өте қарапайым. Нұсқаулар жадта динамикалық түрде жасалуы мүмкін (немесе қорғалмаған бағдарламалық жадтағы қолданыстағы кодтың үстіне жабыстырылуы мүмкін). DR DOS ядросы жүктелу кезінде, негізгі процессор буынына байланысты, өзінің өте маңызды жылдамдыққа сезімтал бөлімдерін оңтайландырады.