тогда% rax будет по-прежнему хранить все, что возвращается из предыдущей не пустой функции.
Нет, ваше понимание неверно.
Когда RAX нет содержит возвращаемое значение (функции void или FP), это регистр с закрытым вызовом, например, RCX или RSI. Прочитайте документацию по соглашению о вызовах или посмотрите на вывод компилятора.
И, кстати, явный оператор return
в сравнении с достижением }
внизу совершенно не имеет значения. (За исключением того, что опускание конца функции non - void
является UB, и некоторые компиляторы компилируют это в ud2
недопустимую инструкцию.)
Затем после main завершает выполнение, но перед возвратом значение, сохраненное в% rax, будет равно 5.
Это 100% детализация реализации; компилятор может делать все что угодно с регистрами внутри функции, например, использовать RAX для вычисления выражений, не являющихся вызовами функций. Соглашение о вызовах только устанавливает границы между функциями.