计算机是如何运行的

第一次写博客,不会怎么使用排版功能,写的不好请大家见谅!

看计算机如何工作,我们先对一个简单的C语言程序进行反汇编,这是在实验楼进行C语言反汇编实验C语言源代码的截图:

 

把C语言源代码反汇编成32位汇编代码

 

去掉干扰代码后的干净代码

 

 

下面我们对这段代码进行分析

注:ebp后的数字代表ebp所在位置,eip后面数字代表反汇编后代码(上图)执行位置;


初始状态下ebp和esp都指向栈底,即空栈,pushl %ebp之后,esp-4然后把当前ebp压入栈中,movl %esp,%ebp相当于C语言ebp=esp,subl $4,%esp和movl $6,(%esp)相当于pushl $6


call f相当于pushl %eip,mov f所在地址,%eip;pushl %ebp和movl %esp,%ebp两句相当于enter;


subl $4,%esp就是把esp减去4也就是向下移动一个单位, movl 8(%ebp),%eax 相当于eax=*(int32_t *)(ebp+8)此时eax=6,同理call g与call f一样;


leave相当于movl %ebp,%esp, popl %ebp;


  总结:由上述分析可以看出,计算机在执行函数调用和函数的参数传递都是通过使用栈来进行的,在调用函数时,先对eip进行保存方便函数调用结束后返回执行,然后保存ebp栈底方便恢复栈在调用之前的状态,最后清空栈使ebp=esp方便函数使用;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值