返回值存储在内存中的哪个位置?
考虑以下代码:
int add(int a, int b) {
int result = a+b;
return result;
}
void main() {
int sum = add(2, 3);
}
当
add(2, 3)
被调用,2个函数参数压栈,栈帧指针压栈,返回地址压栈。然后执行流程跳转到 add(...)
, 并且该函数内的局部变量也存储在堆栈中。当
add(...)
已完成,并执行 return
指令...返回值存储在哪里?怎么样[result]
结束于 [sum]
?
最佳答案
这显然取决于您的硬件架构和编译器。在 64 位 x86 上使用 gcc
,您的代码编译为:
.file "call.c"
.text
.globl add
.type add, @function
add:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
movl %edi, -20(%rbp)
movl %esi, -24(%rbp)
movl -24(%rbp), %eax
movl -20(%rbp), %edx
leal (%rdx,%rax), %eax
movl %eax, -4(%rbp)
movl -4(%rbp), %eax ; return value placed in EAX
leave
ret
.cfi_endproc
.LFE0:
.size add, .-add
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
subq $16, %rsp
movl $3, %esi
movl $2, %edi
call add
movl %eax, -4(%rbp) ; the result of add is stored in sum
leave
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits
在这里,编译器使用 EAX 寄存器来传达
add
的结果。给来电者。您可以在 Wikipedia 中阅读 x86 调用约定。 .
关于low-level - 返回值存储在内存中的哪个位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5472008/