数据寻址

数据寻址

操作数类型

  1. 地址:无符号数
  2. 数字:定点数、浮点数、十进制数
  3. 字符:ASCII码
  4. 逻辑数:逻辑运算

数据寻址

指令的格式:操作码(OP)+寻址特征+形式地址(A)——一地址指令

寻址方式位:寻址方法的编号,存放在寻址特征位。

形式地址:地址码的位置,形式地址并不是直接对应到存储器中的地址,而是在有了这个地址之后再根据寻址特征的要求,将其转化为存储器中的一个地址

有效地址(EA):操作数的真实地址

注意:数据寻址要做的就是将形式地址转换为有效地址

接下来的讨论都是建立在指令字长=机器字长=存储字长的基础上的

立即寻址

形式地址A本身就是操作数,又称为立即数,一般采用的是补码的形式,#表示的是立即寻址特征

一地址指令
操作码(OP)
#
0……011

指令执行方式(共访存一次):

  1. 取指令:访存1次
  2. 执行指令:访存0次
  3. 暂不考虑存结果

优点:指令执行阶段不访问主存,指令执行时间最短

缺点:A的位数限制了立即数的范围,假设A的位数为n位,当立即数采用补码的形式的时候,可以表示的数据范围是: − 2 n − 1 -2^{n-1} 2n1~ 2 n − 1 − 1 2^{n-1}-1 2n11

直接寻址

指令字中的形式地址A就是操作数的真实地址EA,即EA=A

一地址指令
操作码(OP)
1110……0111

最后一个方块中的代码的含义是主存中的地址,根据这串代码我们就能够定位到存储器中的一个存储单元

直接寻址的过程:(共访存2次):

  1. 取指令:访存1次
  2. 执行指令:访存1次
  3. 暂不考虑存结果

优点:简单,执行指令阶段只访问一次主存,不需要专门计算操作数的地址

缺点:A的位数决定了指令操作数的寻址范围,操作数的地址不易修改

间接寻址

指令的地址字段给出的形式地址不是操作数的正式地址,而是操作数的有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A)

一地址指令
操作码(OP)
1110……0111

直接寻址的过程:(共访存3次)——一次间址

  1. 取指令:访存1次
  2. 执行指令:访存2次
  3. 暂不考虑存结果

优点:可以扩大寻址范围(有效地址EA的位数大于形式地址A的位数);便于编制程序

缺点:指令在执行阶段需要多次访存

寄存器寻址

一地址指令
操作码(OP)
1110……0111

在指令字中直接给出操作数所在的寄存器编号,即EA= R i R_i Ri,其操作数在由 R i R_i Ri所指的寄存器内部

寄存器寻址的过程:(共访存1次)

  1. 取指令:访存1次
  2. 执行指令:访存0次
  3. 暂不考虑存结果

优点:在指令执行阶段不访问主存,只访问寄存器;指令字短且执行速度快;支持向量/矩阵运算

缺点:寄存器个数有限;寄存器价格昂贵

寄存器间接寻址

寄存器 R i R_i Ri给出的不是一个操作数,而是操作数所在的主存单元的地址,即 E A = ( R i ) EA=(R_i) EA=(Ri)

一地址指令
操作码(OP)
1110……0111

寄存器间接寻址的过程:(共访存2次):

  1. 取指令:访存1次
  2. 执行指令:访存1次
  3. 暂不考虑存结果

特点:相比于一般的间接寻址速度更快,但是指令执行的阶段需要访问主存(操作数存在主存当中)

隐含寻址

不是明显的给出操作数的地址,而是在指令中隐含着操作数的地址

优点:有助于缩短指令字长

缺点:需要增加存储操作数或者隐含地址的硬件

偏移寻址

偏移寻址的特点在于有效地址的产生需要进行加法运算

基址寻址

将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)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值