第五章 指令系统
(一)
指令的编码
1操作码的编码
(1)指令中包含的信息:操作的类型,操作数的存储位置,操作结果的存放位置
(2)指令格式:指令中用不同的代码段表示上述不同的信息,各代码段拼在一起构成指令的格式,通常为:操作码 地址码
(3)操作码的编码分:
①固定长度的编码:操作码的长度固定且集中放在指令字的一个字段中;这种格式可简化硬件,使指令译码较快,但不利于指令的兼容及扩展。
②可变长度的编码:操作码的长度可变且分散放在指令字不同字段中,这种格式使硬件结构及指令译码更复杂,但便于增加新指令,缩短指令的平均长度。
a 为了缩短指令长度,根据指令的使用概率进行编码
b为了添加新指令,对剩下的码字进行扩充,增加操作码的长度,可添加更多的指令
2地址码的编码:用于描述指令的操作对象,给出操作数或操作数所在的地址,根据地址码部分给出的地址个数,有以下几种:
(1)零地址指令:又称无操作数指令,多属控制指令。如:HLT,NOP。
(2)一地址指令:给出一个操作数的存储位置,这种指令有的只需一个操作数,有的虽需两个操作数,但其中一个操作数的位置是隐含的。如:INC CX,POP AX。
(3)二地址指令:指出两个操作数的存储地址。大多数二地址指令指定一个二元运算,两个操作数运算后得到一个结果,放在其中如一个存储地址中。如:ADD AX,BX
(4)三地址指令:指出两个原操作数的地址和一个结果存放的地址。对于二元运算,这种指令可以使得源操作数不被破坏。如:ADD A1,A2,A3。
(5)多地址指令:有多个操作数存放的地址,微型机上很少使用这种指令。
地址码的编码取决于数据的寻址方式
为了使指令简单明了,操作码设计必须与地址码相配合,以形成高效合理的指令编码,以便于指令的读取,译码及执行
(二)寻址方式:
对指令的地址进行编码,以确定操作数据在存储器中的地址的方式
*寻址方式:操作数可能在指令中、在寄储器中、在寄存器中。通过寻址来确定本条指令数据的地址及下一条要执行指令的地址,称寻址方式。
*寻址方式主要用于汇编语言及高级语言的编译程序中,高级语言一般不用
*不同系列的计算机其寻址方式不相同,但基本原理差不多
CPU中寄存器的组成:(简单给学生回忆一下)
常见的寻址方式有以下几种
1立即寻址
2直接寻址
3间接寻址(R.M)
4基址寻址
5变址寻址
6基址+变址寻址
7相对寻址
8堆栈寻址
1. 立即寻址:操作数(指令的地址码就是操作数)就在指令中,当执行指令时,CPU直接从指令中取得操作数,不必执行总线周期。
用途:该寻址方式常用来给寄存器赋初址。指令执行速度快。
如:Mov Ax, 1680H
M
AH AL
AX 16 80 16位 MOV
80 CS 按小数端存放
16
图1
2. 直接许寻址:指令中以位移方式直接给出操作数地址,即指令的地址码就是操作数的有效地址。若地址码为寄存器号,则为寄存器直接寻内容址
a) 寄存器直接寻址
b) 存储器直接寻址
如:Mov Ax [1680H]
M
AL AH
OP
AX 20 40 80 CS
16
1680H 40
1681H 20
图2
再如:Mov Ax Bx
Bx 把Bx的内容放入 AH
3. 间接寻址:指令段给出的是操作数的地址
(1)寄存器间址:若指令指定一个寄存器,则寄存器的内容为操作数在存储器中的地址。这种方式为寄存器间址,程序员必须保证操作数地址必须已经放入寄存器中。
如:Mov Ax,[Bx]
为寄存器间址方式:把Bx寄存器中的中的内容作为地址,把该地址段所指的存储器单元的内容放入BX。
(2)存储器间址:指令给出一个存储器的地址,该地址所指的单元存放的是操作数的地址。
再如:JUMP(A1)将A1的内容作为地址
存储器间址:把A1的内容A2作为操作数的地址。
![]()
M
![]()
JUMP
CS
![]()
A1
![]()
![]()
![]()
A1 A2

A2 ××××××××
![]()
![]()
![]()
图3
4. 基址寻址:操作数的地址是基址寄存器的内容加上指令中给出的地址(又称位移量)(又称基址加位移量的寻址)。
如:Mov Ax,[Bx+0168H]
M
0168
A8
BX 20 40
21A8H ××××××××
AX ××××××××
图4
指令用途:
①为program及date分配存储空间,实现PA到EA的转换
②当M容量太大,指令不能给出寻找如此大空间的地址,便把整个M 分成若干段,由段寄存器给出段地址,由指令给出段内位移量。
5.变址寻址:操作数的地址是变址寄存器(DI,SI)中的内容加上指令中给出的地址又称变址+位移量寻址,这是一种最常用的寻址方式,用于字符串处理指令中。
如:Mov Ax,[DI+0168H]
M

DI的内容+0168
图5
(1)对于1维数组,DI的变址值可以从0000—FFFF;可对64K数组进行处理。
(2)对于2维数组,需2个变址寄存器。某些寄存器有自动增、减量的功能,每存取一条数据,可按其数组长度进行增(或减)。如8086系列中的串操作指令。
例如:将源串100个数据传送到目标串单元中去。该源串的段首址偏移地址为2500H,目标串首址的偏移地址为1400H,则完成这一串操作的程序如下:
CLD;DF←0,地址自动递增
Mov cx,100
Mov SI,2500H
Mov DI,1400H
REP MOVSB
SI+2500H 12
23
0000—0064H
DI + 1400H
0000 0064H
图6
6.基址+变址的寻址:操作数的地址是基址寄存器中的内容加变址寄存器里的内容再加上指令的地址段给出的地址。
如:Mov Ax,[BX+DI+0168]
7. 相对寻址:程序计数器PC的内容+指令中给出的地址
(1)特点:主要用作转移指令,在程序数据分开存放的计算机中无此寻址方式。
PC又称IP,称为程序计数器,又称指令指针,它是一个存放指令地址的寄存器,具有计数功能;计算机中的指令均是按顺序存放在存储器中的,每条指令的地址由PC自动给出;通常下条指令的地址是PC寄存器的值加上上条指令的字节数构成。
例如:一条相对转移指令长4字节,存储在(750)10处,转移目标地为(500)10处。
① 指令读取之后PC(或IP)的值为多少?
答: ∵指令长4字节,故读取后PC的值应为750+4→754

750H M
a
b
c
750+4 754H d
图6
②相对转移指令(相对寻址)中的地址偏移量从
754-500=250
③该指令的相对地址字段值需要多少二进位?
250≈28
故需8位
④若采用补码表示相对地址,则可前后转移,需1位符号位。9位
8. 堆栈寻址:存储器中专门设了一段存储存储器用于存放在调用子程序时保存原来的寄存器值,子程序的返回地址以及其它计算机状态值;这是一组按先进后出的原则进行存放的连续存储单元。
访问堆栈寻址的操作有入栈PUSH s和出栈POP s两种
Push是将要保存的数及地址压入堆栈
Pop是将要恢复的数及地址弹出堆栈
指令无需给出堆栈地址,由堆栈指针SP隐含给出。
如:若设CS=1000H,IP=0030,SS=2000H,SP=0040H,BX=2340
PUSH BX (把BX中内容入栈)

M
10000H
CS
IP=0030H
1003H
![]()
23 40
20000 SS
入栈
SP-2 2003EH
2003FH
SP=0040 20040H 栈底
图7
(三) 指令类型
指令系统至关重要,它关系到操作系统及编译程序编写的难易:直接影响到计算机的性价比
一台计算机指令从几十条到几百条,各不相同,但归结起来有以下几类(比较常用)
① 传送指令(数据传送,地址传送,标志传送,端口传送)
② 算术逻辑运算指令
③ 循环移位指令
④ 浮点运算指令
⑤ 十进制运算指令
⑥ 字符串处理指令
⑦ 转移指令
a无条件转移, b条件转移,c陷阱指令,d中断类型指令
⑧ 堆栈及其操作指令
⑨ 特权指令
⑩ 其它指令:a向量指令;b多处理器指令;c控制指令。
1.传送指令:
① 数据传送指令:
可在:
存储器
寄存器 寄存器 进行数据传送
I/O端口
![]()