您的位置:首页 > 运维架构 > Linux

Linux内核分析实验1——汇编一个简单的C程序

2017-02-19 23:27 267 查看

实验代码

int g(int x)
{
return x + 3;
}

int f(int x)
{
return g(x);
}

int main(void)
{
return f(2) + 1;
}


汇编指令:
gcc -S main.c


汇编结果

g:
pushl   %ebp
movl    %esp, %ebp
movl    8(%ebp),%eax
addl    $3, %eax
popl    %ebp
ret
f:
pushl   %ebp
movl    %esp, %ebp
pushl   8(%ebp)
call    g
addl    $4, %esp
leave
ret
main:
pushl   %ebp
movl    %esp, %ebp
pushl   $2
call    f
addl    $4, %esp
addl    $1, %eax
leave
ret


分析:

程序从main函数开始

首先

pushl %ebp

movl %esp, %ebp

相当于enter指令,保存ebp的值,然后将ebp的值设为esp,相当于保存原函数的堆栈,然后建立当前函数的堆栈,而且它还有这样的功能,见下面的博客

http://blog.csdn.net/zhangxinrun/article/details/5888425

把立即数2压栈,然后调用函数f

同样enter一下

pushl 8(%ebp),将当前ebp所指向的堆栈位置向上数两个的位置,也就是放2的那个位置,压栈。

做一个变址寻址,即将2放入累加器eax中

累加器再加3,累加器为5.

然后pop %ebp,相当于leave,由于g函数中没有额外压栈,所以没做mov指令

返回f函数,

esp向上移动一个堆栈位置然后leave,

返回main

同样esp向上移动一个堆栈位置然后leave,与此同时eax加1,得到最终值6

程序结束
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐