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

经验分享 程序员 微信小程序 职场和发展