Как передаются аргументы функции в языке Си?


Единственное, что я знаю о механизме передачи значений C, это то, что это делается либо через регистр, либо через стек.

Регистр или стек? Но как именно?

2 5

2 ответа:

Оба. И соглашения будут варьироваться в зависимости от платформы.

На x86 значения обычно передаются стеком. На x64 предпочтительнее пройти мимо регистра.

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

См. x86 соглашения о вызовах

Обычно (некоторые компиляторы делают это по-другому, как указано выше) для обычных вызовов функций они передаются в стек. То есть обычно это серия push-инструкций, которые просто помещают данные в стек.

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

На архитектурах с большое количество регистров они обычно передаются через регистры, такие как некоторые RISC и 64-битные архитектуры.