Chinaunix首页 | 论坛 | 博客
  • 博客访问: 62535
  • 博文数量: 12
  • 博客积分: 469
  • 博客等级: 二等列兵
  • 技术积分: 155
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-24 22:00
文章分类

全部博文(12)

文章存档

2014年(2)

2012年(10)

分类: LINUX

2012-07-26 11:30:14

大多数CPU实现函数掉用是通过栈实现的,现在通过一个例子看下函数调用:
 
fun_call.c:

点击(此处)折叠或打开

  1. int fun2(int c)
  2. {
  3.     int e = c;
  4.     return e;
  5. }

  6. int fun1(int a, int b)
  7. {
  8.     return fun2(a+b);
  9. }

  10. int main(void)
  11. {
  12.     fun1(1,0);
  13.     return 0;
  14. }
通过汇编 

main()

点击(此处)折叠或打开

  1. main:
  2. pushl %ebp              # 保存调用函数ebp  说明main()函数也是被调函数
  3. movl %esp, %ebp         # 设置ebp =esp
  4. subl $8, %esp           # 栈空间
  5. movl $0, 4(%esp)        # 实参0保存在栈区 
  6. movl $1, (%esp)         # 实参1保存在栈区
  7. call fun1               # 函数调用 fun1
  8. movl $0, %eax           # 函数返回值
  9. leave
  10. ret
fun1()

点击(此处)折叠或打开

  1. fun1:
  2. pushl %ebp              # 保存调用函数main()的ebp
  3. movl %esp, %ebp         # 设置新的ebp = esp
  4. subl $4, %esp           # 栈空间
  5. movl 12(%ebp), %eax     # 取形参
  6. movl 8(%ebp), %edx      # 取形参
  7. leal (%edx,%eax), %eax  #
  8. movl %eax, (%esp)       # 返回值
  9. call fun2               # 调用fun2
  10. leave
  11. ret
fun2()

点击(此处)折叠或打开

  1. fun2:
  2. pushl %ebp               #保存调用函数 fun1()的ebp
  3. movl %esp, %ebp          #设置 fun2() 函数的ebp
  4. subl $16, %esp           #设置esp
  5. movl 8(%ebp), %eax       #取形参
  6. movl %eax, -4(%ebp)      #局部变量e=c
  7. movl -4(%ebp), %eax      #返回值
  8. leave
  9. ret
 call 和 jmp 
     call :是子程序调用指令,,和 ret 配合使用
     jmp:无条件转移指令,用作强行转换
 jmp 相对 call 就简单多了,call 在跳转之前要做一些保护,最简单的就是 cs eip 和 esp 寄存器(函数调用 esp 由调用函数自动计算,可以不保存),以便程序可以通过ret 返回,jmp 则不管那么多。

leave 是恢复 ebp 和 esp 的值 即相当与  movl %ebp %esp;  popl %ebp;






阅读(2067) | 评论(6) | 转发(0) |
0

上一篇:PCB

下一篇:添加系统调用

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

hangkong772012-07-30 13:36:41

Bean_lee: 不敢当。呵呵互相交流,互相学习吧。
我的博客里面也有同个领域的博文,欢迎指正。.....

Bean_lee2012-07-29 20:59:20

hangkong77: ^_^,求指导.....
不敢当。呵呵互相交流,互相学习吧。
我的博客里面也有同个领域的博文,欢迎指正。

hangkong772012-07-29 09:12:39

Bean_lee: 看来兄弟的爱好,和我差不太多。.....
^_^,求指导

Bean_lee2012-07-28 15:05:26

看来兄弟的爱好,和我差不太多。

hangkong772012-07-27 20:43:37

zhe_wang: 你能不能研究下汇编怎么调用库函数,比如说call调用printf.前面我们弄过汇编调用系统调用。.....
嗯嗯,下去弄一下。