pc_寻址方式_xuchaoxin1375的博客-爱代码爱编程
寻址方式
- 寻找指令或者操作数有效地址的方式,即,确定本条指令的数据地址以及下一条指令的地址的方法
- 包含指令寻址和数据寻址两类
- 指令中断地址码字段不代表操作数的真是地址,则称这种地址为形式地址(A)
- 形式地址结合寻址方式可以计算出操作数在存储器中的真实地址(称为有效地址(EA))
- (A)表示地址为A的数值
- A可以是寄存器编号
- 也可以是内存单元地址
- 对应的(A)就是寄存器中的数值(或相应内存单元的数值)
- EA=(A)表示有效地址EA就是A处保存的值
- (EA)就表示操作数本身
指令寻址
-
寻找下一条将要执行的指令地址称为指令寻址
-
顺序寻址
-
跳跃寻址
- 如果发生跳跃,跳跃结果是当前指令修改PC值,所以下一条指令依然是通过PC给出
- 但是PC中的值可能不再是默认+1的结果
-
数据寻址
-
寻找本条指令的(操作数)数据地址称为数据寻址
-
在指令中表示一个操作数的地址
-
并且如何用这种表示,得到操作数或者如何计算出操作数的地址
-
将地址码字段进一步划分为寻址特征和形式地址
-
O P 操 作 码 寻 址 特 征 形 式 地 址 A \begin{array}{|c|c|c|c|} \hline OP操作码&寻址特征&形式地址A\\ \hline \end{array} OP操作码寻址特征形式地址A
-
-
隐含寻址
- 不明显地给出操作数地址
- 在指令中隐含操作数地址
- 特点:
- 缩短指令长度
- 需要增加存储操作次数或者隐含地址的硬件
立即数寻址
- 这种类型的指令的地址字段指出的不是操作数地址,而是操作数本身,又称为立即数
- 特点:
- 指令在执行阶段不访问主存,指令执行时间最短
- 缺点是位数限制了立即数的范围
直接寻址
- 指令中的形式地址A是操作数的真是地址EA
- 即EA=A
- 特点:
- 简单(在执行阶段仅需要访问一次主存,不需要专门计算操作数的有效地址)
- A的位数决定了指令操作数的寻址范围,操作数的地址不易修改
间接寻址
- 相对于直接寻址而言的
- 设操作数为 x x x
- E A = ( A ) EA=(A) EA=(A)
- x = ( E A ) = ( ( A ) ) x=(EA)=((A)) x=(EA)=((A))
- 如果是2次间接寻址,那么:
- EA=((A))
- x = ( E A ) = ( ( ( A ) ) ) x=(EA)=(((A))) x=(EA)=(((A)))
- 依次类推
- 特点
- 间接寻址可以扩大寻址范围
- 形式地址A的位数往往比有效地址位数更少
- 但是自行阶段需要多次访存
- 每多1次间址,就需要多访存一次(根据存储字的最高位确定访问次数)
- 这是非常坏的,效率很低
寄存器寻址
- 在指令字中直接给出操作数所在寄存器编号
- E A = R i EA=R_i EA=Ri( R i R_i Ri表示编号为i的寄存器,可以将 R i R_i Ri理解为地址,而且是可以高速访问的地址)
- x = ( E A ) = ( R i ) x=(EA)=(R_i) x=(EA)=(Ri), R i R_i Ri寄存器中的内容就是操作数 x x x
- 特点:
- 指令在执行阶段不需要访存只访问寄存器
- 因为寄存器数量少,对应的地址码(寄存器编号)长度较小,使得指令字短,不需要访存
- 支持向量/矩阵运算
- 但是,寄存器价格高,寄存器的数量有限
- 指令在执行阶段不需要访存只访问寄存器
寄存器间接寻址
-
在寄存器 R i R_i Ri给出的表示操作数本身,而是操作数所在主存单元的地址
-
E A = ( R i ) EA=(R_i) EA=(Ri)
-
x = ( E A ) = ( ( R i ) ) x=(EA)=((R_i)) x=(EA)=((Ri))
-
-
特点
- 相比于一般间接寻址的速度快(第一次访问的地址是寄存器,速度快)
- 指令执行阶段需要访问主存
相对寻址
- 将PC中的内容加上指令格式中的形式地址A ,形成操作数的有效地址EA
- E A = ( P C ) + A EA=(PC)+A EA=(PC)+A
- A是相对于当前指令地址的位移量
- 从公式上看,容易理解,A的位数决定了操作数的范围
基址寻址
-
将cpu中的基址寄存器BR的内容加上指令格式中的形式地址A形成的操作数有效地址EA
- E A = ( B R ) + A EA=(BR)+A EA=(BR)+A
- BR可以采用专用寄存器或者通用寄存器实现
-
特点
- 基址寄存器BR是面向操作系统的
- 内容有操作系统/管理程序确定
- 采用通用寄存器作为BR时,虽然用户可以决定哪个GPR作为BR,但是内容依然有操作系统决定
- 主要是用来解决程序逻辑空间和存储器物理空间的无关性
- 程序执行过程中,BR的内容不变(作为基地址)
- 形式地址可以变(作为偏移量)
- 内容有操作系统/管理程序确定
- 优点:
- 可扩大寻址范围
- BR的位数大于形式地址A的位数
- 用户不必考虑苏自己的程序存于主存的哪个空间区域,有利于多道程序设计
- 可以编制浮动程序,但偏移量(形式地址A)位数较短
- 可扩大寻址范围
- 基址寄存器BR是面向操作系统的
变址寻址
-
E
A
=
(
I
X
)
+
A
EA=(IX)+A
EA=(IX)+A
- 变址寄存器IX(index Register)
- 特点:
- 变址寄存器面向用户
- 在程序执行过程中,IX的内容可以作为偏移量,由用户改变
- 偏移量的位数足以表示整个存储空间
- 形式地址A不变(和基址寻址特点相反)
- 也可以扩大寻址范围
- 便于编制循环程序
堆栈寻址
- 堆栈是存储器(寄存器组)中一块特定的,按照后进先出(LIFO)的原则管理的存储区
- 该存储区中读写单元的**地址(指针)**是用一个特定的寄存器给出
- 该寄存器称为堆栈指针
- 寄存器堆栈又称为硬堆栈
- 成本高
- 从主存中划分一段区域来做堆栈称为软堆栈(比较常用)
- 在采用堆栈结构的计算机系统中,大部分指令表面上都表现为无操作数指令心事
- 应为操作数地址都隐含使用了SP
- 通常,在读写堆栈中的一个单元的前后,都便有自动完成对SP内容的增量/减量操作
小结
-
寻 址 方 式 有 效 地 址 访 存 次 数 隐含寻址 程序指定 0 立即寻址 A 即是操作数 0 直接寻址 E A = A 1 一次间接寻址 E A = ( A ) 2 寄存器寻址 E A = R i 0 寄存器间接一次寻址 E A = ( R i ) 1 相对寻址 E A = ( P C ) + A 1 基址寻址 E A = ( B R ) + A 1 变址寻址 E A = ( I X ) + A 1 \begin{array}{c|c|c} \hline \text { 寻 址 方 式 } & \text { 有 效 地 址 } & \text { 访 } \text { 存 次 数 } \\ \hline \text { 隐含寻址 } & \text { 程序指定 } & 0 \\ \hline \text { 立即寻址 } & \mathrm{A} \text { 即是操作数 } & 0 \\ \hline \text { 直接寻址 } & \mathrm{EA}=\mathrm{A} & 1 \\ \hline \text { 一次间接寻址 } & \mathrm{EA}=(\mathrm{A}) & 2 \\ \hline \text { 寄存器寻址 } & \mathrm{EA}=\mathrm{R}_{i} & 0 \\ \hline \text { 寄存器间接一次寻址 } & \mathrm{EA}=\left(\mathrm{R}_{i}\right) & 1 \\ \hline \text { 相对寻址 } & \mathrm{EA}=(\mathrm{PC})+\mathrm{A} & 1 \\ \hline \text { 基址寻址 } & \mathrm{EA}=(\mathrm{BR})+\mathrm{A} & 1 \\ \hline \text { 变址寻址 } & \mathrm{EA}=(\mathrm{IX})+\mathrm{A} & 1 \\ \hline \end{array} 寻 址 方 式 隐含寻址 立即寻址 直接寻址 一次间接寻址 寄存器寻址 寄存器间接一次寻址 相对寻址 基址寻址 变址寻址 有 效 地 址 程序指定 A 即是操作数 EA=AEA=(A)EA=RiEA=(Ri)EA=(PC)+AEA=(BR)+AEA=(IX)+A 访 存 次 数 001201111