Языки ассамблеи 1960-х годов использовали самомодифицирующийся код для реализации вызовов функций без стека.
Кнут, v1, 1ed с.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
В большой программе, содержащей эту кодирующую как подпрограмму, то одна команда «СПМ Max100» приведет к регистре A должен быть установлен на ток максимальное значение местоположений X + 1 - X + 100, а положение максимума будет отображаться в rI2. Подпрограмма в этом случае достигается инструкциями «MAX100 STJ EXIT», а затем «EXIT JMP *». Из-за того, как работает J-регистр, инструкция выхода затем переместится в местоположение, следующее за местом, где была сделана исходная ссылка на MAX100.
Edit: Это может быть трудно понять, что происходит, даже с кратким объяснением здесь. В строке MAX100 STJ EXIT
, MAX100
- это метка инструкции (и, следовательно, для процедуры в целом), STJ
означает STORE the jump register (где мы только что пришли от), EXIT
означает, что ячейка памяти с надписью «EXIT» является цели МАГАЗИНА. EXIT
, мы увидим позже ярлык последней инструкции. Так что это переписывающий код! Но многие инструкции (включая STJ
здесь) неявно переписывают только часть операнда слова команды. Таким образом, JMP
остается нетронутым, а *
является фиктивным маркером, так как в нем нет ничего значимого, его можно было бы переписать.
Самомодифицирующийся код также используется, когда регистр косвенной адресации не доступен, и в то же адрес вам нужно сидит прямо там в реестре. 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]
Эти две команды выполняют ACC := (ACC)
путем изменения операнд команды загрузки.
Модификации, подобные этим, относительно безопасны, а для античных архитектур они необходимы .
Black Sunday Hack? – Brian
Вот и все! Благодаря! –
Спасибо, что Зак !!! – Niyaz