Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7194147
  • 博文数量: 510
  • 博客积分: 12019
  • 博客等级: 上将
  • 技术积分: 6836
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-01 16:46
文章分类

全部博文(510)

文章存档

2022年(2)

2021年(6)

2020年(59)

2019年(4)

2018年(10)

2017年(5)

2016年(2)

2015年(4)

2014年(4)

2013年(16)

2012年(47)

2011年(65)

2010年(46)

2009年(34)

2008年(52)

2007年(52)

2006年(80)

2005年(22)

分类: LINUX

2006-11-08 09:48:15

 

要重点分析函数的栈结构。要了解由于体系设计的问题,堆栈指针向内存低方向增长,但是数据复制操作等,则是往高内存增长。

当函数调用时候,首先把参数从右往左入栈(通常),然后把当前的指令地址压入堆栈--------------这一部分在函数调用外部进行

函数体内 ,首先要保存ebp,压入堆栈三后,把当前的sp作为该函数的帧指针FP,依据FP界定该函数区域-------------这部分通常在被调函数内处理

FP往低地址便开始存放该函数的局部变量。

 

例子源代码:

#include

int fun(int a,int b);

int main(void)

{

int a;

a =fun(1,2);

return a;

}

int fun(int a,int b)

{

        int c;

        c =a+b;

return c;

}

 

[root@localhost test]# gcc –g tiny.c

对应汇编代码:

[root@localhost test]# gdb a.out  -q

(gdb) disass main

Dump of assembler code for function main:

0x080482f4 :    push   %ebp //保存ebp基地址

0x080482f5 :    mov    %esp,%ebp//设置函数的栈FP

0x080482f7 :    sub    $0x8,%esp

0x080482fa :    and    $0xfffffff0,%esp

0x080482fd :    mov    $0x0,%eax

0x08048302 :   sub    %eax,%esp

0x08048304 :   sub    $0x8,%esp

0x08048307 :   push   $0x2  //参数2压栈

0x08048309 :   push   $0x1   //参数1压栈

0x0804830b :   call   0x804831b //调用call

0x08048310 :   add    $0x10,%esp

0x08048313 :   mov    %eax,0xfffffffc(%ebp) //取函数返回值到a变量

0x08048316 :   mov    0xfffffffc(%ebp),%eax

0x08048319 :   leave 

0x0804831a :   ret   

End of assembler dump.

(gdb) disass fun

Dump of assembler code for function fun:

0x0804831b :     push   %ebp

0x0804831c :     mov    %esp,%ebp

0x0804831e :     sub    $0x4,%esp

0x08048321 :     mov    0xc(%ebp),%eax

0x08048324 :     add    0x8(%ebp),%eax

0x08048327 :    mov    %eax,0xfffffffc(%ebp)

0x0804832a :    mov    0xfffffffc(%ebp),%eax

0x0804832d :    leave  //返回原指令

0x0804832e :    ret   

End of assembler dump.

阅读(3089) | 评论(2) | 转发(1) |
0

上一篇:信号灯概述

下一篇:linux线程知识

给主人留下些什么吧!~~

chinaunix网友2009-08-16 18:22:21

c语言函数调用详细过程ZZ 这是从别处看到的一篇文章,感觉写的非常深入细致,是作者学习汇编语言的笔记,但是我觉得这篇文章对理解C函数调用非常有帮助,于是参考作者的步骤在自己的linux机器上实现了一下, 并对文章做了一些细小的更改,在此对原作者致谢,如果作者觉得这样有些冒犯的话,请通知我我会立即撤掉。 X86汇编语言学习手记(1) 作者: Badcoffee Email: blog.oliver@gmail.com 2004年10月 原文出处: http://blog.csdn.net/yayong 版权所有: 转载时请务必以超链接形式标明文章原始出处、作者信息及本声明. 这是作者在学习X86汇编过程中的学习笔记,难免有错误和疏漏之处,欢迎指正。 1. 编译环境 OS: Axianux 1.0 Compiler: gcc 3..2.3 Linker: Solaris Link Editors 5.x Debug Tool: gdb Edi

chinaunix网友2009-08-16 18:16:52

Making plain binary files using a C compiler这篇文章真的很好,但是在尝试过程中确发现了一些问题,希望各位指教: int main(){ } 编译完后,反汇编,有如下内容: push %ebp mov %esp,%ebp leave ret 这是这篇文章给出的内容. 而我反编译的结果如下(rh8.0 kernel:2.4.18): push %ebp mov %esp,%ebp sub $0x8,%esp//这句可以勉强理解,可能是为以后定义变量欲留位置,不知对否? and $0xfffffff0,%esp//这里就不好理解了,为什么要把后面的4位全都置0??? mov $0x0, %eax sub %eax,%esp leave ret 请各位指教! -------------------------------------------------------------------------------- [color=red][size=18]以下是偶的答复,请