第一节 计算机是如何工作的——20135203齐岳
2016-02-25 22:10
281 查看
第一节 计算机是如何工作的
By 20135203齐岳
存储程序计算机工作模型
存储程序计算机——冯诺依曼体系结构IP:寄存器,总是指向内存的代码段。IP(16位) 32位(EIP) 64位(RIP)。
内存:保存数据和指令。
CPU:CPU从IP指向的内存地址取指令执行,执行之后IP自加一,然后继续执行
for(;;){ next instruction }
API:应用程序编程接口。程序员与计算机的接口界面。
ABI:程序与CPU接口界面(二进制编码)。
X86汇编基础
X86寄存器
通用寄存器段寄存器
CS:代码段寄存器,存储指令。CPU取指令时根据CS+eip来确定指令的地址。
DS:数据段寄存器,存储数据段的段值。
SS:堆栈段寄存器,存储堆栈段的段值。
FS、GS、ES:附加段寄存器,存储附加数据段的内容。
常用汇编指令
movlpushl %eax:将eax寄存器放进堆栈的栈底。
subl $4,%esp movl %eax,(%esp)
popl %eax:将栈顶的数值放入eax里面。
movl (%esp),%eax addl $4,%esp
call 0x12345:函数调用,调用0x12345这个地址。
pushl %eip(*) movl $0x12345,%eip(*)
ret:将函数调用时候保存的eip出栈,执行函数调用之后的下一条指令。
popl %eip(*)
enter:将栈置为空
pushl %ebp movl %esp,%ebp
leave:撤销函数堆栈,释放内存空间
movl %ebp,%esp popl %ebp
注意:( * )表示伪指令,实际上程序员不能直接修改eip,会有安全隐患
常用寻址方式
寄存器寻址:%+寄存器名称,与内存无关。movl %eax,%edx edx=eax;
立即寻址:$+16进制的数字,将数值直接放进寄存器当中,与内存无关。
movl $0X123,%edx edx=123;
直接寻址:一个16进制数字表示一个地址。
movl 0x123,%edx edx=*(int32_t*)0x123;
间接寻址:寄存器的值表示一个内存地址,将这个内存地址中的值放进寄存器中。
movl (%ebx),%edx edx=*(int32_t*)ebx;
变址寻址:括号外面的数字表示寄存器地址加一个立即数。
movl 4(%ebx),%edx edx=*(int32_t*)(ebx+4);
注意:AT&T汇编格式与Intel汇编格式略有不同,linux内核使用的是AT&T汇编格式。
汇编一个简单的C程序分析其汇编指令执行过程
由于理论知识在上学期的博客中详细写过,所以这里直接用课后作业来说明C语言代码
汇编代码
堆栈变化过程
执行leave语句时将esp指向ebp的位置,然后将ebp出栈从而释放函数所使用的堆栈。
执行将函数调用时候保存的eip出栈,执行函数调用之后的下一条指令。
函数返回值保存在eax当中,随着函数调用的结束它的值依次被修改。
注意:
1.函数调用堆栈是由逻辑上多个堆栈叠加起来的
2.函数的默认返回值通过eax寄存器存储返回给上一级函数
参考资料
【原创作品转载请注明出处】 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000相关文章推荐
- 连接网络设备的交叉线和直通线的区别
- 计算机视觉的网站链接
- 有上下界的网络流问题
- iOS之HTTP网络编程
- TCP/IP 三次握手,温故知新
- liunx centos5.8 下配置apache+svn的http访问
- 贝叶斯网络--概率推理
- poj 3281 Dining 拆点网络流
- 李望 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-10000290
- 数据结构-5
- 数据结构——二叉查找树
- HDU1532 - Drainage Ditches(网络流)
- 网络编程_UDP编程原理_发送类型_cs与bs区别JAVA187-188
- HTTP协议
- Android开发之旅:组件生命周期(一)出处:http://www.cnblogs.com/skynet/
- 算法竞赛入门经典(第二版)-刘汝佳-第六章 数据结构基础 例题(17/22)
- HDU3549 - Flow Problem(模板网络流 + Ford-Fulkerson算法)
- poj 1459 Power Network 多源多汇网络流
- 人工神经网络训练样本的选择方法
- Http状态码说明