指令系统
一:指令系统的发展与性能要求
1、指令系统及其发展
一台计算机中所有机器指令的集合,称为这台计算机的指令系统(指令集)。指令系统是表征一台计算机性能的重要因素,它的格式与功能不仅影响到机器的硬件结构,而且影响到系统软件。因为指令是设计一台计算机的硬件与低层软件的接口。
2、指令系统性能的要求
指令系统的性能决定了计算机的基本功能,它的设计直接关系到计算机的硬件结构和用户的需要。
一个完善的指令系统应满足如下四方面的要求:
①完备性:用指令系统编写各种程序时,指令系统直接提供的指令足够使用,而不必用软件来实现。
②有效性:利用该指令系统所编写的程序能够在计算机上高效率运行,主要表现在程序占据存储空间小、执行速度快。
③规整性:规整性包括指令系统的对称性、匀齐性、指令格式和数据格式的一致性。
④兼容性:系列机各机种之间具有相同的基本结构和共同的基本指令集,低档机上运行的软件可以在高档机上运行,即做到 “向下兼容” 。
3、常见的指令集
x86 指令集(复杂指令集)
ARM 指令集(精简指令集)
MIPX指令集(复杂指令集):在1990年代是比较先进的一个指令集,当时就能够支持 64位 的计算机系统,但是由于市场没做好,基本破产。现在只有中科院在做,基本上已经成为我们自己的具有独立自主知识产权的一款指令集。
risc - V指令集(复杂指令集)
二:指令格式
1、指令字长度
指令字长度:一个指令字中包含二进制代码的位数。
机器字长:计算机能直接处理的二进制数据的位数,它决定了计算机的运算精度。(64位操作系统、32位操作系统)。
单字长指令:指令字长等于机器字长度的指令。
半字长指令:指令字长等于半个机器字长度的指令。
双字长指令:指令字长等于两个机器字长度的指令。
多字长指令:指令字长等于几个机器字长度的指令。
使用多字长指令,目的在于提供足够的地址位来解决访问内存任何单元的寻址问题。其主要缺点是必须两次或多次访问内存才能取出一整条指令,降低了的运算速度,又占用了更多的存储空间。
2、操作码
设计计算机时,对指令系统的每一条指令都要规定一个操作码。
指令的操作码 OP 表示该指令应进行什么性质的操作,如进行加法、减法、乘法、除法、取数、存数等。不同的指令用操作码字段的不同编码来表示,每一种编码代表一 种指令。例如,操作码 001 可以规定为加法操作;操作码 010 可以规定为减法操作;而操作码 110 可以规定为取数操作等。CPU中的专门电路用来解释每个操作码,因此机器就能执行操作码所表示的操作。
按操作码的位数是否固定可分为:
-固定长度的操作码:所有指令长度均相同。特点是控制简单,速度
快,适用于指令条数不多的场合。
-可变长度的操作码:频繁使用的指令用位数较少的操作码,不常使
用的指令可利用操作码扩展技术进行扩展。
精简指令集一般使用固定长度的操作码,复杂指令集一般使用可变长度的操作码。
指令助记符:
3、地址码
地址码其实还是地址,CPU 访问存储器获取地址,那么这个地址究竟是出自哪里呢?其实归根结底是由程序员设计的指令集给出的。
根据一条指令中有几个操作数地址,可将该指令称为几操作数指令或几地址指令。三地址指令是最早的计算机指令,然后又发展成二地址指令、一地址指令、零地址指令。
三地址指令
一般的操作数有被操作数、操作数及操作结果这三种数,因而就形成了三地址指令格式。
其中操作数A1、A2、A3可以是内存单元的地址,也可以是运算器中通用寄存器的地址,如果三地址指令中A1、A2、A3都是内存单元,则指令需要4次访问存储器,存储器的寻址范围28 = 256。为了提高指令执行的速度和扩大寻址范围出现了两地址指令和一地址指令。
二地址指令
二地址指令常称为双操作数指令,它的两个地址码字段分别指明参与操作的两个数在内存中或运算器中通用寄存器的地址,A1作存放操作结果的地址,称为目的操作数(D),A2称为源操作数(S)。
举例:
ADD R0,R3(RR型)
ADD R0,100H(RS型)
ADD 100H,200H(SS型),一般不会采用,因为访问内存的次数太多,影响效率。
转换:
MOV R0,200H
ADD 100H,R0
一地址指令
一地址指令常称为单操作数指令。通常这种指令以运算器中累加寄存器 AC 中的数据为被操作数,指令字的地址码字段所指明的数为操作数,操作结果又放回累加寄存器 AC 中。(AC:通用寄存器中的第一个R0)
零地址指令
零地址指令的指令字中只有操作码,而没有地址码。例如停机指令就不需要地址码。因为停机指令不需要操作数。
三:指令和数据的寻址方式
1、指令寻址
顺序寻址
由于指令在内存中是顺序存放,当执行一段程序时,通常是一条指令接一条指令的顺序执行。为了能够指示下一条欲执行指令的指令地址,CPU内部有
一个程序计数器 PC (指令指针寄存器IP),每执行一条指令其值自动加1,指向下一条欲执行指令的指令地址。这种程序顺序执行的过程我们称为指令的顺序寻址。PC 就是用来做指令追踪
跳跃寻址方式
当程序执行循环指令或者转移指令时,指令的寻址就采取跳跃寻址方式。所谓跳跃,是指下条指令的地址不是由程序计数器PC加1产生,而是将本条指令给出的目标地址装入PC作为下条指令的地址。
2、操作数寻址
形式地址是指令字中的地址,有效地址是操作数的内存地址。寻址过程就是通过寻址特征位把操作数的形式地址,变换为有效地址的过程。
立即寻址
地址码部分的形式地址 A就是操作数D,而不是操作数的地址
寻址特征位:#
例:mov R0,#10H
把二进制数10直接取出到R0中
直接寻址
直接内存寻址特点是:在指令格式的形式地址 A 中直接指出操作数的有效地址EA。由于操作数地址直接给出而不需要变换,称为直接寻址方式。
寻址特征位:无
例:mov R0,10H
把内存编号为 10 里的内容取出到R0中。
间接寻址(基本不采用,效率太低)
间接寻址的情况下,指令地址字段中的形式地址A不是操作数的有效地
址EA,A单元的内容才是操作数的有效地址EA。虽然可以扩大寻址范围,但是需要至少访问 2 次内存。效率低下。
寄存器寻址
当操作数不放在内存中,而是放在CPU的通用寄存器中时,可采用寄存器寻址方式。此时指令中给出的操作数地址不是内存的地址单元号,而是通用寄存器的编号。
优点:执行阶段只访问寄存器,执行速度快。寄存器的个数有限,所以指令 的字长一般都很短。
寻址特征位:Ri
例:mov R0,R1
把寄存器R1中的内容取出到R0中
寄存器间接寻址
寄存器间接寻址方式与寄存器寻址方式的区别在于:指令中的操作数地址指示出的寄存器中内容不是操作数,而是操作数的有效地址EA。
便于编制循环程序
寻址特征位:@或()
例:mov R0,@R1 或 mov R0,(R1)
立即寻址、直接寻址、寄存器寻址、寄存器间接寻址这四种寻址方式基本上在所有的指令集架构中都兼容。这四种是最基本的寻址方式。
那么存在这么多的寻址方式究竟有什么意义呢?
这就相当于是一个语法问题。因为计算机可能都采用不同的指令集架构,x86、ARM,那么它们所支持的寻址方式都会有所不同。CPU在操作内存,读取数据时采用的都是本机的一套寻址方式。
例题
下面结合上述四种最基本的寻址方式列出一些操作数寻址的例题:
首先我们要知道一个原则。在汇编语言中,和一些高级语言不同的是,我们首先考虑的不是定义变量的问题。而是要考虑要使用多少个寄存器来解决这个问题。
偏移寻址
寻址特征位:+
例:mov R0,@(BR + 100H)
1、相对寻址方式
相对寻址是把程序计数器PC的内容加上形式地址A形成操作数的有效地址。程序计数器的内容就是当前指令的地址.形式地址A通常称为偏移量。
2、基址寻址方式
基址寻址方式是将CPU中基址寄存器的内容加上指令格式中的形式地址A而形成操作数的有效地址EA。
它的优点是可以扩大寻址能力。同形式地址相比,基址寄存器的位数可以设置得很长,从而可以在较大的存储空间中寻址。在程序的执行过程中BR内容不变,由操作系统指定,形式地址A可变。
3、变址寻址方式
变址寻址方式与基址寻址方式计算有效地址的方法十分相似,它把CPU中某个变址寄存器的内容与形式地址A相加来形成操作数有效地址。
堆栈寻址
四:例题
例:某16位机器所使用的指令格式和寻址方式如下所示,该机有两个20位
基址寄存器,四个16位变址寄存器,十六个16位通用寄存器,指令汇编格
式中的S和D都是指通用寄存器,M指主存中的一个单元。三种指令的操作码
分别是MOV为0AH ,LAD为3CH,STO为1BH 。
说明:MOV是传送指令,LAD为读数指令,STO为写数指令。
(1)分析三种指令的指令格式与寻址方式特点。
该指令是单字长二地址指令,是寄存器-寄存器型,源寄存器S由0~3位指定,目标寄存器D由4~7位指定。
该指令是双字长二地址指令,寄存器—存储器型,其中目标寄存器D由4~7
位指定,存储器由指令中给出的20位地址由直接内存寻址决定。
该指令是双字长二地址指令,是寄存器—存储器型,源寄存器S由4~7位指
定,存储器M由采用0~3位指定的变址寄存器加位移量的变址方式得到或者
由8~9位指定的基址寄存器加位移量的基址寻址得到。
(2)CPU完成哪一种操作所花时间最短?哪一种操作所花时间最长?第二
种指令的执行时间有时会等于第三种指令的执行时间吗?
• CPU完成第一种指令所花时间最短,因为是RR型指令,不需要访问存储器
• CPU完成第三种指令所花时间最长,因为是RS型指令需要访问存储器,同
时要进行寻址方式的变换运算,基址寄存器的内容加位移量或变址寄存器
内容加位移量,这也需要时间。
(3)下列情况下每个十六进制指令字分别代表什么操作?其中如果有编码
不正确,如何改正才能成为合法指令?
6FD6H