寄存器传递参数的局限

1.32 位 x86 通用寄存器一共 8 个(EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP);ESP/EBP 专门负责栈管理,一般不拿来传参,实际可用传参寄存器更少
2.上限约束:能塞进寄存器的参数数量很少,参数一多寄存器不够用,必须改用堆栈传参

堆栈传递参数基础概念

1.栈是进程虚拟内存里系统预分配的独立内存区,依靠 ESP 指针管理栈顶
2.多余参数提前用push压入栈内存;函数内部依靠 ESP 加上固定偏移,读取栈里存放的参数
3.统一规则:函数运算结束后,返回值固定放在 EAX

栈传参执行逻辑与示例

需求:写加法函数,两个数字靠栈传递

  1. 主调用端:push 参数(从右往左压参是常规习惯)
start:
push  6        ; 第二个参数
push  4        ; 第一个参数
call  AddStack ; 调用加法函数
add   esp,8    ; 平衡栈,回收两个4字节参数空间
nop

执行 call 时,会额外压入 1 个返回地址(占 4 字节)
2. 函数内部读取栈参数
栈内存布局(进入函数瞬间):
[ESP+0]:CALL 压入的返回地址
[ESP+4]:第一个参数 4
[ESP+8]:第二个参数 6

AddStack:
mov eax, [esp+4]   ; 取第一个参数
add eax, [esp+8]   ; 加上第二个参数,结果存eax
ret                ; 弹出返回地址,回到call下一行

细节

1.偏移计算:进入函数后 ESP 顶部永远是返回地址,第一个参数固定偏移+4,每多一个参数偏移再加 4
2.返回值不变:无论寄存器传参还是栈传参,运算结果都存在 EAX
3.栈平衡:调用结束后主程序add esp,参数总字节数清理参数,防止栈空间堆积溢出;部分调用约定(stdcall)会用ret n由函数自身平衡栈

两种传参对比

寄存器传参:速度快,仅适合少量参数
堆栈传参:无数量上限,参数再多都能放下,是多参数函数主流方案

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐