Années 1960-ère de l'assemblée langues utilisées self-modifying code pour implémenter les appels de fonction sans pile.
Knuth, v1, p.182:
MAX100 STJ EXIT ;Subroutine linkage
ENT3 100 ;M1. Initialize
JMP 2F
1H CMPA X,3 ;M3. Compare
JGE *+3
2H ENT2 0,3 ;M4. Change m
LDA X,3 ;(New maximum found)
DEC3 1 ;M5. Decrease k
J3P 1B ;M2. All tested?
EXIT JMP * ;Return to main program
Dans un programme plus vaste contenant ce codage comme une sous-routine, la seule instruction "JMP MAX100" serait la cause d'enregistrer Un être réglé à la valeur maximale actuelle des emplacements X + 1 et X + 100, et la position du maximum apparaissent dans rI2. Sous-routine d'entraînement dans ce cas est réalisé par les instructions de la section "MAX100 STJ EXIT" et, plus tard, "la SORTIE de JMP *". En raison de la façon dont la J-registre fonctionne, l'instruction exit va ensuite passer à l'emplacement suivant l'endroit où la référence d'origine MAX100 a été faite.
Edit: Il peut être difficile de voir ce qui se passe, même avec une brève explication ici. Dans la ligne MAX100 STJ EXIT
, MAX100
est une étiquette pour l'instruction (et donc pour l'ensemble de la procédure), STJ
moyen de STOCKER le saut s'inscrire (où nous venons de), EXIT
signifie que l'emplacement de la mémoire de l'étiquette "SORTIE" est la cible de la banque. EXIT
, nous verrons plus tard est l'étiquette de la dernière instruction. Donc, c'est l'écrasement de code! Mais, de nombreuses instructions (y compris STJ
ici) implicitement remplacer uniquement l'opérande partie de l'instruction word. Si l' JMP
reste intacte, et l' *
est un faux jeton, car il n'y a vraiment rien d'intéressant à y mettre, il n'avait écrasés.
Self-modifying code est également utilisé lorsque inscrivez-adressage indirect n'est pas disponible, et pourtant l'adresse que vous avez besoin est assis juste là dans le registre. PDP-1 LISP:
dap .+1 ;deposit address part of accumulator in (IP+1)
lac xy ;load accumulator with (ADDRESS) [xy is a dummy symbol, just like * above]
Ces deux instructions effectuez ACC := (ACC)
par la modification de l'opérande de l'instruction de chargement.
Des Modifications de ce genre sont relativement à l'abri, et sur les architectures antiques, ils sont nécessaires.