计算机硬件基础
数据的表示
为什么我们要使用原码、反码、补码、移码呢?
假如我要使用+53和-6相加,转换成二进制就是:
0011 0101+1000 0110 = 1011 1011=187
因为计算机中只能存在二进制数,所以我们必须要用二进制进行运算,因而我们必须要想出一种方法来进行运算。故而我们引进了原码、反码、补码、移码这样一些概念
-6的反码是1111 1001 补码是1111 1010,我们再进行一次运算
0011 0101+1111 1010 = 1 0010 1111,因为我假定的机器字长为8,所以忽略溢出位,既运算结果为0010 1111也就是47,这个就是正确答案了!
那么什么是移码呢?
我们将补码的符号位取反即可,它用于表示浮点数的阶码,所以只用于整数。
-6的移码是0111 1010
53的移码是1011 0101
浮点数的计算
直接举例子:13.625
13.625=1101.1010=1◇1011 0100 0000 0000 0000 000 × 23
十进制数->二进制数->1数符小数部分 × 2对应次方 (尾数要保证23位数,不够的补0)
计算机体系结构分类中最为常见的是Flynn分类法,他将计算机体系分类为SISD,SIMD,MISD,MIMD四种
其中的S代表Single I代表Instruction M代表Multiple D代表DateStream
即SISD就是传统的老式电脑那样,单指令流单数据量(单处理器,单控制系统,单主存)
至于SIMD,典型的代表有矩阵处理机和超级向量计算机,他们有多个处理器,可以通过异步的方式运行同一指令。
MISD被证明是不可能存在的,即多个控制模块控制单个处理器,至少被认为是不切实际的。
MIMD就很常见了,多个控制部分,多个主存,做个处理器,MIMD计算机包括:并行向量处理机(PVP)、对称对多处理机(SMP)、大规模并行处理机(MPP)、工作机群(COW)、分布式共享存储系统(DSM)。
说完了Flynn分类法就不得不说说CISC和RISC即复杂指令集计算机和精简指令集计算机,
在计算机刚刚发展的前期,一般计算机都是被用于商业或者特殊用途的,人们为了方便,所以设计了各种各样的指令来使得计算机拥有更多的功能,但是这种方法导致软件的开发时间异常长,所以人们开始尝试着设想RISC这样一种计算机,它的指令不多,但是可以互相结合来实现更复杂的功能,这样速度更快,而且开发时间更短。
CISC结构的计算机存在优点,即指令可变长,但是由于各种指令的使用频率不一样导致程序效率低下,而他的寻址方式丰富多样,但是开发时间长,且造价高昂。采用微程序控制技术
RISC结构的计算机采用流水线技术,以硬布线逻辑控制为主,优化编译的速度,对高级编程语言的支持性更好,但是它的寻址方式较少。目前RISC处理器技术的发展方向是采用并行处理技术(包括超级流水线、超级标量、超长指令字)大幅度提高运算速度。
流水线技术
假设某工作有4个部分组成,即ABCD,他们分别需要占用一秒钟的时间去完成,且只有完成上一个任务才能进行下一个任务。
这个任务要执行1000遍,每遍包括4个1秒的部分,即总用时:1000*4*1=4000秒
看似这样计算是没有问题的,但是当A工作的时候BCD在做什么呢?在等待A工作完的半成品?
我们换种思路,当A工作完之后,马上开始下一个工作,BCD亦然,用下图表示ABCD工作后的样子(1为正在工作)
A 1111111111111111111111111000
B 0111111111111111111111111100
C 0011111111111111111111111110
D 0001111111111111111111111111
例子中运行了25次工作,而总是工作时间为28秒!
这样算下来,1000次工作我们总共花费的时间为1003秒!
倘若每次A需要花费2秒,B需要花费1秒,C需要花费3秒,D需要花费1秒呢?
这里我们直接带入公式就可以了,(A+B+C+D)+(次数-1)*MAX(A,B,C,D)
计算机中的指令由两部分组成:操作数、地址
操作数存在于主存或者任何储存位置中,故而可以有以下6种寻址方式:
1、立即寻址,指令的地址字段指出的不是操作数的地址,而是操作数本身,例如MOV AX,8888H
2、直接寻址,指令的操作数包含在指令的地址中
3、间接寻址,指令的操作数地址包含在指令的地址中,需要进行间接的寻址
4、寄存器寻址,指令的操作数存储在CPU的寄存器中
5、寄存器间接寻址,指令的操作数存储在CPU的寄存器所指的地址中,需要进行间接的寻址
6、相对寻址,相对寻址更像是一种偏移,指令的操作数存储在PC+相对地址而形成的相对地址中
PC,程序计数器-用来存放程序的下一条指令地址-在CPU中用于跟踪指令地址
IR,指令寄存器-用来保存当前正在执行的一条指令-对用户是完全透明的
ID,指令译码器-用来将二进制的编码“翻译成”指令
由于指令被从主存中调用至寄存器,再由寄存器调用至IR的时候是二进制的编码状态,需要依赖ID的帮助来把指令翻译出来。