这显然取决于您的硬件架构和编译器。在使用gcc
64位x86,你的代码编译为:
.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调用约定。
来源
2011-03-29 11:56:24
NPE
已删除标签。这个问题与内存分割无关。 – Lundin 2011-03-29 11:55:42
根据调用约定和优化设置,您可以在堆栈中找到那些参数或寄存器内的参数。 (当然,在你的具体例子中,由于所有的输入都是编译时常量,所以编译器会将所有返回值一起放回去,所以它会直接放到一个带有立即数的单个移动指令中)。 – Damon 2011-03-29 11:56:53
@Lundin - 谢谢,我觉得那是一个可能;这只是本书中有关堆栈参数的一章的名称。 – 2011-03-29 12:31:46