linux函数调用中eip esp ebp的作用

本文详细介绍了如何使用C语言编写代码,并通过GCC编译器进行编译,然后使用objdump工具进行反汇编,最后对生成的汇编代码进行深入分析。包括swap函数的实现、内存操作、参数传递及函数调用过程。

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

1.vi main.c编写一个c代码文件

include <stdio.h>
void swap(int *a,int *b)
{
        int tmp=*a;
        *a=*b;
        *b=tmp;
}

int main()
{
        int a,b;
        a=1;
        b=2;
        swap(&a,&b);
}

2.编译

shellby@ubuntu:~/devlop$ gcc -o main main.c 

3.反汇编

shellby@ubuntu:~/devlop$ objdump -D main 

4.分析汇编

080483b4 <swap>:
 80483b4:       55                      push   %ebp            //ebp入栈
 80483b5:       89 e5                   mov    %esp,%ebp       //esp值传给ebp
 80483b7:       83 ec 10                sub    $0x10,%esp      //局部变量tmp 实际只需要4字节 分配了16字节 和优化有关  16字节对齐
 80483ba:       8b 45 08                mov    0x8(%ebp),%eax  //取a的地址
 80483bd:       8b 00                   mov    (%eax),%eax     //取a的值给eax
 80483bf:       89 45 fc                mov    %eax,-0x4(%ebp) //a的值给tmp
 80483c2:       8b 45 0c                mov    0xc(%ebp),%eax  //取b的地址
 80483c5:       8b 10                   mov    (%eax),%edx     //
 80483c7:       8b 45 08                mov    0x8(%ebp),%eax  
 80483ca:       89 10                   mov    %edx,(%eax)
 80483cc:       8b 45 0c                mov    0xc(%ebp),%eax
 80483cf:       8b 55 fc                mov    -0x4(%ebp),%edx
 80483d2:       89 10                   mov    %edx,(%eax)
 80483d4:       c9                      leave                 //等同于 mov %ebp, %esp    pop %ebp
 80483d5:       c3                      ret
和swap类似:
080483d6 <main>:
 80483d6:       55                      push   %ebp
 80483d7:       89 e5                   mov    %esp,%ebp
 80483d9:       83 ec 18                sub    $0x18,%esp
 80483dc:       c7 45 f8 01 00 00 00    movl   $0x1,-0x8(%ebp)   
 80483e3:       c7 45 fc 02 00 00 00    movl   $0x2,-0x4(%ebp)
 80483ea:       8d 45 fc                lea    -0x4(%ebp),%eax
 80483ed:       89 44 24 04             mov    %eax,0x4(%esp)
 80483f1:       8d 45 f8                lea    -0x8(%ebp),%eax
 80483f4:       89 04 24                mov    %eax,(%esp)
 80483f7:       e8 b8 ff ff ff          call   80483b4 <swap>
 80483fc:       c9                      leave
 80483fd:       c3                      ret
 80483fe:       90                      nop
 80483ff:       90                      nop




 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值