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

标签 low-level

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

考虑以下代码:

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/

相关文章:

c# - 解码 git 对象/"Block length does not match with its complement"错误

linux - 为什么 Linux 不通过 TSS 使用硬件上下文切换?

compiler-construction - 从硬件编写低级语言

c++ - 计算机如何计算平方根?

rust - 在编译位域的Rust并集时获取E0658

windows - 分析 .exe/.dll (Windows PE) 文件中的代码膨胀

assembly - 调用堆栈究竟是如何工作的?

assembly - 如何通过汇编语言直接与硬件交互?

c++ - 有没有可以用来代替脚本的低级语言?

c - c 如何管理与 CPU 字长不同的数据?