2.2.2 操作数与操作类型
操作数是指令处理的对象,常见的类型有:地址、数值、字符、逻辑值等。
①地址——可以看作无符号整数,用来参加运算以确定主存地址。
②数值——包括定点数、浮点数和十进制数,前两种数值形式将在3.1.3中具体讲述,十进制数一般用NBCD码(即8421码)表示。
③字符——计算机在处理信息时如果遇到文本信息,不能直接处理与存储,需要采用编码的形式来表示文本,即用不同的二进制数表示不同的文字,如常用的ASCII码。当然还有其他的一些字符编码。
④逻辑值——计算机除了作算术运算外,还需要作逻辑运算。因此有时一些0和1的组合被看作逻辑值,而不是被看作算术数值。被看作逻辑值的n个0和1,它们每一位都代表着真和假,运算时通常需要按位运算。
指令的操作类型按功能可分成算术逻辑运算、数据传送、程序控制、输入/输出等类型。
(1)算术逻辑运算
一些低档的微型机只有定点加减运算指令、求补指令、比较指令、加1减1指令等算术运算指令。较高档的机器还有十进制运算指令、定点乘除指令、浮点运算指令等。逻辑运算类指令包括逻辑与、或、非、异或和测试等。有些机器还有位操作、位测试等指令。一些大型机、巨型机还设有向量运算指令,可以直接对整个向量或矩阵进行求和、求积等运算。算术逻辑运算指令都影响状态标志位Flag(程序状态字PSW)。
(2)移位操作
移位操作有算术移位、逻辑移位和循环移位三种。可以实现对操作数左移或右移一位或多位。算术移位和逻辑移位可分别实现对有符号数和无符号数乘以2n(左移n位)或整除以2n(右移n位)的运算,移位操作所需要的时间远比乘除操作所需要的时间短,所以移位操作经常被用来做简单的乘法和除法运算。
循环移位有带进位位的大循环和不带进位位的小循环两种,常用于实现循环式控制、压缩BCD码高低字位互换及多倍字长的移位等。
(3)数据传送
在程序中使用最多的是数据传送指令。这类指令的功能是实现寄存器与寄存器,寄存器与存储单元以及存储单元与存储单元之间的数据传送,包括对数据的读(Load)和写(Store)。数据传送时,数据从源地址传送到目的地址,源地址中的数据保持不变。
有些机器设置有数据块传送指令,可一次把多达64KB的数据从一个存储区传送到另一个存储区。数据交换指令则完成源操作数与目的操作数的互换。堆栈的压入Push和弹出Pop指令也属于数据传送指令。
(4)程序控制(转移)
在多数情况下,计算机是按照顺序执行程序的每条指令的,但有时需要改变指令执行的顺序,这时就采用转移类指令来完成。这类操作主要用于控制程序的流向,包括停机、无条件转移、条件转移、子程序调用与返回、中断和陷阱指令等。
无条件转移是指不受任何条件的约束,可以直接把程序转移到下一条所需执行的指令的地址。
条件转移是根据对某些条件判定的结果(通常是前面执行的算术逻辑运算指令对状态标志位的影响)决定是否发生转移,若条件满足则转移,否则顺序执行下一条指令。
转移还有绝对转移和相对转移的区别。绝对转移是转移到一个给定的目标地址(在整个存储器范围内)。相对转移是相对当前地址(程序计数器的内容)向前或向后转移一个位移量的范围(小范围)。
在编写程序时,有些具有特性功能的程序段会被反复使用。为避免重复编写,可将这些程序段设定为独立子程序,当需要执行这些子程序时,只需用子程序调用指令即可。
调用指令(Call)一般与返回指令(Return)配合使用。调用指令用于从当前程序位置转移到子程序的入口;返回指令用于子程序执行完后重新返回到原程序的断点。子程序调用指令与返回指令也有条件调用、条件返回和无条件调用、无条件返回的区别。
中断指令设置中断类型,开放或禁止中断等。陷阱(Trap)是一种异常中断,其目的不是为了请求CPU正常处理中断,而是为了把发生的各种事件通知CPU,并根据故障情况转入相应的故障处理程序。陷阱指令一般不提供给用户使用。
(5)输入/输出
输入/输出指令用来实现主机与外设间的各类信息交换,如数据的输入和输出、向外设发出的控制命令、检测外设的工作状态等。由于I/O端口的数目远少于存储单元数,故此类指令的地址码较短。有些计算机采用内存和外设(接口)统一编址的方法,把外设看作内存单元,所有能对内存单元进行操作的指令均可对外设端口进行操作(包括算术逻辑运算)。这样的计算机就没有输入/输出指令。
(6)字符串处理
字符串处理指令实现对字符串的非数值处理,包括:字符串的传送、字符串比较、字符串查询、字符串转换等。
(7)其他
其他包括特权指令、多处理机指令、多媒体指令等。特权指令是用于系统资源分配和管理的指令。例如,检测用户的访问权限,修改段表、页表,改变系统的工作模式,任务的创建和切换等。多处理机指令是专门为支持多处理机系统而设置的指令。多媒体指令是专门为处理多媒体数据而设置的指令。例如,Pentium处理器的MMX指令。