Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
cursos:ensamblador:avanzadas1 [21-01-2024 10:22] – sromero | cursos:ensamblador:avanzadas1 [21-01-2024 10:31] (actual) – [Obtener el valor de PC (Contador de Programa)] sromero | ||
---|---|---|---|
Línea 435: | Línea 435: | ||
\\ | \\ | ||
- | ==== Obtener el valor de PC (Contador de Programa) ==== | + | \\ |
+ | ===== Código Automodificable ===== | ||
+ | |||
+ | Ya vimos en un capítulo anterior un ejemplo de **código automodificable**. Consiste en sobreescribir en memoria un opcode o un dato en función de una condición, para que cuando lleguemos a ese punto del programa, se ejecute el opcode modificado. | ||
+ | |||
+ | En el ejemplo que ya vimos, utilizamos código automodificable para sobreescribir un instrucción de carga " | ||
+ | |||
+ | <code z80> | ||
+ | ld (save_bc+1), | ||
+ | ; opcode "ld bc, NN NN" en memoria | ||
+ | |||
+ | ... hacer cosas con BC, perdiendo su valor ... | ||
+ | |||
+ | save_bc: | ||
+ | ld bc, $0000 ; En el LD anterior cambiamos $000 | ||
+ | ; por el valor de BC, así que cuando | ||
+ | ; el z80 llegue aquí no es ya ld bc, 0 | ||
+ | ; sino ld bc, valor_que_tenia_BC | ||
+ | ; así que recuperaremos BC aquí. | ||
+ | </ | ||
+ | |||
+ | Cuando se ejecuta la instrucción '' | ||
+ | |||
+ | Cuando se ejecuta el '' | ||
+ | |||
+ | La escritura en memoria ('' | ||
+ | |||
+ | Y no sólo podemos modificar datos, también podríamos modificar opcodes, cambiando '' | ||
+ | |||
+ | \\ | ||
+ | ===== Obtener el valor de PC (Contador de Programa) | ||
Utilizando '' | Utilizando '' |