计算机如何工作 函数调用分析2

也是为了做MOOC上面的课程,才有了这篇文章。

由于时间仓促,难免有遗漏 错误地方 敬请指出!

实验环境;虚拟机kali linux 3.18

编译器:gcc

编程语言:c语言

编辑器:vim


首先贴出我们需要分析的C源码

首先程序很简单 就是main函数调用sea函数 sea函数再调用wm函数完成整个程序的执行。

接下来再看一下反汇编的代码


让我们定位到18行的main函数 首先pushl %ebp到subl $4, %ebp首先完成了main函数自己的堆栈结构 21行movl $8, (%esp)  这个动作称作压栈 也就是我们的sea(8), 接着调用sea函数 call的功能很强大,首先将eip压入main的堆栈 ,然后eip指向sea函数 好了 让我们到sea函数 sea只有一个动作 就是return wm(x )

继续看sea函数的反汇编代码  大同小异 首先依然像main函数一样建立自己的堆栈段 ,压入参数 ,call wm函数 sea函数最后面还有leave ret 这个我们等下解释,让我们跟随sea函数到达wm函数, wm函数依然执行了三步操作 1 建立自己堆栈 2 完成函数操作 3 清除自己堆栈段 以及通过ret改变eip执行wm函数 wm函数也通过相同的手段返回到main函数 最后我们发现 所有用到的堆栈段全部已经成功清除 没有造成内存泄露 。 


以上就是简单的系统调用函数分析。

但是我们最后可以发现,我们的计算机并不是一个单任务系统 而是多任务系统?那又是怎么是实现的呢? 多任务系统通过中断处理机制 完成任务的切换 ,我们发现中断处理机制和函数调用也有相同点 处理机制保存中断现场 恢复现场  函数调用保存eip esp 恢复eip esp ----个人观点

----张振海


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值