Ну закинул я в стэк параметры для функции, функция же ищет эти параметры в регистрах, а параметры в стэке - функция работать не будет нормально ... Так что, путаница получается какая-то...
Именно вызываемая функция определяет, как именно ты передашь параметры. Если она хочет через стек, ты будешь пихать в стек. Захочет в регистрах — будешь пихать в регистры. Это не взаимозаменяемые методы. Есть общепринятые соглашения, где, как и в каком порядке пихать. Большинство функций, с которыми ты столкнёшься, им следуют.
Zen3 тоже push медленнее, чем sub+mov AMD K7 тоже самое Так что можно даже сказать, что если ориентируешься на новые процессоры - нужно использовать sub+mov
Кстати, на днях видел, как GCC тоже сделал mov [esp] (O3)
"Ядро при загрузке обычно имеет вид файла-образа, сжатого в формат zImage или bzImage с помощью zlib. В нём содержится головная программа, которая проводит минимальную настройку оборудования"
В большинстве случаев, размер стекфрейма функции известен заранее, за счёт чего можно сразу знать на сколько двигать esp ну и фрем поинтер тоже можно выкинуть, но на 16 битах его не особо выкинешь, либо весь код будет из префиксов