《Linux内核分析》-X86汇编基础及实验总结
来源:互联网 发布:windows桌面消失 编辑:程序博客网 时间:2024/05/12 22:18
作者:王鹤楼
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
几个宏汇编对应的汇编指令pushl %eax subl $4, %esp movl %eax, (%esp)popl %eax movl (%esp), %eax addl $4, %espcall 0x12345 pushl %eip movl 0x12345, %eipret popl %eipenter pushl %ebp movl %esp,%ebpleave movl %ebp,%esp popl %ebp
左边main.c的C程序源代码,右边main.s是汇编main.c之后的代码
下面分析汇编代码main.s
17~25行是main函数
18: pushl %ebp 保存程序进入main函数之前的基地址指针寄存器内容到栈中
19: 把当前的栈指针赋值给基地址指针寄存器,即设置main函数的栈底
20: 栈指针向下移动一个位置
21: 把立即数29存到栈顶
22:调用f函数,并且把eip的下一条指令(addl $3, %eax)的地址压入栈中
8~16是f函数==>
9:保存调用此函数的基地址批针寄存器内容到栈中
10:把当前栈指针赋给栈的基地址指针寄存器,也就是设置当前函数栈的基地址
11:栈指针向下移动一个位置
12:把相对于ebp向上移偏2个地址的内容赋给eax,也就是把立即数29赋值给eax
13:把eax也就是立即数29压入栈中
14:调用f函数,同时把eip的下一条指令(leave)压入栈中
1~7是g函数
2:保存调用此函数的基地址批针寄存器内容到栈中
3:把当前栈指针赋给栈的基地址寄存器,也就是设置当前函数栈的基地址
4:把相对于ebp向上移偏2个地址的内容赋给eax,也就是立即数29
5:把1和eax寄存器的内容(29)相加赋给eax
6: 把栈顶的内容弹出来赋给寄存器ebp,然后esp减去4
7:返回语句,相当于popl %eip,程序执行中转到第15行
15:把函数f的栈的基地址赋给栈指针,然后把栈顶的内容弹出来也就是main函数的栈的基地址赋给ebp
16: 返回语句,相当于popl %eip,程序执行中转到第23句
23:调用函数f的返回结果存在eax中,把立即数3与 eax相加再存回eax
24:离开main函数
下面这张图片展示了栈的变化:
进入每个函数开头都指有两句指令:
pushl %ebpmovl %esp, %ebp
作用就是保存调用函数栈的基地址,然后设置本函数栈底
退出一个函数时一般都会是如下两句
leaveret这两句语句对应的代码为:movl %ebp,%esppopl %ebppopl %eip
以前内容就是学习《Linux内核分析》第一堂课的总结。
- 《Linux内核分析》-X86汇编基础及实验总结
- Linux内核分析 X86汇编基础测验
- Linux内核分析——x86汇编基础
- linux内核分析之-x86汇编原理
- Linux内核分析:实验四--使用嵌入汇编系统调用
- Linux内核分析实验1——汇编一个简单的C程序
- X86汇编基础
- 170824 汇编-x86基础
- Linux内核分析:实验一
- Linux内核分析:实验一
- Linux内核分析实验一
- Linux内核分析:实验一
- Linux内核分析:实验二
- Linux内核分析实验二
- Linux内核分析:实验二
- Linux内核分析:实验二
- Linux内核分析实验三
- Linux内核分析实验三
- JAVA Static方法与单例模式的理解
- java中hashcode()和equals()的详解
- LightOJ 1236 Pairs Forming LCM (唯一分解定理)
- ImageWatch
- BZOJ 3761 甄嬛 二分答案
- 《Linux内核分析》-X86汇编基础及实验总结
- matplotlib中画图显示中文,但保存为图片后中文乱码
- 开发小技巧
- Bmob实战之分页获取数据
- 个人学习-java-非static静态代码块
- SecureCRT 连接Oracle VirtualBox虚拟机中的Linux系统
- RancherOS 的安装
- 用opencv实现HOG+SVM行人检测
- Git代理设置,加速clone