Теоретически вы можете, согласно Карлу Норуму.Это называется «самоизменяющийся код».
На практике вас обычно останавливает операционная система.Большинство основных современных операционных систем предназначены для проведения различий между «читаемой», «читаемой» и «исполняемой» памятью.Когда ядро ОС такого типа загружает программу, оно помещает код на специальную «исполняемую» страницу, которая помечена только для чтения, чтобы пользовательское приложение не могло ее изменить;в то же время попытка получить адрес, которого нет на «исполняемой» странице, также вызовет исключение ошибки.Это делается в целях безопасности, потому что многие виды вредоносных программ, вирусов и других хаков зависят от того, как программа переходит в измененную память.Например, хакер может передать данные приложения, которые заставляют какую-то функцию записать вредоносный код в стек, а затем запустить его.
Но в глубине души то, что сама операционная система делает для загрузки программы, это именноВы описываете - он загружает код в память, помечает память как исполняемый и переходит в нее.
В мире встроенного оборудования может не быть операционной системы, которая мешает вам, и поэтому некоторые платформы используют ее довольно регулярно.На PlayStation 2 я делал это все время - если бы был какой-то код, который был бы специфичен, скажем, для уровня пустыни, и не использовался нигде больше, я бы не держал его в памяти все время - вместо этого язагружал его вместе с уровнем пустыни и исправлял мои указатели функций на нужный исполняемый файл.Когда пользователь покидает уровень, я выкидываю этот код из памяти, устанавливаю все эти указатели функций на обработчик исключений и загружаю код для следующего уровня в то же пространство.