当前位置: 首页 > news >正文

函数调用汇编

目录

一、核心概念

二、函数调用过程(以 x86 cdecl 为例)

三、x86 vs x64 区别

四、示例分析(C代码 → 汇编)

五、常见问题


一、核心概念

  1. 调用约定 (Calling Convention)

    • 规定参数传递顺序(如 cdecl 是右到左)、栈清理责任(调用者或被调用者清理)。

    • 常见约定:cdecl(C默认)、stdcall(Win32 API)、fastcall(寄存器传参)。

  2. 栈帧 (Stack Frame)

    • 每个函数调用时在栈上分配的内存块,保存返回地址、参数、局部变量等。

    • 通过 EBP(基址指针)和 ESP(栈指针)管理。

  3. 关键寄存器

    • EIP: 指向下一条要执行的指令(不可直接修改)。

    • ESP: 栈顶指针。

    • EBP: 基址指针,标记当前栈帧的起点。

二、函数调用过程(以 x86 cdecl 为例)

1. 调用者 (Caller) 准备参数

push 3        ; 第三个参数(假设从右向左压栈)
push 2        ; 第二个参数
push 1        ; 第一个参数
call my_func  ; 1. 将返回地址压栈 2. 跳转到 my_func
add esp, 12   ; 调用者清理栈(cdecl 约定)

2. 被调用函数 (Callee) 建立栈帧

my_func:
    push ebp           ; 保存旧基址指针
    mov ebp, esp       ; 新基址指针指向当前栈顶
    sub esp, 8         ; 分配8字节局部变量空间

此时栈结构:

[ebp+12] 参数3
[ebp+8]  参数2
[ebp+4]  参数1
[ebp]    旧EBP
[ebp-4]  局部变量1
[ebp-8]  局部变量2

3. 函数执行

通过 EBP 偏移访问参数和局部变量:

mov eax, [ebp+8]   ; 取第一个参数
mov [ebp-4], eax   ; 存入局部变量1

4. 函数返回

mov eax, 42        ; 返回值存EAX
mov esp, ebp       ; 恢复ESP到栈帧起点
pop ebp            ; 恢复旧EBP
ret                ; 弹出返回地址,跳回调用者

三、x86 vs x64 区别

四、示例分析(C代码 → 汇编)

假设有函数:

int add(int a, int b) {
    return a + b;
}

对应 x86 汇编:

add:
    push ebp
    mov ebp, esp
    mov eax, [ebp+8]    ; 取a
    add eax, [ebp+12]   ; 加b
    mov esp, ebp
    pop ebp
    ret

调用代码:

push 2
push 3
call add
add esp, 8   ; 清理栈
; 结果在EAX中

五、常见问题

  1. 栈溢出:递归过深或局部变量过大导致栈破坏。

  2. 调用约定不匹配:如误用 stdcall 未清理栈,引发崩溃。

  3. 寄存器保存:被调用函数需保存 EBXESIEDI(按约定)。

相关文章:

  • iPaaS集成平台轻量化架构的重要性
  • xlua 运行原理
  • DoS攻击防范
  • Linux中查询软件存在
  • 迪威 3D 模型发布系统:制造业产品展示革新利器
  • 多源 BFS_多源最短路(十八)542. 01 矩阵 中等 超级源点思想
  • 江科大51单片机笔记【16】AD/DA转换(下)
  • 完美解决ElementUI中树形结构table勾选问题
  • k8s环境部署
  • 算法每日一练 (10)
  • ai智能语音机器人对我们生活有什么影响
  • OpenAI智能体初探:使用 OpenAI Responses API 在 PDF 中实现检索增强生成(RAG)
  • 自然语言处理:文本聚类
  • 202250311-WINDOWS本地4G显存Docker运行vLLM
  • 垂起固定翼+多旋翼+自组网:无人机中低空一体化组网技术详解
  • 平时作业
  • 头歌java课程实验(Java面向对象 - 封装、继承和多态的综合练习)
  • C/C++都有哪些开源的Web框架?
  • 【软件】免费的PDF全文翻译软件,能保留公式图表的样式
  • 鲸鱼算法WOA对风电场风电机组一次二次调频参数进行全局最优辨识,二次调频参数辩识matlab/simulink,也可进一步修改成一次调频参数辩识
  • 天河做网站开发/西安网络优化大的公司
  • quiz在哪个网站做/专业做网站公司
  • 网站公司怎么做运营/网络营销步骤
  • 搜索不到网站的关键词/seo关键词排名优化品牌
  • 顺德公司做网站/新开发的app怎么推广
  • 一个人可以建设几个网站/网络推广怎么做