Вызов функции на 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);
Так
Если бы все было наоборот, то вызываемому пользователю нужно было бы получить некоторую дополнительную информацию, чтобы найти первый аргумент, либо указатель, либо счетчик, либо что-то еще, что сообщает ему, где находится строка форматирования.