数据寻址
操作数类型
- 地址:无符号数
- 数字:定点数、浮点数、十进制数
- 字符:ASCII码
- 逻辑数:逻辑运算
数据寻址
指令的格式:操作码(OP)+寻址特征+形式地址(A)——一地址指令
寻址方式位:寻址方法的编号,存放在寻址特征位。
形式地址:地址码的位置,形式地址并不是直接对应到存储器中的地址,而是在有了这个地址之后再根据寻址特征的要求,将其转化为存储器中的一个地址
有效地址(EA):操作数的真实地址
注意
:数据寻址要做的就是将形式地址转换为有效地址
接下来的讨论都是建立在指令字长=机器字长=存储字长的基础上的
立即寻址
形式地址A本身就是操作数,又称为立即数,一般采用的是补码的形式,#表示的是立即寻址特征
指令执行方式(共访存一次):
- 取指令:访存1次
- 执行指令:访存0次
- 暂不考虑存结果
优点:指令执行阶段不访问主存,指令执行时间最短
缺点:A的位数限制了立即数的范围,假设A的位数为n位,当立即数采用补码的形式的时候,可以表示的数据范围是: − 2 n − 1 -2^{n-1} −2n−1~ 2 n − 1 − 1 2^{n-1}-1 2n−1−1
直接寻址
指令字中的形式地址A就是操作数的真实地址EA,即EA=A
最后一个方块中的代码的含义是主存中的地址,根据这串代码我们就能够定位到存储器中的一个存储单元
直接寻址的过程:(共访存2次):
- 取指令:访存1次
- 执行指令:访存1次
- 暂不考虑存结果
优点:简单,执行指令阶段只访问一次主存,不需要专门计算操作数的地址
缺点:A的位数决定了指令操作数的寻址范围,操作数的地址不易修改
间接寻址
指令的地址字段给出的形式地址不是操作数的正式地址,而是操作数的有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A)
直接寻址的过程:(共访存3次)——一次间址
- 取指令:访存1次
- 执行指令:访存2次
- 暂不考虑存结果
优点:可以扩大寻址范围(有效地址EA的位数大于形式地址A的位数);便于编制程序
缺点:指令在执行阶段需要多次访存
寄存器寻址
在指令字中直接给出操作数所在的寄存器编号,即EA= R i R_i Ri,其操作数在由 R i R_i Ri所指的寄存器内部
寄存器寻址的过程:(共访存1次)
- 取指令:访存1次
- 执行指令:访存0次
- 暂不考虑存结果
优点:在指令执行阶段不访问主存,只访问寄存器;指令字短且执行速度快;支持向量/矩阵运算
缺点:寄存器个数有限;寄存器价格昂贵
寄存器间接寻址
寄存器 R i R_i Ri给出的不是一个操作数,而是操作数所在的主存单元的地址,即 E A = ( R i ) EA=(R_i) EA=(Ri)
寄存器间接寻址的过程:(共访存2次):
- 取指令:访存1次
- 执行指令:访存1次
- 暂不考虑存结果
特点:相比于一般的间接寻址速度更快,但是指令执行的阶段需要访问主存(操作数存在主存当中)
隐含寻址
不是明显的给出操作数的地址,而是在指令中隐含着操作数的地址
优点:有助于缩短指令字长
缺点:需要增加存储操作数或者隐含地址的硬件
偏移寻址
偏移寻址的特点在于有效地址的产生需要进行加法运算
基址寻址
将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即 E A = ( B R ) + A EA=(BR)+A EA=(BR)+A
基址寄存器也可以用通用寄存器代替,只不过在专门用一个寄存器来实现基址寻址的时候,不需要在指令字中指出它的名字,而是把它的名字隐含的放在了操作码中;如果使用通用寄存器话,是需要提供相应的编号的,将编号填写到指令字的字段当中
基址寄存器是面向操作系统的,其内容由操作系统或者管理程序决定。在程序执行过程中,基址寄存器的内容不变(作为基址),形式地址可变(作为偏移量)
当采用通用寄存器作为基址寄存器的时候,可以由用户决定哪个寄存器作为基址寄存器,但是其中的内容任然由操作系统决定
优点:可以扩大寻址范围(基址寄存器的位数大于形式地址A的位数);用户不必考虑自己的程序存在主存中的哪一块地址区域,故有利于多道程序的设计,以及可用于编制浮动程序
变址寻址
有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加的和,即EA=(IX)+A,其中IX为变址寄存器(专用),也可以用通用寄存器来作为变址寄存器
如果使用通用寄存器来作为变址寄存器的时候,需要在操作码中设置一个专门的字段来表示通用寄存器的编号
变址寄存器是面向用户的,在程序执行的过程中,变址寄存器的内容可以由用户改变(作为偏移量),形式地址A不变(作为基址)
优点:可以扩大寻址范围(变址寄存器的位数大于形式地址A的位数);在数组处理的过程中,可以设定A为数组的首地址,不断的改变变址寄存器中的内容,便可以很容易的形成数组中的任意一组数据的地址,特别适合编制循环程序
相对寻址
把程序计数器PC的内容加上指令格式中的形式地址A而形成的操作数的有效地址,即EA=(PC)+A,A是相对于当前指令地址的位移量,可正可负,补码表示
相对寻址更接近于指令的寻址,但是它实际上的操作对象是一个地址,只是刚刚好它的地址是一个指令的地址
优点:操作数的地址是不固定的,它在随着PC的值的变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序的浮动,相对寻址广泛应用于转移指令
堆栈寻址
操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数的地址
堆栈存储器(专用寄存器)中的一块特定的按照“LIFO”原则管理存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)