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

本文详细解析了一个简单的C++函数从源代码到汇编代码的转换过程,包括栈帧初始化、局部变量压栈、操作数加载、运算执行及结果存储等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开始温习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函数返回,回到上级调用 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值