(计算机组成原理)指令的寻址方式

指令寻址方式是指指令或者操作数有效地址的寻找方式,主要分为数据寻址和指令寻址。指令的地址码字段往往并不是操作数的真实地址,而是形式地址,用A表示,(A)即操作数形式地址所指向的存储介质的数值。用形式地址结合指令的寻址方式可以计算出操作数的真实地址,称为有效地址用EA表示,(EA)即表示有效地址所指向存储介质的数值,亦即操作数。如果此时存在EA=(A),表示形式地址A所指向的存储介质中的数值,就是操作数的有效地址,(EA)是真正的操作数。


数据寻址和指令寻址

程序被启动时,程序所包含的指令和数据都被装入到内存中。在程序指令过程中,需要取指令和操作数,确定指令存放位置的过程称为指令寻址确定操作数存放位置的过程称为数据寻址

指令寻址

找到下一条将要执行指令的地址,称为指令寻址。指令基本上按执行顺序存放在主存中,执行过程中,指令总是从内存单元被取到指令寄存器IR中。

一般来说,指令寻址只有两种方式:顺序执行时,用指令计数器(PC)+‘1’来得到下一条指令的地址;跳转执行时,通过转移指令的寻址方式,计算出目标地址,送到PC中即可。目标转移地址的形成方式主要有3种:立即寻址(直接地址),相对寻址(相对地址),间接寻址(间接地址)。

顺序寻址可通过程序计数器(PC)加1,自动形成下一条指令的地址,1->2->3 ,7->8都属于顺序寻址。

数据寻址

找到当前正在执行指令的数据地址,称为数据寻址。开始时数据被存放在内存中,但在执行过程中,内存的数据可能被装入到CPU寄存器中,或者内存的堆栈区中;还有操作数可能是I/O端口中的内容,或本身就包含在指令中(立即数)。另外运行的结果也可能要被运送到CPU的寄存器中,堆栈中等等,所以数据的寻址要涉及对寄存器,内存单元,堆栈,I/O,立即数的访问。此外操作数可能是某个一维数组或者二维数组的元素,因此还要考虑如何提供相应的寻址方式,以方便找到数组元素。综上所述数据寻址要比指令寻址麻烦的多。为了区分不同的方式,在指令字中通常设一个字段,用来指明属于何种寻址方式。


常见的数据寻址方式 

绝大多数情况下,地址码字段通常都不代表操作数的真实地址,而是形式地址,寻址方式就是将形式地址转换成真实地址,设置多种寻址方式是为了各种不同程序的需要。

α.立即寻址

如果形式地址是立即数,则表明该数是操作数,不需要给出地址去其他地方找操作数。A不是操作数地址,而是操作数本身。

通常把‘#’符号放在立即数前面,以表示该寻址方式为立即寻址如#20H。

优点:只需取出指令即可立即获得操作数。采用立即寻址特征的指令只需在取指令时访问存储器,而在执行阶段不必再访问存储器。

缺点:由于A表示的就是立即数,因此A的位数限制了立即数的表示范围,例如A占8位,则立即数的表示范围为‘-128~127’(立即数都是由补码表示)

用途:1)若需要一个循环次数(如for 循环的循环次数)給某专用寄存器,则可以使用立即寻址直接将循环次数作为立即数送入。

           2)若需要将某程序的首地址送入程序计数器中,而且程序的首地址可以看成时一个操作数,则可以使用立即寻址直接将该程序的首地址作为立即数送入。

立即寻址方式通常用于对某寄存器或内存单元赋值

β.直接寻址

若形式地址为实际地址即可直接寻址

数据直接寻址与指令直接寻址一样,可将有效地址EA=A 。

优点:寻找操作数简单,因为直接给出了操作数的有效地址,不需要经过其他变换。

缺点:操作数的有效地址仅由A决定,而A的位数一般都比较小,因此寻址范围比较小。

γ.隐含寻址

隐含寻址指指令中不明显给出操作数地址,其操作数地址隐含在操作码或者某个寄存器中。其中最典型的例子就是一地址格式的加法指令 ↓。

 操作码显示ADD,说明有两个操作数进行运算,而地址只给出了一个操作数地址,另一个操作数隐藏在ACC中,这就是隐含寻址。

δ.间接寻址

直接寻址的地址码字段A的位数较小,因此寻址范围较小,间接寻址可以解决这个问题;直接寻址是直接给出了操作数的有效地址,即直接可以通过该地址找到操作数。间接寻址分为一次间接寻址和多次间接寻址。

一般来说,指令字长等于存储字长。作为一条指令,首先要有操作码,既然有操作码就要占位数,要占位数说明A的位数肯定小于指令字长,而有效地址EA在主存中,和指令字长的位数一样大,那么EA所能表示的寻址范围就更大了。

假设指令字长和存储字长都是16位,其中A为8位,显然直接寻址范围为2^{8},而a)中一次间接寻址的寻址范围可以达到2^{16 }。 而如果是多次间接寻址,就达不到2^{16},如b)需要使用第一位标注寻址是否结束,故寻址范围为2^{15}

优点:便于子程序返回和查表。

缺点:很明显,一次间接寻址在指令执行阶段还需要访问两次存储器(一次取操作数的有效地址,一次取操作数),而N次间接寻址却需要访问存储器N+1次。

间接寻址用途:I/O系统中断中讲到寻找中断服务程序入口就是使用间接寻址。

ε.寄存器寻址

寄存器寻址比较简单,基本和直接寻址类似。在直接寻址的指令字中,地址码字段给出的是主存的地址,而在寄存器寻址的指令字中,地址码字段直接给出了寄存器编号R_{i},则操作数的有效地址EA=R_{i},如下图

 

 优点:1)由于操作数在寄存器中,因此指令在执行阶段不需要访存,即减少了执行时间。

            2)减少了指令字的长度;例如假设有2^{7}=128条指令,7bit + 27bit + 27bit + 27bit + 27bit = 155bit 。如果使用了寄存器寻址,一个操作数的地址就不需要27位,因为给出的是寄存器号,即使计算机中有1024个寄存器,一个操作数的地址也仅仅需要10位表示即可,所以可以大大地减少指令字的长度。

ζ.寄存器间接寻址

间接寻址明白了,寄存器间接寻址基本就跳过了。和寄存器寻址的不同之处在于,R_{i}的内容不是操作数,而操作数所在主存单元的地址号,即有效地址EA=\left ( R_{i} \right )

优点:便于编制循环程序。

缺点:对于直接寻址和间接寻址来说不是缺点,对于寄存器寻址来说是一个小小的缺陷,因为寄存器间接寻址需要访问一次存储器去取操作数。

η.基址寻址 

基址是什么?字面意义就是操作数的有效地址需要通过某个基础地址来形成。需要设置一个基址寄存器(BR),其操作数的有效地址EA等于指令字中的形式地址A与基址寄存器中的内容相加。

                                                        EA=A+\left ( BR \right )

a)采用专用寄存器BR作为基址寄存器                                b)采用通用寄存器作为基址寄存器

优点:1)扩大操作数的寻址范围

           2)便于解决多道程序问题

注意:基址寄存器的内容由操作系统确定,在程序执行过程中不能由用户随意改变;

           虽然基址寄存器的内容不可以由用户改变,但是当采用通用寄存器组来作为基址寄存器时,用户有权知道到底使用哪个通用寄存器来作为基址寄存器。

θ.变址寻址

变址寻址与基址寻址相似度90%。

a)采用通用寄存器作为变址寄存器                                  b)采用专用寄存器IX作为变址寄存器

变址寻址的有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加

        EA=A+\left ( IX \right )

注意:在变址寻址中,变址寄存器的内容是由用户设定的,在程序执行过程中其值可变,而指令字中的形式地址A时不可变的,这点恰好和基址寄存器相反。

优点:1)扩大操作数的寻址范围(前提是变址寄存器的位数大于形式地址A的位数)

           2)适合处理数组问题和循环程序

基址寻址与变址寻址的区别:两种方式有效地址的形成都是寄存器内容+偏移地址,但在基址寻址中,程序员操作的是偏移地址,基址寄存器的内容由操作系统控制,在执行过程中时动态调整的;在变址寻址中,程序员操作的是变址寄存器,偏移地址时固定不变的。

λ.相对寻址

基址寻址,变址寻址,相对寻址都可以看成时偏移寻址。相对寻址基于程序局部性原理。相对寻址的有效地址是将程序计数器(PC)的内容与指令字中的形式地址A相加而成:EA=\left ( PC \right )+A

 从图中可以看出,操作数的位置与当前指令的位置有一个相对的距离。

相对寻址用途一:用于转移类指令。转移后的目标地址与当前指令有一段距离,称为相对位移量,此位移量由指令字的性质地址给出,故A称位位移量。

相对寻址用途二:便于编制浮动程序。

寻址方式有效地址计算方式用途及特点
立即寻址通常用于给寄存器赋值
直接寻址EA=A
隐含寻址缩短指令字长
一次间接寻址EA=\left ( A \right )扩大寻址范围,易于完成子程序返回
寄存器寻址EA=R_{i}指令字较短;指令执行速度较快
寄存器间接寻址EA=\left ( R_{i}\right )扩大寻址范围
基址寻址EA=A+\left ( BR \right )

扩大操作数寻址范围;适用于多道程序

设计,常用于为程序或数据分配存储空间

变址寻址EA=A+\left ( IX \right )主要用来处理数组问题
相对寻址EA=A+\left ( PC \right )用于转移指令和程序浮动

先间接寻址

再变址寻址

EA=\left ( A \right )+\left ( IX \right )

先变址寻址

再间接寻址

EA=\left ( A+\left ( IX \right ) \right )

  • 19
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值