Почему аргументы функции помещаются в стек справа налево?
Порядок отправки аргументов функции
- @ Некоторые платформы (ARM и PowerPC) помещают некоторые функции в регистры, и они могут никогда не появиться в стеке. 27.10.2010
Ответы:
Чтобы разрешить существование функций с переменным числом аргументов, таких как printf. Функция может извлечь первые один или два аргумента, а затем использовать их значения для вывода общего количества аргументов в стеке.
Единственная причина заключается в функциях с переменным числом аргументов: первые аргументы, извлеченные из стека, являются «известными» для функции, и по ним она может определить, сколько других аргументов она должна прочитать из стека.
Обратите внимание, что для того, чтобы это работало нормально, в таких соглашениях о вызовах очистка стека предоставляется вызывающей стороне, которая знает, сколько аргументов она поместила в стек. Это немного менее эффективно, чем callee-cleanup, потому что код очистки должен быть написан после каждого вызова функции, в то время как в соглашениях о вызовах, которые не разрешают функции с переменным числом аргументов, он может быть встроен в конец каждой функции.
Кроме этого, особой причины нет, на самом деле существует несколько соглашений о вызовах (например, Pascal , Borland Fastcall), которые не поддерживают функции с переменным числом переменных и перемещают параметры слева направо.