直接寻址、间接寻址、立即寻址

2020-03-20来源: eefocus关键字:直接寻址  间接寻址  立即寻址

一、前言


直接寻址、间接寻址、立即寻址,只是CPU在通过总线与内存交互时的不同交互方法,而产生的三种概念词!


对于这些寻址方式,很多人没有听说过,但是对于学习汇编的同学来说,非常熟悉,很多书中都有提到过这几种寻址方式,但是没有细说,这里来给大家详细介绍一下这三种寻址方式的不同体现在哪里!


二、直接寻址


直接寻址即直接给出内存单元的物理地址/虚拟地址直接寻址!


详细说一下:


假如有一个内存,且大小是:0x00000000~0xFFFFFFFF


每个物理地址代表一个内存单元(这里抛开虚拟内存管理机制),那么我想要取得0x00000001地址里的数据,首先CPU需要通过地址总线找到该内存单元,然后通过控制总线确定操作方法,在通过数据总线将其数据送回来,便于处理!


那么我们要怎样将地址给CPU呢?


答:


放到CS段地址寄存器中,CS寄存器负责保存段地址,CPU会根据此段地址,去内存中将指令读取到CS:IP寄存器当中,然后执行!


假如我想要将0x00000001地址里的数据取出来,放到AX寄存器当中,那么需要在内存中写好指定代码:


MOVE AX,[DS:0x00000001H]


MOVE AX,[0x00000001H]

(AX内存=DS+0x00000001H)

DS是段寄存器,这里无需多说,详细介绍可以看这篇文章:C语言内存模型详细介绍_堆栈介绍


操作系统会自动帮我们把CS:IR寄存器指向我们的代码段,当CPU将指令取到CS:IP寄存器以后,就会通过CU控制单元译码解析指令转换成对应的电平信号,驱动CPU晶体管工作!


CPU会直接将段地址+0x00000001的物理地址通过北桥,传送给内存芯片,内存芯片会把该地址里的数据取回来传递给CPU,当CPU接受到返回来的数据时,会把该数据写入到AX寄存器,这样一个指令就执行完成了,实际上并不是一个指令,其实CPU要分好几次时钟周期来执行,第一次去将DS寄存器里的段首地址读取出来,第二次加上0x00000001,第三次去内存中取数据,第四次将获取到的数据写入到AX中,即四个个时钟周期来完成一个指令,其中还会用到alu运算单元来进行段地址+偏移地址的运算,所以实际上可能需要多个时钟周期来完成!


CPU是由晶体管来驱动的,每次开关驱动一次都称为一次时钟周期,时间周长不算,一般用赫兹来表示时钟周期的单位!


上面的过程仅一步到位非常之快,因为我们直接给出了实际物理地址!


下面来说说间接寻址


三、间接寻址


间接寻址是建立在直接寻址之上的一种概念,地址不是直接寻址那样直接给出,而是通过某个特定的内存单元得出,第一次是得到某个特定内存单元里的地址数据,第二次在将得出的地址进行DS+偏移地址H的运算直接寻址!


这样说可能有点含糊不清,不过来看一下这段汇编代码,你就应该能明白直接寻址与间接寻址之间的区别了:


MOV esp,0x00000001

MOV AX,[esp]

esp、eax等寄存器均为8086寻址寄存器,用于暂时存放地址的,并且寻址时也是以DS+esp的方式!


其实esp和eax等e开头的寄存器和AX,BX,CX通用寄存器的作用没有区别,只是CPU设计者,设计出这么多寄存器是为了方便区分,某些寄存器做某些事情,这样更加方便于统一和区分,你也可以使用BX来进行间接寻址,只要你在里面写上[],这个括号在汇编里表示寻址括号,如果你把bx用[]括起来,CPU会把BX里的内容当做地址看待!


这样的话,CPU要做的工作可就很多了,首先要将0x00000001地址送入到esp里,在将esp里的地址取出来,然后通过DS+esp在去内存中寻址,在取回来放到AX中!


所以间接寻址说的明白一点,就是通过寄存器得到要寻址的地址,然后在寻址,而非直接给出地址直接寻址!


上面有个疑惑,就是直接寻址的地址是怎么来的?


答:在内存中取出指令存入到IP寄存器时,这个地址就已经存放进去了,在IP寄存器的低位,直接寻址的地址是存放在指令中的,而不需要二次获取!


其如果使用间接寻址,在8085系列的CPU设计出了R0,R1的寄存器,并且如果间接寻址使用@符号表示


mov R0,0x00000001

mov ax,@R0

用于表示间接寻址,不过这种寻址方式更加少见了,因为自8086系列CPU出现以后,[]指令的出现,更加方便于寻址,并且直观性更强,但是还是可以使用上面这种方法寻址的,因为向前兼容(即新的东西兼容老的东西),只是不同架构的CPU编写方法不同,但意思都是一个样!


三、立即寻址


通过上面的了解,立即寻址就非常简单了,即立即数寻址!


立即数即指令的一部分,平常我们所看到的编程语言当中:


int a = 5;

这样我们在栈中保存了一个数据5,但是它是有空间的,在汇编中对它寻址是这样的:


比如a在栈中的偏移地址是0x135h


mov ax,[135h]

CPU会到135h的内存中根据位宽寻址,将值寻回来以后,放入到ax寄存器当中!

立即数不同,立即数是不占任何空间的,它存在于代码段,是指令的一部分:


mov ax,135H

ax内容=135


当这个指令执行完成之后内存被释放掉之后,我们下次想要找到这个内存空间是找不到的!


立即寻址要快于其它寻址,因为它无需进行寻址!

关键字:直接寻址  间接寻址  立即寻址 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492285.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:寄存器与七种寻址方式
下一篇:Keil C51中code、data、bdata、idata、xdata、pdata的解释

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

51单片机直接寻址方式与编程举例
直接寻址方式是指在指令中操作数直接以单元地址的形式给出,也就是在这种寻址方式中,操作数项给出的是参加运算的操作数的地址,而不是操作数。例如:MOV  A,30H  这条指令中操作数就在30H单元中,也就是30H是操作数的地址,并非操作数。 在80C51单片机中,直接地址只能用来表示特殊功能寄存器、内部数据存储器以及位地址空间,具体的说就是:1、内部数据存储器RAM低128单元。在指令中是以直接单元地址形式给出。我们知道低128单元的地址是00H-7FH。在指令中直接以单元地址形式给出这句话的意思就是这0-127共128位的任何一位,例如0位是以00H这个单元地址形式给出、1位就是以01H单元
发表于 2017-10-17
七种寻址方式(直接寻址方式)
指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。例:假设有指令:MOV BX, [1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么?解:根据直接寻址方式的寻址规则,把该指令的具体执行过程用下图来表示。从图中,可看出执行该指令要分三部分: 由于1234H是一个直接地址,它紧跟在指令的操作码之后,随取指令而被读出;访问数据段的段寄存器是DS,所以,用DS的值
发表于 2017-01-22
七种寻址方式(直接寻址方式)
直接寻址 间接寻址的指令格式和功能分别是什么
直接寻址的含义,指令格式和功能各是什么? 答:在直接寻址方式中,指令操作数域给出的是参加运算的操作数地址。在MCS-51单片机中,直接地址只能用来表示特殊功能寄存器、内部数据寄存器和位地址空间。其中,特殊功能寄存器和位地址空间只能用直接寻址方式访问。 寄存器间接寻址的含义,指令格式和功能各是什么? 答:在寄存器间接寻址方式中,指令操作数给出的是存放操作数地址的寄存器。在MCS-51指令系统中,可作为寄存器间接寻址的寄存器有工作寄存器R0~R1、堆栈批示器SP和地址寄存器DPTR。在指令助记符中,间接寻址用符号 @来表示。 位寻址的含义,指令格式和功能各是什么? 答:它是指对一些内部数据存储器RAM和特殊功能寄存器进行
发表于 2013-08-02
单片机寻址—直接寻址
在指令中直接给出操作数地址的寻址方式称为直接寻址,直接寻址何以寻址特殊功能寄存器、内部RAM(128字节)和位地址,如: MOV A, 70H; A←(70H) 该指令是将RAM单元70H(地址)的内容送累加器。
发表于 2013-01-30
单片机寻址—直接寻址
ARM 处理器寻址方式之间接寻址的几种表达
我们以 LDR 指令为例来分别举例分析。LDR 指令的格式为:LDR{条件} 目的寄存器,<存储器地址>LDR 指令是字加载指令,用于从存储器中将一个 32 位的字数据送到目的寄存器中。该指令通常用于从存储器中读取 32 位的字数据到通用寄存器,然后对数据进行处理。当程序计数器 PC 作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。指令示例:LDR R3, [R4]             ; 将存储器地址为 R4 的字数据读入寄存器 R3LDR R3, [R1, #8]     
发表于 2020-02-07
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved