Много лет назад я провел утро, пытаясь отладить некоторый самомодифицирующийся код, одна инструкция изменила целевой адрес следующей инструкции, то есть я вычислял адрес ветвления. Он был написан на ассемблере и отлично работал, когда я выполнял программу по одной инструкции за раз. Но когда я запустил программу, она не удалась. В конце концов, я понял, что машина получает 2 инструкции из памяти и (поскольку инструкции были размещены в памяти) изменяемая мной инструкция уже была получена, и, таким образом, машина выполняла неизмененную (неправильную) версию инструкции. Конечно, когда я отлаживал, он выполнял только одну инструкцию за раз.
Я хочу сказать, что самомодифицирующийся код может быть чрезвычайно неприятным для тестирования / отладки и часто имеет скрытые предположения относительно поведения машины (будь то аппаратная или виртуальная). Более того, система никогда не могла совместно использовать кодовые страницы между различными потоками / процессами, выполняемыми на (теперь) многоядерных машинах. Это сводит на нет многие преимущества виртуальной памяти и т. Д. Это также аннулирует оптимизацию ветвей, выполненную на аппаратном уровне.
(Примечание - я не включаю JIT в категорию самомодифицирующегося кода. JIT переводит из одного представления кода в альтернативное представление, это не модифицирует код)
В общем, это просто плохая идея - действительно изящная, очень непонятная, но очень плохая.
конечно - если все, что у вас есть, это 8080 и ~ 512 байт памяти, вам, возможно, придется прибегнуть к таким методам.