概述
本文参考《计算机组成原理(第2版)》(唐朔飞)
目录
- 指令类型
- 指令格式
- 指令字长
- 指令的基本格式
- 定长操作码指令格式
- 扩展操作码指令格式
- 地址码的表示与编码
- 寻址方式
- 指令寻址
- 数据寻址
- 立即寻址
- 直接寻址
- 隐含寻址
- 寄存器寻址
- 间接寻址
- 存储器间接寻址
- 寄存器间接寻址
- 基址寻址
- 变址寻址
- 相对寻址
- 堆栈寻址
指令类型
传送指令、算术 / 逻辑运算指令、程序控制指令(转移指令、转子程序指令和返回指令)、输入 / 输出类指令
指令格式
指令字长
- 指令字:代表指令的一组二进制代码信息
- 指令字长:指令字中二进制代码的位数
一台机器的指令系统可以采用位数不相同的指令,即指令字长是可变的
指令的基本格式
- 操作码
O
P
OP
OP:指明该指令所要完成的操作
(操作码字段的位数决定了支持的指令数) - 地址码 A A A:说明操作数存放的地址,有时则就是操作数本身
定长操作码指令格式
- 各指令 O P OP OP 的位置、位数固定相同
- 优点:有利于简化硬件设计,减少译码时间
- 应用:在字长较长的大中型、超级小型机以及 RISC 上使用
扩展操作码指令格式
- 各指令 O P OP OP 的位置、位数不固定,根据需要变化
- 不同地址数的指令可以具有不同长度的燥作码,从而在满足需要的前提下,有效地缩短指令字长
设汁操作码不固定的指令系统时,应尽量考虑安排指令使用频度高的指令占用短的操作码,这样可以缩短经常使用的指令的译码时间
- 特点:在不增加指令字长度的情况下可表示更多的指令,但增加了译码和分析难度,需更多硬件支持
- 应用:微机中常使用此方式
实现的关键在于 设置扩展标志
例
指令字长16位,可含有3、2、1或0个地址,每个地址占4位
各指令的操作码一定不能重复,因此如果要扩展,就得至少留一个状态进行扩展!
地址码的表示与编码
- 地址码用来指出该指令的 源操作数的地址 以及 结果的地址
- 这里的 “地址”, 可以是
- 主存的地址
- 寄存器的地址 (寄存器编号)
使用寄存器比使用主存速度更快,且需要的寻址范围小得多 (寄存器个数很少) - I/O 设备的地址
指令提供地址的方式
- 显地址方式:指令中明显指明地址
- 隐地址方式:地址隐含约定,不出现在指令中(例如某种格式的地址就代表内存中的地址)。使用隐地址可以减少指令中的地址数,简化地址结构
- 零地址指令(例:空操作
NOP
)
- 一地址指令(例:递增,移位,取反,
INC AX
,NOT BX
)
- 二地址指令(例:
[A1]+[A2]→[A1]
,[A2]
为源地址,[A1]
为目的地址)
- 三地址指令(例:
[A1]+[A2]→[A3]
,其中[A1]
、[A2]
为源地址,[A3]
为目的地址)
- 多地址指令:用于实现成批数据处理
可以看出,在指令字长相同的情况下,地址数越少,地址码的位数就越多,寻址范围越大
例
指令字长16位,用可变格式操作码分别形成三地址指令、二地址指令、一地址指令和零地址指令15、 14、31、16条。结果之一如下:
寻址方式
指令寻址
指令寻址:确定下一条将要执行的指令的地址
- 顺序寻址:可以通过程序计数器 P C PC PC加 1 自动形成下一条指令的地址
- 跳跃寻址:通过转移类指令实现
数据寻址
数据寻址:确定本条指令的操作数 / 操作数地址
- 形式地址 A A A :指令中地址码给出的地址
- 有效地址 E A EA EA :形式地址经过某种运算而得到的能直接访问主存中操作数的地址,是寻址方式和形式地址共同来决定的
- 数据寻址方式种类较多,可以通过操作码隐含说明不同寻址方式,也可以在指令宇中必须设一字段来指明属于哪一种寻址方式
立即寻址
- 立即寻址:指令直接给出操作数
- 提高了指令执行速度,但操作数长度受限
- 主要用来给通用寄存器或存储单元提供常数或设置初值
直接寻址
- 直接寻址:指令字中的形式地址 A A A 就是操作数的真实地址 E A EA EA
- 寻找操作数比较简单,也不需要专门计算操作数的地址,在指令执行阶段对主存只访问一次
- 它的缺点在于 A A A 的位数限制了操作数的寻址范围
隐含寻址
- 隐含寻址:指令字中不明显地给出操作数的地址,其地址隐含在操作码或某个寄存器中
- 有利于缩短指令字长
寄存器寻址
- 寄存器寻址:给出操作数所在的寄存器编号
- 由于操作数不在主存中,故寄存器寻址在指令执行阶段无须访存,减少了执行时间
- 由于地址字段只需指明寄存器编号(计算机中寄存器数有限),故指令字较短,节省了存储空间
间接寻址
- 间接寻址:指令给出操作数的间接地址 (操作数有效地址所在的存储单元地址),即 E A = ( A ) EA=(A) EA=(A)
存储器间接寻址
- 与直接寻址相比,扩大了操作数的寻址范围,因为 A A A 的位数通常小于指令字长,而存储字长可与指令字长相等
- 缺点在于指令的执行阶段需耍访存两次( 一次间接寻址)或多次(多次间接寻址),致使指令执行时间延长
寄存器间接寻址
- 寄存器间接寻址:指令字中给出寄存器的编号,该寄存器中存储的是操作数的地址
- 它比存储器间接寻址少访存一次
基址寻址
- 基址寻址:指令给出一个寄存器号 (基址寄存器) 和一个地址量,寄存器内容与地址量之和为有效地址
E A = A + ( B R ) EA=A+(BR) EA=A+(BR)
- 基址寄存器的位数可以大于形式地址 A A A 的位数,因此基址寻址可以扩大操作数的寻址范围
- 例如,将主存空间分为若干段,每段首地址存于基址寄存器中,段内的位移量由指令字中形式地址 A A A 指出,这样操作数的有效地址就等于基址寄存器内容与段内位移量之和,只要对基址寄存器的内容作修改,便可访问主存的任一单元
- 基址寻址在程序重定位中极为有用。用户可不必考虑自己的程序存于主存的哪一区域,完全可由操作系统或管理程序根据主存的使用状况,赋予基址寄存器内一个初始值(即基地址),便可将用户程序的逻辑地址转化为主存的物理地址(实际地址)
变址寻址
- 变址寻址:指令给出一个寄存器号 (变址寄存器) 和一个变址偏移量,寄存器内容与偏移量之和为有效地址
E A = A + ( I X ) EA=A+(IX) EA=A+(IX)
- 变址寻址与基址寻址的有效地址形成过程极为相似。但两者的应用场合不同
- 基址寻址 (面向系统) 主要用于为程序或数据分配存储空间,故基址寄存器的内容通常由操作系统确定,在程序的执行过程中值是不可变的,而指令字中的 A A A 是可变的
- 变址寻址 (面向用户) 中,变址寄存器的内容是由用户设定的,在程序执行过程中其值可变,而指令字中的 A A A 是不可变的。变址寻址主要用于处理数组问题,设定 A A A 为数组的首地址,不断改变变址寄存器的内容,便可很容易形成数组中任一数据的地址
相对寻址
- 相对寻址:指令给出位移量, P C PC PC 的内容 (当前指令的地址) 与位移量 (补码表示,可正可负) 之和为有效地址
E A = ( P C ) + A EA=(PC)+A EA=(PC)+A
- 有效地址相对 P C PC PC 上下浮动,常应用于相对转移指令
- 为实现程序浮动提供了较好支持
例
某机器字长
16
16
16 位,主存按字节编码,转移指令采用相对寻址,由两个字节组成,第一字节为操作码字段,第二字节为相对位移量字段。假定取指令时,每取一个字节
P
C
PC
PC 自动加
1
1
1。某转移指令所在主存地址为
2000
H
2000H
2000H
- 若相对位移量字段的内容为 06 H 06H 06H,求该转移指令成功转移后的目标地址
- 若相对位移量字段的内容为 F C H FCH FCH,求该转移指令成功转移后的目标地址
解
- 取出该指令后, 源 地 址 = P C + 2 = 2002 H 源地址=PC+2=2002H 源地址=PC+2=2002H,相对位移量 A = 06 H A=06H A=06H, 目 标 地 址 = 源 地 址 + A = 2002 H + 0006 H = 2008 H 目标地址=源地址+A=2002H+0006H=2008H 目标地址=源地址+A=2002H+0006H=2008H
- 取出该指令后, 源 地 址 = P C + 2 = 2002 H 源地址=PC+2=2002H 源地址=PC+2=2002H,相对位移量 A = F F F C H A=FFFCH A=FFFCH (补码,进行符号扩展), 目 标 地 址 = 源 地 址 + A = 2002 H + F F F C H = 1 F F E H 目标地址=源地址+A=2002H+FFFCH=1FFEH 目标地址=源地址+A=2002H+FFFCH=1FFEH
例
设相对寻址的转移指令占3个字节,第一字节为操作数,第二、三字节为相对位移量,而且数据在存储器中采用以低字节地址为字地址的存放方式。每当CPU从存储器取出一个字节时,即自动完成
(
P
C
)
+
1
→
P
C
(PC)+ 1 rightarrow PC
(PC)+1→PC
- 若 P C PC PC 当前值,240 (十进制),要求转移到 290 (十进制),则转移指令的第二、三字节的机器代码是什么?
- 若 P C PC PC 当前值,240 (十进制),要求转移到 200 (十进制),则转移指令的第二、三字节的机器代码是什么?
解
- P C PC PC 当前值为 240, 该指令取出后 P C PC PC 值为 243, 要求转移到 290, 即相对位移量为 290 − 243 = 47 290 -243 =47 290−243=47, 转换成补码 2 F H 2FH 2FH。由于数据在存储器中采用以低字节地址为字地址的存放方式,故该转移指令的第二字节为 2 F H 2FH 2FH,第三字节为 00 H 00H 00H
- 同理,该转移指令的第二字节为 D 5 H D5H D5H, 第三字节为 F F H FFH FFH
例
某计算机字长为16位,主存地址空间大小为128KB,按字编址,采用字长指令格式,指令名字段定义如下:
转移指令采用相对寻址方式,相对偏移是用补码表示,寻址方式定义如下:
注:(X)表示存储地址X或寄存器X的内容
则转移指令的目标地址范围是多少?
解
主存按字编址为
64
K
64K
64K,
转
移
目
标
地
址
=
(
P
C
)
+
(
R
n
)
转移目标地址=(PC)+(Rn)
转移目标地址=(PC)+(Rn),
P
C
PC
PC 为
16
16
16 位,转移指令的目标地址范围是:
0
0
0 ~
2
16
−
1
2^{16}-1
216−1 的
64
K
64K
64K 空间
堆栈寻址
堆栈寻址:借助堆栈指针 S P SP SP 找到操作数
- 堆栈从高地址 (栈底) 向低地址 (栈顶) 扩展,即自底向上生长方式
- 压栈: − S P -SP −SP,再存数
- 出栈:取数,再 + S P +SP +SP
最后
以上就是鲜艳毛豆为你收集整理的指令系统指令类型指令格式寻址方式的全部内容,希望文章能够帮你解决指令系统指令类型指令格式寻址方式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复