这个文集是用来记录 庖丁解牛Linux内核 这个课程的笔记和作业.错误之处,恳请指出.

实验目地

通过这个实验,主要了解到C函数的调用在汇编层面的逻辑.

实验内容

C程序

首先我们准备了一个简单的函数调用的c程序

int g(int x)

{

return x + 3;

}

int f(int x)

{

return g(x);

}

int main(void)

{

return f(8) + 1;

}

通过gcc -S -o main.S main,c -m32,可以获得main.S也就是该段代码的反汇编代码.去掉其中以"."开头的代码,因为这是汇编语言中的伪指令,是写给编译器看的,并不是真正的机器会执行的代码.然后我们得到下面的汇编代码:

g:

pushl %ebp

movl %esp, %ebp

movl 8(%ebp), %eax

addl $3, %eax

popl %ebp

ret

f:

pushl %ebp

movl %esp, %ebp

subl $4, %esp

movl 8(%ebp), %eax # 这里是要跳过call中入栈的eip,跳过前面看入栈的ebp,也就是4*2=8bytes,内存单位是1byte,那么8(%ebp)就是在ebp的基础上往前移8bytes,指向main里的立即数8.

movl %eax, (%esp)

call g

leave

ret

main:

pushl %ebp #从这一句开始执行, 把main函数的栈底地址入栈.

movl %esp, %ebp # 更新栈底地址

subl $4, %esp

movl $8, (%esp) #相当于push $8

call f # push 下条指令eip到栈中,然后修改eip为f的地址,跳到f处开始执行

addl $1, %eax

leave

ret

基本逻辑直接看我上面的注释.下面是几个注意的点

要注意的是除了最开始的初始化,esp指向的栈顶是当前有效数据的最低地址,而不是指向null的地址.那么

subl $4, %esp

movl $8, (%esp)

这两句其实就是push $8,为什么要分成两句我还不知道.

总结

计算机的工作原理其实就是讲一些代码放在连续的内存里,然后同时开辟一段堆和栈. 堆用来存储全局.

我们在调用函数时,在汇编层面的处理是:

先把CS:IP压入栈,以便函数结束后再接着当前流程执行

再把当前函数的栈顶压入

再从右到左压入函数变量

庖丁解牛linux内核 百度云,庖丁解牛Linux内核-1相关推荐

  1. 庖丁解牛linux内核 百度云,庖丁解牛Linux内核分析笔记-1

    2019-5-3 主要内容摘自 孟宁<庖丁解牛Linux内核分析> 天下大事必作于细,天下难事必作于易 1.计算机三大法宝 存储程序计算机 函数调用堆栈 中断 2.虚拟一个x86的CPU硬 ...

  2. Linux使用百度云

    2019独角兽企业重金招聘Python工程师标准>>> 百度云没有Linux客户端,于是有大神用Go语言写出来一个叫BaiduPCS-Go的命令行盘客户端,可以通过终端操作百度云盘, ...

  3. QNAP 威联通(NAS)安装百度云(Linux方案)

    之前在下 一直是用精简WIN10虚拟方案中跑win的百度云,但是作者本人的453bmini主频1.5G着实有一些弱鸡的性能,稍微同时跑5个下载线程虚拟机基本就跟卡死没区别了.就想着能否有一些替代方案. ...

  4. 解决百度云下载过慢、Linux下载百度云数据问题

    1. 找到你要下载的百度云链接 我这里是:https://pan.baidu.com/s/1uzwqLaCXcWe06xEXk1ROWw 2. 第二步找到文件实际下载路径 两种方式: 使用f12/Fn ...

  5. 百度同步盘linux客户端,技术|Linux下百度云的Python客户端(支持Unicode)

    bypy - 百度云/百度网盘的Python客户端 下载地址: Copyright 2013 Hou Tianze (GitHub: houtianze, Twitter: @ibic, G+: +T ...

  6. 解决:Linux版百度云客户端 BCloud网络错误 问题

    国内很多云盘渐渐停止服务支持,如新浪.华为.115.360等... 强大的百度云,你会继续免费让大家使用吗? 今天在Linux上使用了liulang的BCloud百度云客户端,登陆之后不显示主页,什么 ...

  7. linux微信教程 百度云,2019-03-08 linux安装QQ,微信,百度云,迅雷

    介绍 在linux下使用QQ等流行的windows软件一直是国内很多linux用户的需求,之前要实现这个需求用户往往需要对wine进行很多繁琐的配置,但即使这样最后跑出来的软件也是功能残缺的,只能满足 ...

  8. linux镜像 百度云

    转发的下面为链接,大家进去吧.还是比较全的,有些貌似不能下载 http://www.linuxfly.org/post/659/ 不为什么,就为了方便搜索,特把红帽EL 5.EL6.EL7 的各版本整 ...

  9. linux同步到云盘,Linux命令行上传文件到百度网盘

    百度云/百度网盘Python客户端github项目 系统环境: linux与ma + python3.6 安装依赖包 pip install requests pip install bypy==1. ...

最新文章

  1. 郑捷《机器学习算法原理与编程实践》学习笔记(第七章 预测技术与哲学)7.1 线性系统的预测...
  2. (转)SplitContainer 控件(Windows 窗体)
  3. 【规范】前端编码规范——jquery 规范
  4. 【ionic App问题总结系列】ionic 如何更新app版本
  5. 【算法】Floyd-Warshall算法(任意两点间的最短路问题)(判断负圈)
  6. 用pythonnet为计算机视觉做图像整理
  7. 暑假开始了,大家给力啊
  8. python gRPC测试helloworld
  9. python中字符串大小写转换常用操作
  10. ubuntu 打不开商店怎么办
  11. Microsoft Loopback Adapter : Oracle 安装
  12. php的require 失败,PHP在require_once上失败
  13. java鸟_java飞扬的小鸟
  14. 为啥有人说每个程序员都应该这学习5种编程语言?
  15. 理解XML Schema: XML Schema 初步 (I)(转)
  16. Linux添加/删除用户和用户组(linux中,添加cvs用户,实质就是添加linux用户。)
  17. 为什么div设置其border无效?
  18. javafx 与java,java桌面应用程序和javafx有什么区别?
  19. (1)Spring框架----通俗易懂的IoC原理
  20. c语言单片机当型编程,手把手教你学单片机的C语言程序设计(十四).pdf

热门文章

  1. 数据安全--14--隐私保护治理浅析
  2. 其实真正的互联网公司是很少的很少
  3. 怎样删除androidstudio创建的模拟器
  4. 数值积分: 梯形规则--复合梯形规则--辛普森规则--复合辛普森规则--龙贝格求积公式
  5. vue+elementui 登录注册页面实现
  6. 性能测试和优化实录(mybatisplus异步写库@Async引起的对象无法释放问题)
  7. 数据研发工程师面试全过程(个人面试)
  8. php投影,使用 CSS 3 制作长投影
  9. Bugzilla安装完初次登录提示“couldn‘t create child process: 720002: index.cgi”解决方法
  10. 菜鸟学数据库——大话 char、varchar、 nchar、nvarchar之间剪不断理还乱的关系