C程序的机器级表示-3

/*********************************************/
 TEXT: C程序的机器级表示
 AUTHOR: arden chao
 DATE: 2006-10-17
 EMAIL:  arden1019@gmail.com
 VERSION:1.0.0
/*********************************************/


//2006-10-24 函数的内存空间<2>

接着昨天。
我们的程序,在进行到call _fun时,我们在进程内存空间上便有了这样一个函数栈。我们这个函数栈要完成什

么样的功能呢?我们来思考着说明这个问题。main中调用一个函数,我们进入函数体,完成一系列函数代码后

接着main中下一条语句进行,于是,在进入函数调用的时候,我们需要把函数返回后要执行代码的地址保存下

来,把传入函数的参数也存下来。
看看fun的代码:
_fun:
 pushl %ebp   ;侦指针压栈
 movl %esp, %ebp  ;栈指针(保存栈顶地址)-〉侦指针
 subl $4, %esp  ;gcc习惯
 movl 8(%ebp), %eax  ;a-〉%eax
 movl %eax, -4(%ebp)  ;%eax-〉localvar
 movl $10, 12(%ebp)  ;10->b
 movl $1, %eax  ;return 1;
 leave    ;展开为:mov ebp esp   pop ebp 侦指针出栈
 ret    ;展开为:pop eip 下一条指令地址

在进入fun时,我们保存了其入口的地址放到%edp中,当我们返回时,我们就把它赋给%esp,这样,函数栈指针

就回去了原来的位置。

 |----------------|
高地址 |                | 
 |----------------|
 |      | 
 |----------------|
 | b  | 
 |----------------|
 |     a     |
 |----------------|
 |      | 
 |----------------|
ebp |        | 
 |----------------|
esp |    localvar    |
 |----------------|
 |   | 
低地址 |----------------|

我们把fun放到main中:
 ...
 movl $30, 4(%esp)
 movl $20, (%esp)
 call _fun
 movl %eax, -4(%ebp)
 movl -4(%ebp), %eax
 leave
 ret
在call _fun前,我们已经把参数存到合适位置上了。
在fun返回后,从%eax处得到函数返回。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值