目录
1.指令格式
指令的定义
指令(又称机器指令): 是指示计算机执行某种操作的命令,是计算机运行的最小功能单位
一台计算机的所有指令的集合构成该机的指令系统,也称指令集
注:一台计算机只能执行自己指令系统中的指令,不能执行其他系统的指令
指令格式
一条指令就是机器语言的一个语句,它是一组有意义的二进制代码
一条指令通常要包括操作码字段和地址码字段两部分:
操作码:用户要干什么?
地址码:对谁操作?
一条指令可能包含0个,1个,2个,3个,4个地址码
根据地址码数目不同,可以将指令分为零地址指令,一地址指令,二地址指令,三地址指令...
零地址指令:
1)不需要操作数,如空操作,停机,关中断等指令
2)堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压回栈顶
一地址指令:
1)只需要单操作数,如 +1,-1,取反,求补等
指令含义:OP(A1)-》 A1
完成一条指令需要3次访存:取址 -》 读A1 -》写A1
2)需要两个操作数,但其中一个操作数隐含在某个寄存器(如隐含在ACC)
指令含义:(ACC)OP(A1) -》ACC
完成一条指令需要2次访存:取指 -》 读A1
注:A1指某个主存地址,(A1)表示A1所指向的地址中的内容
二,三地址指令:
二地址指令:常用于需要两个操作数的算数运算,逻辑运算相关指令
指令含义:(A1)OP(A2) -》A1
完成一条指令需要访存4次,取指 -》读A1 -》 读A2 -》 写A1
三地址指令:常用于需要两个操作数的算数运算,逻辑运算相关指令
指令含义:(A1)OP(A2) -》A3
完成一条指令需要访存4次,取指 -》读A1 -》读A2 -》写A3
四地址指令:
指令含义:(A1)OP(A2) -》A3,A4 = 下一条将要执行指令的地址
完成一条指令需要访存4次,取指 -》读A1 -》读A2 -》写A3
正常情况下:取指令之后 PC+1,执行下一条指令
四地址指令:执行指令后,将PC的值修改为A4所指地址
指令-按指令长度分类
指令字长:一条指令的总长度(可能会变)
机器字长:CPU进行一次整数运算所能处理的二进制位数(通常与ALU直接相关)
存储字长:一个存储单元中的二进制代码位数(通常和MDR位数相同)
半字长指令,单字长指令,双字长指令,指令字长会影响取指令所需时间
定长指令字结构:指令系统中所有指令的长度都相等
变长指令字结构:指令系统中各种指令的长度不等
指令-按操作码长度分类
定长操作码:指令系统中所有指令的操作码长度都相同
n位 -》2^n 条指令
优点:控制器的译码电路设计简单
缺点:灵活性较低
可变长操作码:指令系统中各指令的操作码长度可变
优点:控制器的译码电路设计复杂
缺点:灵活性较高
定长指令字结构 + 可变长操作码 -》 扩展操作码指令格式
指令-按操作类型分类
数据传送类
1.数据传送
LOAD 作用:把存储器中的数据放到寄存器中
STORE 作用:把寄存器中的数据放到存储器中
进行主存与CPU之间的数据传送
程序控制类
2. 算术逻辑操作
算术:+,-,*,/,+1,-1,求补,浮点数运算,十进制运算
逻辑:与,或,非,异或,位操作,位清楚,位求反
3.移位操作
算术移位,逻辑移位,循环移位(带进位和不带进位)
4.转移操作
无条件转移 JMP
条件转移:
JZ:结果为0;JO:结果溢出;JC:结果有进位
调用和返回 CALL和RETURN
陷阱(Trap)与陷阱指令
改变程序执行的顺序
输入输出类(I\O)
5.输入输出操作
CPU寄存器与IO端口之间的数据传送(端口即IO接口中的寄存器)
进行CPU和I\O设备之间的数据传送
2.扩展操作码指令格式
不同地址数的指令使用不同长度的操作码
扩展操作码
指令字长为16位,每个地址码占4位
前4位为基本操作码字段OP,另有3个4位长的地址字长字段A1,A2和A3
4位基本操作码若全部用于三地址指令,则有16条
但至少须将1111留作扩展操作码之用,即三地址指令为15条
1111 1111 留作扩展操作码之用,二地址指令为15条
1111 1111 1111留作扩展操作码之用,一地址指令为15条
零地址指令为16条
在设计扩展操作码指令格式时,必须注意一下两点:
1)不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同
2)各指令的操作码一定不能重复
通常情况下,对使用频率较高的指令,分配较低的操作码;对使用频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和分析的时间
扩展操作码
设地址长度为n,上一层留出m种状态,下一层可扩展出m * 2^n种状态
指令操作码
操作码指出指令中该指令应该执行什么性质的操作和具有何种功能
操作码是识别指令、了解指令功能与区分操作数地址内容的组成和使用方法等的关键信息。例如,指出是算术加运算,还是减运算;是程序转移,还是返回操作
操作码分类:
定长操作码:
在指令字的最高位部分分配固定的若干位(定长)表示操作码
一般n位操作码字段的指令系统最大能够表示2^n条指令
优:定长操作码对于简化计算机硬件设计,提高指令译码和识别速度很有利
缺:指令数量增加时会占用更多固定位,留给表示操作数地址的位数受限
扩展操作码(不定长操作码):
全部指令的操作码字段的位数不固定,且分散地放在指令字的不同位置上
最常见的变长操作码方法是扩展操作码,使操作码的长度随地址码的减少而增加,不同地址数的指令可以具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长
优:在指令字长有限的前提下仍保持比较丰富的指令种类
缺:增加了指令译码和分析的难度,使控制器的设计复杂化
3.指令寻址
指令寻址(下一条欲执行指令的地址):顺序寻址和跳跃寻址
始终由程序计数器PC给出
顺序寻址
1)主存按字编址
该系统采用定长指令字结构 指令字长 = 存储字长 = 16bit = 2B
(PC) + 1 -》 PC
2)主存按字节编址
该系统采用定长指令字结构 指令字长 = 存储字长 = 16bit = 2B
(PC)+ 2 -》 PC
3)主存按字节编址
该系统采用变长指令字结构
指令字长 = 存储字长 = 16bit = 2B
读入一个字,根据操作码判断这条指令的总字节数n,修改PC的值
(PC)+ n -》 PC
根据指令的类型,CPU可能还要进行多次访存,每次读入一个字
顺序寻址 (PC)+ "1" -》 PC
1:理解为1个指令字长,实际加的值会因指令长度,编址方式而不同
跳跃寻址
由转移指令指出
JMP:无条件转移,把PC中的内容改成7
注:每一条指令的执行周期都分为"取指令","执行指令"两个阶段
4.数据寻址
确定本条指令的地址码指明的真实地址
指令:操作码 + 地址码(寻址特征 + 形式地址)
假设指令字长 = 机器字长 = 存储字长
直接寻址:
指令字中的形式地址A就是操作数的真实地址EA,即EA = A
一条指令的执行:取指令 访存1次,执行指令 访存1次,暂不考虑存结果共访存2次
优点:简单,指令执行阶段仅访问一次主存,不需要专门设计操作数的地址
缺点:A的位数决定了该指令操作数的寻址范围,操作数的地址不易修改
间接寻址方式:
一次间接寻址
指令的地址字段给出的形式地址不是操作数的真正地址,而操作数有效地址所在存储单元的地址,即EA = (A)
一条指令的执行:取指令 访存1次,执行指令 访存2次,暂不考虑结果,共访存3次
二次间接寻址
优点:
1)可扩大寻址范围(有效地址EA的位数大于形成地址A的位数)
2)便于编制程序(用间接寻址可以方便地完成子程序返回)
缺点:
指令在执行阶段要多次访存(一次间距需两次访存,多次寻址需根据存储字的最高位确定几次访存)
寄存器寻址:
直接寻址
在指令字中直接给出操作数所在的寄存器编号,即EA = Ri,其操作数在由Ri所指的寄存器内
一条指令的执行:取指令 访存1次 执行指令 访存0次,暂不考虑存结果共访存1次
优点:
指令在执行阶段不访问主存,只访问寄存器,指令字短且执行速度快,支持矩阵运算
缺点:
寄存器价格昂贵,计算机中寄存器个数有限
间接寻址
寄存器间接寻址:寄存器Ri中给出的不是一个操作数,而是操作数所在主存单元的地址,即EA = (Ri)
一条指令的执行: 取指令 访存1次,执行指令 访存1次,暂不考虑存结果,共访存2次
特点:与一般的间接寻址相比速度更快,但指令的执行阶段需要访问主存(因为操作数在主存中)
隐含寻址:
不是明显地给出操作数的地址,而是在指令中隐含着操作数的地址
优点:有利于缩短指令字长
缺点:需增加存储操作数或隐含地址的硬件
立即寻址:
形式地址A就是操作数本身,又称立即数,一般采用补码形式,#表示立即寻址特征
一条指令的执行:
取指令 访存1次 执行指令 访存0次 暂不考虑存结果 共访存1次
优点:
指令执行阶段不访问主存,指令执行时间最短
缺点:
A的位数限制了立即数的范围
5.偏移寻址
基址寻址:以程序的起始存放地址作为"起点" EA = (BR) + A
变址寻址:程序员自己决定从哪里作为"起点" EA = (IX) + A
相对寻址:以程序计数器PC所指地址作为"起点" EA = (PC) + A
基址寻址:
将CPU中的基址寄存器(BR)的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即EA = (BR)+ A
采用专用的寄存器BR作为基址寄存器
采用通用寄存器作为基址寄存器
R0指明指令中要将那个通用寄存器作为基址寄存器
根据通用寄存器的总数判断要用几个Bit来指明寄存器
优点:
1)便于程序"浮动",方便实现多道程序并发运行
2)可扩大寻址范围(基址寄存器的位数大于形式地址A的位数)
3)用户不比考虑自己程序存于主存的哪一个空间区域,故有利于多道程序设计,以及可用于编制浮动程序(整个程序在内存里边浮动)
注:程序运行前,CPU将BR的值修改为该程序的起始地址(存放在PCB中)
基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。在程序的执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)
当采用通用寄存器作为基址寄存器时,可有用户决定那个寄存器作为基址寄存器,但其内容仍由操作系统确定
变址寻址:
有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和,EA = (IX)+ A,
其中IX可为变址寄存器(专用),也可用通用寄存器作为变址寄存器
注:变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变
(IX作为偏移量),形式地址A不变(作为基地址)
变址寻址的作用
优点:
在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序
基址&变址 复合寻址:
先基地址后变址寻址:EA = (IX) + ((BR) + A)
注:实际应用中往往需要多种寻址方式复合使用
相对寻址:
把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA = (PC) + A
其中A是相对于PC所指地址的位移量,可正可负,补码表示
优点:
1)操作数的地址不是固定的,它随着PC值的变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序浮动(一段代码在程序内部的浮动)
2)这段代码在程序内浮动时不用更改跳转指令的地址码
3)相对寻址广泛应用于转移指令
注:ACC加法指令的地址码,可采用"分段"方式解决,即代码段,数据段分开
总结:
硬件实现数的"比较"
1)通过"CMP指令"比较a和b,实质是用 a - b
2)相减的结果信息会记录在程序状态寄存器中(PSW)
3)根据PSW的某几个标记位进行条件判断,来决定是否转移
PSW中有几个比特位记录上次运算的结果
1)进位/借位标志CF:最高位有进位/借位时 CF = 1
2)零标志 ZF:运算结果0 则 ZF = 1,否则ZF = 0
3)符号标志 SF:运算结果为负,SF = 1,否则为0
4)溢出标志 OF:运算结果有溢出 OF = 1 否则为 0
6.堆栈寻址
操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址
堆栈是寄存器(或专用寄存器)中一块特定的按"后进先出(LIFO)"原则管理的存储区,该存储区中被读\写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)
硬堆栈 --- 成本高
指令执行时不访存,速度快
软堆栈 --- 成本低
指令执行时访存,速度慢
7.CISC和RISC
CISC:
设计思路:一条指令完成一个复杂的基本功能
代表:x86架构,主要用于笔记本、台式机等
比如设计一套能实现整数、矩阵加/减/乘运算的指令集
CISC的思路:除了提供整数的加减乘指令除之外,还提供矩阵的加法指令、矩阵的减法指令、矩阵的乘法指令
一条指令可以由一个专门的电路完成有的复杂指令用纯硬件实现很困难→采用“存储程序”的设计思想,由一个比较通用的电路配合存储部件完成一条指令
80-20规律:典型程序中80%的语句仅仅使用处理机中20%的指令
RISC:
设计思路:一条指令完成一个基本"动作",多条指令组合完成一个复杂的基本功能
代表:ARM架构,主要用于手机、平板等
RISC的思路:只提供整数的加减乘指令
一条指令一个电路,电路设计相对简单,功耗更低
对比: