Вызов функции на C в сборку

Если у нас есть следующая функция:

      int func(int n, float f, char* s, double* d);

Вызов функции в Assembly будет так:

      movl <n>, %ecx
movl <s>, %edx
pushl <d>
pushl <f>
call func

Это правильно? Почему именно в таком порядке? Это из-за размера каждого вида?

1 ответ

Для известных аргументов нет веских веских причин для продвижения справа налево или наоборот, так что это просто соглашение, которому нужно следовать.

Для переменных аргументов выгодно протолкнуть их в обратном порядке, потому что вызываемый не знает, сколько аргументов было передано. но первый аргумент находится в известной позиции, то есть сразу после адреса возврата.

Итак, если вы рассмотрите пример :

       printf(FormatString, a1, a2, a3, a4);

Так теперь находится в известной позиции и может легко найти другие параметры в стеке.

Если бы все было наоборот, то вызываемому пользователю нужно было бы получить некоторую дополнительную информацию, чтобы найти первый аргумент, либо указатель, либо счетчик, либо что-то еще, что сообщает ему, где находится строка форматирования.

Другие вопросы по тегам