问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

计算机体系结构中的指令寻址方式详解

创作时间:
作者:
@小白创作中心

计算机体系结构中的指令寻址方式详解

引用
CSDN
1.
https://blog.csdn.net/weixin_51193374/article/details/139205701

寻址方式是计算机体系结构中的一个重要概念,它决定了指令和数据在存储器中的定位方式。本文详细介绍了指令寻址和数据寻址的多种方式,包括顺序寻址、跳跃寻址、隐含寻址、立即数寻址、直接寻址、间接寻址、寄存器寻址、寄存器间接寻址、相对寻址、基址寻址、变址寻址和堆栈寻址等。通过理解这些寻址方式的原理和应用场景,可以更好地掌握计算机体系结构和编写高效的汇编语言程序。

一、指令寻址

(一)顺序寻址

通过程序计数器PC加1(1条指令的长度),自动形成下一条指令的地址。
PC 自增的大小与编址方式、指令字长有关。现代计算机通常是按字节编址的,若指令字长为16位,则 PC自增为(PC)+2;若指令字长为32位,则PC自增为(PC)+4。

(二)跳跃寻址

通过转移类指令实现。跳跃是指由本条指令给出下条指令地址的计算方式。而是否跳跃可能受到状态寄存器的控制,跳跃的方式分为绝对转移(地址码直接指出转移目标地址)和相对转移(地址码指出转移目的地址相对于当前PC 值的偏移量),由于CPU总是根据PC的内容去主存取指令的,因此转移指令执行的结果是修改PC 值,下一条指令仍然通过PC 给出。

二、数据寻址

数据寻址是指如何在指令中表示一个操作数的地址,或怎样计算出操作数的地址。数据寻址的方式较多,为区别各种方式,通常在指令字中设置一个寻址特征字段,用来指明属于哪种寻址方式(其位数决定了寻址方式的种类),由此可得指令的格式如下所示:
操作码 寻址特征 形式地址A

一地址指令
二地址指令
指令中的地址码字段并不代表操作数的真实地址,这种地址称为形式地址,即A。形式地址结合寻址方式,可以计算出操作数在存储器中的真实地址,这种地址称为有效地址,即EA,(A)表示地址为A的数值,A既可以是寄存器编号,又可以是内存地址。
还有三地址指令、四地址指令等:
常见的寻址方式分为以下几种
寻址方式 有效地址 访存次数 备注
隐含寻址 程序指定 0 ——
立即寻址 A即是操作数 0 ——
直接寻址 EA=A 1 ——
一次间接寻址 EA=(A) 2 ——
寄存器寻址 EA=Ri 0 ——
寄存器间接一次寻址 EA=(Ri) 1 ——
相对寻址 EA=(PC)+ A 1 属于偏移寻址,用于指令转移
基址寻址 EA=(BR)+ A 1 属于偏移寻址,用于多道程序
变址寻址 EA=(IX)+ A 1 属于偏移寻址,用于循环程序
堆栈寻址 入栈/出栈时EA的确定方式不同 硬堆栈不访存,软堆栈访存1次 ——

(一)隐含寻址

这种类型的指令,不是明显地给出操作数的地址,而是在指令中隐含着操作数的地址。例如单地址指令格式,就不给出第二操作数的地址,而是规定累加器ACC作为第二操作数的地址,指令中只是明显指出第一操作数。隐含寻址的优点是有利于缩短指令字长,缺点是需要增加存储操作数的硬件和存储隐含地址的硬件。

(二)立即(数)寻址

这种类型的指令的地址码字段指出的不是操作数的地址,而是操作数本身,又叫立即数。数据采用补码的形式存放。立即寻址的优点是指令在执行阶段不访问主存,指令执行的时间最短,缺点是A的位数限制了立即数的范围。(在定长指令码格式下,所有指令的长度都是一样的,这时候取每条指令的时间都一样,执行指令时立即数寻址最快,但是如果在变长指令码下,受到形式地址位数的限制,如果操作数比较大,那立即寻址方式在取指令的时间上要用时更多一点)

(三)直接寻址

这种类型的指令的地址码字段的形式地址就是操作数的真实地址,取数操作直接取地址里面的内容,它的有点是简单,只需要访问一次主存,不需要专门计算操作数的地址,缺点是A的位数决定了该指令操作数的寻址范围,操作数的地址不易修改,相对于立即寻址,直接寻址缩短了指令的长度。
注意:
(1)寻址范围为正数,因为主存地址没有负的;

(四)间接寻址

这种类型的指令是相对于直接寻址而来的,在直接寻址中,形式地址就是真实地址,在间接寻址中,形式地址是操作数地址的地址,即EA=(A),间接寻址可以是一次间接,也可以是多次间接。它的优点是可以扩大寻址范围,因为EA的位数大于A的位数,便于编制程序,可以方便地实现子程序的返回,缺点是在执行使需要多次访问内存,访问速度慢。这种寻址方式并不常用。一般扩大寻址范围都采用寄存器间接寻址。毕竟访问寄存器更快一点。

(五)寄存器寻址

这种类型的指令是直接给出操作数所在的寄存器的编号,EA=Ri,操作数就在Ri内存放。寄存器寻址的优点是指令在执行阶段不访问主存,只访问寄存器,因此执行速度快,因为寄存器数量少,所以寄存器编号所占的位数也少,指令字长也比较短。缺点是寄存价格昂贵,计算机中寄存器的个数也是有限的。

(六)寄存器间接寻址

这种类型的指令是相对于寄存器寻址的,指令中还是直接给出寄存器的编号,但是寄存器中存放的不是操作数而是操作数所在的地址,EA=(Ri)。它的优点是扩大了寻址范围,比间接寻址速度更快,但是指令执行阶段还是要访问主存的。

(七)相对寻址

这种类型的指令是将程序计数器PC中的内容与指令中的形式地址A相加,从而得出操作数的有效地址EA=(PC)+A,A是相对于当前指令地址的位移量,用补码表示,可正可负。
相对寻址的优点是,操作数的地址是不固定的,它随着PC值的变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序的浮动(随着操作系统功能的日渐强大,程序在主存中的位置不是固定不变的)。相对寻址用于控制程序的执行顺序、转移等。
相对寻址经常在选择题和大题的小问中考察,形式地址A(相对于当前指令地址的位移量)常用OFFSET(相对于当前指令的指令位移量)表示,注意转移后的地址=(PC)+指令长度+OFFSET*指令长度

(八)基址寻址

这种类型的指令是将CPU中基址寄存器BR的内容加上指令格式中的形式地址,形成操作数的真实地址,EA=(BR)+A。其中,基址寄存器既可以采用专用寄存器,也可以采用通用寄存器。
基址寄存器是面向操作系统的,它的内容由操作系统或管理程序确定,主要用于解决程序逻辑空间与存储器物理空间的无关性。程序运行过程中,基址寄存器中的内容是不变的,形式地址是可变的。如果采用通用寄存器作为基址寄存器,可以由用户决定哪个寄存器作为基址寄存器,但是内容还是由操作系统决定。
基址寻址的优点是可以扩大寻址范围(基址寄存器的位数大于A的位数),用户不用考虑自己的程序存放在主存的哪个区域,有利于多道程序设计,可用于编址浮动程序,常用于为程序和数据分配存储空间。

(九)变址寻址

这种类型的指令是将指令中的形式地址与变址寄存器IX内容相加,得到真实地址,EA=(IX)+A,也可以用通用寄存器作为变址寄存器。
与基址寻址相反,变址寻址是面向用户的,在程序执行的过程中,变址寄存器中的内容是可以由用户改变的,用作偏移量,而形式地址A则不变,作为基地址。
变址寻址的优点是可以扩大寻址范围(变址寄存器的位数大于A的位数),主要用在数组处理过程中,可以设定A为数组首地址,然后不断改变IX中的值即可形成数组中任意一个数据的地址,适合编制循环程序。IX的位数足以表示整个存储空间。
另外,在这里说一下基址寻址和变址寻址的区别
基址寻址实现的是程序段之间的转移,比如设置基址为0,我在100那个有个程序,利用基址寻址到100(一顿执行,此处省略~)。我在200又有个程序,再利用基址寻址到200。是不是每次一条指令就可以完成?所以对于基址寻址功能的描述中有一句:实现程序的动态再定位。
变址寻址适合循环,那是怎么实现的呢?常使用的for循环都知道,每次加1。是一个固定的值。从100开始,下次101,下次102… …用基址寻址实现可不可以呢?当然可以!按照基址寻址中基址不变的原则,更改后面的偏移量就可以。那相当于100次偏移,要100个不同的指令(后面的偏移量不同)。那变址如何实现的呢?变址寻址把100存在式子里的C中,通过改变变址寄存器中的数值,一次加1。指令中放的可都是寄存器的编号,虽然寄存器数值变了,编号还是固定的。

(十)堆栈寻址

堆栈是存储器中的一块按照后进先出原则管理的存储区,改存储区中被读/写单元的地址是由一个特定的寄存器给出的,该寄存器称为堆栈指针SP。堆栈可分为硬堆栈和软堆栈,硬堆栈是指寄存器堆栈,由于制作成本高,不适合做大容量,一般采用软堆栈,即从主存中划分出一段区域来作为堆栈。
在采用堆栈结构的计算机系统中,大部分指令表面上都表现为无操作数指令的形式,因为操作数地址都隐含了SP。通常在读或写堆栈中的一个单元的前后都伴有自动完成对SP内容的增减。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号
计算机体系结构中的指令寻址方式详解