寻址方式是指寻找指令或操作数有效地址的方式,即确定本条指令的数据地址及下一条待执行指令的地址的方法。寻址方式分为指令寻址和数据寻址两大类。
指令中的地址码字段并不代表操作数的真实地址,这种地址称为形式地址(A)。形式地址结合寻址方式,可以计算出操作数在存储器中的真实地址,这种地址称为有效地址(EA)。
注:(A)表示地址为A的数值,A既可以是寄存器编号,也可以是内存地址。对应的(A)就是寄存器中的数值,或相应内存单元的数值。EA = (A)是指有效地址是地址A中的数值。
指令寻址
指令寻址方式有两种:顺序寻址和跳跃寻址。
顺序寻址
可通过程序计算器(PC)加1(1个指令字长),自动形成下一条指令的地址。
注:如果是按字节编址,或采用变长指令字结构,PC简单加1就不行。只有当满足:定长指令字结构+按指令字编址时才会有PC每次都加1!!
定长指令字结构、按字编址、指令字长=存储字长=16bit=2B
定长指令字结构、按字节编址、指令字长=存储字长=16bit=2B
(PC)+ 2 → PC
变长指令字结构、按字节编址、指令字长=存储字长=16bit=2B
由于CPU无法确定当前指令到底占多少存储字。此时可以先读入第一个字的内容,由于操作码是包含在第一个字中,CPU可以根据操作码判断这条指令是几地址指令,进而可以得到该指令的总字节数n,再根据n修改PC的值。
注:如果是按字编址则,n应该是总存储字数。
跳跃寻址
通过转移类指令实现。所谓跳跃,是指下条指令的地址码不由程序计算器给出,而由本条指令给出。
注:是否跳跃可能受到状态寄存器和操作数的控制,而跳跃到的地址分为绝对地址(由标记符直接得到)和相对地址(相对于当前指令地址的偏移量),跳跃的结果是当前指令修改PC值,所以下条指令仍然通过程序计数器(PC)给出。
当遇到跳转指令时,PC的值依然先+1,然后CPU执行跳转指令后再修改PC的值为要跳转的值。因此如果跳转指令条件满足PC的值前后会改变两次
数据寻址——找到操作数
任务:确定本条指令的地址码
指明的真实地址EA(即操作数的存放地址)。由于程序在内存中的起始地址并不一定是0,所以会有多种地址码解释方式。
1、在程序在内存中的起始地址为0时,地址码指明的地址就是真实地址。
直接寻址、间接寻址、寄存器寻址、寄存器间接寻址、隐含寻址、立即数寻址都属于非偏移寻址。
2、程序在内存中的起始地址不为0,地址码指明的是以起始地址为基准的数值。
基址寻址和变址寻址都是以某个起始地址为基准的。
3、程序在内存中的起始地址不为0,地址码指明的是以PC的值为基准的数值。
相对寻址是以PC的值为基准的。
后两种都是以某个地址作为起点,形式地址视为“偏移量”。——这就是偏移寻址
由于数据的寻址方式较多,为区别各种方式,通常在指令字中设置一个“寻址特征”字段,用来指明属于哪种寻址方式,指令格式如下:
一、直接寻址——EA=A
指令字中的形式地址A就是操作数的真实地址EA,即EA=A。
访存次数:取指令1次,执行指令1次,暂不考虑存结果,共访存2次。
优点:简单,指令执行阶段仅访问一次主存,不需专门计算操作数的地址。
缺点:A的位数决定了该指令操作数的寻址范围。操作数的地址不易修改。
二、间接寻址——EA=(A)
指令的地址字段给出的形式不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A)。
一次间址访存次数:取指令1次,执行指令2次,暂不考虑存结果,共访存3次。
优点:
①可扩大寻址范围(有效地址EA的位数大于形式地址A的位数)。
由于EA是存放在主存单元中,理论上,EA可以很大,但过大就无意义了,所以此时EA可以表示所有的主存空间。
②多次间接寻址可以便于编制程序(用间接寻址可以方便地完成子程序返回)。
③有利于多道程序并发执行
缺点:指令在执行阶段要多次访存(一次间址需两次访存,多次寻址需要根据存储字的最高位确定几次访存)。
三、寄存器寻址——EA=Ri
寄存器寻址是指在指令字中直接给出操作数所在的寄存器编号,即EA=Ri,其操作数在由Ri所指的寄存器内。
寄存器寻址的地址码位数由通用寄存器个数决定。
访存次数:取值令1次,执行指令0次,暂不考虑存结果,共访存1次。
优点:指令在执行阶段不用访问主存,只访问寄存器,速度快。支持向量/矩阵运算。
缺点:寄存器价格昂贵,数量较少,对应地址码长度短,寻址范围小。
四、寄存器间接寻址——EA=(Ri)
寄存器Ri中给出的不是一个操作数,而是操作数所在主存单元的地址,即
EA=(Ri)。
访存次数:取指令1次,执行指令1次,暂不考虑存结果,共访存2次。
特点:与一般间接寻址相比速度更快,不过比寄存器寻址速度慢。寻址范围大。
五、隐含寻址
不显式地给出操作数的地址,而是在指令中隐含着操作数的地址。
优点:有利于缩短指令字长。
缺点:需增加存储操作数或隐含地址的硬件。
六、立即(数)寻址
形式地址A就是操作数本身,又称立即数,一般采用补码形式。“#”表示立即寻址特征。
优点:指令在执行阶段不访问主存,指令执行时间最短。
缺点:A的位数限制了立即数的范围。
前面的寻址方式都是非偏移寻址,接下来的三种寻址方式属于偏移寻址。
一、基址寻址——EA = (BR)+A
以程序的起始存放地址作为“起点”
将CPU中基址寄存器(BR,base address register)的内容加上指令格式中的形式地址A而形成操作数的有效地址。此时形式地址A通常称为偏移量OFFSET
Tips:OS中的”重定位寄存器”就是“基址寄存器”。
注:指明寄存器的bit数是根据通用寄存器总数来判断的。
基址寄存器可以采用专用寄存器BR,也可以采用通用寄存器。
基址寻址的作用:便于程序的“浮动”,程序可以从内存中任何地址作为起始地址往后存放,当程序在主存中的起始位置改变后,OS只需要改变基址寄存器中的内容,让其指向当前的起始地址(存在PCB中)就可以。每个程序运行前,CPU将BR的值修改为该程序的起始地址。
优点:可以扩大寻址范围(基址寄存器的位数大于形式地址A的位数);用户不必考虑自己的程序存于主存的哪个空间区域,因此有利于多道程序设计,并可用于编制浮动程序,但偏移量(形式地址A)的位数较短。
注:基址寄存器BR是面向操作系统的,其内容由操作系统或管理程序确定。在程序运行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。
当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍然由操作系统决定。
二、变址寻址——EA = (IX)+A
程序员自己决定从哪里作为“起点”
将变址寄存器IX(Index Register)中的内容加上指令格式中的形式地址A而形成操作数的有效地址。
变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户来定义。
形式地址A不变,且A作为基址,IX作为偏移量。
优点:
可扩大寻址范围(变址寄存器的位数大于形式地址A的位数)偏移量(变址寄存器IX)的位数足以表示整个存储空间。
在数组处理中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可以很容易形成数组中任一数据的地址,特别适合编制循环程序。
三、基址&变址复合寻址
四、相对寻址——EA = (PC)+A
以程序计数器PC所指地址作为“起点”
将程序计数器(PC)的内容加上指令格式中的形式地址A而形成操作数的有效地址。此时的A也称为偏移量OFFSET。
A是相对于PC所指地址的偏移量,可正可负,用补码表示。
注:当取走一条指令后PC的值一定会自动“+1”,因此A是相对于当前地址的下一条地址的偏移量,而不是当前地址!!!
转移类指令通常使用相对寻址方式
相对寻址的作用
由于程序中的代码段大多时候需要挪动位置,如果此时还是使用直接寻址方式来解析指令(如跳转指令)就会出现错误。此时使用相对寻址方式来解析指令,就可以避免错误的产生,保证循环的正常运行。
引入相对寻址后,可以方便每段代码在程序内浮动
注意:由于程序段的浮动,可能会导致数组始址发生变化,进而会影响数组的访问。如果每次移动都要重新改变数组始址会很麻烦。此时采用“分段”方式解决,将程序分为程序段和数据段两部分。数组部分存放在数据段中,程序段的移动不会改变数组的始址。
优点:操作数的地址不是固定的,它随着PC值的变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序内部的程序段的浮动。(基址寻址中的浮动是整个程序在内存中的浮动)
寻址方式 | 有效地址 | 访存次数(指令执行期间) | 用途 |
---|---|---|---|
隐含寻址 | 程序指定 | 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的确定方式不同 | 硬堆栈不访存,软堆栈访存 |
堆栈寻址
操作数存放在堆栈中,隐含使用堆栈指针SP(Stack Pointer)作为操作数地址。
堆栈是存储器(或专用寄存器组)中一块特定的按“后进先出”原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)。
硬堆栈——采用寄存器实现
软堆栈——从主存中划出一片区域
软堆栈执行POP和PUSH操作会有访存的开销。