七种寻址方式
- 1.立即寻址
- 2.直接寻址
- 3.寄存器寻址
- 4.寄存器间接寻址
-
- 5.基址加变址寻址
- 6.相对寻址
- 7.位寻址
1.立即寻址
立即寻址就是不寻址,直接把被操作的数据(立即数)写在指令当中。在指令代码中,需要在立即数前面加上 #,表示立即寻址。
例如:把数据40H传送到累加器ACC中。
指令
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020071613194922.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NzQ0NzI0,size_16,color_FFFFFF,t_70#pic_center)
Debug:
执行第三步程序时,寄存器A内数据变为十六进制0x40。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200716132417157.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NzQ0NzI0,size_16,color_FFFFFF,t_70#pic_center)
2.直接寻址
直接寻址就是将被操作的数据在存储器中的地址写在指令代码当中。也就是将操作数的地址写在指令当中。
例如:地址40H中的数据为5BH,将40H中的数据传入累加器ACC中。
指令:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200716160715351.png#pic_center)
这条指令中的40H,与立即寻址中的#40H意义不同,这里的40H表示数据#5BH的地址。
Debug:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200716161045754.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NzQ0NzI0,size_16,color_FFFFFF,t_70#pic_center)
单步执行到第4行指令时,累加器中的数据变为0x5b。
3.寄存器寻址
寄存器寻址就是将操作数(被操作的数据)存放在寄存器中。能够实现寄存器寻址的寄存器有A、B、DPTR、R0 ~ R7。
例如:![在这里插入图片描述](https://img-blog.csdnimg.cn/20200716165149504.png#pic_center)
在第3行指令中,对于目的操作数来说就是寄存器寻址,对于源操作数来说就是立即寻址。
在第4行指令中,目的操作数和源操作数都是寄存器,那么二者都是寄存器寻址。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200716165951558.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NzQ0NzI0,size_16,color_FFFFFF,t_70#pic_center)
4.寄存器间接寻址
与寄存器寻址相似,在寄存器寻址时,寄存器中存放的是操作数,而寄存机间接寻址时,寄存器中存放的是操作数的地址。只用R0、R1、DPTR可以实现寄存器间接寻址
例如:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200716193248629.png#pic_center)
寄存器R0中存放的是数据3FH的地址40H,这样寄存器间接寻址可以将数据3FH传到累加器ACC中。
Debug:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020071619355243.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NzQ0NzI0,size_16,color_FFFFFF,t_70#pic_center)
累加器的数据变为0x3f。
4.1记录一下调试程序过程中遇到的一个错误
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200716194359937.png#pic_center)
如果程序这样写,会有什么错误。调试一下。
Debug
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200716194650790.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NzQ0NzI0,size_16,color_FFFFFF,t_70#pic_center)
a中的数据没有变,可以看见R0中是0x3f,这时候a通过寄存器间接寻址得到的是地址3fh中的数据0x00。
5.基址加变址寻址
基址寄存器只能是PC和DPTR,变址寄存器为累加器A。这种寻址方式是将PC或DPTR中得值与A中的值相加,得到的结果是操作数的地址。注意:是操作数的地址,不是操作数本身。
例如:MOVC A, @A+DPTR
这条指令是把A和DPTR中的值相加,得到操作数的地址,存到A中,然后A在根据地址去找到操作数。
MOVC A,@A+PC
同理,这条只是将DPTR换为PC。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020071813094797.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NzQ0NzI0,size_16,color_FFFFFF,t_70#pic_center)
6.相对寻址
相对寻址就是PC指针当前指向的值,与设置的JC偏移量相加得到的值作为目标地址,其中偏移量是自己设定的。
JC 80H
假如这条指令存放在1005H,取出操作码后PC指向1006H,取出偏移量后PC指向1007H,那么目标地址就是1007H + 80H,但是偏移量是有符号数,80H是-128的补码,因此最后的目标地址是0F87H。
7.位寻址
单片机中21个特殊功能寄存器,其中有11个是可位寻址的(ACC、B、IP、IE、PSW、SCON、TCON、P0 ~ P3)
一共有四种表示形式,以PSW为例
- 直接使用位地址
- 位名称
- 单元地址加位
- 特殊功能寄存器名称加位
MOV C, 0D2H
MOV C, OV
MOV C, 0D0H.2
MOV C, PSW.2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)