4.2.2 常见的数据寻址方式

1.隐含寻址

在指令中隐含着操作数的地址。

如单地址的指令格式,就不是明显地在地址字段中指出第二操作数的地址,而是规定累加器ACC作为第二操作数,指令格式明显指出的仅是第一操作数的地址。因此,累加器ACC对单地址指令格式来说是隐含地址。

隐含寻址的优点是有利于缩短指令字长;缺点是需增加硬件。

2.立即(数)寻址

这种类型的指针的地址字段指出的不是操作数的地址么事操作数本身,又称为立即数。数据是用补码形式存放的。

OP

#(立即寻址特征)

A操作数本身

立即寻址的优点是指令在执行阶段不访问主存,指令执行时间短;缺点是A的位数限制了立即数的范围。

3.直接寻址

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

直接寻址的优点是简单,指令在执行阶段仅访问一次主存,不需要专门计算操作的地址;缺点是A的位数决定了该指令操作数的寻址范围,操作数的地址不易修改。

4.间接寻址

间接寻址是相对于直接寻址而言的,指令的地址字段给出的形式地址不是操作数的真实地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A).

间接寻址可以是一次间接寻址,还可以是多次间接寻址。

主存第一位为1时,表示取出的仍不是操作数的地址,即多次间址;当主存第一位为0时,表示取出的是操作数的地址。

间接寻址的优点是可以扩大寻址范围(优点地址EA的位数大于形式地址A的位数),便于编制程序(用间接寻址可以方便地完成子程序返回);缺点是指令在执行阶段要多次访问。

5.寄存器寻址

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

寄存器寻址的优点是指令在执行阶段不访问主存,只访问寄存器,指令字段短且执行速度快,支持向量/矩阵运算;缺点是寄存器价格昂贵,计算机中寄存器个数有限。

6.寄存器间接寻址

寄存器间接寻址是指在寄存器Ri中给出的不是一个操作数,而是操作数所在主存单元的地址,即EA=(Ri)

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

7.相对寻址

相对寻址是把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址。即EA=(PC)+A,其中A是相对于当前地址的位移量,可正可负,补码表示。

A的位数决定操作数的寻址范围。

相对寻址的优点是操作数的地址不是固定的,它随着PC的值得变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序浮动,相对寻址广泛应用于转移指令。

对于转移指令JMPA,当CPU从存储器中取出一个字节时,会自动执行(PC)+1->PC.若转移指令的地址为X,且占2个字节,在取出该指令后PC的值会增2,即(PC)=X+2,这样在执行完该指令后,会指定跳转到X+2+A的地址继续执行。

8.基址寻址

基址寻址是将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,而形成操作数的有效地址,EA=(BR)+A。其中基址寄存器既可采用专用寄存器,也可以采用通用寄存器。

基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍由操作系统确定。

基址寻址的特点是可扩大寻址范围(基址寻址的位数大于形式地址A的位数);用户不必考虑自己的程序存于主存的哪一空间区域,故有利于多道程序设计,以及可用于编制浮动程序。

9.变址寻址

有效地址EA等于指令中的形式地址A与编制寄存器IX的内容相加之和,即EA=(IX)+A,其中IX为变址寄存器(专用),也可用通用寄存器作为变址寄存器。

变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(作为偏移量),形式地址A不变(作为基地址)。

变址寻址的优点是可扩大寻址范围(变址寄存器的位数大于形式地址A的位数),在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任意数据的地址,特别适合编制循环程序。

显然,变址寻址与基址寻址的有效地址形成过程及其相似。但从本质上来讲,两者有较大区别。基址寻址主要用于为多道程序或数据分配存储空间,故基址寄存器的内容通常由操作系统和管理程序确定,在程序的执行过程中其值不可变,而指令字中的A是可变的;变址寻址主要用于处理数组问题,在变址寻址中,变址寄存器的内容是由用户设定的,在程序执行过程中,其值可变,而指令字中的A是不可变的。

10.堆栈寻址

堆栈是存储器(或专用寄存器组)中一块特定的按“先进后出(LIFO)”原则管理的存储区,该存储区中被读、写单元的地址是用特定的寄存器给出的,该寄存器称为堆栈指针(SP)。堆栈可分为硬堆栈和软堆栈两种。

寄存器堆栈又称为硬堆栈。寄存器堆栈的成本比较高,不适合做大容量的堆栈;而从主存中划出一段区域来做堆栈是最合算且最常用的方法,这种堆栈称为软堆栈。

在采用堆栈结构的计算机系统中,大部分指令表面上都表现为为无操作数指令的形式,因为操作数地址都隐含使用了SP。通常情况下,在读写堆栈中的一个单元的前后都伴有自动完成对SP内容的增量或减量操作。

寻址方式

有效地址

访存次数

隐含寻址

程序指定

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IMWeb前端团队

nodejs中错误捕获的一些最佳实践

本文作者:IMWeb yisbug 原文出处:IMWeb社区 未经同意,禁止转载 本文内容大部分来自 https://www.joyent.com/...

23360
来自专栏阮一峰的网络日志

汇编语言入门教程

学习编程其实就是学高级语言,即那些为人类设计的计算机语言。 但是,计算机不理解高级语言,必须通过编译器转成二进制代码,才能运行。学会高级语言,并不等于理解计算机...

35740
来自专栏专注 Java 基础分享

Java并发之线程间的协作

     上篇文章我们介绍了synchronized关键字,使用它可以有效的解决我们多线程所带来的一些常见问题。例如:竞态条件,内存可见性等。并且,我们也说明了...

23190
来自专栏逍遥剑客的游戏开发

Nebula3学习笔记(5): IO系统

19840
来自专栏java一日一条

死磕Java并发:深入分析volatile的实现原理

通过前面一章我们了解了synchronized是一个重量级的锁,虽然JVM对它做了很多优化,而下面介绍的volatile则是轻量级的synchronized。如...

7420
来自专栏york技术分享

sed 使用教程 - 通读篇(30分钟入门系列)

和上篇 awk 分享一样,作为通读性的分享,不想引入太过复杂的东西,依然从日常工作中碰到的 80% 的需求出发,重点阐述最重点的部门,工作原理等,普及一些对se...

521220
来自专栏Linyb极客之路

从Java内存模型角度理解安全初始化

如大家所知,Java代码在编译和运行的过程中会对代码有很多意想不到且不受开发人员控制的操作:

11830
来自专栏腾讯IVWEB团队的专栏

nodejs 中错误捕获的一些最佳实践

本文为翻译文章,原文比较长,感觉也有点啰嗦,所以根据个人理解猜测梳理出本文。

68100
来自专栏Jerry的SAP技术分享

使用JavaScript给对象修改注册监听器

我们在开发一些大型前端项目时,会遇到这样一种情况,某个变量上有个字段。我们想知道是哪一段程序修改了这个变量上的字段。比如全局变量window上我们自定义了一个新...

9420
来自专栏吴生的专栏

谁说深入浅出虚拟机难?现在我让他通俗易懂(JVM)

1:什么是JVM 大家可以想想,JVM 是什么?JVM是用来干什么的?在这里我列出了三个概念,第一个是JVM,第二个是JDK,第三个是JRE。相信大家对这三个不...

40260

扫码关注云+社区

领取腾讯云代金券