南平信息网
游戏
当前位置:首页 > 游戏

C程序的机器级表示-3

发布时间:2019-09-13 19:34:46 编辑:笔名

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

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

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

来,把传入函数的参数也存下来。

看看fun的代码:

_fun:

pushl%ebp;侦指针压栈

movl%esp, %ebp;栈指针(保存栈顶地址)-〉侦指针

subl$4, %esp;gcc习惯

movl8(%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处得到函数返回。

一岁宝宝咳嗽怎么办
儿童夜间咳嗽怎么办最有效
小宝宝脸色发黄怎么回事
怎样解决糖尿病胃轻瘫消化不好