这篇文字解释这个问题: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]的更多相关文章

  1. u-boot源码汇编段简要分析

    Hi,大家好!我是CrazyCatJack,你们可以叫我CCJ或者疯猫.今天我给大家带来的是u-boot的源代码汇编段分析,以后还会给大家讲解后续的C代码,请持续关注哦^_^ 先简单说一下u-boot ...

  2. GCC 预处理、编译、汇编、链接..

    1简介 GCC 的意思也只是 GNU C Compiler 而已.经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言:它现在还支持 Ada 语言.C++ 语言.Java 语言.Objective ...

  3. GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb ...

  4. Beennan的内嵌汇编指导(译)Brennan's Guide to Inline Assembly

    注:写在前面,这是一篇翻译文章,本人的英文水平很有限,但内嵌汇编是学习操作系统不可少的知识,本人也常去查看这方面的内容,本文是在做mit的jos实验中的一篇关于内嵌汇编的介绍.关于常用的内嵌汇编(AT ...

  5. 从linux0.11中起动部分代码看汇编调用c语言函数

    上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一 ...

  6. C内嵌汇编-格式

    C内嵌汇编-格式: __asm__(汇编语句部分:输出部分:输入部分破坏描述部分);C内嵌汇编以关键字"__asm__"或"asm"开始, 下辖四个部分, 各部 ...

  7. 20145212——GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ...

  8. C程序汇编运行模式简析

    SJTUBEAR 原创作品转载请注明出处 /<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1. 汇编 ...

  9. 生成ARM汇编

    使用ndk即可生成arm汇编 1.首先写好hello.c 2.编写makefile #ndk根目录 NDK_ROOT=E:\Android\android-ndk-r10b #编译器根目录 TOOLC ...

  10. gdb调试汇编堆栈过程的学习

    gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之 ...

随机推荐

  1. hdu 1875 最小生成树 prime版

    最小生成树prime版 大致的步骤 首先选取一个到集合最近的点 然后标记起在集合内部 然后更新最短距离 畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    ...

  2. (六)springmvc之ModelAndView、Model、Map、ModelMap

    <a href="<%=request.getContextPath()%>/responseData/response_1">使用原生的作用域</a ...

  3. bat实现监控进程守护程序-保证平台服务的稳定执行

    背景是平台所在的服务器经常因异常原因导致当前机器所在的服务关闭....直接贴代码吧. ********************************************************* ...

  4. 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). ...

  5. 升级xcode11&ios13的坑

    Swift Packages 目前Pod跟SPM的兼容还没做好,配置好SPM后,Pod不能进行正常更新,先配置好Pod再集成SPM则没有问题 Pod以后的更新可能会解决这个问题,也会有越来越多的库支持 ...

  6. 转: 解决idea工具下tomcat中文乱码问题

    在运行/调试 配置对话框的Startup/Connection面板中, 勾选Pass environment variables. 并添加一个environment variable, Name填 J ...

  7. Oracle创建上下文 SYS_CONTEXT

    Oracle创建上下文 SYS_CONTEXT 1. 系统默认的一些参数 set heading offselect SYS_CONTEXT('USERENV', 'TERMINAL') termin ...

  8. Codeforces 853B Jury Meeting

    题意 从城市1-n来的评审团到城市0商讨国家大事,离开和抵达的那一天不能讨论,飞机均当天抵达,给出所有飞机起飞抵达代价情况,问能否使所有评审员聚齐连续k天并返回,并求最小代价 思路 从前向后扫一遍,求 ...

  9. SPI、I2C、I2S

    1. SPI总线 1.1 基础概念: 技术性能 SPI接口是Motorola 首先提出的全双工三线同步串行外围接口,采用主从模式(Master Slave)架构:支持多slave模式应用,一般仅支持单 ...

  10. PHP获取当前页面地址

    #测试网址:     http://localhost/blog/testurl.php?id=5   //获取域名或主机地址 echo $_SERVER['HTTP_HOST']."< ...