在 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 来评估非函数调用表达式。调用约定只是明确了函数之间的界限。
我的理解是,如果 没有 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 来评估非函数调用表达式。调用约定只是明确了函数之间的界限。