跳至主要內容

2.指令的寻址方式


指令寻址和数据寻址

提示

寻址方式是指寻找指令或操作数有效地址的方式,即确定本条指令的数据地址及下一条待执行指令的地址的方法

指令寻址

  1. 顺序寻址,通过程序计数器PC加1(1个指令字长),自动形成下一条指令的地址。
  2. 跳跃寻址,由本条指令给出下条指令地址的计算方式,跳跃的地址分为绝对地址(由标记符直接得到)和相对地址(相对于当前指令地址的偏移量),跳跃的结果是当前指令修改PC值,所以下一条指令仍然通过PC给出

数据寻址

数据寻址方法较多,通常在指令中设一个寻址特征字段区分

常见的数据寻址方式

相关总结

隐含寻址

这种类型的指令不明显地给出操作数的地址,而在指令中隐含操作数的地址,例如累加器(ACC)对单地址指令格式来说是隐含寻址

image.png
image.png
  • 优点:缩短指令字长
  • 缺点:需增加存储操作数或隐含地址的硬件

立即(数)寻址

表示立即寻址特征表示立即寻址特征表示立即寻址特征表示立即寻址特征表示立即寻址特征表示立即寻址特征表示立即寻址特征

image.png
image.png
  • 优点:指令执行阶段[1]不需要访存,执行时间段
  • 缺点:A的位数限制了立即数的范围

直接寻址

指令中的形式地址AA就是操作数的真实地址EAEAEA=AEA=A

image.png
image.png
  • 优点:简单,执行阶段仅访存一次
  • 缺点:AA的位数决定了操作数寻址范围

间接寻址

指令的地址字段给出的形式地址是操作数有效地址所在的存储单元,即操作数地址的地址,EA=(A)EA=(A),间接寻址可以是一次间接寻址,或多次间接寻址

image.png
image.png
  • 优点:扩大寻址范围,一般问到扩大寻址范围时,通常指的是寄存器间接寻址
  • 缺点:执行阶段多次访存,一次间接寻址需要访存两次

寄存器寻址

寄存器寻址是指在指令字中直接给出操作数所在的寄存器编号,即EA=RiEA=R_{i},其操作数在RiR_{i}所指的寄存器内

image.png
image.png
  • 优点:不访问主存只访问寄存器,因寄存器数量较少,对应地址码长度较小,使得指令字短且因不用访存,所以执行速度快,支持向量/矩阵运算
  • 缺点:寄存器价格昂贵

寄存器间接寻址

寄存器间接寻址是指在寄存器R中给出的不是一个操作数,而是操作数所在主存单元的地址,即EA=(Ri)EA=(R_{i})

image.png
image.png
  • 优点:比一般间接寻址速度快
  • 缺点:访存

相对寻址

相对寻址是把PCPC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(PC)+AEA=(PC)+A,其中AA是相对于当前PCPC下一个位置[2]的位移量,可正可负,补码表示

image.png
image.png
  • 优点:地址不固定,随PCPC变化,便于程序浮动,相对寻址广泛应用于转移指令
  • 缺点:AA的位数决定操作数的寻址范围

注意

注意, 对于转移指令 JMPA, 当 CPU 从存储器中取出一字节时, 会自动执行 (PC)+1PC(\mathrm{PC})+1 \rightarrow P C。若转移指令的地址为 XX, 且占 2B2 B, 在取出该指令后, PCP C 的值会增2 , 即 (PC)=X+2(P C)=X+2, 这样在执 行完该指令后, 会自动跳转到 X+2+A\mathrm{X}+2+\mathrm{A} 的地址继续执行。

基址寻址

基址寻址是指将 CPU 中基址寄存器 (BR) 的内容加上指令格式中的形式地址 A 而形成操作 数的有效地址, 即 EA=(BR)+A\mathrm{EA}=(\mathrm{BR})+\mathrm{A} 。其中基址寄存器既可采用专用寄存器, 又可采用通用寄存器。

image.png
image.png

基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定,主要用于解决程序逻辑空间与存储器物理空间的无关性。

  • 基址寻址的优点是可扩大寻址范围(基址寄存器的位数大于形式地址A的位数):用户不必考虑自己的程序存于主存的哪个空间区域,因此有利于多道程序设计,并可用于编制浮动程序
  • 缺点:偏移量(形式地址A)的位数较短。

变址寻址

变址寻址是指有效地址 EA 等于指令字中的形式地址 A\mathrm{A} 与变址寄存器 IX\mathrm{IX} 的内容之和, 即 EA=\mathrm{EA}= (IX)+A(I X)+A, 其中 IX 为变址寄存器 (专用), 也可用通用寄存器作为变址寄存器。

image.png
image.png

变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(作为偏移量),形式地址A不变(作为基地址[3])。主要用于处理数组问题。

堆栈寻址

堆栈是存储器(或专用寄存器组)中一块特定的、按后进先出(LIF0)原则管理的存储区,该存储区中读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)。堆栈可分为硬堆栈软堆栈两种。

  • 寄存器堆栈又称硬堆栈。寄存器堆栈的成本较高,不适合做大容量的堆栈;
  • 而从主存中划出一段区域来做堆栈是最合算且最常用的方法,这种堆栈称为软堆栈。

栈顶在小地址方向时:

出栈:

(Msp)ACC(SP)+1SP \begin{align*} (M_{sp}) \to ACC \\ (SP)+1\to SP \end{align*}

入栈:

(SP)1SP(Y)Msp \begin{align*} &(SP)-1\to SP \\ &(Y)\to M_{sp} \end{align*}

提示

image.png
image.png

  1. 强调执行阶段是因为取指令的时候也是需要访存的 ↩︎

  2. 因为取出当前指令后PCPC会自动增加 ↩︎

  3. 和基址寻址进行对比,这里正好相反 ↩︎