## 一、C函数定义 [TOC] * 栗子 ```c 返回类型 函数名(参数列表) { return; } int plus(int「参数类型」 x「参数名」,int y){ return x+y; } ``` * 数据宽度 ```c int //4字节 short //2字节 char //1字节 ``` ## 二、参数 * 参数是以堆栈形式传输 * 参数是从右向左 ### 2.1、例子 ```c int plus(int x, int y) { return x + y; } int main() { plus(1, 2); return 0; } ``` ```x86asm main函数: # 传参 push 2 push 1 call plus # 调用函数 add esp,8 # 外平栈 puls函数: # 提升堆栈 push ebp # 将ebp「栈底」存进去,便于返回 mov ebp,esp # 将ebp「栈底」同步至esp「栈顶」 sub esp,40h # 将esp「栈顶」减少40h 提升之后的40h就是缓冲区 # 保存当前寄存器状态 push ebx push esi push edi # 将缓冲区添CC lea edi,[ebp-40h] # 设置串复制地址 mov ecx,10h # ecx「计数器」设置stos计数器次数 mov eax,0CCCCCCCCh # 设置填充内容 rep stos dword ptr [edi] # stos指令,将EAX的值存入内存 # 执行return x + y; mov eax,dword ptr [ebp+8] add eax,dword ptr [ebp+0Ch] # 返回值存放在eax寄存器中 # 恢复寄存器状态 pop edi pop esi pop edx # 恢复ebp状态 mov esp,ebp pop ebp #返回函数 ret ```   ## 三、返回值 * C语言中,返回值存在EAX寄存器中 * 使用返回值时 ```c int plus(int x, int y) { int z = x + y return z; } int main() { int x; x = plus(1, 2); return 0; } ``` ```x86asm # main函数 push 2 push 1 call plus add esp,8 mov dword ptr [ebp-4], eax # 将plus返回存入局部变量中 ...... ``` ## 四、函数调用时堆栈的分配 