写在前面:
- 本系列笔记主要以《计算机组成原理(唐朔飞)》为参考,大部分内容出于此书,笔者的工作主要是挑其重点展示,另外配合下方视频链接的教程展开思路,在笔记中一些比较难懂的地方加以自己的一点点理解(重点基本都会有标注,没有任何标注的难懂文字应该是笔者因为强迫症而加进来的,可选择性地忽略)。
一、操作数类型
1、地址
地址实际上也可看作是一种数据,在许多情况下要计算操作数的地址,这时地址可被认为是一个无符号的整数。
2、数字
计算机中常见的数字有定点数、浮点数和十进制数。
3、字符
在应用计算机时,文本或者字符串也是一种常见的数据类型。由于计算机在处理信息过程中不能以简单的字符形式存储和传送,因此普遍采用ASCII码。当然,还有其它一些字符编码,如8位EBCDIC码,又称扩展BCD交换码。
4、逻辑数据
计算机除了做算术运算外,有时还需做逻辑运算,此时n个0和1的组合不是被看作算术数字,而是被看作逻辑数。例如,在ASCII码中的0110101,它表示十进制数5,若要将它转换为NB-CD短十进制码,只需通过它与逻辑数0001111完成逻辑与运算,抽取低4位,即可获得0101。此外,有时希望存储一个布尔类型的数据,它们的每一位都代表着真(1)和假(0),这时n个0和1组合的数就都被看作逻辑数。
二、数据在存储器中的存放方式
1、机器字长
通常计算机中的数据存放在存储器或寄存器中,而寄存器的位数便可反映机器字长。一般机器字长可取字节的1、2、4、8倍,这样便于字符处理。在大、中型机器中字长为32位和64位,在微型计算机中字长从4位、8位逐渐发展到目前的16位、32位和64位。
2、边界对齐
(1)为了便于硬件实现,通常要求多字节的数据在存储器的存放方式能满足“边界对准”的要求。下图所示的存储器存储字长为32位,可按字节、半字、字,双字访问,半字地址是2的整数倍,字地址是4的整数倍,双字地址是8的整数倍,当所存数据不能满足此要求时,可填充一个至多个空白字节,这么做的目的是为了便于访存,只是浪费了一些空间。
(2)在数据不对准边界的计算机中,数据(例如一个字)可能在两个存储单元中,此时需要访问两次存储器,并对高低字节的位置进行调整后才能取得一个字,很显然,这种存储方式虽然充分利用了存储空间,但是却增加了不少的访存时间,而且读写控制也很复杂。
3、大端和小端存储模式
(1)大端(存储)模式是指数据的低位保存在字的高地址中,而数据的高位保存在字的低地址中,也就是高位字节地址为字地址。(如下左图所示)
(2)小端(存储)模式是指数据的低位保存在字的低地址中,而数据的高位保存在字的高地址中,也就是低位字节地址为字地址。(如下右图所示)
三、操作类型
1、数据传送
数据传送包括数据在寄存器与寄存器、寄存器与存储单元、存储单元与存储单元之间的传送。如从源到目的之间的传送、对存储器读(LOAD,把存储器中的数据放到寄存器中)和写(STORE,把寄存器中的数据放到存储器中)、交换源和目的的内容、置1、清零、进栈、出栈等。
2、算术逻辑操作
这类操作可实现算术运算(加、减、乘、除、增1、减1、取负数即求补)和逻辑运算(与、或、非、异或)。
对于低档机而言,一般算术运算只支持最基本的二进制加减、比较、求补等,高档机还能支持浮点运算和十进制运算。有些机器还具有位操作功能,如位测试(测试指定位的值)、位清除(清除指定位)、位求反(对指定位求反)等。
3、移位
移位可分为算术移位、逻辑移位和循环移位三种。
算术移位和逻辑移位分别可实现对有符号数和无符号数乘以(左移)或整除以
(右移)的运算,并且移位操作所需时间远比乘除操作执行时间短,因此,移位操作经常被用来代替简单的乘法和除法运算。
循环移位又分带进位和不带进位两种。
4、转移
(1)在多数情况下,计算机是按顺序执行程序的每条指令的,但有时需要改变这种顺序,此刻可采用转移类指令来完成.
(2)转移指令按其转移特征又可分为无条件转移、条件转移、跳转、过程调用与返回、陷阱(Trap)等几种。
①无条件转移:
无条件转移不受任何条件约束,可直接把程序转移到下一条需执行指令的地址。例如“JMP X”,其功能是将指令地址无条件转至X。
②条件转移:
条件转移是根据当前指令的执行结果来决定是否需要转移,若条件满足则转移,若条件不满足则继续按顺序执行。
一般机器都能提供一些条件码,这些条件码是某些操作的结果,例如零标志位(Z)、负标志位(N、溢出标志位(V)、进位标志位(C)、奇偶标志位(P)等。
还有一种条件指令——SKP(Skip),它暗示其下一条指令将被跳过,从而隐含了转移地址是SKP后的第二条指令。
③调用与返回:
在编写程序时,有些具有特定功能的程序段会被反复使用,为避免重复编写,可将这些程序段设定为独立子程序,当需要执行某子程序时,只需用子程序调用指令即可。此外,计算机系统还提供了通用子程序,如申请资源、读写文件、控制外设等,需要时均可由用户直接调用,不必重新编写。
通常调用指令包括过程调用、系统调用和子程序调用,它可实现从一个程序转移到另一个程序的操作。
调用指令(CALL)一般与返回指令(RETURN)配合使用,CALL用于从当前的程序位置转至子程序的入口,RETURN用于子程序执行完后重新返回到原程序的断点。如下图所示,主程序从2000地址单元开始,并在2100处有一个调用指令,当执行到 2100处指令时,CPU停止下一条顺序号为2101的指令,而转至2400执行SUB1子程序,在SUB1中又有两次(2500和2560处)调用子程序SUB2,每一次都将 SUB1挂起而执行SUB2,子程序末尾的RETURN 指令可使CPU返回调用点。
从上例来看,子程序可以在多处被调用,而且子程序调用可出现在子程序中,即允许子程序嵌套。由于可以在许多处调用子程序,因此CPU必须记住返回地址,使子程序能准确返回,返回地址可存放在以下3处:
[1]寄存器内。机器内设有专用寄存器专门用于存放返回地址。
[2]子程序的入口地址内。
[3]栈顶内。现代计算机都设有堆栈,执行RETURN指令后便可自动从栈顶内取出应返回的地址。
④陷阱(Trap)与陷阱指令:
陷阱其实是一种意外事故的中断,例如机器在运行中可能会出现电源电压不稳定、存储器校验出差错、输入输出设备出现了故障、用户使用未被定义的指令、除数出现为0、运算结果溢出以及特权指令等种种意外事件,致使计算机不能正常工作,此刻必须及时采取措施,否则将影响整个系统的正常运行。因此,一旦出现意外故障,计算机就发出陷阱信号,暂停当前程序的执行,转入故障处理程序进行相应的故障处理。
计算机的陷阱指令一般不提供给用户直接使用,而作为隐指令(即指令系统中不提供的指令),在出现意外故障时由CPU自动产生并执行。也有的机器设置供用户使用的陷阱指令或“访管”指令,利用它完成系统调用和程序请求。
5、输入输出
对于I/O单独编址的计算机而言,通常设有输入输出指令,它完成从外设中的寄存器读入一个数据到CPU的寄存器内,或将数据从CPU的寄存器输出至某外设的寄存器中。
输入:IN AX, n 端口中的内容→CPU中的寄存器
输出:OUT n, AL CPU中的寄存器→端口中的内容
6、其它
其它包括等待指令、停机指令、空操作指令、开中断指令、关中断指令、置条件码指令等。为了适应计算机的信息管理、数据处理及办公自动化等领域的应用,有的计算机还设有非数值处理指令,如字符串传送、字符串比较、字符串查询及字符串转换等。
在多用户、多任务的计算机系统中,还设有特权指令,这类指令只能用于操作系统或其他系统软件,用户是不能使用的。
在有些大型或巨型机中,还设有向量指令,可对整个向量或矩阵进行求和、求积运算。在多处理器系统中还配有专门的多处理机指令。