函数调用汇编

目录

一、核心概念

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

[三、x86 vs x64 区别](#三、x86 vs x64 区别)

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

五、常见问题


一、核心概念

  1. 调用约定 (Calling Convention)

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

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

  2. 栈帧 (Stack Frame)

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

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

  3. 关键寄存器

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

    • ESP: 栈顶指针。

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

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

  1. 调用者 (Caller) 准备参数
cpp 复制代码
push 3        ; 第三个参数(假设从右向左压栈)
push 2        ; 第二个参数
push 1        ; 第一个参数
call my_func  ; 1. 将返回地址压栈 2. 跳转到 my_func
add esp, 12   ; 调用者清理栈(cdecl 约定)
  1. 被调用函数 (Callee) 建立栈帧
cpp 复制代码
my_func:
    push ebp           ; 保存旧基址指针
    mov ebp, esp       ; 新基址指针指向当前栈顶
    sub esp, 8         ; 分配8字节局部变量空间

此时栈结构:

cpp 复制代码
[ebp+12] 参数3
[ebp+8]  参数2
[ebp+4]  参数1
[ebp]    旧EBP
[ebp-4]  局部变量1
[ebp-8]  局部变量2
  1. 函数执行

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

cpp 复制代码
mov eax, [ebp+8]   ; 取第一个参数
mov [ebp-4], eax   ; 存入局部变量1
  1. 函数返回
cpp 复制代码
mov eax, 42        ; 返回值存EAX
mov esp, ebp       ; 恢复ESP到栈帧起点
pop ebp            ; 恢复旧EBP
ret                ; 弹出返回地址,跳回调用者

三、x86 vs x64 区别

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

假设有函数:

cpp 复制代码
int add(int a, int b) {
    return a + b;
}

对应 x86 汇编:

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

调用代码:

cpp 复制代码
push 2
push 3
call add
add esp, 8   ; 清理栈
; 结果在EAX中

五、常见问题

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

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

  3. 寄存器保存 :被调用函数需保存 EBX, ESI, EDI(按约定)。

相关推荐
切糕师学AI1 小时前
ARM 汇编指令:LDR
汇编·arm开发
询问QQ688238861 天前
探索多虚拟电厂联合调度优化模型:集中式算法的实践
汇编
草莓熊Lotso1 天前
C++11 核心特性实战:列表初始化 + 右值引用与移动语义(附完整代码)
java·服务器·开发语言·汇编·c++·人工智能·经验分享
西西弗Sisyphus2 天前
读第三方程序的变量的原理
汇编
西西弗Sisyphus2 天前
一个程序点击事件的汇编指令与解析 - 目标变量的真实虚拟地址 = 逐级解引用并叠加偏移后的结果
汇编
2501_918126913 天前
nes游戏语言是6502,有没有一种方法可以实现,开发另一种更高效的汇编语言,替代6052,并本土化,弯道超过nes的底层语言?
汇编·硬件工程·个人开发
啊森要自信3 天前
【C语言】 C语言文件操作
c语言·开发语言·汇编·stm32·单片机
云qq3 天前
x86操作系统19——键盘驱动
linux·c语言·汇编
_Voosk3 天前
C指针存储字符串为何不能修改内容
c语言·开发语言·汇编·c++·蓝桥杯·操作系统
天途小编3 天前
融合空域相关法规核心条款汇编
汇编·无人机