开始温习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程序可以通过`extern`声明来调用汇编程序。声明时,形参个数需与汇编程序中实际需要的变量个数一致,参数传递应遵循ATPCS(ARM Thumb Procedure Call Standard)规则。 **示例代码**: **C程序**: ```c #...
- 在C++程序中使用extern "C"来声明C库函数,确保编译器按照C语言的规则进行编译和链接,避免了由于C++对函数名进行名称修饰而导致的链接错误。 3. C++库中包含类的调用: - 如果C++库中含有类,可以在二次接口...
C++虚函数调用的反汇编解析
现在,我们可以创建一个C/C++项目,如`UseDllTest`,用于调用汇编DLL中的函数。在`main.cpp`或其他源文件中,包含刚刚创建的头文件,并调用`addNumbers`: ```cpp #include #include "myasm_dll.h" int main() { ...
这就涉及到如何从C/C++代码调用汇编代码中的函数和变量。下面我们将详细介绍这一过程。 首先,从C/C++中调用汇编代码中的函数。为了使C/C++能够正确识别和链接汇编函数,需要在C/C++代码中使用`extern "C"`关键字...
### Visual C++中函数调用方式浅探 在Visual C++环境下进行软件开发时,了解不同的函数调用约定(calling conventions)对于优化程序性能、理解编译器行为以及避免潜在的错误至关重要。本文将深入探讨Visual C++中...
下面我们将详细讨论如何在C语言中调用汇编程序,并通过一个具体的实例来解释这一过程。 首先,我们要理解C语言和汇编语言之间的接口。C语言是一种高级编程语言,而汇编语言则更接近机器代码,可以直接控制处理器的...
本文旨在探讨C++中的虚函数调用机制,通过分析一个简单的示例程序,解释虚函数如何在运行时被正确地调用,并深入剖析这一过程背后的原理。 #### C++中的虚函数调用机制 C++中的虚函数调用机制主要依赖于虚拟表...
通过这种方式,你可以在C++项目中直接集成和调用汇编代码,充分利用x64架构的性能优势。记住,虽然汇编语言能提供更高的控制和效率,但它也更难编写和维护,因此应在必要时谨慎使用。对于大多数情况,优化的C++代码...
在 C 和 C++ 中,默认的函数调用方式是 C 式调用,也就是 __cdecl。除非特殊声明,否则编译器将使用 C 式调用。在本文中,我们将详细探究 C 式调用和 Pascal 式调用两种函数调用方式的差异。 一、C 式调用(__cdecl...
外部链接是将汇编代码编译为静态或动态库,然后在C++代码中通过函数调用来使用。内部嵌入则是将汇编代码直接插入到C++源文件中,作为内联汇编来使用。这个案例可能是这两种方法中的某一种,具体要看源代码的实现。 ...
C函数的名字修饰是在函数名前加下划线,而C++函数通常使用更复杂的名字修饰。 2. **__fastcall**:这个约定尝试通过寄存器传递参数以提高效率。通常,前两个DWORD或更小的参数存储在ECX和EDX寄存器中,其余参数按从...
在C/C++编程中,函数调用是程序执行的核心部分,不同的调用约定会影响函数的参数传递和堆栈清理方式。本文将详细讲解C/C++中常见的几种函数调用方式,包括stdcall、cdecl、fastcall、thiscall以及naked call。 1. ...
### 通过函数指针调用C++非静态成员函数 在C++编程中,通过函数指针调用非静态成员函数是一种高级技巧,主要用于实现回调、动态绑定等场景。本文将详细探讨如何在Visual C++ 6.0 (VC6.0) 和Borland C++ Builder 6.0...
在Visual C++中,函数调用方式可以分为两种:C式调用和Pascal式调用。其中,C式调用是缺省的,除非特殊声明。在本文中,我们将详细探讨这两种调用方式的差异和实现过程。 一、C式调用(cdecl) C式调用是Visual ...
本文将详细介绍如何使用反汇编技术来深入解析C语言函数的工作原理,包括函数调用过程中的堆栈动态分配、变量初始化等关键细节。 #### 二、基础知识 在深入探讨之前,我们需要了解一些基础概念: 1. **反汇编**:...
本工程通过一系列示例,展示了如何在C++程序中使用内联汇编来实现函数调用、参数传递、循环以及条件判断。 首先,我们来看"Less1"这个示例。在这个例子中,开发者可能用内联汇编来演示如何手动管理函数调用的过程。...
这种混合编程模式通常需要对汇编语言有深入理解,并且需要熟练掌握C语言的函数调用约定,以便正确地在C和汇编之间传递参数和返回值。 例如,以下是一个简单的示例,展示了如何在C代码中调用汇编函数: ```c #...
函数调用约定与函数名称修饰规则是编程中至关重要的概念,尤其在使用C/C++时。函数调用约定,也称为调用约定或调用约定协议,规定了函数调用时参数如何入栈、谁负责清理栈以及如何传递返回值。函数名修饰规则则涉及...