Что происходит с% rax после пустого оператора return в void-функции? - PullRequest
0 голосов
/ 25 марта 2020

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

, если:

int a(int param){
    return param;
}

void b(){
}

int main(){
    a(5);
    b();
    return 1;
}

Затем после того, как main завершит выполнение, но перед возвратом, значение, сохраненное в% rax, будет 5.

Мой вопрос: что произойдет, если b имеет пустой оператор return ? То есть

void b(){
    return;
}

Это очищает% rax? Или% rax все еще сохраняет прежнее значение?

1 Ответ

2 голосов
/ 25 марта 2020

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

Нет, ваше понимание неверно.

Когда RAX нет содержит возвращаемое значение (функции void или FP), это регистр с закрытым вызовом, например, RCX или RSI. Прочитайте документацию по соглашению о вызовах или посмотрите на вывод компилятора.

И, кстати, явный оператор return в сравнении с достижением } внизу совершенно не имеет значения. (За исключением того, что опускание конца функции non - void является UB, и некоторые компиляторы компилируют это в ud2 недопустимую инструкцию.)

Затем после main завершает выполнение, но перед возвратом значение, сохраненное в% rax, будет равно 5.

Это 100% детализация реализации; компилятор может делать все что угодно с регистрами внутри функции, например, использовать RAX для вычисления выражений, не являющихся вызовами функций. Соглашение о вызовах только устанавливает границы между функциями.

...