在 void 函数中的空 return 语句后 %rax 会发生什么?

What happens to %rax after an empty return statement in a void function?

我的理解是,如果 没有 return 语句执行 void 函数,那么 %rax 仍将存储 return 从上一个非空函数。

也就是说,如果:

int a(int param){
    return param;
}

void b(){
}

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

然后在 main 完成执行后但在 returning 之前,%rax 中存储的值将为 5。

我的问题是,如果 b 有一个空的 return 语句会怎样? 也就是说,

void b(){
    return;
}

这会清除 %rax 吗?或者 %rax 是否仍保留其先前的值?

then %rax will still store whatever is returned from the previous non-void function.

不对,你理解错了

当 RAX 不包含 return 值(void 或 FP 函数)时,它是一个调用破坏的寄存器,例如 RCX 或 RSI。阅读调用约定文档或查看编译器输出。

顺便说一句,明确的 return 声明与到达底部的 } 完全无关。 (除了掉落在 non-void 函数的末尾是 UB,一些编译器会将其编译为 ud2 非法指令。)

Then after main finishes execution but before returning, the value stored in %rax will be 5.

即100%的实现细节;编译器可以在函数内使用寄存器做任何它想做的事情,比如使用 RAX 来评估非函数调用表达式。调用约定只是明确了函数之间的界限。