> Да.Ну так то оно наверное может работать, но кажется это будет не бесплатно. При том что это 1 частный случай проблемы, а есть еще более 9000 вариантов как сломать flow софта. Если каждый с пеналти затыкть, в целом получится жуть на уровне дотнета в лучшем случае.
> Верно.
И это испортит оптимизацию, не халявно. Ну вон integer overflow может быть весьма фатален если это массив или указатель. И даже если там код и не выполнится, много с этого радости дохлым водилам тойот?
> На IA32 оно так всегда и было,
И это одна из причин искренне желать ей смерти. Костылищи которые пришлось вбить на уровне железа поражают воображение. Да, там есть "register renaming" и проч, так что реально регистров сильно больше чем вывешено. Однако вывесить как доступное кодеру и компилеру апи было бы, имхо, эффективнее. Во всяком случае в разумных пределах. IA32 являет собой коллекцию костылей и подпорок compat с уродским легаси ABI.
> наверное со времён шестнадцатиразрядного x86 с командами enter+leave.
> В прологе esp копировался в ebp и далее вся работа шла через ebp. Тогда это
> объяснялось, что при адресации через регистр базы опкод получается на байт меньше.
В IA32 было очень много дурных решений. А потом... потом совместимость, и по крупному ее сломать решился только AMD в x86-64. И даже там они зассали это сделать как следует и ограничились какими-то полумерами. Могли бы и лучше, но видимо побоялись участи итаника.
> На деле, подозреваю, компиляторы были не очень, а адресовать через ebp проще - в
> отличие от esp он в теле подпрограммы не меняется. Потом появился
> -fomit-frame-pointer и регистр освободили.
Со временем интель вообще отрастил "виртуальные" регистры, и прямо на уровне железа стал оптимизить ряд операций, так что железо начало делать по факту совсем не то что в коде. Но это такой фееричный костыль на легаси аби во имя совместимости вместо того чтобы уже сделать проц нормально наконец...