这篇文字解释这个问题:C语言函数调用在汇编语言是怎么实现的?栈模型很好的满足了函数调用的需求,以最简单的函数调用说明。

 :    int add2(int a, int b){return a+b;}
0040B450 push ebp
0040B451 mov ebp,esp
0040B453 sub esp,40h
0040B456 push ebx
0040B457 push esi
0040B458 push edi
0040B459 lea edi,[ebp-40h]
0040B45C mov ecx,10h
0040B461 mov eax,0CCCCCCCCh
0040B466 rep stos dword ptr [edi]
0040B468 mov eax,dword ptr [ebp+]
0040B46B add eax,dword ptr [ebp+0Ch]
0040B46E pop edi
0040B46F pop esi
0040B470 pop ebx
0040B471 mov esp,ebp
0040B473 pop ebp
0040B474 ret --- No source file ---------------------------------------------------------------------------------------------------------------------------------------
0040B76C int
0040B76D int
0040B76E int
0040B76F int
--- e:\项目\000test\testconsole\main.cpp -----------------------------------------------------------------------------------------------------------------
:
: int main(int argc, char **argv){
0040B770 push ebp
0040B771 mov ebp,esp
0040B773 sub esp,4Ch
0040B776 push ebx
0040B777 push esi
0040B778 push edi
0040B779 lea edi,[ebp-4Ch]
0040B77C mov ecx,13h
0040B781 mov eax,0CCCCCCCCh
0040B786 rep stos dword ptr [edi]
:
: int a = ;
0040B788 mov dword ptr [ebp-],0Ah
: int b = ;
0040B78F mov dword ptr [ebp-],14h
: int c = add2(a, b);
0040B796 mov eax,dword ptr [ebp-]
0040B799 push eax
0040B79A mov ecx,dword ptr [ebp-]
0040B79D push ecx
0040B79E call @ILT+(add2) (0040100a)
0040B7A3 add esp,
0040B7A6 mov dword ptr [ebp-0Ch],eax
:
: return c;
0040B7A9 mov eax,dword ptr [ebp-0Ch]
: }
0040B7AC pop edi
0040B7AD pop esi
0040B7AE pop ebx
0040B7AF add esp,4Ch
0040B7B2 cmp ebp,esp
0040B7B4 call __chkesp (0040b6b0)
0040B7B9 mov esp,ebp
0040B7BB pop ebp
0040B7BC ret

44行执行函数调用,过程如下:

(1)参数入栈,从右向左;

(2)CALL指令,注意CALL指令将EIP入栈,并JMP;

(3)初始化ADD函数堆栈,push ebp; mov ebp, esp;sub esp,0x40; push ebx; push esi; push edi; rep stos ptr dword es:[edi].  rep指令表示,执行循环,循环次数放置在ECX寄存器中;stos指令表示,将EAX值放入edi指向的地址,并将edi递增.  在第10行我们看到EAX被设置为0xCCCCCCCC,所以rep stos ptr dword es:[edi]的作用是,将开辟的0x40局部变量空间初始化为0xCC,0xCC是INT 3的汇编指令,目的是防止误执行。

(4)执行ADD指令,结果存放在EAX中;

(5)恢复现场,pop ebx; pop esi; pop edi;

(6)ret,弹出eip;

(7)保持栈平衡,add esp,8;

最新文章

  1. 接口--interface
  2. Sea.js学习2——Sea.js的API 快速参考
  3. C++进阶 面向对象基础(三)
  4. Create a method synchronized without using synchronized keyword
  5. Sina App Engine(SAE)入门教程(6)- memcache使用
  6. MySQL 5.6 解决InnoDB: Error: Table "mysql"."innodb_table_stats" not found.问题
  7. [转]TOMCAT原理以及处理HTTP请求的过程、ContextPath ServletPath
  8. 修改easyui datebox默认日期格式
  9. 使用HttpWebRequest模拟登陆阿里巴巴(alibaba、httpwebrequest、login)
  10. 2.Java集合总结系列:List接口及其实现
  11. 基于封装通用的EF CRUD 的操作
  12. Mysql 的 IF 判断
  13. clCreateBuffer和clCreateBuufer + clEnqueueWriteBuffer
  14. STS 安装SVN插件
  15. linux下PythonQt混编记录
  16. SRM 605 div 2 T3
  17. 使用promisify解决fs的回调地狱问题
  18. common.php
  19. 站在.NET的角度学安卓的草民笔记1
  20. linux系统挂载ISO文件

热门文章

  1. ASP.NET Core分布式项目-3.oauth2与open id connect 对比
  2. linux重启php服务
  3. 关于hashcode 和 equals 的内容总结
  4. 从零开始学ios开发(二):Hello World!
  5. ASP.NET WEB应用程序(.network4.5)MVC Razor视图引擎2 动态数据的呈现
  6. 关于Vue父组件把异步获取的数据传给子组件的问题
  7. UDP及操作系统理论
  8. 用<audio>标签打造一个属于自己的HTML5音乐播放器
  9. 利用PL/SQL从Oracle数据库导出和导入数据
  10. centos根目录扩容,home目录减小容量