汇编——寄存器传参与栈传参
·
寄存器传递参数的局限
1.32 位 x86 通用寄存器一共 8 个(EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP);ESP/EBP 专门负责栈管理,一般不拿来传参,实际可用传参寄存器更少
2.上限约束:能塞进寄存器的参数数量很少,参数一多寄存器不够用,必须改用堆栈传参
堆栈传递参数基础概念
1.栈是进程虚拟内存里系统预分配的独立内存区,依靠 ESP 指针管理栈顶
2.多余参数提前用push压入栈内存;函数内部依靠 ESP 加上固定偏移,读取栈里存放的参数
3.统一规则:函数运算结束后,返回值固定放在 EAX
栈传参执行逻辑与示例
需求:写加法函数,两个数字靠栈传递
- 主调用端: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由函数自身平衡栈
两种传参对比
寄存器传参:速度快,仅适合少量参数
堆栈传参:无数量上限,参数再多都能放下,是多参数函数主流方案
更多推荐

所有评论(0)