MOOC《Linux内核分析》第一课
来源:互联网 发布:免疫细胞疗法 知乎 编辑:程序博客网 时间:2024/06/10 14:43
郑阳 原创作品转载请注明出处 《Linux内核分析》MOOC课程
“数据结构+算法”构成了程序,然后程序被编译器处理成机器指令流,在计算机硬件的一系列处理下得到执行。第一节课的学习中,孟宁老师给我们介绍了汇编程序的相关知识:
“数据结构+算法”构成了程序,然后程序被编译器处理成机器指令流,在计算机硬件的一系列处理下得到执行。第一节课的学习中,孟宁老师给我们介绍了汇编程序的相关知识:
寄存器的分类
通用寄存器
- 段寄存器
- 标志寄存器
指令寻址模式
- 寄存器寻址
- 直接寻址
- 间接寻址
- 立即数寻址
- 变址寻址
对move指令,后缀中b、w、l、q分别代表的是8位、16位、32位、64位字节操作。
以AT&T为例,重点对如下几个常用指令进行介绍:
poshl %eax//将eax寄存器处的数据压入堆栈,和如下的代码效果等同subl $4,%espmovl %eax,(%esp)
popl %eax//将eax寄存器中的数据推出堆栈,和如下代码的效果等同movl (%esp),%eaxaddl $4,%esp
enter//和如下代码的效果等同pushl %ebpmovl %esp,%ebp
leave//和如下代码的效果等同movl %ebp,%esppopl %ebp
ret//将栈顶的返回地址弹出到eip,然后按照eip此时指示的指令地址继续执行程序.call//首先是将返回地址(也就是call指令要执行时eip的值)压入栈顶,然后是将程序跳转到当前调用的方法的起始地址。
接下来分析试验中的main.c程序
执行如下命令
gcc –S –o main.s main.c -m32得到main.s程序文件
将影响程序阅读的部分去除之后,得到如下干净的代码
下面对程序进行分析,先从main:处开始
main: pushl %ebp ;ebp中的数据压入栈顶,esp从“栈顶”下移一位指向“栈顶-1” movl %esp,%ebp ;esp中的数据移入ebp中 subl $4,%esp ;esp指向“栈顶-2”处 movl $9,(%esp) ;esp所指位置存入数据9 call f ;将eip(第23行代码地址)压入“栈顶-3”处,esp指向“栈顶-3”处,跳转到f函数处接下来分析
f: pushl %ebp ;ebp中数据压入堆栈,esp指向“栈顶-4”处 movl %esp,%ebp ;ebp也指向“栈顶-4”处 subl $4,%esp ;esp指向“栈顶-5”处 movl 8(%ebp),%eax ;ebp指向“栈顶-2”处并将数据发送给eax,所以eax为9 movl %eax,(%esp) ;“栈顶-5”处的数据为9 call g ;eip(第15行代码地址)压入堆栈“栈顶-6”处,esp指向“栈顶-6”处,程序跳转到g函数处 leave ret再分析
g: pushl %ebp ;ebp压入堆栈,esp指向“栈顶-7”处 movl %esp,%ebp ;ebp指向“栈顶-7”处 movl 8(%ebp),%eax ;“栈顶-5”处的值传给eax,eax=9 addl $6,%eax ;eax=9+6=15 popl %ebp ;ebp压出栈,esp指向“栈顶-6”处 ret ;返回程序第15行代码处执行,esp指向“栈顶-5”处...最后返回main:中执行 addl $2,%eax leave ret可以计算出eax=9+6+2
0 0
- MOOC《Linux内核分析》第一课
- 《Linux内核分析》MOOC课-mykernel实验
- MOOC《Linux内核分析》第二课
- MOOC《Linux内核分析》第四课
- Linux内核分析MOOC课程汇编分析
- mooc-linux内核课-1
- 网易MOOC《Linux内核分析》第一节作业
- 《LINUX 内核分析》MOOC课程总结
- 韩岩___第1课___《linux内核分析》MOOC课
- 韩岩___第2课___《linux内核分析》MOOC课
- 韩岩___第3课___《linux内核分析》MOOC课
- 韩岩___第4课___《linux内核分析》MOOC课
- 韩岩___第5课___《linux内核分析》MOOC课
- 韩岩___第6课___《linux内核分析》MOOC课
- 韩岩___第8课___《linux内核分析》MOOC课
- MOOC课程"Linux内核分析"之作业一
- MOOC课程"Linux内核分析"之作业二
- MOOC-Linux内核lab5 分析system_call中断处理过程
- 计算机网络部分基础知识
- 构造方法(Constructor )那点事
- 删除事件处理程序如何解决
- [LeetCode]236 二叉树的最近公共父亲节点
- linux精讲——su切换用户
- MOOC《Linux内核分析》第一课
- ubuntu 系统配置维护 常用命令
- kali2.0 Metasploit连接postgres数据库
- 半年总结
- 总结的一些正则表达式
- thinkPHP入门(一):基础
- Android根据联系人姓名首字符顺序读取通讯录
- QML 中神秘的 Component
- Oracle备份 DataGuard简介