C возвращает хранилище значений во фрейме стека

#c #stack #callstack #function-call

#c #стек #callstack #вызов функции

Вопрос:

 int f(int a, int b){
    return a b;
}

int main(){
    f(1,2);
}
  

В этом примере при вызове функции f отсутствует конкретная переменная, хранящая результат сложения a и b . Мой вопрос: где a b будет сохранен результат?

Комментарии:

1. В типичном ABI int оно будет возвращено в регистр процессора. Для больших возвращаемых типов, которые не помещаются в регистр, фактически существует скрытый void* параметр памяти, предоставляемый вызывающим объектом; функция помещает возвращаемое значение в эту память. Для получения подробной информации обратитесь к документации вашего компилятора — точный механизм зависит от реализации.

2. Ответ здесь варьируется в зависимости от компилятора и операционной системы. Стандарт C не предъявляет особых требований.

Ответ №1:

оно будет перемещено во временные регистры.
он загрузит значения, затем вызовет f(int,int) посмотрите на разборку: введите описание изображения здесь

Комментарии:

1. Спасибо, я новичок в этом, какой инструмент вы используете для отображения кода дизассемблирования?

2. Вы можете использовать compiler Explorer (godbolt), он бесплатный и доступен онлайн