Los lenguajes de ensamblaje de la era de los años 60 usaban código de auto-modificación para implementar llamadas a funciones sin una pila.
Knuth, v1, p.182 1ed:
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
En un programa más amplio que contiene esta codificación como una subrutina, la única instrucción "JMP Max100" causaría registro A que se establece en la corriente valor máximo de las ubicaciones X + 1 a X + 100, y la posición del máximo aparecería en rI2. El enlace de subrutina en este caso se logra mediante las instrucciones "MAX100 STJ EXIT" y, más tarde, "EXIT JMP *". Debido a la forma en que funciona el registro J, la instrucción de salida saltará a la ubicación siguiente al lugar donde se hizo la referencia original a MAX100.
Editar: Puede ser difícil ver lo que está pasando, incluso con la breve explicación aquí. En la línea MAX100 STJ EXIT
, MAX100
es una etiqueta para la instrucción (y por lo tanto para el procedimiento en su conjunto), STJ
medios almacenar el registro de salto (en el que acabamos de de), EXIT
significa la posición de memoria etiqueta 'EXIT' es el objetivo de la TIENDA. EXIT
, vemos más adelante es la etiqueta de la última instrucción. ¡Así que está sobrescribiendo el código! Sin embargo, muchas instrucciones (incluido STJ
aquí) sobrescriben implícitamente solo la parte de operando de la palabra de instrucción. Por lo tanto, el JMP
permanece intacto, y el *
es un token ficticio, ya que no tiene nada significativo colocar, solo se sobrescribe.
código mutante también se utiliza en el direccionamiento indirecto por registro no está disponible, y sin embargo la dirección que necesita está sentado allí mismo en el registro. 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]
Estas dos instrucciones realizan ACC := (ACC)
modificando el operando de la instrucción de carga.
Las modificaciones como estas son relativamente seguras, y en las arquitecturas antiguas, son necesarias.
DirectTV's Black Sunday Hack? – Brian
¡Eso es todo! ¡Gracias! –
Gracias por eso Zach !!! – Niyaz