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