您的位置:首页 > 其它

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语言语句的机器级表示

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: