函数调用
函数调用 |
函数调用,计算机编译或运行时,使用某个函数来完成相关命令。对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数、变量或其它构造类型数据及表达式。各实参之间用逗号分隔。
目录
简介
在程序中通过对函数的调用来执行函数体,其过程与其它语言的子程序调用相似。
C语言中,函数调用的一般形式为:
函数名(实际参数表)
对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数、变量或其它构造类型数据及表达式。各实参之间用逗号分隔。
用户空间 操作系统的进程空间可分为用户空间和内核空间,它们需要不同的执行权限。其中函数调用运行在用户空间。
评价
指针寄存器 EBP
EBP是所谓的帧指针,指向当前活动记录的上方(上一个活动记录的最下方)
ESP
ESP是所谓的栈指针,指向当前活动记录的最下方(下一个将要插入的活动记录的最上方)
这两个指针的值规定了当前活动记录的位置
参数传递 将函数参数压栈:mov eax,dword ptr [n] ;(n为参数变元)
push eax
操作 函数调用将执行如下操作:
⒈将帧指针压入栈中:push ebp
⒉使得帧指针等于栈指针:mov ebp,esp
⒊使栈指针自减,自减得到的内存地址应当能够(足够)用来存储被调用函数的本地状态:sub esp,0CCh
注意:0CCh为0xCC,随着具体函数的不同而不同。
传入保存状态 push ebx ;保存ebx寄存器的值
push esi ;保存esi寄存器的值
push edi ;保存edi寄存器的值
装入edi lea edi,[ebp-0CCh] ;0cch是当前活动记录的大小。
EDI是目的变址寄存器。
恢复传入的保存状态 00411417 pop edi
00411418 pop esi
pop ebx
栈指针上移,恢复空间 add esp,0CCh
函数返回释放空间 当函数返回时,编译器和硬件将执行如下操作:
⒈使栈指针等于帧指针: mov esp,ebp
⒉从栈中将旧的帧指针弹出: pop ebp
⒊返回:ret[1]