函数单独编译与函数在main函数中调用编译后生成汇编代码对比

     前几天上信息安全课,简单的把课上内容复习下.主要讲单个函数编译后生成汇编代码地址  与  函数在main函数中调用后生成汇编地址的区别

int accum = 0;

int sum(int x, int y)
{
    int t = x + y;
    accum += t;
    return t;
}


code.c文件代码如上所示,

输入命令gcc -o1 -c code.c

生成code.o文件,再输入命令objdump -d code.o进行查看(我的生成默认的1 objdump -d 1)

00000000 <sum>:
   0:    55                            push   %ebp
   1:    89 e5                      mov    %esp,%ebp
   3:    83 ec 10                 sub    $0x10,%esp
   6:    8b 45 0c                 mov    0xc(%ebp),%eax
   9:    8b 55 08                 mov    0x8(%ebp),%edx
   c:    01 d0                       add    %edx,%eax
   e:    89 45 fc                   mov    %eax,-0x4(%ebp)
  11:    a1 00 00 00 00     mov    0x0,%eax
  16:    03 45 fc                  add    -0x4(%ebp),%eax
  19:    a3 00 00 00 00     mov    %eax,0x0
  1e:    8b 45 fc                  mov    -0x4(%ebp),%eax
  21:    c9                            leave  
  22:    c3                            ret

main.c

int main()

{

    return sum(1, 3);


输入命令gcc -o1 -o obj code.o main.c

生成汇编代码如下

080483b4 <sum>:
 80483b4:    55                           push   %ebp
 80483b5:    89 e5                     mov    %esp,%ebp
 80483b7:    83 ec 10                sub    $0x10,%esp
 80483ba:    8b 45 0c                mov    0xc(%ebp),%eax
 80483bd:    8b 55 08                mov    0x8(%ebp),%edx
 80483c0:    01 d0                      add    %edx,%eax
 80483c2:    89 45 fc                  mov    %eax,-0x4(%ebp)
 80483c5:    a1 18 a0 04 08     mov    0x804a018,%eax
 80483ca:    03 45 fc                  add    -0x4(%ebp),%eax
 80483cd:    a3 18 a0 04 08     mov    %eax,0x804a018
 80483d2:    8b 45 fc                  mov    -0x4(%ebp),%eax
 80483d5:    c9                            leave  
 80483d6:    c3                            ret    
 80483d7:    90                            nop

080483d8 <main>:
 80483d8:    55                                    push   %ebp
 80483d9:    89 e5                              mov    %esp,%ebp
 80483db:    83 e4 f0                          and    $0xfffffff0,%esp
 80483de:    83 ec 10                         sub    $0x10,%esp
 80483e1:    c7 44 24 04 03 00 00  movl   $0x3,0x4(%esp)
 80483e8:    00
 80483e9:    c7 04 24 01 00 00 00   movl   $0x1,(%esp)
 80483f0:    e8 bf ff ff ff                         call   80483b4 <sum>
 80483f5:    c9                                      leave 
 80483f6:    c3                                      ret    
 由此可见汇编代码地址的变化,特别在地址0x80483f0 时地用地址为0x80483b4是sum函数的第一条指令的地址,,暂时分析到这,待续....

对于x86处理器上的Linux,正文段从ox08048000单元开始,栈底则在oxc0000000之下开始,堆底和栈顶之间未用的虚拟空间很大(保护模式下,不能直接访问物理内存,全部是虚拟内存),在这个例子中ox80483f0可见是sum函数的汇编指令在正文段中的地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值