C到汇编[1]
这篇文字解释这个问题: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;

C到汇编[1]的更多相关文章
- u-boot源码汇编段简要分析
		Hi,大家好!我是CrazyCatJack,你们可以叫我CCJ或者疯猫.今天我给大家带来的是u-boot的源代码汇编段分析,以后还会给大家讲解后续的C代码,请持续关注哦^_^ 先简单说一下u-boot ... 
- GCC 预处理、编译、汇编、链接..
		1简介 GCC 的意思也只是 GNU C Compiler 而已.经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言:它现在还支持 Ada 语言.C++ 语言.Java 语言.Objective ... 
- GDB调试汇编堆栈过程分析
		GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb ... 
- Beennan的内嵌汇编指导(译)Brennan's Guide to Inline Assembly
		注:写在前面,这是一篇翻译文章,本人的英文水平很有限,但内嵌汇编是学习操作系统不可少的知识,本人也常去查看这方面的内容,本文是在做mit的jos实验中的一篇关于内嵌汇编的介绍.关于常用的内嵌汇编(AT ... 
- 从linux0.11中起动部分代码看汇编调用c语言函数
		上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一 ... 
- C内嵌汇编-格式
		C内嵌汇编-格式: __asm__(汇编语句部分:输出部分:输入部分破坏描述部分);C内嵌汇编以关键字"__asm__"或"asm"开始, 下辖四个部分, 各部 ... 
- 20145212——GDB调试汇编堆栈过程分析
		GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ... 
- C程序汇编运行模式简析
		SJTUBEAR 原创作品转载请注明出处 /<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1. 汇编 ... 
- 生成ARM汇编
		使用ndk即可生成arm汇编 1.首先写好hello.c 2.编写makefile #ndk根目录 NDK_ROOT=E:\Android\android-ndk-r10b #编译器根目录 TOOLC ... 
- gdb调试汇编堆栈过程的学习
		gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之 ... 
随机推荐
- hdu 1875 最小生成树 prime版
			最小生成树prime版 大致的步骤 首先选取一个到集合最近的点 然后标记起在集合内部 然后更新最短距离 畅通工程再续 Time Limit: 2000/1000 MS (Java/Others) ... 
- (六)springmvc之ModelAndView、Model、Map、ModelMap
			<a href="<%=request.getContextPath()%>/responseData/response_1">使用原生的作用域</a ... 
- bat实现监控进程守护程序-保证平台服务的稳定执行
			背景是平台所在的服务器经常因异常原因导致当前机器所在的服务关闭....直接贴代码吧. ********************************************************* ... 
- leetcode-62. Unique Paths · DP + vector
			题面 A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). ... 
- 升级xcode11&ios13的坑
			Swift Packages 目前Pod跟SPM的兼容还没做好,配置好SPM后,Pod不能进行正常更新,先配置好Pod再集成SPM则没有问题 Pod以后的更新可能会解决这个问题,也会有越来越多的库支持 ... 
- 转: 解决idea工具下tomcat中文乱码问题
			在运行/调试 配置对话框的Startup/Connection面板中, 勾选Pass environment variables. 并添加一个environment variable, Name填 J ... 
- Oracle创建上下文 SYS_CONTEXT
			Oracle创建上下文 SYS_CONTEXT 1. 系统默认的一些参数 set heading offselect SYS_CONTEXT('USERENV', 'TERMINAL') termin ... 
- Codeforces 853B Jury Meeting
			题意 从城市1-n来的评审团到城市0商讨国家大事,离开和抵达的那一天不能讨论,飞机均当天抵达,给出所有飞机起飞抵达代价情况,问能否使所有评审员聚齐连续k天并返回,并求最小代价 思路 从前向后扫一遍,求 ... 
- SPI、I2C、I2S
			1. SPI总线 1.1 基础概念: 技术性能 SPI接口是Motorola 首先提出的全双工三线同步串行外围接口,采用主从模式(Master Slave)架构:支持多slave模式应用,一般仅支持单 ... 
- PHP获取当前页面地址
			#测试网址: http://localhost/blog/testurl.php?id=5 //获取域名或主机地址 echo $_SERVER['HTTP_HOST']."< ... 
