680 likes | 866 Views
计 算 机 组 成 原 理. computer organization principle. 主讲教师 丁纪凯. 指 令 系 统. 第 5 章. 本章要点 指令系统是计算机全部指令的集合,同硬件电路 的工作密切相关,是 CPU 的一个重要特性。本章重点 论述了指令的寻址方式,结合 80X86 系列机和 MIPS 机 的指令系统讲解机器指令的组成,并根据两种典型的 CPU 结构正确分析基本指令的执行过程。. 第 5 章 — 指令系统. 5.1 指令与指令系统 5.2 介绍两类指令系统
E N D
计 算 机 组 成 原 理 computer organization principle 主讲教师 丁纪凯
指 令 系 统 第5章
本章要点 指令系统是计算机全部指令的集合,同硬件电路 的工作密切相关,是CPU的一个重要特性。本章重点 论述了指令的寻址方式,结合80X86 系列机和MIPS机 的指令系统讲解机器指令的组成,并根据两种典型的 CPU结构正确分析基本指令的执行过程。 第5章 — 指令系统
5.1指令与指令系统 5.2介绍两类指令系统 5.3指令流程 第 5 章 指 令 系 统
操作码 操作数 5.1 指令与指令系统 1. 指令 指令是指示计算机执行某种基本操作的命令,CPU能执行的指令是用二进制代码表示的机器指令。 5.1.1 指令格式 机器指令由操作码(opcode)和操作数(operand)两个字段组成。 操作码字段指出该指令的功能——执行何种操作。若操作码字段 有n位,则可表示2n条指令——有2n种不同的基本操作。 操作数字段(又称为“地址码”)指出该指令的操作对象 ,通常为 一个立即数(在指令代码中直接给出)、寄存器中内容、存储单元 的内容或I/O端口的内容:
(1)若为立即数,则操作数字段即该立即数的二进制表示;(1)若为立即数,则操作数字段即该立即数的二进制表示; (2)若为寄存器内容,则操作数字段即该寄存器的地址,以寄存器 地址的二进制编码表示.例如CPU有8个寄存器,则这8个寄存器地 址可用3位二进制码“000”~“111”表示之; (3)若为存储器内容,则操作数字段即该存储器地址的二进制表示。 按指令执行过程,操作数有源操作数和目的操作数之分: 源操作数——参予操作的原始数椐, 目的操作数——指令执行后的结果数据。
按指令操作的不同,源操作数可以是1个,也可以是2个,而有的按指令操作的不同,源操作数可以是1个,也可以是2个,而有的 指令无操作数,据此,按指令中地址码个数的不同,指令格式可分为:零地址指令 ; 一地址指令 ; 二地址指令 ; 三地址指令 ; 2. 指令的地址码结构 (1)零地址指令 指令格式如下: 指令中只有操作码字段(op),而无操作数——地址码字段。 这类指令在如下两种情况下出现: ● 该条指令运行时不需要操作数; 例如 80x86系列中的空操作指令NOP和暂停指令HLT ● 指令有操作对象(操作数),但该操作数是指令操作码已指 定或隐含的,通常指定为累加器进行操作,称为“隐地址”——
操作数由指令操作码隐含约定。 例如80x86系列中的BCD修正指令DAA(机器码格式为27H),操 作码27H中己隐含约定操作数为AL,该指令实现BCD码加法操作后, 对AL寄存器中的内容进行修正操作, 采用隐地址指令减少了指令的长度,简化了指令的结构。 (2) 一地址指令 ★指令格式如下: 该类指令的功能是: op (A) 或 (AC)op(A) AC 其中 op为操作码,表示该指令的功能; A为一个操作数的地址码——寄存器名(寄存器的编号)、 内存或I/O端口的地址; AC为累加器(在一地址指令中为“隐地址” );
(A)为地址码的内容,即A的寄存器、内存或I/O端口的中的 内容; (AC)为累加器AC中的内容; ★ 采用一地址指令的两种情况: 一种是单操作数指令,源与目的为同一操作数,由指令中地址 码A指定。 例如:80x86系列中的增量指令INC CL的机器码格式为 : FEC1 H即 111111 1011 000 001 f1 f21 f22 f23 f1字段FEH和f22字段000表示这是8位增量指令, f21字段 11 说明是寄存器操作数、f23字段001指出寄存器为CL。 一种是双操作数 —一个操作数由指令的地址码A给出,另一 个操作数是隐含的,一般为累加器AC。
例如80x86系列中的乘法指令MUL CL的机器码格式为: F6E1H 即11110110 11 100 001 f1 f21 f22 f23 f1字段的11110110和f22的100表示该指令为两个8位数相乘, f21的11表示是两个寄存器相乘,f23的001表示乘数为CL,执行 AL×CL,结果送AX的操作,其中被乘数AL和乘积AX在机器码格式 中无操作数字段表示。 (3) 二地址指令 指令格式如下: 该类指令的功能是: (A1)op(A2) A1
该类指令的功能是: (A2)op(A3) A1 指令格式如下: (4) 三地址指令 其中, op为操作码,表示该指令的功能; A2为第一个源操作数的地址码——寄存器名、内存或I/O端口 的地址,也可以是立即数; A3为第二个源操作数的地址码——寄存器名、内存或I/O端口 的地址,也可以是立即数; A1为目的操作数(操作结果)的地址码——寄存器名、内存或 I/O端口的地址; (A2)为地址码的内容,即A2的寄存器、内存或I/O端口的中的 内容; (A3)为地址码的内容,即A3的寄存器、内存或I/O端口的中的 内容;
上述零地址、一地址和二地址指令的特点是: 指令代码短、硬件实现简单以及执行速度快。一般用于结构较简 单而且字长较短的小型机和微型机中。 三地址指令的特点是: 指令代码长、指令功能强、便于编程。一般用于结构较复杂而且 字长较长大型机中。
3. 指令的操作码 指令系统中的每一条指令都有一个唯一确定的操作码,指令不同, 其操作码的编码也不同。通常,希望用尽可能短的操作码字段来表达 全部的指令。指令操作码的编码可以分为规整型和非规整型两类。 (1)规整形(定长编码) 简单的编码方法,操作码字段的位数和位置是固定的,其位数 应当有足够长。 若一指令系统有m条指令,则指令中操作码字段的位数为N位 应满足m≤2N,即 N≥log2 m 该方法有利于简化硬件设计,减少指令译码时间。 广泛应用 于大中型计算机中。
例 IBM370机(字长32位),在它的半字长,单字长,1个半字长指令 中操作码位数都一样为8位。8位操作码最多可有256条指令。 (2) 非规整形(变长编码) 操作码字段位数不同,且分散在指令字的不同位置上,能有效 压缩指令中操作码字段的平均长度,但将增加指令译码和分析的难 度,使控制器的设计复杂化。 最常用的非规整型编码方式是扩展操作码法。让地址码长度 长的指令(如三地址指令)的操作码字段短些,操作数地址码长度 短的指令(如一或零地址指令)的操作码字段长些。 例 PDP-11机(字长16位)的指令分为单字长、两字长、三字 长三种,操作码字段占4~16位不等,可遍及整个指令长度。
例 1指令格式如下所示,其中op为操作码, A1、A2 均为寄存器地址码, 试分析该指令的特点。 15 9 7 4 3 0 OP A1 A2 解:(1) 单字长(2字节)二地址指令 (2) OP采用7位,可有27=128条指令 (3) 源和目的操作数都是寄存器,即(reg1)op(reg2)→reg1 寄存器代码均用4位表示,可分别指定16个reg之中一个。 例2某计算机指令长度为16位,每个地址码为4位,采用扩展操作码的方 法设计指令系统,要求有15条三地址指令,15条二地址指令,15条一 地址指令和16条零地址指令。 解:若采用定长编码方法,三地址指令只能有16条,利用扩展操作码法可在指令长度不变情况下,使指令总数大大超过16条。
设计方法是在设计一类指令中至少留下一个编码作为扩展窗口,与下一个设计方法是在设计一类指令中至少留下一个编码作为扩展窗口,与下一个 地址码组成一个更多位数操作码。 (1)采用操作码4位设计三地址指令,取 指令的编码:0000 XXXX YYYY ZZZZ ~1110 XXXX YYYY ZZZZ 共15条; (2)用1111作为扩展窗口,取用操作码8位设计二地址指令,取 指令的编码:1111 0000 YYYY ZZZZ~1111 1110 YYYY ZZZZ 共15条; (3)用1111 1111作为扩展窗口,取用操作码12位设计一地址指令,取 指令的编码:1111 1111 0000 ZZZZ~1111 1111 1110 ZZZZ 共15条; (4)用1111 1111 1111作为扩展窗口,取用操作码16位设计零地址指令,取 指令的编码:1111 1111 1111 0000 ~ 1111 1111 1111 1111 共16条;
4. 汇编语言指令 汇编语言是一种符号语言,其特点是用符号形式表示计算机指令, 用指令助记符代替机器指令的操作码、用标识符代替地址码。这是一 种面向具体计算机的语言。 汇编语言与机器语言相比、除保留了机器语言的优点外,还具有 易懂、易写、易记、易调试和易修改等优点。与高级语言相比,具有 执行速度快、节省内存和控制精确等优点。不同的CPU有不同的汇编语 言。 80x86系列CPU的汇编语言指令分析: (1) 8086CPU部分指令助记符表
(3) 80X86汇编语言指令中所用到的存储器操作数表示为: [DISP] / [ REG] / [REG+DISP] 其中, DISP为16位或32位立即数(对8086只能是16位立即数); REG为16位或32位寄存器(对8086只能是16位寄存器),可形 成寄存器间接寻址、基址寻址和变址寻址,也可以用二个寄存器形成 基址变址寻址。
指令的寻址方式是指“指令中操作数的表示形式”。指令的寻址方式是指“指令中操作数的表示形式”。 指令中的操作数—操作对象通常来源于: 5.1.2 寻址方式 立即数— 操作数即指令代码中的地址码部分; 寄存器— 操作数在寄存器中(即指令代码中的地址码部分所指 出的寄存器中的内容); 内存单元— 操作数在内存单元中(即指令代码中的地址码部分 所指出的内存单元中的内容); I/O端口(I/O接口中存放信息的寄存器)—操作数在I/O端口中 (即指令代码中的地址码部分所指出的I/O端口中的内容);
前两种操作数的表示比较简单, 立即寻址指立即数操作数,即指令中的地址码部分; 寄存器寻址指寄存器操作数,即由代表寄存器编号的二进制值表 示地址码; 存储器(内存)寻址指存储器操作数,即指令地址码给出内存单 元的地址,由于内存单元的地址一般较长,通常以其有效地址表示。 而有效地址又有多种表示,因此“存储器寻址”又有多种表示形式。 I/O端口操作数的地址较短,比“存储器寻址”简单些。 计算机指令的寻址方式可归纳为如下几种: 立即寻址 ; 隐含寻址 ; 寄存器寻址 ; 直接寻址 ; 寄存器间接寻址 ; 存储器间接寻址 ; 变址寻址 ; 基址寻址 ; 相对寻址 ;
操作数直接由指令中的地址码给出,该操作数的寻址方式称为“立操作数直接由指令中的地址码给出,该操作数的寻址方式称为“立 即寻址”。 指令格式为: 1. 立即寻址 该指令是一条三地址指令,指令中的op1为操作码;Rd为存放目的 操作数的寄存器的编号、Rs1为一个源操作数的寄存器的编号、imm 为另一个源操作数,是一个立即数; 该指令功能是: (Rs1) op1 immRd 这里的一个源操作数imm为立即寻址。 若 op1为AND逻辑与的操作码,指令功能是: (Rs1)AND immRd 通常立即寻址的操作数用于对寄存器赋值,进行初始化,也用于要 求有立即数参予的一些数据运算(算术和逻辑运算)的指令中。
注意: 立即数只能作为源操作数,不能作为目的操作数。 在汇编语言指令中,通常直接用数字表示操作数, 例如:ADD AL,20H; 例如:有的计算机中,在常数前加上#表示立即数, ADD AL,#20H ; 2.寄存器寻址 操作数是一个寄存器中存放的数据,寄存器的编号由指令中对应的 地址码给出。 三地址指令的格式为: 地址码字段Rs1、Rs2和Rd都是寄存器寻址的操作数。把指令中的 地址码——寄存器号Rs1、Rs2和Rd作为指针,直接指向对应寄存器 中的操作数。若寄存器号Rs1、Rs2和Rd字段各为n位二进制代码,可 以有2n个寄存器作为操怍数。
该指令功能是: (Rs1) op1 (Rs2) Rd 3.直接寻址 操作数在存储器中,存储器的地址在指令中由代码直接給出。 寻址过程示意图如下: 指令中的地址码字段X即内存操作 数的地址,据此代码,从对应内存中 取出内存操作数参予运算。 操作数的地址是指令代码的组成部分,适用于访问固定的存储单元。 当内存容量很大时,地址码会很长。在汇编语言指令中,直接寻址中 的内存地址可直接在指令中用数字給出,有的计算机中在数字前后加上一个符号[ ]。
例如: 指令 JUMP 2000 ; AND AL, [2000H] ; 直接寻址的三地址指令的格式为: op1为操作码,表示执行的操作; Rd为存放目的操作数的寄存器; Rs1为一个存放源操作数的寄存器; addr为一个存放另一源操作数的内存单元地址 ,以立即数表示的; 该指令功能是:(Rs1) OP1 mem (addr) Rd
例:指令AND AL,BL, [2000H]; 指令功能为 (BL) AND mem(2000H) AL mem(2000H)表示地址为2000H的内存单元的内容; 该指令的机器指令中,Rd为寄存器AL的编号,Rs1为寄存器BL的 编号;addr为立即数2000H表示的内存地址; 4.寄存器间接寻址 操作数在内存中,内存地址在 寄存器中,指令中給出寄存器的 编号。 寻址过程示意图如下:
指令中的R字段为寄存器编号,由此字段可找到对应的寄存器,从指令中的R字段为寄存器编号,由此字段可找到对应的寄存器,从 该寄存器中取出内容(R) ——X,即内存操作数的地址,据此地址可从 对应内存中取出操作数。 由于寄存器的内容可以攺变,所以这种寻址方式具有很强的寻址能 力。 在汇编语言指令中,表示寄存器间接寻址中的寄存器通常用寄存器 名,并在其前后加上符号( )或[ ]。 例如: AND R1, (R2),R3 ; MOV AX, [ BX ] ; 寄存器间接寻址的三地址指令的格式为:
op1为操作码,表示执行的操作; Rd为存放目的操作数的寄存器,指令中以寄存器的编号表示; Rs1为存放内存操作数的存储单元地址的寄存器,指令中给出寄 存器的编号; Rs2为一个存放源操作数的寄存器;指令中以寄存器的编号表示; 该指令功能是:mem[(Rs1)]OP1(Rs2)Rd 例:指令 AND R1,(R2),R3 , 指令功能为mem[(R2)] AND(R3)R1 编号 R2的寄存器中的内容(R2)为内存地址,取出该地址对应的 内存单元中的内容是一个源操作数,表示为 mem[(R2)],这个 源操作数的寻址方式为寄存器间接寻址。
指令中给出的地址码字段A是存放操作数地址的存储单元的地址,指令中给出的地址码字段A是存放操作数地址的存储单元的地址, 即操作数地址的地址。 寻址过程示意图如下: 5.存储器间接寻址 指令中,地址码字段A給出内存地址,由A 找到内存单元2,取出其内容X,再以X为地址 找到内存单元1,该内存单元1中存放的数即参 予操作的操作数。 存储器间接寻址方式的寻址能力很强,但由于多次访问存储器而影 响指令执行的速度。 在汇编语言指令中,内存地址A用数字加上符号( ) 或 @( )表示。
例如:指令 ADD R2, ( 2000 )、 AND R1, @(R2), R3 存储器间接寻址的三地址指令的格式为: op1为操作码; Rd 、Rs2为存放目的操作数、源操作数的寄存器,指令中均以寄存 器的编号表示; Rs1为存放操作数地址的存储单元的地址的寄存器,指令中给出寄 存器的编号; 该指令功能是:mem[mem(Rs1)]OP1(Rs2) Rd
例:指令AND R1,@ (R2), R3 ; 指令功能为: mem[mem(R2)]AND(R3) R1 指令中,Rs2字段为寄存器R3的编号,由此字段可找到对应的寄存 器R3,从该寄存器中取出内容 (R3)为一个源操作数; Rd为存放目的操作数寄存器R1的编号 ; Rs1字段为寄存器R2的编号,由此编号找到对应的寄存器 R2,从该寄存器中取出内容(R2)为A即一级内存操作数的地址, 可从内存地址A的内存中取出操作数地址X,然后再由地址 X 的内 存单元取出参加运算的操作数。 由Rs1字段给出的R2二次寻址求得内存操作数mem [mem(Rs1)] 作为一个源操作数,这个源操作数的寻址方式即为存储器间接寻址。
操作数在内存中,操作数的地址由两部分组成:一 是寄存器中的 数据,二是指令中給出的一个地址码,两者相加之和即为存放操作数的内存单元地址。 6. 变址寻址 寻址过程示意图如下: 指令中,R字段为寄存器号,A为 一个立即数的代码,操作数的地址为 ( R ) + A, 当寄存器中的内容进行 加1或减1操作后寻址时,可以用来对 一个内存数组进行访问。 在汇编语言指令中,变址寻址操作数的表示通常为A ( R )或[R+A]。 例如:指令 ADD R2 , 100 ( R1 )。 ADD R2 , [R1+100]
操作数在内存中,操作数的地址由两部分组成:一是寄存器中的数操作数在内存中,操作数的地址由两部分组成:一是寄存器中的数 据,二是指令中給出的一个地址码,两者相加之和即内存操作数的地 址。若寄存器中的数值是固定的,而地址码的值是可变化的,这种寻 址方式称为” 基址寻址 “。 基址寻址与变址寻址的指令在形式上相似,其区别是变址寻址中, R中的值是可变 的;而基址寻址中,R中的值是固定的。 7. 基址寻址 8. 相对寻址 操作数在内存中,操作数的地址是程序计数器PC值加上一个偏移量 A,而该偏移量在指令代码中,这种寻址方式称为”相对寻址”。 寻址过程示意图如下:
A可以为正值,也可以为负值。通常A值小于内存地址值;A可以为正值,也可以为负值。通常A值小于内存地址值; 操作数的地址为 PC+A; 所以相对寻址能以较短的地址码来访问内存。 在汇编语言指令中,一般用 A( PC ) 表示操作数的地址。 例: ADD A,2000H ( PC ) 指令功能为: (AC)+ mem [ (PC)+2000H ] AC
指令中不给出操作数,根据指令中操作码即可确定操作数的存储指令中不给出操作数,根据指令中操作码即可确定操作数的存储 位置,操作数隐含在操作码中,这种寻址方式称为”隐含寻址”。 例:指令 PUSH AX 源操作数是AX,目的操作数为堆栈指针SP指出的内存单元, 是隐含的。 在大多数计算机中,累加器A、AL与AX常用作隐含寻址中的操 作数。 例: 指令 ADD #3 该指令中源操作数为立即数 3,目的操作数为A是隐含的。 例: 指令MUL BL 乘数为BL,被乘数为AL,也是隐含的。 9. 隐含寻址
5.2.1 80x86系列指令系统 5.2 介绍两类指令系统 80x86及其兼容芯片是应用最多的处理器芯片,属于CISC型的指令 系统。8086指令是变字长指令,不同指令的操作码和寻址方式不同,指 令长度也不一致,每条指令由1~6个字节组成。以8086CPU为例说明 CISC芯片分析指令编码的特点。 最常用的两操作数的传送、加、减、与、或指令的编码格式如图 所示。 操作码 ——反映该指令的功能 ; 类型 ——反映操作数的类型(字长等); 寻址方式 ——反映操作数的寻址方式,寄存器操作数的编码也在 其间;
操作数 ——操作数中的立即数、内存操作数中的位移量部分。 对于实现“寄存器与寄存器,寄存器与存储器之间”的上述操作的指 令而言, 上述8086指令编码格式可细化为以下图所示的格式。 第一字节中 6位OPCODE可表示64个不同的操作 ; D 位表示数据传送的方向:D=0,寄存器为源操作数,D=1,寄存器 为目的操作数 ; W 位表示操作数是字还是字节:W=1,为字操作,W=0,为字节操作 第二字节中3位 REG 字段的编码如表:
两个操作数中有一个是寄存器,其编码由上表所示;另一个是寄存两个操作数中有一个是寄存器,其编码由上表所示;另一个是寄存 器或是存储器,其指令代码由第二个字节中的MOD字段和R/M字段决定, 如下表所示。 MOD = 00、01和10时,另一操作数为存储器操作数; MOD = 11时,另一操作数为寄存器操作数;
MOD = 00时 R/M = 000~011:为不带位移量的基址变址寻址 100、101和111:为不带位移量的寄存器间接寻址 110:为直接寻址
MOD = 01时, R/M = 000~011:为带8位位移量的基址变址寻址 100~111:为带8位移量的寄存器间接寻址 MOD = 10时, R/M = 000~011:为带16位位移量的基址变址寻址 100~111:为带16位移量的寄存器间接寻址 MOD = 11时,另一操作数为寄存器操作数: 8位寄存器为AL、BL、CL、DL、AH、BH、CH和DH 16位寄存器为AX、BB、CX、DX、SP、BP、SI和DI
例5-1查表写出指令 MOV [BX + 2340H] , AX 的机器指令。 解: 源操作数AX为寄存器,目的操作数[BX +2340H]为存储器操作数。 该指令为16位操作; 机器指令共4字节,MOV指令的操作码为100010,各字段的取值分别为:D=0 ; W=1 第2字节中 MOD = 10 ; REG = 000 ; R/M = 111, 指令机器码为: 为书写方便,机器指令可以十六进制数表示为:89874023H
例5-2 查表写出指令 ADD [BX +2340H] , AX 的机器指令。 解:只需改变操作码即可,加法指令的操作码为000000,其余字段 不变。 则该指令的机器码如下: 指令的十六进制数机器码为:01874023H
例5-3 查表写出指令 AND [BX +2340H] , AX 的机器指令 。 解:只需改变操作码即可,该指令的操作码为001000,其余字段不变。 则该指令的机器码如下: 指令的十六进制数机器码为: 21874023H
例5-4 查表写出指令 SUB [BX +2340H] , AX 的机器指令。 解:只需改变操作码即可,该指令的操作码为001010,其余字段不变。 则该指令的机器码如下: 指令的十六进制数机器码为: 29874023H
例5-5查表写出指令 MOV [BX +2340H] ,1234H 的机器指令 。 解: 该指令是将16位数送内存[BX +2340H]; 源操作数为16位立即数1234H,机器码指令中增加了第5、6两字节 的立即数 1234H,由于源操作数为16位立即数,操作码为7位: 1100011 该指令为6字节指令,其机器码如下: 指令的十六进制数机器码为: C78740233412H
5.2.2 MIPS处理器的指令系统 1. MIPS处理器 MIPS处理器是MIPS技术公司推出的一种RISC芯片。自1986年来陆续 推出R2000处理器、R3000处理器、R8000、、R10000、和R12000等型号 处理器。 MIPS处理器的主要特征: (1) 指令系统简单; (2) 采用流水技术,依靠优化编译器进行指令序列的重新安排,以 防止流水线中出现的相互冲突; (3) 使用较多寄存器,32个通用寄存器、一对存储64位数据的寄存 器Hi,Lo以及异常PC寄存器epc。32个通用寄存器分别表示为$0到 $31,其中$0固定为0。Hi,Lo寄存器用于存放定点乘法的结果。
(4) 采用“比较与转移”指令,比较和转移这两个动作在一条指令内 便可完成,如beq $1, $2, 1000。 (5) 没有状态寄存器。 2. MIPS系列微处理器的指令系统 MIPS处理器指令系统的主要特点是MIPS处理器的指令系统简单; 采用32位字长的等字长指令; (1)指令格式有三种——寄存器型(R型)、立即数型(I型)和转移 型(J型): ◆R类型的指令:该类型指令从寄存器堆中读取两个源操作数,计 算结果写回寄存器堆;◆I类型的指令:该类型指令使用一个16位的立即数作为一个源操 作数;
◆J类型的指令:该类型指令使用一个26位的立即数作为跳转的目 标地址; 三类指令格式为: rs: 源操作数1的寄存器编号; rt: 源操作数2的寄存器编号; rd: 目的操作数的寄存器编号; shamt: 移位次数(移位指令); funct: 功能码,操作码的扩展,指定操作类型; immediate:立即数; target: 目标地址;