第三章 指令集结构

77
第第第 第第第第第 3.1 第第第第第第第第第 3.2 第第第第第第 3.3 第第第第第第第 3.4 第第第第第第第第第第 3.5 第第

description

第三章 指令集结构. 3.1 程序设计语言的级别 3.2 机器语言指令 3.3 指令集结构设计 3.4 相对简单的指令集结构 3.5 实例. 3.1 程序设计语言的级别. 3.1.1 语言种类. 高级语言( high-level languages ). 平台无关( platform-independent ). 汇编语言( assembly language ). 向下兼容( backward compatible ). 机器语言. 3.1.2 编译和汇编程序. 1. 编译、汇编 2. 编译器 源程序、源代码、目标代码 - PowerPoint PPT Presentation

Transcript of 第三章 指令集结构

Page 1: 第三章  指令集结构

第三章 指令集结构

3.1 程序设计语言的级别

3.2 机器语言指令

3.3 指令集结构设计

3.4 相对简单的指令集结构

3.5 实例

Page 2: 第三章  指令集结构

3.1 程序设计语言的级别 3.1.1 语言种类

高级语言( high-level languages )

汇编语言( assembly language )

向下兼容( backward compatible )

平台无关( platform-independent )

机器语言

Page 3: 第三章  指令集结构

3.1.2 编译和汇编程序 1. 编译、汇编2. 编译器 源程序、源代码、目标代码 连接器、装载器3. 编译过程 同一高级语言源代码可以经过编译在不 同的微处理器和操作系统或者计算平台上运行。

Page 4: 第三章  指令集结构

图 3.1 高级程序的编译过程 装载器包含在计算平台中

Page 5: 第三章  指令集结构

4. 汇编器和汇编过程

图 3.2 汇编语言程序的汇编过程

每一种汇编语言对应一种微

处理器,不需要针对不同平

台的汇编器

Page 6: 第三章  指令集结构

1. 什么是指令?指令:指示计算机执行某种操作的命令。机器语言:计算机硬件实体直接表示控制信息的语言。 (计算机硬件能直接理解并执行的语言)指令集::一台计算机能执行的全部指令的集合。

(计算机程序员接触到的计算机的所有功能) 一条指令就是机器语言的一个语句,用来说明机器硬件应完成的操作。

3.1.3 机器语言与指令

Page 7: 第三章  指令集结构

指令集表征着计算机的基本功能和使用属性,是计算机系统设计中的核心向题。是表征一台计算机性能的重要因素,它的格式与功能不仅直接影响到机器的硬件结构,而且也直接影响到系统软件,影响到机器的适用范围。

Page 8: 第三章  指令集结构

操作码 地址码

2. 指令的组成 ◆ 一条指令一般应包含如下信息: (1) 操作码 (2) 操作数的地址 (3) 操作结果的地址 (4) 下一条指令地址 ◆ 指令的基本格式

操作码:表示指令应执行的操作和应具有的功能。

地址码:表示参与操作的操作数的存放地址或操作结

果的存放地址。

Page 9: 第三章  指令集结构

3.2 机器语言指令 3.2.1 指令类型与功能

3.2.1.1 数据传送指令

将数据从一个地方移到另一个地方(实际是“拷贝”)。 例:◆ 8086 指令 MOV AL , BL ; AL←BL MOV AL , Disp(BX)(SI) ; AL←((BX)(SI)+Disp) ◆ IBM370 机的成组取指令:

成组取 R1 R3 B2 D2

Page 10: 第三章  指令集结构

3.2.1.2 数据运算指令 包括算术运算指令、逻辑运算指令 、移位指令。例: 8086 指令系统中 ADD AL , BL ; AL←AL+BL MUL BL ; AX←AL×BL AND AL , 0FEH ; AL←AL∧FEH ,即 AL 的最低位 ;清 0,其余位不变。 OR AL , 0F0H ; AL←AL∨F0 ,即 AL的高 4位置 1,

;其余位不变 TEST AL , 00000001B ; AL∧00000001B A0 = 0 结果为 0 ; A0 = 1 结果不为 0

Page 11: 第三章  指令集结构

◆ 移位指令 实现对操作数的左、右移位。 移位操作指令分为算术移位、逻辑移位和 循环移位三种,可以实现对操作数左移或右移 一位或几位。

3.2.1.3 程序控制指令 控制程序流程的指令,包括:跳转指令(条件或无条件)或分支指令、子程序调用和子程序返回指令、“软中断”指令、停机指令。

Page 12: 第三章  指令集结构

3.2.2 数据类型 数值数据 无符号整型数、有符号整型数、浮点数据 布尔类型 数据值常以 0 表示 FALSE ,以非 0 表示 TRUE 字符数据 字符编码标准 ( ASCII、 EBCDIC、 UNICODE、或别的)

例: 8086 指令系统JMP L1 ;直接寻址的转移,无条件转移到 L1处,JNZ 50H ;相对寻址的转移。若操作结果不为 0,则转移到当前 PC+ 50H 处。设指令地址为 1000H ,则当前 PC= 1002H ,转移地址为: 1002H + 50H = 1052H

Page 13: 第三章  指令集结构

3.2.3 寻址方式

寻址方式:确定操作数地址的方法。 形式地址:指令中直接给出的地址。 有效地址:形式地址经一定的计算而得到的操作数的 实际地址。

Page 14: 第三章  指令集结构

3.2.3.1 直接寻址 指令字中直接给出操作数的有效地址。

Page 15: 第三章  指令集结构

◆ 例: Intel 8086 指令 MOV AX , [2000H] 将有效地址为 2000H 的内存单元的内容读入累加器 AX中。◆ 例如: LDAC 5 从内存单元 5读取数据并且把数据存储在 CPU 的累加器中。◆ 这种方式简单直观,便于硬件实现。但随着存储器容 量不断扩大,要寻址整个主存空间,将造成指令长度 加长。另外程序位置受到限制。

Page 16: 第三章  指令集结构

3.2.3.2 间接寻址

指令中指定的是含有操作数地址的内存单元的地址。

至少要进行两次内存访问。

Page 17: 第三章  指令集结构

例如: LDAC @5 或 LDAC ( 5 )

OP … 5IR

10 操作数 35

操作数的地址 105…

Page 18: 第三章  指令集结构

◆ 间接寻址的特点① 间接寻址比直接寻址灵活,可扩大寻址范围,以短 的地址码访问大的存储空间。② 采用间接寻址,当操作数地址需要改变时,可不必 修改指令,只要修改地址指示字中内容 (即存放有效 地址的单元内容 )即可。③ 间接寻址需多次访存才能取得操作数,因而降低了 指令的执行速度。

Page 19: 第三章  指令集结构

3.2.3.3 寄存器直接寻址和寄存器间接寻址 ◆ 寄存器寻址◆ 与直接和间接寻址方式相似,但指定的是寄存器,而 不是内存单元。◆ 寄存器存取信息的速度比主存快,需要的地址短,可 压缩指令长度,有利于加快指令执行速度。但寄存器 的数量有限。◆ 寄存器直接寻址

OP 寄存器寻址 Rn 操作数Rn

例如:假设寄存器 R 中存储了数值 5 ,则: LDAC R ;把数值 5从寄存器 R中拷贝到 CPU的累加器中

Page 20: 第三章  指令集结构

例如:假设寄存器 R 中存储了数值 5 ,则: LDAC (R) 或 LDAC @R ;相当于 LDAC 5 ,从寄存器 R 中获取地址

◆ 寄存器间接寻址

Page 21: 第三章  指令集结构

3.2.3.4 立即值寻址

指定的操作数不是一个地址,而是确实要用到的数据。

例如: Intel 8086 指令 MOV AX, 2000H ;将数据 2000H存入累加器 AX中例如: LDAC #5 ;把数据值 5 移到累加器中

OP 立即寻址 D

这种寻址方式在取指令的同时操作数即被取出,不必再次访问存储器,提高了指令执行速度。但由于指令字有限,使得数据范围受限。

Page 22: 第三章  指令集结构

3.2.3.5 隐含寻址

并不明确地指出操作数,因为总是用到特定的寄存器。

例如: CLAC ;清空 CPU 中的累加器,即将其值置为 0

常用于用堆栈存储数据的 CPU 中。指令中不需要指定操作数,因为它暗示操作数一定来自堆栈。

Page 23: 第三章  指令集结构

堆栈及堆栈操作

◆ 一种按“后进先出”存取顺序进行存取的存储结构

◆ 堆栈操作指令是一种特殊的数据传送指令◆ 堆栈有两种生成方式 自底向上生成方式:栈底占最高地址,栈顶为较低地 址,压入数据时,按由高地址向低地址顺序进行,弹出 数据 ( 即取出数据 )时,由低地址向高地址顺序进行。 自顶向下生成方式:与自底向上生成方式顺序相反。

Page 24: 第三章  指令集结构
Page 25: 第三章  指令集结构

自底向上生成堆栈的工作过程

Page 26: 第三章  指令集结构

◆ 堆栈操作有两种 ① 压入(进栈)指令:把指定的操作数送入栈顶。 SP←SP减量, (SP)← 数据 ② 弹出(退栈、出栈)指令:从栈顶弹出数据,送到 指令指定的目的地址中。 目的← (SP) , SP←SP增量

Page 27: 第三章  指令集结构

例: 8086 的指令系统中 进栈指令: PUSH AX SP←SP - 1, (SP)←AH , SP←SP - 1, (SP)←AL 出栈指令: POP AX AL←(SP) , SP←SP + 1, AH←(SP) , SP←SP + 1

低地址

AL

AH

高地址SP

SP-1

SP-1

低地址

AL

AH

高地址SP+1

SP+1

SP AL

AH

Page 28: 第三章  指令集结构

3.2.3.6 相对寻址 将程序计数器 PC 的当前内容与指令中给出的形式地址相加形成操作数的有效地址。 有效地址 E= (PC)+ Disp

Page 29: 第三章  指令集结构

◆ 程序计数器 PC 的内容一般为现行指令的下一条指令的 地址。◆ 形式地址是操作数地址相对于 PC当前内容的一个相对 位移量( Disp),位移量可正可负,一般用补码表示。◆ 在相对寻址中,只要保持位移量不变,就可实现指令 带着数据在存储器中浮动,有利于实现程序再定位。

K OP 相对寻址 5K+1

K+2

K+6 操作数

M OP 相对寻址 5M+1

M+2

M+6 操作数

Page 30: 第三章  指令集结构

例: 8086 指令 JNC 03H 的功能为,如果进位为 0,则

转移到目标地址为 (PC) + 03H 处进行执行。设指令为双字节指令,本条指令地址为 1000H 。本条指令取指后, PC= 1002H转移目标地址为 1002H + 0003H = 1005H若指令为 JNC 0FDH 则转移目标地址为1002H + FFFDH = 0FFFH

0FFDH

0FFEH

0FFFH ××

1000H JNC

1001H 03H

1002H

1003H

1004H

1005H ××

D=FDH

D=03H

Page 31: 第三章  指令集结构

3.2.3.7 变址寻址方式和基址寻址1.变址寻址方式 变址寻址方式与相对寻址方式类似,但它是将指令提供的地址与变址寄存器中而不是程序计数器中的内容相加。

Page 32: 第三章  指令集结构

例如: Intel 8086 指令 MOV AL , [BX+4] 设 BX = 2000H , BX+4 = 2004H (2004H) = 82H ,则 AL←82H例如: LDAC 5(X) ;变址寄存器 X:数值 10,则 5 + 10 = 15 ;读取 15号单元中的数据并且把它存储在累加器中。

Page 33: 第三章  指令集结构

◆ 变址寻址可用于数组、向量、字符串等数据的处理 例: Intel 8086 指令 LODS ; AL←(SI) , SI←SI + 1

SI A

A a0

A +1

a1

A +2

a2

+1

Page 34: 第三章  指令集结构

2.基址寻址 ◆ 操作数的有效地址等于指令中的形式地址与基址 寄存器中的内容之和。 ◆ 基址寄存器可以是一个专用的寄存器,也可以是 由指令指定的一个通用寄存器。

Page 35: 第三章  指令集结构

◆ 基址寻址主要用于将用户程序的逻辑地址(用户编写 程序时所使用的地址)转换成主存的物理地址(程序 在主存中的实际地址)。

Page 36: 第三章  指令集结构

◆ 基址寻址与变址寻址在形式上以及有效地址的计算 方法上都是相似的,但它们的应用场合是不同的。 基址寻址是面向系统的,主要用于逻辑地址到 物理地址的变换,用以解决程序定位问题。基址寄 存器由系统程序使用,对用户是透明的。 变址寻址是面向用户的,主要用于访问数组、 向量、字符串等成批数据,用以解决程序的循环控 制问题。

Page 37: 第三章  指令集结构

3.2.4 指令格式

操作码 地址码

指令的基本格式:

指令格式的设计包含两个方面: 1. 确定指令的长度; 2. 划分指令的字段,定义各字段的位数、含义 。

Page 38: 第三章  指令集结构

一、指令长度 ◆ 指令字长度:一个指令字所包含的二进制信息的位数。 ◆ 定长指令:指令系统中所有指令的长度都是一样的。 ◆ 可变长指令:各指令的长度可以不同。 ◆ 指令长度与机器字长

二 . 指令的地址码 考虑的问题:需要多少地址信息及如何给出地址。

Page 39: 第三章  指令集结构

1. 零地址指令 格式:

(1) 无需任何操作数 , 如空操作,停机等指令。 (2) 所需操作数是隐含指定的,如堆栈运算指令。2. 一地址指令 格式: 意义: (1) A OP (A) (2) AC (AC) OP (A)

OP

OP A

指令短,节省空间,执行快,常用于微、小型机中。

Page 40: 第三章  指令集结构

3. 二地址指令 格式:

意义: A1 (A1) OP (A2)

最常用的指令格式,适用于中、小、微型机。

OP A1 A2

◆ 二地址指令的几种形式① 存储器—存储器型( S—S型)指令② 寄存器—寄存器型( R—R型)指令

③ 寄存器—存储器型( R—S型)指令

OP R1 R2

OP Rn A

Page 41: 第三章  指令集结构

4. 三地址指令 格式: 意义: A3 (A1) OP (A2)

常用于大、中型机中。

OP A1 A2 A3

5. 多地址指令

Page 42: 第三章  指令集结构

考虑一个简单的例子: A = B + C 一个操作: 加法 三个操作数: 两个源操作数—— B 、 C 一个目的操作数—— A

假定微处理器可以执行 16 种不同的操作。 需要 4 位来代表其中的操作(因为 24 = 16 ) (假设位模式 1010 → 加法)

假定仅有 4 种可能的操作数—— A , B , C 和 D 。 用两位来表示每一种操作数: 00→A , 01→B , 10→C , 11→D

Page 43: 第三章  指令集结构

图 3.4 采用 (a)三操作数, (b)二操作数, (c) 单操作数, (d)0 操作数的指令格式和计算 A= B+ C的汇编语言程序以及机器代码。

微处理器可以设计成能运行具有

3

、2

、1

或0

个操作数的指令。

Page 44: 第三章  指令集结构

二、指令的操作码

指令系统中的每一条指令都有唯一确定的操作码。 操作码位数取决于机器指令系统的规模。 1.固定长度操作码 操作码的长度固定,且集中放在指令字的一 个字段中,其余部分全部用于地址码。 此方式有利于简化硬件设计和减少指令译码 时间,用于字长较长的大、中型及超级小型机中。

Page 45: 第三章  指令集结构

2. 可变长度操作码 操作码的长度允许有几种不同的选择,对地址 数少的指令允许操作码长些,对地址数多的指令, 则操作码就短些。 若指令长度一定,则操作码字段与地址码字 段之间存在平衡问题一般均采用 “扩展操作码” 的 方法。

Page 46: 第三章  指令集结构

◆ 扩展操作码

目的:在满足需要的前提下,有效地缩短指令字长。

例::设某机指令字长为 16 位,若固定 OP 为 4 位,三个地址

码,每个 4位,其格式为:OP A1 A2 A3

若采用固定长度操作码,则最多只允许有 16种三地址指令。

0 0 0 0

1 1 1 1

×××× ×××× ××××

×××× ×××× ××××… … …

Page 47: 第三章  指令集结构

条零地址指令

条单地址指令

条二地址指令

条三地址指令

16

15

15

15

1111 1111 1111 1111

0000 1111 1111 1111

xxxx 1110 1111 1111

xxxx 0000 1111 1111

xxxx xxxx 1110 1111

xxxx xxxx 0000 1111

xxxx xxxx xxxx 1110

xxxx xxxx xxxx 0000

15/15/15 扩展法

Page 48: 第三章  指令集结构

15 条三地址指令、 14 条二地址指令、 31 条一地址指

令、 16 条 0 地址指令,共 76 条指令,其扩展方法如下:

Page 49: 第三章  指令集结构

0 0 0 0

1 1 1 0

×××× ×××× ××××

…0 0 0 1 ×××× ×××× ××××

×××× ×××× ××××

… … … 15 条三地址指令

1 1 1 1

1 1 1 1

×××× ××××…

1 1 0 1 ×××× ××××

… … … 14 条二地址指令

0 0 0 0

1 1 1 1

1 1 1 1

××××

1 1 1 0 ××××

… … … 31 条一地址指令

1 1 1 0 0 0 0 0

1 1 1 11 1 1 1

1 1 1 1

… … … … 16 条 0地址指令

1 1 1 1 1 1 1 1 0 0 0 0

1 1 1 1 1 1 1 1 1 1 1 1

Page 50: 第三章  指令集结构

Pentium Ⅱ的指令格式: 指令长度是可变的,从 1 个字节到 12 个字节 。

前缀 操作码

MOD Reg/OP

R/M 比例 S 变址 I 基址 B

位移量 立即数 模式 额外模式字节 SIB

字节数 0~4 1~2 0~1 0~1 0~4 0~4

2位 3位

3

3位 2位 3 位

1

3位

MOD 字段与 R/M 字段: 5位,表示 8个寄存器和 24种寻址方法

Page 51: 第三章  指令集结构

rt

操作码 rs

6 5 5 6

rt

5

rd

26

funct

(b) R类指令

操作码

6

与 PC相加的偏移量

(a) I类指令

(c) J类指令

rs 立即数(immediate) 操作码

6 5 5 16

0 5 6 10 11 15 16 31

0 5 6 10 11 15 16 31

31

20 21

0 5 6

shamt

25 26

5

Page 52: 第三章  指令集结构

3.3 指令集结构设计

一、指令系统的基本要求1. 完备性 任何运算都可以用指令编程实现。即要求指令系 统的指令丰富、功能齐全、使用方便,应具有所有基 本指令。2. 有效性 用指令系统中的指令编写的程序能高效率运行,占 用空间小、执行速度快。3. 规整性

Page 53: 第三章  指令集结构

指令系统具有对称性、匀齐性,指令与数据格式的一致性。◆ 对称性:所有寄存器和存储单元均同等对待,所有 指令可以使用所有寻址方式,减少特殊操 作和例外情况。◆ 匀齐性:一种操作可支持各种数据类型。◆ 指令与数据格式的一致性:指令长度与数据长度有 一定的关系,以便于存取和处理。4. 兼容性

Page 54: 第三章  指令集结构

二、指令系统的两种设计风格 1. 复杂指令系统计算机 CISC 靠增强指令的功能,增加指令系统的复杂程 度来提高计算机系统的性能。 特点: (1) 指令系统复杂庞大,指令数目一般多达 200~ 300 条。 (2) 指令格式多,指令字长不固定,使用多种不 同的寻址方式。 (3) 可访存指令不受限制。 (4) 各种指令的执行时间和使用频率相差很大。 (5) 大多数采用微程序控制器。

Page 55: 第三章  指令集结构

2. 精简指令系统计算机 RISC 靠精简指令系统,简化指令功能及优化的编译程序 来提高计算机系统的性能。 特点: (1) 选取使用频率高的简单指令以及很有用但又不复杂 的指令组成指令系统。 (2) 指令数少,指令长度一致,指令格式少,寻址方式 少,指令总数大都不超过 100 条。 (3) 以寄存器 — 寄存器方式工作,只有取数 /存数 (LOAD/STORE) 指令访问存储器,其余指令的操作都 在寄存器之间进行。 (4) 采用指令流水线调度,使大部分指令在一个机器周 期内完成。

Page 56: 第三章  指令集结构

(5) 使用较多的通用寄存器以减少访存。(6) 以组合电路控制为主,不用或少用微程序控制。(7) 采用优化编译技术,力求高效率支持高级语言的 实现。

机器名 指令数 机器名 指令数

RISCⅡ 39 ACORN 44

MIPS 31 INMOS 111

IBM 801 120 IBMRT 118

MIRIS 64 HPPA 140

PYRAMID 128 CLIPPER 101

RIDGE 128 SPARC 89

Page 57: 第三章  指令集结构

3.4 相对简单的指令集结构

存储器模型 : 该微处理器可以访问 64K (= 216 )字节 的存储器(每字节 8 位)或者 64K×8 的 存储器。从外部设备输入数据和输出数 据到外部设备,都可以被看作是访问内 存。三个寄存器:累加器( AC )、寄存器 R 、 1 位零标志

Z 。16 条指令,每一条都是 8 位指令码,见表 3.1 。

Page 58: 第三章  指令集结构

Instruction

Instructi on Code

Operati on

NOP 0000 0000 No operati on LDAC 0000 0001 Г AC=M[Г ] STAC 0000 0010 Г M[Г ]=AC MVAC 0000 0011 R=AC MOVR 0000 0100 AC=R J UMP 0000 0101 Г GOTO Г J MPZ 0000 0110 Г I F(Z=1)THEN GOTO Г J PNZ 0000 0111 Г I F(Z=0)THEN GOTO Г ADD 0000 1000 AC=AC+R,I f(AC+R=0)Then Z=1 El se Z=0 SUB 0000 1001 AC=AC-R,I f(AC-R=0)Then Z=1 El se Z=0 I NAC 0000 1010 AC=AC+1,I f(AC+1=0)Then Z=1 El se Z=0 CLAC 0000 1011 AC=0,Z=1 AND 0000 1101 AC=AC∧ R,I f(AC∧ R=0)Then Z=1 El se Z=0 OR 0000 1101 AC=AC∨ R,I f(AC∨ R=0)Then Z=1 El se Z=0 XOR 0000 1110 AC=AC⊕ R,I f(AC⊕ R=0)Then Z=1 El se Z=0 NOT 0000 1111 AC=AC’,I f(AC’=0)Then Z=1 El se Z=0

表 3.1 相对简单 CPU 的指令集

Page 59: 第三章  指令集结构

LDAC 、 STAC 、 JUMP 、 JMPZ 和 JPNZ 指令都需要 16 位的存储地址。这些指令在存储器中每个都需要 3字节。第一个字节包含指令的操作码,另外两字节对应地址。

3 字节格式 1 字节格式

相对简单 CPU 的指令格式:

Page 60: 第三章  指令集结构

例如: 25 : JUMP 1234H该指令以如下形式存储在存储器中: 25 : 0000 0101 ( JUMP ) 26 : 0011 0100 ( 34H ) 27 : 0001 0010 ( 12H )

注意:第二字节低 8 位,第三字节高 8 位

Page 61: 第三章  指令集结构

指令集结构的用法举例: 用相对简单 CPU 编程计算 1 + 2 +……+ n 。 则其高级语言的代码片断如下:

可以把数值 n 存储在标明为 n 的存储单元中,结果存在标明为 total 的内存单元处,内存单元 i 用于存储求和的次数。确定运算步骤如下:

total = 0 ; FOR i = 1 TO n DO {total = total + i} ;

1 : total = 0 , i = 0 2 : i = i + 1 3 : total = total + i 4 : IF i≠n THEN GOTO 2

Page 62: 第三章  指令集结构

实现这一算法的相对简单 CPU 的代码如下: CLAC STAC total STAC i

Loop: LDAC i INAC STAC i

MVAC LDAC total ADD STAC total

MVAC LDAC n SUB JPNZ Loop

total = 0 , i = 0

i = i + 1

total = total + i

IF i≠n THEN GOTO Loop

Page 63: 第三章  指令集结构

指令 1st Loop 2nd Loop 3rd Loop 4th Loop 5th Loop CLAC AC=0 STAC total total=0 STAC i i=0 LDAC i AC=0 AC=1 AC=2 AC=3 AC=4 I NAC AC=1 AC=2 AC=3 AC=4 AC=5 STAC i i=1 i=2 i=3 i=4 i=5 MVAC R=1 R=2 R=3 R=4 R=5 LDAC total AC=0 AC=1 AC=3 AC=6 AC=10 ADD AC=1 AC=3 AC=6 AC=10 AC=15 STAC total total=1 total=3 total=6 total=10 total=15 LDAC n AC=5 AC=5 AC=5 AC=5 AC=5 SUB AC=4,

Z=0 AC=3, Z=0

AC=2, Z=0

AC=1, Z=0

AC=0, Z=0

J PNZ Loop J UMP J UMP J UMP J UMP NO J UMP

下表显示了当 n = 5 时代码的运行过程:表 3.2 循环求和程序的执行步骤

Page 64: 第三章  指令集结构

怎样看待这个指令集结构? 它满足了以教学为目的的设计目标。当我们在第 6和 7 章中设计这种 CPU 时我们就会看到,其复杂度足以阐明很多 CPU 的设计原则,却又没有掉进自身复杂度的陷阱中。 对于简单的应用程序来 说,指令集完整。如果一个应用程序需要 使用浮点型数据,它就不是 十分完整。对于 通用计算机(例如个人计算机),该指令集显然是不够的。 该指令集是相当正交的。只是多了 OR 指令,但有时 CPU 的指令集不是 完全正交更好一些。 寄存器组 是它最大的弱点。寄存器的 缺乏导致执行任务较慢,并且降低了性能。

Page 65: 第三章  指令集结构

3.5 实例: 8085 微处理器指令集结构

3.5.1 8085 微处理器的寄存器组 通用数据寄存器: 累加寄存器 A - 总是接收一个 8位的算术或逻辑

指令的结果;也为所有采用二操作数的指令提供一个操作数。

六个通用寄存器 - 命名为 B , C , D , E , H 和L ,可成对访问 : B 和 C , D 和 E , H 和L 。寄存器对 HL常用来指向内存单元。

16 位的堆栈指针寄存器 SP :包含堆栈顶部的地址。

Page 66: 第三章  指令集结构

5 个标志,共同称为标志寄存器:

● 符号标志 S :表明算术或逻辑指令计算出的结果的符号。其中,值 1 表示负数;值 0 表示正数(或零)。

● 零标志Z:如果算术或逻辑运算指令 产生的结果为0 ,则将 Z置为 1 ;否则 Z 为 0 。

● 奇偶标志P:如果算术或逻辑运算结果中有 偶数个1 ,则将 P置为 1 ;否则 P 为 0 。

● 进位标志 CY:当算术运算 产生进位时才去设置它。

Page 67: 第三章  指令集结构

● 辅助进位标志 AC :与进位标志类似。它不指明进位值,但指出从结果的低四位向高四位传递了进位。

例如,加法 0000 1111 + 0000 1000 = 0001 0111

中断标志寄存器 IM :用于允许和禁止中断而且检查待处理的中断。程序 员可以读取并且设置该寄存器中的值来处理中断。

例如,加法 1111 0000 + 1000 0000 = 1 0111 0000 ,对两个 8 位值相加但产生了 9位结果。最左边的 1 被存储在 CY中;如果加法不产生进位 1 ,则 CY中会存储 0 。

Page 68: 第三章  指令集结构

3.5.2 8085 微处理器指令集 8085 指令集总共包含了 74 条指令。 可分为三个部分:数据传送指令、数据运算 指令和程序控制指令。 采用如下记号描述: ● r, r1, r2 :表示任何一个 8位寄存器 A, B, C, D, E, H,或者 L。

● M :表示内存单元。M[HL]表明该内存单元的地址存在寄存器对 HL中。

● rp:表示寄存器对 BC, DE, HL,或者堆栈指针 SP。 ● Г:一个 16位地址或者数据。● n :是一个存储在内存中且紧跟操作码后的 8位地址或者数据值。● cond:条件指令的一个条件。值为: NZ 、 Z 、 P 、 N 、 PO 、 P

E 、 NC 、 C 。

Page 69: 第三章  指令集结构

除了 POP PSW指令外,其它指令都不会 修改标志的值。 ( PSW:处理器状态字(保存累加器和标志器中的内容 ))

指令 操作 NOP No operati on MOV r1,r2 r1=r2 MOV r,M r=M[HL] MOV M,r M[HL]=r MVI r,n r=n MVI M,n M[HL]=n LXI rp Г, rp Г= LDA Г A=M[Г ] STA Г M[Г ]=A LHLD Г HL=M[Г ],M[Г +1] SHDL Г M[Г ],M[Г +1]=HL

指令 操作 LDAX rp A=M[rp](rp=BC,DE) STAX rp M[rp]=A(rp=BC,DE) XCHC DE← → HL PUSH rp Stack=rp(rp≠ SP) PUSH PSW Stack=A,fl ag regi ster POP rp Rp=Stack(rp≠ SP) POP PSW A,fl ag regi ster=Stack XTHL HL← → Stack SPHL SP=HL I N n A=i nput port n OUT n output port n=A

表 3.3 8085微处理器的数据传送指令

(立即寻址)

( 直接寻址 )

Page 70: 第三章  指令集结构

指令的通用格式。一些指令有指定寄存器的字 段,而另一些指令这些部 分却是固定的。

图 3.6 8085的指令格式

一字节 二字节

Page 71: 第三章  指令集结构

指令 操作 标 志位

ADD r A=A+r ALL ADD M A=A+M[HL] ALL ADI n A=A+n ALL ADC r A=A+r+CY ALL ADC M A=A+M[HL]+CY ALL ACI n A=A+n+CY ALL SUB r A=A-r ALL SUB M A=A-M[HL] ALL SUI n A=A-n ALL SBB r A=A-r-CY ALL SBB M A=A-M[HL]-CY ALL SBI n A=A-n-CY ALL I NR r r=r+1 Not CY I NR M M[HL]=M[HL]+1 Not CY DCR n r=r-1 Not CY DCR M M[HL]=M[HL]-1 Not CY I NX rp rp=rp+1 None DCX rp rp=rp-1 None DAD rp HL=HL+rp CY DAA Deci mal adj ust ALL

指令 操作 标 志位

ANA r A=A∧ r ALL ANA M A=A∧ M[HL] ALL ANI n A=A∧ n ALL ORA r A=A∨ r ALL ORA M A=A∨ M[HL] ALL ORI n A=A∨ n ALL XRA r A=A⊕ r ALL XRA M A=A⊕ M[HL] ALL XRI n A=A⊕ n ALL CMP r Compare A and r ALL CMP M Compare A and M[HL] ALL CPI n Compare A and n ALL RLC CY=A7,A=A6-0,A7 ALL RRC CY=A0,A=A0,A7-1 ALL RAL CY,A=A,CY CY RAR A,CY=CY,A CY CMA A=A’ NONE CMC CY=CY’ CY STC CY=1 CY

数据运算指令

大多数会影响表中的标志。

表 3.4 8085微处理器的数据运算指令

Page 72: 第三章  指令集结构

13 条程序控制指令。 DI , EI , RIM 和 SIM 包含在此因为它们可以处理中断, 而中断最终又会影响 程序控制。这些指令都不修改标志。

Instruction Operati on J UMP Г GOTO Г J cond Г I f condi t i on i s true then GOTO Г PCHL GOTO address i n HL CALL Г Cal l subrouti ne at Г Ccond Г I f condi t i on i s true then cal l subrouti ne at Г RET Return f rom subrouti ne Rcond I f condi t i on i s true the return f rom subrouti ne RSTn Cal l subrouti ne at 8*n(n=5. 5,6. 5,7. 5) RI M A=I M SI M I M=A DI Di sabl e i nterrupts EI Enabl e i nterrupts HLT Hal t the CPU

表 3.5 8085微处理器的程序控制指令

Page 73: 第三章  指令集结构

3.5.3 一个简单的 8085 程序 计算和 1 + 2 +……+ n ,并且把结果存储于内存单元 total 中 。 n 值最初存于标志为 n 的内存单元中。 当设计此程序时,我们计算如 n +( n- 1 )+……+ 1 形式的总和。 算法如下:

与相对简单 CPU 中的程序不同, 8085 程序把它的运行值存储在 CPU 寄存器中。寄存器 B 包含数值 i ,总和存储在寄存器 A 中。

1: i = n , sum= 0 2 : sum= sum+ i , i = i- 1 3 : IF i≠0 THEN GOTO 2 4 : total = sum

Page 74: 第三章  指令集结构

执行该算法的 8085 代码如下: LDA n MOV B,A XRA A } sum= A♁A = 0 Loop: ADD B } sum= sum+ i DCR B } i = i- 1 JNZ Loop } IF i≠0 THEN GOTO Loop STA total } total = sum

i = n

运行值存储在 CPU 寄存器,减少了内存访问次数,程序更短、运行速度更快

该程序仅需要 七条指令,而对于相对简单 CPU 的程序则需要 13 条指令。它的循环段(执行了 n 次)仅需要三条指令;而对于相对简单 CPU 同样的循环则需要 10 条指令。

Page 75: 第三章  指令集结构

当 n = 5 时,它的运算过程 。

Instruction 1st Loop 2nd Loop 3rd Loop 4th Loop 5th Loop LDA n MOV B,A

B=5

XRA A A=0 ADD B A=5 A=9 A=12 A=14 A=15 DCR B B=4,

Z=0 B=3, Z=0

B=2, Z=0

B=1, Z=0

B=0, Z=0

J NZ Loop J UMP J UMP J UMP J UMP NO J UMP STA total total=15

表 3.6 8085循环求和程序执行步骤

Page 76: 第三章  指令集结构

3.5.4 分析 8085 指令集结构 完备性: 8085 微处理器的指令集要 比相对简单 CPU的更完备,而且适合于像微波炉控制器这 样的应用。 但是,对于 像个人计算机这样更复杂的应用,它就不能 够满足需要了。与相对简单 CPU相比, 8085微处理器一个最明显的优势就是它的调用子程序的能力。还结合了中断。但不能很容易地处理浮点数据。

正交性:指令集也是相当正交的。 例如它没有清空累加器指令, 而使用 XRA A将累加器与自身作 异或运算, 使 A值始终置为 0 。

寄存器组: 8085 的寄存器组 比较充足,有更多的标志位。

Page 77: 第三章  指令集结构

3.6 总 结 在设计微处理器的过程中,确定指令集结构是第一步也算是最重要的一步。 ISA规定了微处理器能为 人所看到的外部特性,包括:指令集,用户可访问的寄存器,以及如何与内存交互。 高级语言程序被编译和连接后形成机器语言程序。汇编语言程序经汇编后生成机器语言程序。微处理器实 际执行这些机器语言程序 。 设计 ISA 的目标包括:完备性,即指令集应该包括编程所需的指令;正交性,即指令尽量最小重叠;还应该包含足够的寄存器以提高处理器的 性能。 ISA 不但规定指令集,也规定指令所能处理的 数据类型,及每条指令 所采用的寻址方式和指令格式。