`
kingj
  • 浏览: 421707 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

c,c++函数调用的汇编过程

    博客分类:
  • c
  • c++
 
阅读更多

开始温习C,C++,以前都是看effective c++之类的书籍,对c++原理不甚了解,为了知其所以然,

今天仔细研究了一下一个简单的函数的汇编过程。请各位大侠多指教。

 

 

/* 如下代码使用GUN GCC编译,反汇编如下 */

int main(int argc,char **args)

{

    int a=20;

    int b=30;

    int c=0;

    c=a+b;

    return 0;

}

 

 

004016DD push   %ebp   /*将栈底指针入操作栈,保存main函数的上级调用函数的栈基地址,此处为操作系统调用基地址*/

004016DE mov    %esp,%ebp /* 保存esp指针值,放入到ebp栈底指针中,设置main函数的基地址,以便函数return后返回上级调用基地址 */

004016E0 and    $0xfffffff0,%esp  /* 使栈的地址以16字节对齐  */

004016E3 sub    $0x10,%esp        /* 由于i386架构的栈是向下扩展的,因此,采用esp地址减去16字节,开辟局部变量空间 */

004016E6 call   0x401d44 <__main> /* 调用main函数地址0x401d44 */

004016EB movl   $0x14,0xc(%esp)   /*将变量a=0x14即20这个局部变量push到栈中,其内存地址为0xc */

004016F3 movl   $0x1e,0x8(%esp)   /* 将变量b=0x1e即30这个局部变量push到栈中,内存地址为0x8 */

004016FB movl   $0x0,0x4(%esp)    /* 将变量c=0即0x0push到栈中,内存地址为0x4 */

00401703 mov    0x8(%esp),%eax    /* 将内存地址为0x8的值即30放入eax寄存器 */

00401707 mov    0xc(%esp),%edx    /* 将内存地址为0xc即20放入edx寄存器 */

0040170B add    %edx,%eax         /* 调用add指令将edx,eax值相加,并将结果存入eax寄存器*/

0040170D mov    %eax,0x4(%esp)    /* 将eax寄存器的值放入栈地址为0x4即变量c中,此时0x4地址处的职位50 */

00401711 mov    $0x0,%eax         /* 设置函数返回值为0,linux/Unix下均采用eax寄存器作为函数返回值的寄存器*/

00401716 leave                    /* 该指令将ebp值赋给esp,pop先前栈内的上级函数栈的基地址给ebp,恢复原栈基址 */

00401717 ret                      /* main函数返回,回到上级调用 */

分享到:
评论

相关推荐

    C++虚函数调用的反汇编解析

    C++虚函数调用的反汇编解析

    DSP编程技巧之--从C/C++代码调用汇编代码中的函数与变量

    在C/C++与汇编语言混合编程的情况下,一般我们都会选择C/C++来实现所期待的大部分功能,对于少数和硬件关联度...C/C++与汇编的交互都是从C/C++代码调用汇编代码中的函数与变量,所以在此我们就来看一下这种调用的规则。

    ARM汇编 C语言 C++ 相互调用

    如果对于C++库中含有类的,可以在二次接口函数中生成临时对象来调用对应的功能函数,当然要根据实际情况来定了。

    C++内联汇编示例

    工程主要时C++内联汇编的示例,内部简单的用汇编实现了函数传参及调用,循环以及if语句的实现

    深入C++虚表(虚函数 虚表 反汇编)

    许多C++语言的教材对于虚函数的使用以及调用机制有着详细的阐述,但是对于虚表的一些细节内容阐述却并不是很深,对于虚表我们可能会有很多疑问。本文就试图通过使用汇编语言对于虚表实现的细节进行分析,从而加深对...

    C 与 C++ 接口函数相互调用的实现

    在该过程中,所有函数的名称都会被转换成一个符号作为汇编文件中的唯一标识,对 C 语言函数一般直接用函数名称作为其唯一标识的符号,而对于 C++ 函数在多数情况下需要在函数名称加上各种前缀或后缀才能作为其标识,...

    VC++与汇编语言的混合编程

    在Turbo C++或Borland C++编程环境下,我们可TCC或BCC行命令把一个C语言的源程序转换成汇编语言的源程序。通过阅读汇编语言程序可以很准确地知道C语言语句的功能是如何实现的。 C语言源程序转换的命令格式如下: TCC...

    从汇编看c++中默认构造函数的使用分析

    ebp为一个寄存器,总是指向一个函数调用堆栈的栈底,作为基址,用偏移量来访问该调用栈上的变量,但这里没有任何变量要访问,因此不起作用 mov ebp, esp;这两句的作用是为了保存调用main之前堆栈的基址ebp的值,并...

    实例分析C++的虚表的查看,使用,调用虚函数

    用c++类的实例解析虚函数表,查看虚表的地址,利用虚函数表中的地址调用虚函数实现C++中的多态特性, 此例是解析虚函数中简单易于理解的示例,重要的地方具有详细的注释。亲测可用,若有不清除的地方,可以留言,...

    从汇编看c++函数的默认参数的使用说明

    在c++中,可以为函数提供默认参数,这样,在调用函数的时候,如果不提供参数,编译器将为函数提供参数的默认值。下面从汇编看其原理。 下面是c++源码: 代码如下:int add(int a = 1, int b = 2) {//参数a b有默认值 ...

    特殊的C++笔试题,非常不错的

    如果C++调用C,如fun(),则调用名就不是C的翻译结果_fun, 而是带有参数信息的一个名字,因此就不能调用到fun(),为了解决这个问题,加上extern "C"表示该函数的调用规则是C的规则,则调用时就不使用C++规则的带有...

    从汇编看c++中引用与指针的使用分析

    首先是引用情形下的c++源码: 代码如下:void add(int a, int b, int&c) { c = a + b;} int main() { int a = 1; int b = 2;... 为该调用函数的栈空间预留12byte,用来存储局部变量a,b, c ; 7 : 

    从汇编看c++函数的默认参数

    在c++中,可以为函数提供默认参数,这样,在调用函数的时候,如果不提供参数,编译器将为函数提供参数的默认值。下面从汇编看其原理。  下面是c++源码: int add(int a = 1, int b = 2) {//参数a b有默认值 ...

    一种TI 5000系列DSP C/C++语言和汇编语言混合编程的方法

    摘 要:首先介绍并比较了TI5000系列DSP的三种主要软件开发方法的优缺点,提出了C/C++与汇编语言混合编程方法的优越性所在。之后在比较了几种典型混合编程方法的基础上,提出了一种结构化的混合编程方法并详细阐述了...

    C++复习资料之系列

    在一个C++程序中,main函数的位置( c )。 (a) 必须在程序的开头 (b) 必须在程序的后面 ( c ) 可以在程序的任何地方 (d) 必须在其它函数中间 2.用C++语言编制的源程序要变为目标程序必须要经过( d )。 (a) ...

    易语言5.1测试版补丁破解+升级包+调用LIB的例子

     支持静态链接其它编程语言(如C/C++、汇编等)编译生成的静态库(.LIB或.OBJ),但仅限于COFF格式,支持cdecl和stdcall两种函数调用约定。  使用说明如下:函数声明和调用方法与DLL命令一致;“库文件名”以....

    单片机与DSP中的一种TI 5000系列DSP C/C++语言和汇编语言混合编程的方法

    摘 要:首先介绍并比较了 TI 5000 系列DSP的三种主要软件开发方法的优缺点,提出了C/C++与汇编语言混合编程方法的优越性所在。之后在比较了几种典型混合编程方法的基础上,提出了一种结构化的混合编程方法并详细...

    浅析C++类的底层实现

    如果你不了解C++类的实现机制,不知道底层如何调用构造函数,静态变量,虚函数的底层等等关于C++类的底层实现,请一定要阅读本文档,因为他会让你豁然开朗。

    eWOW64Ext v1.1 - 加载任意 32/64 模块|动态调用|64 位汇编|64 位进程读写

    也就是:wow 环境 -&gt; 进入 x64 环境 -&gt; x64 函数调用 或 x64 汇编代码 -&gt; 退出 x64 环境 -&gt; wow 环境,以上必须在一个子程序内完成;部分实现代码借鉴 c++ 开源代码:wow64ext,在此感谢作者 rewolf。

    基于TMS320C62X DSP的混合编程研究

    在编写C代码的过程中调用内联函数,TMS320C62X中有一些直接映射为内联的C6000指令的特殊函数,内联函数用前下划线(_)表示,使用时同调用C语言的库函数一样调用它,如b=_nassert(N&gt;=10);汇编代码以C代码可以调用的函数...

Global site tag (gtag.js) - Google Analytics