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调试器: 进入之 ...
随机推荐
- java——值传递和引用传递
值传递 在方法被调用时,实参通过形参把它的内容副本传入方法内部,此时形参接收到的内容是实参值的一个拷贝,因此在方法内对形参的任何操作,都仅仅是对这个副本的操作,不影响原始值的内容. 先来看个例子: p ...
- 原生js分页器插件
window.page = function page(ele, para) { this.ele = document.querySelector(ele); this.options = { co ...
- ASM实例远程连接
存在一个软件,远程连接ASM实例 tj2:/picclife/app/grid$ lsnrctl status Listening Endpoints Summary... (DESCRIPTION= ...
- (六)maven之常用插件
一.maven的插件 maven官方插件:http://maven.apache.org/plugins/index.html 二.常用插件之:javadoc 作用:生成代码文档 2.1 编写代码,并 ...
- SQL优化中的重要概念:死锁
原文:SQL优化中的重要概念:死锁 上面几篇文章讲到 事务.锁定.阻塞,最后还有一种比较极端的情况,就是死锁,这也是锁定.阻塞的一种情况. 死锁是当两个事务分别锁定了资源,而又继续请求对方已获取的资源 ...
- AngularJS视图 ng-view
AngularJS支持通过在单个页面上的多个视图的单页应用.要做到这一点AngularJS提供ng-view 和 ng-template指令,以及 $routeProvider 服务. ng-view ...
- Map集合中key不存在时使用toString()方法、valueOf()方法和强制转换((String))之间的区别
1.toString()方法 底层代码 public String toString() { return this; } 其返回值为String类型的字符串本身 Map<String, Obj ...
- Zuul + Ribbon 脱离Eureka完成负载均衡+重试机制
Zuul + Ribbon 脱离Eureka完成负载均衡+重试机制 因为没有注册中心,所以需要网关对下游服务做负载均衡,然后果断集成Ribbon.中间遇到很多坑,最后终于解决了. 其实Ribbon里面 ...
- 关于H5的一些相关基础知识
HTML只是简写全写是(Hyper Text Markup Language)表示的是:超文本标记语言; HTML5表示的是html的第5次重大修改的第5个版本,(而html5是W3C和WHATWG ...
- Python TCP通信之仿文件下载
TCP_文件下载_Client.py import socket def main(): # 创建TCP套接字 tcp_socket = socket.socket(socket.AF_INET, s ...