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

实验代码

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
程序结束

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值