科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件C程序的机器级表示-3

C程序的机器级表示-3

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

C程序的机器级表示。

作者:CSCUM 来源:CSDN 2008年3月21日

关键字: 机器级 C语言 C++ C Linux

  • 评论
  • 分享微博
  • 分享邮件

 

我们的程序,在进行到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处得到函数返回。 

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章