gpt4 book ai didi

low-level - 返回值存储在内存中的哪个位置?

转载 作者:行者123 更新时间:2023-12-04 22:07:58 27 4
gpt4 key购买 nike

返回值存储在内存中的哪个位置?

考虑以下代码:

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com