в регистры EAX, EBX, ECX, EDX, ESI, EDI
Все регистры заняты, и теперь перед тем, как сделать что-то, нам приходится сохранить регистр = минимум 12 раз = обращения к памяти тоже 12 раз
А теперь представим, что все они в стэке. Тогда обращений к памяти 6 (esp+смещение), регистры сохранять нужно только при входе и выходе, и то по усмотрению
К тому же, обращения распределены по коду - необязательно сразу на старте функции заносить все аргументы функции во все регистры, мы можем для одной части функционала использовать один аргумент = 1 обращение, потом весь функционал, далее ещё одно обращение. Это намного легче для процессора
И не забываем, что перед тем, как занести аргументы перед вызовом функции, регистры могут быть заняты, к примеру в EBX - хэндл, в ESI - ещё что-то, EDI тоже занят,
И что мы делаем? Правильно - ещё раз сохраняем. Это получается уже 18 обращений к стэку
В нормальных функциях, как показывает практика, аргументов не больше 4-5 и так же используются 4-5 регистров для хранения промежуточных результатов. Это легко ложится на все роны. В арме и спарке, как по мне, так ещё меньше.
Ну если нравится сохранять регистры и по сто раз обращаться к памяти - пожалуйста
Ну это если не используют регистры r8 -R15 и хмм 0 - 15 а так дефицита нету вроде если воображение подключить!
Мы сейчас про x86
Соглашения, обычно, не позволяют занять все регистры под аргументы, потому оставшееся просто кладётся на стек, те соглашения о вызовах, что применяют на x86_64 похожи на этакую золотую середину
Обсуждают сегодня