Как передаются аргументы функции в языке Си?
Единственное, что я знаю о механизме передачи значений C, это то, что это делается либо через регистр, либо через стек.
Регистр или стек? Но как именно?
2 ответа:
Оба. И соглашения будут варьироваться в зависимости от платформы.
На x86 значения обычно передаются стеком. На x64 предпочтительнее пройти мимо регистра.
Во всех случаях, если у вас слишком много параметров, некоторые из них должны быть переданы стеком.
Обычно (некоторые компиляторы делают это по-другому, как указано выше) для обычных вызовов функций они передаются в стек. То есть обычно это серия push-инструкций, которые просто помещают данные в стек.
Существуют особые случаи, такие как системные вызовы, когда параметры передаются через инструкции сборки и регистры. В аппаратных случаях они передаются через регистры или даже определенные сигналы прерывания, которые впоследствии записываются в регистры.
На архитектурах с большое количество регистров они обычно передаются через регистры, такие как некоторые RISC и 64-битные архитектуры.