指令和数据的寻址方式
数据存放
按字节编址:每个字节存储单元都有一个地址编号
按字编址:每个字存储单元对应一个地址编号
按字节地址寻址:给出一个字节地址,可以取出长度为一个字节的数据
按字地址寻址:给出一个字地址,可以取出长度为一个字的数据
对于上面的例子,
假设某数据长度为4B,则需要给出4个字节地址
假设某数据长度为4B,则需要给出1个字地址
三个字长:
机器字长:CPU一次能处理的二进制数据的位数。
指令字长:一个指令字中包含二进制代码的位数。
存储字长:一个存储单元存储二进制代码的长度。
注:这些长度都是字节的整数倍, 一般等于内部寄存器的位数。
指令字长又分为:(为了方便与CPU交流,都是于机器字长对比)
- 单字长指令:指令长度=机器字长
- 半字长指令、双字长指令
通常一次并行取出一个存储字,按字节寻址时通过移位截取存储字中的一个字节
概述
定义:
寻址方式是指存储器当采用地址指定方式时,CPU形成后继指令地址或形成操作数地址的方式。
分类
- 指令寻址:一条指令执行完毕后下一条指令的地址(始终由程序计数器PC给出)
- 数据寻址:确定本条指令执行中各操作数的地址
程序计数器(PC):PC保存将要执行的指令地址
指令寻址方式
指令寻址方式有两种:
-
顺序方式
💎\(( PC ) + 1 \to PC\) ,这里的“1”表示一条指令所占用的主存单元数(按字节编址) -
跳跃方式
PC = 转移地址值(由转移指令指出)
注意: 下一条指令始终由程序计数器PC给出
操作数寻址方式
形成操作数有效地址的方法,称为操作数的寻址方式。
也就是 形式地址转化成有效地址的过程。
分类:
下面例子都是假设:指令字长=机器字长=存储字长,假设操作数为3
1、立即寻址
立即寻址是一种特殊的寻址方式
,形式地址A就是操作数本身。(此时操作数被称为立即数)
(即操作数地址=操作数本身)
一条指令的执行,共访存1次。
取指令 访存1次;执行指令 访存0次;暂不考虑存结果
特点: 在取指令时,操作码和操作数被同时取出,不必再次访问存储器,从而提高了指令的执行速度。
优点:速度最快, 指令执行阶段不访问主存。
缺点:
-
不能被修改,固定单一(因为操作数是指令的一部分)
-
操作数A的位数限制了立即数的范围。
用途:
通常用于给某一寄存器或主存单元赋初值,或者用于提供一个常数。
2、直接寻址
指令中地址码字段给出的地址A是操作数的有效地址EA(Effective Address)(即EA=A)
一条指令的执行,共访存2次。
取指令 访存1次;执行指令 访存1次;暂不考虑存结果
特点: 操作数地址是不能修改的,与程序本身所在的位置无关,所以又叫做绝对寻址方式
优点: 简单,指令执行阶段只访问一次主存,不需要计算操作数的地址。
缺点:
- A的位数决定了该指令操作数的寻址范围,
- 操作数的地址不易修改。
用途:
-
在早期的计算机中,主存储器的容量较小,指令中地址码的位数要求不长,采用直接寻址方式简单快速,也便于硬件实现,因此,常被作为主要的寻址方式。
-
但在现代,随着计算机主存容量的不断扩大,所需的地址码将会越来越长。指令中地址码的位数将不能满足整个主存空间寻址的要求,因此直接寻址方式受到了很大的限制。
-
另外,在指令的执行过程中,为了取得操作数,必须进行访存操作,降低了指令的执行速度。
3、隐含寻址
隐含寻址: 不是明显地给出操作数的地址,而是在指令中隐含着操作数的地址。
- 如:指令中一个操作数直接给出,另一个操作数(隐含在)放在ACC中。(隐含了累加器ACC作为源和目的寄存器)
优点:有利于缩短指令字长。
缺点:需增加存储操作数或隐含地址的硬件。
4、间接寻址
间接寻址:指令的地址码部分给出的地址是存放操作数地址的主存单元的地址,也就是:操作数地址的地址。
即:EA=(A)
注意:
- 间接寻址可能寻址多次:可能是地址的地址的地址.....
- 标志位为1表示是地址的地址。标志位为0表示是有效地址,然后通过有效地址找到操作数。
优点:
-
间接寻址比直接寻址灵活
因为操作数的有效地址在主存储器中,可以被灵活的修改而不必修改指令 -
可扩大寻址范围(有效地址EA的位数大于形式地址A的位数)。
-
便于编制程序(用间接寻址可以方便地完成子程序返回)。
缺点:
- 严重降低了指令执行的速度
间接寻址在指令执行过程中至少需要两次访问主存储器才能取出操作数,
用途: 因为速度慢,现在使用较少。
5、寄存器寻址
寄存器分为通用寄存器和专用寄存器。通用寄存器都有编号
在指令的地址码部分给出CPU内某一通用寄存器的编号,指令的操作数存放在相应的寄存器中,也就说:形式地址存储的是寄存器中操作数的地址。
即EA=Ri
一条指令的执行,共访存1次:取指令 访存1次,执行指令 访存0次,暂不考虑存结果
优点:
-
指令在执行时从寄存器中取操作数比访问主存要快得多;
由于寄存器在CPU的内部 -
可以有效减少指令的地址码字段的长度。
由于寄存器的数量较少,因此寄存器编号所占位数也较少
缺点: 寄存器数量少,造价高。
6、寄存器间接寻址
寄存器间接寻址:将操作数放在主存储器中,而操作数的地址放在某一通用寄存器中,然后在指令的地址码部分给出该通用寄存器的编号和地址。
即EA=(Ri)
一条指令的执行,共访存2次:取指令 访存1次,执行指令 访存1次,暂不考虑存结果
优点:
- 指令执行速度较前述的间接寻址方式要快,
因为这种寻址方式的指令较短,并且在取指后只需一次访存便可得到操作数。
用途: 目前在计算机中使用较为广泛的一种寻址方式。
7、偏移寻址
偏移寻址的重点是寄存器的特点,不同方式特点如下:
- 基址寻址:以
程序的起始
存放地址作为“起点”,面向操作系统
,利于多道程序设计。 - 变址寻址:程序员自己决定从哪里作为“起点”,
编制循环程序
。 - 相对寻址:以程序计数器
PC
所指地址作为“起点”
偏移寻址扩大(程序的)寻址范围的原因:
xx寄存器的位数可以设置得很长,而偏移量的位数可以相对较短。
(1)相对寻址
由程序计数器PC提供基准地址,而指令的地址码部分给出相对的位移量D,两者相加后作为操作数的有效地址,
即:EA=(PC)+D
。
偏移量不固定
特点: 操作数的地址不是固定的,它随着PC值的变化而变化,并且与指令地址之间总是相差一个固定值。
优点:
操作数的地址不固定,便于程序/(程序的某部分)浮动。编程时只要确定程序内部操作数与指令之间的相对距离,而无需确定操作数在主存储器中的绝对地址。
实现公共子程序的浮动。-->实现多个给程序的共享。
用途: 广泛应用于转移指令。(和公共子程序浮动一个道理)
(2)基址寻址
在基址寻址方式中,指令的地址码部分给出偏移量D,而基准地址放在基址寄存器Rb(也可以采用通用寄存器)中,操作数的有效地址仍然是由基准地址与偏移量D相加而成,即:EA=(Rb)+D
。
偏移量不固定
注:
- 基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。
- 用哪一个寄存器作为基址寄存器也必须在硬件设计时就事先规定,基准地址值可正可负。
- 当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍由操作系统确定。
优点:
-
可扩大寻址范围(基址寄存器的位数大于形式地址A的位数);
-
用户不必考虑自己的程序存于主存的哪一空间区域,故有利于多道程序设计,以及可用于编制浮动程序(程序的运行和程序所在的位置无关)。
(3)变址寻址
变址寻址:有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和,
变址寻址就是将指令的地址码部分给出的偏移地址A与CPU内某特定的变址寄存器Rx中的内容相加,以形成操作数的有效地址,
即:EA= (Rx) + A
。
偏移量是固定的,Rx是变动的
注: 可用变址寄存器(专用),也可用通用寄存器作为变址寄存器;用哪一个寄存器作为基址寄存器也必须在硬件设计时就事先规定。
优点:
- 可扩大寻址范围(变址寄存器的位数大于形式地址A的位数);
- 在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序。
解释:
while(1){
(X)+1 → X
if
(X)-10==0 :Z=1
else
Z=0
if
Z==0 :M → PC
else
(PC)+1 → PC#取下条指令,break此循环
}
用途: 变址寻址方式是一种被广泛采用的寻址方式,
最典型的应用就是将指令的地址码部分给出的地址A作为基准地址,而将变址寄存器Rx中的内容作为修改量。
在遇到需要频繁修改操作数地址时,无须修改指令,只要修改Rx中的变址值就可以了,这对于数组运算、字符串操作等一些进行成批数据处理的指令是很有用的。
例题:
3.假设变址寄存器R的内容为1000H,指令中的形式地址为2000H;地址1000H中的内容为2000H,地址2000H中的内容为3000H,地址3000H中的内容为4000H,则变址寻址方式下访问到的操作数是( )
1000H B. 2000H
C. 3000H D. 4000 H
解析:
1.根据变址寻址的方法,变址寄存器的内容与形式地址的内容相加之后,得到操作数的实际地址。
2.根据实际地址访问内存,获取操作数4000H。
8、段寻址方式
9、堆栈寻址
堆栈寻址:操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。
堆栈是存储器(或专用寄存器组)中一块特定的按“后进先出(LIFO)”原则管理的存储区,
该存储区中被读/写单元的地址是用一个特定的寄存
器给出的,该寄存器称为堆栈指针(SP)
分类:寄存器堆栈和寄存器堆栈。
用途: 堆栈可用于函数调用时保存当前函数的相关信息(保存子程序数据)
例题
例4.5 一种二地址RS型指令的结构如下所示: (P135)
其中I为间接寻址标志,X为寻址模式字段,D为偏移量字段
表4.11 例4.5的寻址方式
试写出6种寻址方式的名称
典型指令(P135页)
1、指令的分类
数据传送类指令
一般传送指令: MOV AX,BX
数据交换指令: XCHG
堆栈操作指令: PUSH,POP
运算类指令
算术运算指令: 加、减、乘、除以及加1、减1、比较
逻辑运算指令:
移位指令
程序控制类指令
程序控制类指令用于控制程序的执行方向,并使程序具有测试、分析与判断的能力。
输入和输出指令、字符串处理指令、特权指令、其他指令
2、基本指令系统的操作
20%和80%规律:
CISC中大约有20%的指令使用频率高,占据了80%的处理机时间,而有80%的不常用指令只占用处理机的20%时间。
VLSI技术发展引起的问题
VLSI工艺要求规整性,而大量复杂指令控制逻辑极其不规整,给VLSI工艺造成了很大的困难。
现在用微程序实现复杂指令与用简单指令组成的子程序相比,没有多大的区别。因为现在控制存储器和主存的速度差缩小。
CISC中,通过增强指令系统的功能,简化了软件,增加了硬件的复杂程度。然而指令复杂了,指令的执行时间必然加长,从而使整个系统的执行时间反而增加,因而在计算机体系结构设计中,软硬件的功能分配必须恰当
精简指令系统RISC
三大最大特点:
1、选取使用频率最高的一些简单指令,指令条数少;
2、指令长度固定,指令格式种类少,寻址方式种类少;
3、只有取数/存数两条指令访问存储器,其余指令的操作都在寄存器中进行。
4.5.3 精简指令系统特点(采用流水线技术)
简单而统一格式的指令译码;
大部分指令可以单周期执行
只有LOAD/STORE可以访问存储器
简单的寻址方式
三地址指令格式
较多的寄存器
对称的指令格式
总结
一台计算机中所有机器指令的集合,称为这台计算机的指令系统。
指令系统是表征一台计算机性能的重要因素,它的格式与功能不仅直接影响到机器的硬件结构,而且也影响到系统软件。
指令格式是指令字用二进制代码表示的结构形式,通常由操作码字段和地址码字段组成。操作码字段表征指令的操作特性与功能,而地址码字段指示操作数的地址。目前多采用二地址、单地址、零地址混合方式的指令格式。指令字长度分为:单字长、半字长、双字长三种形式。高档微机采用32位长度的单字长形式。
形成指令地址的方式,称为指令寻址方式。
有顺序寻址和跳跃寻址两种,由指令计数器来跟踪。
形成操作数地址的方式,称为数据寻址方式。
-
操作数可放在寄存器、内存和指令中。
-
数据寻址方式有隐含寻址、立即寻址、直接寻址、间接寻址、寄存器寻址、寄存器间接寻址、相对寻址、基值寻址、变址寻址、块寻址、段寻址等多种。
按操作数的物理位置不同,有RR型RS型和SS型。前者比后者执行的速度快。
堆栈“后进先出”。按结构不同,分为寄存器堆栈和存储器堆栈。
不同机器有不同的指令系统。
一个较完善的指令系统应当包含数据传送类指令、算术运算类指令、逻辑运算类指令、程序控制类指令、I/O类指令、字符串类指令、系统控制类指令。
RISC指令系统是目前计算机发展的主流,也是CISC指令系统的改进
,它的最大特点是:①指令条数少;②指令长度固定,指令格式和寻址方式种类少;③只有取数/存数指令访问存储器,其余指令的操作均在寄存器之间进行。
考试重点题
1.基址寻址方式中,操作数在( A )。
A.主存储器 B.基址寄存器
C.数据寄存器 D.运算器
2.CPU中跟踪指令后继地址的寄存器是( B )。
A.地址寄存器 B.程序计数器
C.指令寄存器 D.通用寄存器
3.根据操作数所处的物理位置,寻址方式中执行速度最快的指令是( D )型。
A.RR B.RS C.SS D.立即数
4.指令系统中采用不同寻址方式的目的主要是( B )。
A.可直接访问外存
B.缩短指令长度,扩大寻址空间,提高编程灵活性
C.实现存储程序和程序控制
D.提供扩展操作码并降低指令译码难度