`
kingj
  • 浏览: 425632 次
  • 性别: 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函数返回,回到上级调用 */

分享到:
评论

相关推荐

    浅析ARM汇编 C语言 C++ 相互调用的方法

    C程序可以通过`extern`声明来调用汇编程序。声明时,形参个数需与汇编程序中实际需要的变量个数一致,参数传递应遵循ATPCS(ARM Thumb Procedure Call Standard)规则。 **示例代码**: **C程序**: ```c #...

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

    - 在C++程序中使用extern "C"来声明C库函数,确保编译器按照C语言的规则进行编译和链接,避免了由于C++对函数名进行名称修饰而导致的链接错误。 3. C++库中包含类的调用: - 如果C++库中含有类,可以在二次接口...

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

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

    vs2010 C/C++ 调用汇编dll

    现在,我们可以创建一个C/C++项目,如`UseDllTest`,用于调用汇编DLL中的函数。在`main.cpp`或其他源文件中,包含刚刚创建的头文件,并调用`addNumbers`: ```cpp #include #include "myasm_dll.h" int main() { ...

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

    这就涉及到如何从C/C++代码调用汇编代码中的函数和变量。下面我们将详细介绍这一过程。 首先,从C/C++中调用汇编代码中的函数。为了使C/C++能够正确识别和链接汇编函数,需要在C/C++代码中使用`extern "C"`关键字...

    visual c++中函数调用方式浅探

    ### Visual C++中函数调用方式浅探 在Visual C++环境下进行软件开发时,了解不同的函数调用约定(calling conventions)对于优化程序性能、理解编译器行为以及避免潜在的错误至关重要。本文将深入探讨Visual C++中...

    C语言中调用汇编程序

    下面我们将详细讨论如何在C语言中调用汇编程序,并通过一个具体的实例来解释这一过程。 首先,我们要理解C语言和汇编语言之间的接口。C语言是一种高级编程语言,而汇编语言则更接近机器代码,可以直接控制处理器的...

    C++虚函数调用机制初探

    本文旨在探讨C++中的虚函数调用机制,通过分析一个简单的示例程序,解释虚函数如何在运行时被正确地调用,并深入剖析这一过程背后的原理。 #### C++中的虚函数调用机制 C++中的虚函数调用机制主要依赖于虚拟表...

    C++汇编x64调用asm文件例子

    通过这种方式,你可以在C++项目中直接集成和调用汇编代码,充分利用x64架构的性能优势。记住,虽然汇编语言能提供更高的控制和效率,但它也更难编写和维护,因此应在必要时谨慎使用。对于大多数情况,优化的C++代码...

    C++程序同汇编程序混合调用的源代码

    外部链接是将汇编代码编译为静态或动态库,然后在C++代码中通过函数调用来使用。内部嵌入则是将汇编代码直接插入到C++源文件中,作为内联汇编来使用。这个案例可能是这两种方法中的某一种,具体要看源代码的实现。 ...

    Visual C++中函数调用方式浅探

    在 C 和 C++ 中,默认的函数调用方式是 C 式调用,也就是 __cdecl。除非特殊声明,否则编译器将使用 C 式调用。在本文中,我们将详细探究 C 式调用和 Pascal 式调用两种函数调用方式的差异。 一、C 式调用(__cdecl...

    关于C和C++中函数的调用约定.doc

    C函数的名字修饰是在函数名前加下划线,而C++函数通常使用更复杂的名字修饰。 2. **__fastcall**:这个约定尝试通过寄存器传递参数以提高效率。通常,前两个DWORD或更小的参数存储在ECX和EDX寄存器中,其余参数按从...

    C/C++函数调用的几种方式总结

    在C/C++编程中,函数调用是程序执行的核心部分,不同的调用约定会影响函数的参数传递和堆栈清理方式。本文将详细讲解C/C++中常见的几种函数调用方式,包括stdcall、cdecl、fastcall、thiscall以及naked call。 1. ...

    通过函数指针调用C++非静态成员函数

    ### 通过函数指针调用C++非静态成员函数 在C++编程中,通过函数指针调用非静态成员函数是一种高级技巧,主要用于实现回调、动态绑定等场景。本文将详细探讨如何在Visual C++ 6.0 (VC6.0) 和Borland C++ Builder 6.0...

    Visual C++中函数调用方式浅探.docx

    在Visual C++中,函数调用方式可以分为两种:C式调用和Pascal式调用。其中,C式调用是缺省的,除非特殊声明。在本文中,我们将详细探讨这两种调用方式的差异和实现过程。 一、C式调用(cdecl) C式调用是Visual ...

    利用反汇编手段解析c语言函数

    本文将详细介绍如何使用反汇编技术来深入解析C语言函数的工作原理,包括函数调用过程中的堆栈动态分配、变量初始化等关键细节。 #### 二、基础知识 在深入探讨之前,我们需要了解一些基础概念: 1. **反汇编**:...

    C++内联汇编示例

    本工程通过一系列示例,展示了如何在C++程序中使用内联汇编来实现函数调用、参数传递、循环以及条件判断。 首先,我们来看"Less1"这个示例。在这个例子中,开发者可能用内联汇编来演示如何手动管理函数调用的过程。...

    汇编用的c语言声明;来自汇编小站

    这种混合编程模式通常需要对汇编语言有深入理解,并且需要熟练掌握C语言的函数调用约定,以便正确地在C和汇编之间传递参数和返回值。 例如,以下是一个简单的示例,展示了如何在C代码中调用汇编函数: ```c #...

    函数调用约定与函数名称修饰规则

    函数调用约定与函数名称修饰规则是编程中至关重要的概念,尤其在使用C/C++时。函数调用约定,也称为调用约定或调用约定协议,规定了函数调用时参数如何入栈、谁负责清理栈以及如何传递返回值。函数名修饰规则则涉及...

Global site tag (gtag.js) - Google Analytics