x86-64汇编中函数调用如何返回值?以foo函数为例解析
x86-64下函数返回值%rax寄存器的原理说明
补全foo的汇编定义
按照x86-64的System V调用约定,foo函数的汇编实现如下:
foo: movq %rdi, %rax ; 将第一个参数x(存在%rdi)移入%rax寄存器 addq %rsi, %rax ; 把第二个参数y(存在%rsi)加到%rax,结果存于%rax ret ; 返回到调用者,此时%rax中就是x+y的结果
%rax的使用说明
在foo的汇编代码里,%rax是核心的结果存储寄存器:
- 第一步将第一个参数从%rdi拷贝到%rax,作为加法的初始值;
- 第二步执行加法操作,把%rsi里的第二个参数加到%rax中,最终的求和结果直接保存在%rax里;
- 执行
ret指令返回时,%rax里的值会被保留,供调用者读取。
返回值传递机制解释
x86-64平台遵循System V AMD64调用约定,这个约定明确了整数、指针类型的函数返回值必须通过%rax寄存器传递:
- 被调用函数(比如这里的
foo)完成计算后,必须把最终结果写入%rax寄存器; - 当
ret指令执行,程序控制权回到调用者后,调用者无需额外内存读取操作,直接读取%rax寄存器就能拿到函数返回值; - 这是平台统一的规范,编译器、手写汇编都遵循这个规则,确保调用者和被调用者之间能正确传递返回值,避免交互错误。
内容的提问来源于stack exchange,提问作者chez93
相关产品推荐
相关产品推荐

