650 likes | 740 Vues
第三章 指令系统. CPU 的主要工作是执行指令,指令是指挥计算机执行某些操作的命令,一台计算机所有指令的集合构成该计算机的指令系统。指令和指令系统是计算机最基本的概念. 指令系统是计算机的主要属性,位于硬件和软件的交界面上,它既是硬件设计的依据,又是软件设计的基础。. 本章主要内容. 指令格式 操作码的扩展、地址码的结构 常见的寻址方式 指令的类型. OP. Addr. 一、机器指令的格式. 一条指令就是机器语言的一个语句,由一组二进制代码来表示。一条指令由两部分构成:. 操作码 :指明指令的操作性质及功能。 地址码 :指明操作数的地址。
E N D
第三章 指令系统 CPU的主要工作是执行指令,指令是指挥计算机执行某些操作的命令,一台计算机所有指令的集合构成该计算机的指令系统。指令和指令系统是计算机最基本的概念. 指令系统是计算机的主要属性,位于硬件和软件的交界面上,它既是硬件设计的依据,又是软件设计的基础。
本章主要内容 • 指令格式 • 操作码的扩展、地址码的结构 • 常见的寻址方式 • 指令的类型
OP Addr 一、机器指令的格式 • 一条指令就是机器语言的一个语句,由一组二进制代码来表示。一条指令由两部分构成: 操作码:指明指令的操作性质及功能。 地址码:指明操作数的地址。 • 一条指令必须有一个操作码,可能包含几个地址码。 • 指令涉及指令长度、操作码结构、地址码结构等问题。
1、指令长度 • 指令长度是指一条指令中所包含的二进制代码的位数,它取决于操作码字段的长度、操作数地址的个数及长度。一般希望指令长度短一些。 • 指令长度与机器字长没有固定的关系。指令长度可以等于机器字长,也可以大于或小于机器字长。 • 在一个指令系统中,若所有指令的长度都相等,称为定长指令字结构;若各种指令的长度随指令功能不同而不同,称为变长指令字结构。
2、操作码 • 指令系统中的每一条指令都有一个唯一确定的操作码,指令不同,其操作码的编码也不同。 • 操作码字段的位数取决于计算机指令系统的规模。通常,希望用尽可能短的操作码字段来表达全部指令。于是,形成了操作码结构设计的不同方法。 • 指令操作码的编码可分为定长编码和变长编码。
定长编码 • 定长编码方式是最简单的一种操作码编码方式,操作码的位数和位置固定,但指令长度不固定。操作码的位数越多,所能表示的操作种类就越多。 • 操作码不同,所涉及的操作数的个数也不完全相同,所以指令的长度会随操作码的不同而变化。 • 例如,IBM370机就是采用这种定长操作码格式。 IBM 370机(字长32位)的指令可分为三种不同的长度,不论指令的长度有多少位,其中的操作码字段一律都是8位。 • 特点:字段规整、译码简单。
IBM 370机的指令格式 OP一样长,操 作码译码器设计 就简单多了。
变长编码 • 变长编码是一种操作码长度不固定,而指令长度固定的设计方法。操作码分散在指令字的不同位置上。 • 例如:PDP-11机(字长16位)的指令分为单字长、两字长、三字长三种,其中单字长指令的操作码字段占4~16位不等,可遍及整个指令长度。 • 特点:操作码字段位数不固定将增加指令译码难度,使控制器的设计复杂化。但是,它有效地利用了指令中的每个二进制位。
PDP-11机的指令格式 OP不一样长, 控制器设计变 得难多了。
15 12 11 8 7 4 3 0 OP A1 A2 A3 指令操作码的扩展技术 • 变长操作码常常采用扩展操作码的方法来设计。 • 扩展思路:让地址码个数多的指令,操作码字段短些;让地址码个数少的指令,操作码字段长些。 • 假设,某机器指令长16位,包括一个操作码字段和三个地址字段,其中操作码字段4位,每个地址字段也是4位。其格式如下: • 如果按照定长编码的方法,4位操作码字段最多只能表示16条不同的三地址指令。
0000 XXXX YYYY ZZZZ 1110 XXXX YYYY ZZZZ … 15条三地址指令 1111 0000 XXXX YYYY 1111 1110 XXXX YYYY 15条二地址指令 … 1111 1111 0000 XXXX 1111 1111 1110 XXXX 15条一地址指令 … 1111 1111 1111 0000 1111 1111 1111 1111 … 16条零地址指令 指令操作码的扩展技术 扩展窗口 扩展窗口 扩展窗口
3、地址码 • 根据一条指令中有几个操作数地址,可将该指令称为几地址指令。 • 一般的指令有被操作数、操作数以及操作结果这三个数,因而就形成了三地址指令格式,这也是早期计算机指令的基本格式。 • 在三地址格式的基础上,后来又发展成了二地址格式、一地址格式和零地址格式。
OP A1 A2 A3 三地址指令 • 格式: • 执行的操作:(A1) OP (A2) → A3 • A1为被操作数地址, A2为操作数地址, A3为结果的存放地址。 • A1、A2、A3可以是内存单元地址,也可以是运算器中的通用寄存器。如果全是内存中的单元地址,则执行一条三地址指令至少需要访问4次主存。
OP A1 A2 二地址指令 • 格式: • 执行的操作:(A1) OP (A2) → A1 • A1为目的操作数地址,兼做存放结果的地址;A2为源操作数地址。(A1原先的值无需保存) • A1、A2可以是内存中的单元地址,也可以是运算器中的通用寄存器。如果是内存中的单元地址,则执行一条二地址指令至少要访问4次主存.
OP A1 一地址指令 计算机中有许多寄存器 其中有一个称为累加寄 存器(AC),存放操作数 • 格式: • 执行的操作:(AC) OP (A1) → AC • 这种指令以累加寄存器AC中的数为被操作数,指令中地址码字段所指明的数为操作数,操作结果又放回累加寄存器AC中(隐含约定AC)。 • A1可以是内存中的单元地址,也可以是运算器中的通用寄存器。如果是内存中的单元地址,则执行一条一地址指令至少需要访问2次主存。
OP 零地址指令 • 格式: • 零地址指令只有操作码,而没有地址码。 • 例如下面的情况不需要地址码: • 指令不需要操作数,例如停机指令就没有操作数. • 操作数隐含约定在累加器AC中。 • 操作数隐含指定在堆栈中,例如堆栈计算机,零地址指令的操作数从堆栈中获得。
简化地址结构与减少地址码字段的位数 • 简化地址结构的途径:隐含约定地址 • PC代替指令中的后继指令地址 • 结果存放在操作数地址 • 操作数或结果约定在AC中 • 约定所有地址的位置,如零地址指令 • 减少地址码字段位数的途径: • 采用隐含约定地址减少地址数,减少位数 • 采用寄存器寻址、寄存器间接寻址,减少位数
按操作数的物理位置分类 • 第一种是访问内存的指令格式,我们称这类指令为存储器—存储器型指令(SS) 。 • 这种指令操作时都涉及内存单元,参与操作的数都放在内存里。从内存单元取操作数,操作结果放回内存中。 • 机器执行这种指令需要多次访问内存,执行速度慢。 • 第二种是访问寄存器的指令格式,我们称这类指令为寄存器—寄存器型指令(RR) 。 • 机器执行这类指令过程中,需要多个通用寄存器和个别专用寄存器。从寄存器中取操作数,把结果放回寄存器,因此,不需要访问内存。 • 机器执行寄存器—寄存器型指令的速度很快。 • 第三种类型是寄存器—存储器型指令(RS) 。 • 执行此类指令既需要访问内存单元,又要访问寄存器。 • 执行速度介于第一种和第二种之间。
二、指令和数据的寻址方式 • 存储器既可以存放指令,又可以存放数据。当某指令或操作数存放在某个存储单元时,该存储单元的编号,就是该指令或操作数在存储器中的地址。 • 所谓寻址就是寻找操作数的地址或下一条要执行的指令的地址,而形成操作数或指令地址的方式,称为寻址方式。寻址方式分为两类,即指令寻址方式和数据寻址方式。
1、指令寻址方式 寻找下一条将要执行的指令的地址称为指令寻址。指令寻址比较简单,它又可以细分为顺序寻址和跳跃寻址。
顺序寻址方式 计算机中有许多寄存器 其中有一个称为程序计数器(PC),放指令地址 • 指令在内存中是顺序存放的,当执行一段程序时,通常是一条指令接一条指令地顺序执行。 • CPU顺序取出指令、执行指令的过程我们称为指令的顺序寻址方式。 • 必须有一个跟踪程序执行顺序的措施,那就是程序计数器PC。程序计数器PC用来记录指令的顺序号,该顺序号是指令在内存中的地址。
顺序寻址方式 • 下图是指令顺序寻址方式的示意图: 程序启动时,由操作系统把程序的首地址放入程序计数器PC中。
跳跃寻址方式 • 当程序转移执行的顺序时,指令的寻址就采用跳跃寻址方式。所谓跳跃,是指下条指令的地址不是由程序计数器给出,而是由转移指令给出。 • 跳跃寻址时,转移地址形成方式有3种,直接寻址、间接寻址、相对寻址。它们与数据寻址方式中的直接寻址、间接寻址、和相对寻址完全相同,只不过寻找的不是操作数的有效地址而是转移的有效地址,具体内容将在数据寻址中详细介绍。 • 采用指令跳跃寻址方式,可以实现程序转移和公共程序调用等功能。例如,指令系统的各种条件转移或无条件转移指令,就是采用跳跃寻址实现程序转移。
跳跃寻址方式 • 下图是指令跳跃寻址的示意图:
2、数据寻址方式 • 根据指令中地址码字段的内容(形式地址)形成操作数有效地址的方式,称为数据寻址方式。 形式地址A有效地址EA • 数据寻址方式的种类很多,但最终目的是寻找所需要的操作数。 • 寻址方式与操作数可能存放的地方有直接关系。 寻址 方式
操作数可能存放的地方 • 操作数可能存在的地方有: • 操作数包含在指令中 。 • 操作数在CPU的某个寄存器中 。 • 操作数在主存中 。 • 操作数在堆栈中 。 • 操作数在某个输入/输出端口中 。 • 由于各种机器的结构不同、数据的来源不同,从而形成了各种不同的数据寻址方式。下面介绍一些比较典型而且常用的寻址方式。
隐含寻址 • 隐含寻址指令,不是明显地给出操作数的地址,而是在指令中隐含着操作数的地址,即采用隐含约定的方式实现寻址。 • 例如,单地址指令格式:ADD Addr 明显给出的只是第一操作数的地址Addr,该地址中的数据跟谁加?约定累加器AC为第二操作数地址,它并不出现在指令的地址码字段中。因此,累加器AC对单地址指令格式来说是隐含地址。
立即寻址 • 指令的地址码字段给出的不是操作数的地址,而是操作数本身,这种寻址方式称为立即寻址。 • 例如:MOV CX,8 中,8的寻址方式就是立即寻址方式,8称为立即数。 • 立即寻址指令的执行时间很短,因为数据包含在指令中,指令和操作数同时取出,不需要再次访问内存。 • 在程序执行过程中,立即数不能被修改,灵活性差;一般用来提供初始值。
直接寻址 • 指令中地址码字段直接给出操作数的有效地址,形式地址就是有效地址,这种寻址方式称为直接寻址方式。直接寻址方式给出的地址是绝对地址,也叫绝对寻址方式。 操作数 S=(A) • 直接寻址不需寻址运算,便于硬件实现,但寻址空间受到限制。 形式地址=有效地址
间接寻址 • 间接寻址意味着指令中给出的地址A不是操作数的地址,而是存放操作数地址的主存单元的地址,简称操作数地址的地址。通常在指令格式中划出一位作为直接或间接寻址标志位。 操作数 S =((A)) • 间接寻址方式是早期计算机经常采用的寻址方式,由于两次访存,影响指令执行速度,但能够用同一条指令指向不同的主存单元。 原来是地址的地址…
寄存器寻址 • 寄存器寻址指令的地址码给出的是CPU中通用寄存器的编号,该编号指定的寄存器里存放着操作数。 操作数 S=(Ri) • 特点: 1、从寄存器取数比从内存取数要快; 2、表示寄存器的地址码字段比表示内存地址的地址码字段要短.
寄存器间接寻址 • 指令中的地址码给出某一通用寄存器的编号,该编号指定的寄存器中存放着操作数的有效地址,而操作数存放在内存单元中。间接寻址需要用寻址标志位指明。 操作数 S=((Ri)) • 指令较短,只需一次访存,比间接寻址要快。 寄存器里放有效地址
相对寻址 • 程序计数器PC的内容加上指令中形式地址D,形成操作数的有效地址,这种寻址方式为相对寻址。相对寻址需要用寻址标志位指明。 • 形式地址D常称为偏移量,这个偏移量可以是正数,也可以是负数。 • 优点:操作数地址与指令地址总是差一个固定的值,因而所编写的程序是浮动的,可以放在内存的任何地方执行而不需修改。 • 有效地址为:EA = (PC) + D 浮动程序在内存任 何地方都能运行!
基址寻址 计算机中有许多寄存器 其中有的用作基址寄存器(Rb),存放基址值。 • 基址寄存器Rb的内容与指令中的形式地址D相加,形成操作数有效地址,这种寻址方式称为基址寻址,需要寻址标志位. • 基址寄存器存放基地址,形式地址给出偏移量且可正可负。 • 有效地址:EA=(Rb)+D • 基址寻址面向系统,用于逻辑地址和物理地址的变换,实现程序在内存中的再定位和扩大寻址范围。如多用户管理。 对用户而言,基址寄存器提供 基准值、是固定的;形式地址 为偏移量、是可变的。
变址寻址 计算机中有许多寄存器 其中有的用作变址寄存器(Rx),存放变址值。 • 变址寻址是把CPU中的变址寄存器Rx的内容与指令中给出的形式地址D相加,形成操作数有效地址的寻址方式。变址寻址需要用寻址标志位指明。 • 有效地址:EA = (Rx) + D • 变址寻址和基址寻址计算有效地址的算法相同,但用法有区别。 • 变址寄存器提供修改量、是可变的,而指令中的形式地址提供基准值、是固定的;变址寻址是面向用户的,目的是实现有效地址的规律性变化。 从名字上就能听出来: 基址寄存器内容不能变, 变址寄存器内容可变。 例如,数组元素的访问。
页面寻址 在内存、外存交换数据时,一般以数据块为单位,也就有了页面寻址 • 把整个主存空间分成若干大小相等的块,每块称为一页,每页都有自己的编号,称为页地址。 • 在一页中,有若干主存单元,每个单元也有自己的编号,称为页内地址。 • 这样划分后,存储器的有效地址被分为两部分,一部分为页面地址,一部分为页内地址。 • 页内地址由指令的形式地址直接提供,通过与页面地址的简单拼接得到有效地址,从而实现从逻辑地址到物理地址的转换。 • 如此类似,学生的学号可由班号和编号组成,班号对应页号,编号对应页内地址,通过班号和编号的拼接构成学号。
有效地址生成过程 • EA=0 // A=A • EA=(PC)H // A=A • EA=(RP)// A=A
3、综合说明 • 除以上寻址方式外,还有位寻址、块寻址、段寻址、堆栈寻址(堆栈寻址后面还要介绍)等。 • 几种寻址方式可以组合使用。如基址变址寻址,就是基址寻址和变址寻址的组合。 • 一条指令有两个或两个以上地址码时,可以采用不同的寻址方式。例如,源地址采用寄存器寻址方式,而目的地址采用间接寻址方式。 • 为了区分不同的寻址方式,需要在指令中给出寻址标志位加以区别,也可以采用隐含约定的方式来规定。一位标志位能区分2种寻址方式,n个寻址特征位能区分2n种寻址方式。
三、堆栈寻址方式 • 堆栈与其它形式的存储器之间的差别在于数据的存取方式和寻址方式有所不同。 • 所谓堆栈是指按照特定顺序进行存取的存储区域,堆栈的特点是“先进后出”。在存储器堆栈中,作为起点的一端被固定,称为栈底;另一端随操作的进行而浮动,称为栈顶。堆栈操作始终在栈顶进行。 • 计算机中常用的有两种堆栈结构:寄存器堆栈和存储器堆栈。
1、寄存器堆栈 • 用一组专门的寄存器构成寄存器堆栈 。 • 寄存器堆栈的特点: • 寄存器组中各寄存器是互相连接的,它们之间具有对应位自动推移功能。 • 数据传送都是在栈顶和某个寄存器之间进行。 • 栈顶固定不动,数据串行移动,先进栈的数据最后才能出来,操作具有先进后出的特点。 • CPU通过“压入”指令把数据送入堆栈,而通过“弹出”指令把数据从堆栈中取出来(PUSH、POP)。 • 寄存器堆栈也叫串联堆栈。
寄存器堆栈原理 • 当某通用寄存器的数据进栈时,占据最顶部位置,堆栈中的原有数据依次下移。 • 当压入堆栈的数据个数超过堆栈的容量时,栈底的数据会被挤出堆栈而丢失。 • 出栈时,最顶部的数据最先离开堆栈,并被放回到通用寄存器中。与此同时,堆栈里的所有其它数据依次上移,以填满原先数据所留下的空间。 • 寄存器堆栈是有价值的,多用于控制器;其主要不足是成本高,寄存器数目有限,不适合作大容量堆栈。 寄存器堆栈原理示意图
2、存储器堆栈 • 从主存中划出一个区域作为堆栈使用,称为存储器堆栈。通常,在设计计算机系统时,把主存储器的一部分用作堆栈区。堆栈区一旦设定,该存储区就不能作为其它用途。 • 存储器堆栈的特点是:数据不动,栈顶移动。 • 在存储器堆栈中,需要设置一个堆栈指示器SP来跟踪栈顶的移动,并始终指向栈顶。SP是CPU中的一个专用寄存器。 • 在建立存储器堆栈时,需要把一个存储单元地址送入堆栈指示器SP,以确定堆栈的栈顶,例如把300Q作为栈顶地址送入堆栈指示器SP,进行初始化。
堆栈的压入操作(PUSH) • 在存储器堆栈中,也使用“压入”和“弹出”指令进行操作。但指令的功能与寄存器堆栈中的情况有所不同。 • 压入指令PUSH A操作如下: (SP)- 1 → SP (A)→ Msp 其中,(A)表示通用寄存器A的内容,SP表示堆栈指示器,Msp表示栈顶。
堆栈的弹出操作(POP) • 假设出栈前,堆栈中已经有a、b、c三个数,堆栈指示器指向栈顶单元275。现在执行的操作是把堆栈中的数送回通用寄存器A中。 • 弹出指令“POP A”的操作如下: (Msp)→ A (SP)+ 1 → SP
关于存储器堆栈 • 习惯上,在画存储器堆栈时,地址值小的存储单元位于上面,地址值大的存储单元位于下面。在开始时,栈顶地址值较大。随着压入操作的进行,栈顶地址值将变小,栈顶逐渐上移。所以把这种结构的堆栈称为“自底向上”生长的堆栈。 • 对于“自底向上”生长的存储器堆栈,压入时先修改堆栈指示器,后存入数据;弹出时相反,先取出数据,后修改堆栈指示器。——“SP指向的栈顶有元素”。 • 与“自底向上”堆栈相对应,还有“自顶向下”生长的堆栈。
四、指令类型 • 不同机器的指令系统各不相同。从指令操作码的功能来考虑,一个较完善的指令系统,应当包括: • 数据传送类指令 • 算术运算类指令 • 逻辑运算类指令 • 输入输出类指令 • 字符串操作类指令 • 程序控制类指令 • 处理机控制类指令 • 特权指令
1、数据传送指令 • 数据传送指令用来实现数据的传送操作。数据是在传送过程中得到加工、处理、并获得结果的,所以传送指令是最基本指令。 • 数据传送指令包括:一般传送指令、数据交换指令、堆栈操作指令等 。如,MOV R1,R0 。 • 数据传送指令主要用来实现主存储器和寄存器之间、寄存器和寄存器之间的数据传送。 • 设置传送指令时,一般有3方面的约定: • 传送范围:规定好操作数的来源和目的地。 • 传送单位:如,以字节、字、双字、数组之一为单位传送。 • 寻址方式:指令中要有寻址标志位,来说明是何种寻址方式。如设置F位,F=0表示直接寻址;F=1表示间接寻址。
2、算术运算指令 • 计算机的基本任务是对数据执行运算操作,计算机无一例外地设置有算术运算指令。 • 算术运算指令包括: • 定点加、减、乘、除指令,浮点加、减、乘、除指令; • 加1、减1指令; • 算术移位指令、算术比较指令; • 十进制加、减运算指令; • 大型机有向量运算指令,可对向量或矩阵求和、求积。 • 例如,“ADD SUM,DX”,为双操作数指令,其中, ADD为指令助记符,代表加操作;DX,源操作数地址,为寄存器编号;SUM,目的操作数地址,为主存单元;功能是将DX内容与SUM单元内容相加,结果留在SUM单元中。
3、逻辑运算指令 • 逻辑函数多种多样,但都可以由与、或、非、异或这4种基本的逻辑函数组合实现;逻辑运算中还包括逻辑移位操作。 • 主要用于无符号数的位操作、代码的转换、判断和运算,特点是运算按位进行,本位运算不影响其它位。 • 例如,A=1100 1010,B=0000 1000,“AND A,B”是一条双操作数指令,其中,AND为指令助记符,代表“与”操作;B,源操作数地址,为主存单元;A,目的操作数,为主存单元。该指令的功能是将A和B的内容相与,结果留在A单元中。
4、输入输出指令 • 以主机为参考点,信息由外设传送给主机称为输入,由主机传送给外设称为输出。 • 输入输出(I/O)指令用来实现主机与外部设备之间的信息交换,包括输入输出数据、主机向外设发送的命令、以及外设向主机报告工作状态等。 • 事实上,CPU不能直接访问外设。在CPU和外设之间还存在一个接口,是通过这个接口实现信息交换的。 • 在接口中,设置有数据寄存器、命令寄存器、状态寄存器。这些寄存器也称为端口。CPU可访问端口,访问就需要地址,于是存在外设端口的编址问题。