3章 程序的机器级以及程序优化
2017-09-14 16:20
375 查看
理解计算机是如何抽象工作的?
现代计算机体系也符合早期冯.诺伊曼结构需要有如下部件:
1、存储器:上面有编号,代表存储空间地址0,1,2,3…。
2、控制器:发出总的控制信号。
3、算术逻辑部件:ALU,可以进行算术运算和逻辑运算,可以是GPRs里面操作数,也可以存储器里面操作数。运算结果可以放回寄存器或者输出到存储器。
4、通用寄存器:用于暂时存储一些数据。
5、标志寄存器:运算结果还包含一些标志信息存储在标志寄存器,例如符号是什么,有没有进位,有没有溢出等等,可以送到控制器影响后续指令的执行。
6、IR:指令寄存器,指令暂时存放的寄存器。
7、MAR:地址总线,送出存储器上面的地址信号,配合控制信号,可以通过数据总线取出对应地址上面的数据。
8、MDR:数据总线,通过数据总线读取数据,如果读取指令,那么送到IR寄存器,如果读取数据,要么直接送到ALU计算,要么先送到GPRs再送到ALU进行计算。
将上述部件类比生活妈妈中的做菜:
CPU=厨房,爸爸=控制器,盘子=GPRs,锅炉等=ALU,厨房架子=存储器。- 做菜之前:
原材料(数据)和菜谱(指令)都按序号放在厨房外的架子(存储器)上,每一个架子都有编号(存储单元地址)。
菜谱上含有一些信息:原料位置、做法、做好的菜放哪里等。例如,把10、11号架子上的原料一起抄,并放入3号盘,然后告诉从第5个架子(PC=5)上指定菜谱开始做。
- 开始做菜:
第一步:从5号架上取菜谱(根据PC从内存取指令)。
第二步:看菜谱(控制器指令译码)。
第三步:从架子上或盘中取原材料(根据译码从寄存器或者内存取操作数)。
第四步:洗、切、炒等具体操作(指令在ALU执行)。
第五步:装盘(放入寄存器留待后续操作使用)或者送桌子(直接放回对应的架子)。
第六步:算出下一个菜谱所在架子号。(修改PC值返回第一步重复执行)。
继续做下一道菜(执行下一条指令)。
以上操作涉及了内存和寄存器,寄存器实际上也是CPU内部的暂时存储单元,可以存储一些数据,可以加速数据的提取;因为从物理内存提取需要发送地址信号,控制信号,数据接收相对比较耗时。
实际过程执行:
指令和数据:
指令概念:
不同的机器,机器指令不一样。这跟具体的供应商有关。
机器级指令:
机器指令与汇编指令一一对应,汇编仅仅是一些助记符而已,最终编译器会翻译成0/1序列。
高级语言转换成机器代码过程:
指令体系结构:
体系结构是一种规定,每一个厂商都有各自的指令集。但是最终实现的功能都是抽象的操作硬件。通过指令可以使得计算机通用,不同的功能,用不能的指令组合序列来实现。不同的ISA规定的指令集不同,如IA-32、MISP、ARM等,计算机组成必须能够实现ISA规定的功能,如提供GPR、标志、运算电路等。同一种ISA可以有不同的计算机组成,如乘法指令可用ALU或乘法器实现。ISA是就是计算机组成的抽象。
IA-32指令系统:
以IA-32指令系统为例子来讲述指令系统这个抽象概念。
1、IA32寄存器组成:
2、计算机中数据存放在哪里:
要么在靠近CPU的临时数据存储器寄存器当中,相当于厨房里面盘子,寄存器文件构成通用寄存器组GPRs,要么在远离CPU的存储器。二者访问速度不同。
3、IA-32支持数据类型及格式:
4、IA-32寄存器组织:
5、IA-32的寻址:
最重要的是保护模式下寻址,也就是虚拟地址。
存储器操作数的寻址方式:
c语言变量声明后,编译器会在存储空间里面分配对应的存储单元。不同类型,不同对齐方式,分配地址空间不一样。各种寻址方式就对应不同类型变量,假定地址是连续递增的。
现在为什么理解为什么需要提供这么多寻址方式,因为高级语言当中不同类型的声明有这种计算的需求,通过给出这种寻址方式,硬件计算起来通过指令寻址会特别快。
6、IA-32机器指令格式:
其中 8d 04 02 对应的汇编指令为 leal (%edx , %edx , 1) , %eax。所以这个指令在存储器上存储的是8d,04 ,02 。控制器取出这条指令之后,首先经过译码,然后再执行其告诉的操作。这个译码方式我们不需要明白(这些是芯片制造厂商需要考虑的问题),但是需要理解机器的工作过程就是这样的。所以最终存储在存储器上面的全部都是0和1序列。现在对于这个CPU工作方式大概有了一点了解,很有用。
第6周:
栈:
C语言语句的机器级表示
相关文章推荐
- 利用java的反射以及在java web反射机制的使用优化程序
- 按位与 按位或 按位异或(位运算到底可以干什么,有些什么经典应用,以及如何用位运算优化你的程序)
- Spark程序运行常见错误解决方法以及优化
- Spark程序运行常见错误解决方法以及优化
- 第2次课改善深层神经网络:超参数优化、正则化以及优化 - week3 超参数调试、Batch正则化和程序框架
- Spark程序运行常见错误解决方法以及优化
- matlab程序优化以及eclipse与github的结合
- Spark程序运行常见错误解决方法以及优化
- opencv,python程序性能检测以及优化函数
- 堆和栈的探讨以及从创建对象层面来优化程序的常识
- C程序优化方法
- ◆程序笔记◆◇第三期◇ 读入优化
- VOIP 以及后台程序相关
- GCCE编译器优化,缩小目标程序代码
- 网页使用ie或者360打开时按F12出现程序停止运行异常的原因以及解决方案
- 用用程序缺少*.dll以及0xc000007b无法正常启动
- asp.net 程序优化性能的七个方面
- Android项目实战--手机卫士24--程序锁的实现以及逻辑
- asp.net程序性能优化的七个方面
- seo教程之百度权重对网站程序的代码优化设计要求