По поводу самомодифицирующегося кода (я упомянул выше про ограниченные команды i/o): был процессор (DSP), в котором у команд in/out простой до неприличия синтаксис: cmd addr, где addr - 16-бит int. Все. Ни тебе косвенной адресации, ничего. Только константный адрес, который ессесно был следующим словом после кода самой команды в памяти программ.
Конечно, разработчики предполагали, что на шине ввода/вывода будет ряд устройств со своими регистрами по определенным адресам, и все будет ок. Хрен! Вот понадобилось нам туда подключить а) устройства со мноооожеством регистров (больше сотни) б) ОЗУ (да, извращение, но что делать) в) EEPROM и т.п. Скорость обращения к данному пространству не очень важна, но блин. Для обращения к памяти в 64к, повешенной на i/o надо ровно 64к памяти программ (типа in 0x0000; in 0x0001 и т.д.).
Архитектура гарвардская. Флэш можно перепрограммировать теоретически без программатора следующим образом: загружаем в бут-память (2к слов) нечто через SPI (SPI соединяем в первом приближении с SCI). Переключаем флэш-память программ на бут (все 64к памяти программ недоступны для исполнения, исполняются только 2к бут-памяти). Появляются команды модифицирования массива flash- памяти программ. Модифицируем память программ в части адресов команд in/out (там флэш-массив модифицируется только блоками по 256 слов, а стирается/очищается еще более крупными вроде бы). Акробатический трюк - обратное переключение с сохранением всех регистров.... Вообщем крутизна.
И тут вспоминаем про то, что в данном процессоре маленькая часть ОЗУ (256 слов) умеет быть как памятью данных, так и памятью программ (но одновременно - только одним типом). Видимо, разработчики процессора тоже о чем-то думали. Дальше - просто - в эту память в режиме данных копируем функцию чтения порта. Потом меняем определенное слово, соотв. адресу порта. Потом - переключаем ее на работу как память программ и CALL our_magic_io_fn. Медленно, конечно, но работоспособно.
А больше и не припомню случаев, когда был реально нужен самомодифицирующийся код. Может быть кто-то что-то напишет на эту тему? Спектрум вроде распологал к тому, чтобы программировать виртуозно, да и программисты тогда были не сплошь академические и "правильные" (как я).
Для справки: описываемый проц - TMS320LF2407A (ну вся семейка TMS320xF24XX) фирмы Texas Instruments. Очень своеобразный проц, возможно это связано с тем, что само ядро (TMS320) - разработки начала 90-х если не 80-х. Одна система прерываний чего стоит! Однако по стабильности и надежности - не припомню более надежного. За более чем 7 лет работы с ним - ни одного случая зависания/сброса/сбоя/ошибки вычислений по вине железа (а работал он в очень жестких условиях по ЭМИ, да и по питанию тоже иногда). Вот что значит отлаженное ядро. Да и errata всего-то странички 2-3, причем в начещественных вещах.




).
Ответить с цитированием