![单片机原理及应用(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/989/40680989/b_40680989.jpg)
4.3 寻址方式
操作数是指令的重要组成部分,它指定了参与运算的数或数所在的单元地址,而如何得到这个地址就称为寻址方式。一般来说,寻址方式越多,计算机功能越强,灵活性越大。所以寻址方式对机器的性能有重大影响。8051单片机共有7种寻址方式,描述如下。
1.立即寻址
指令中的源操作数是立即数,这种寻址方式叫作立即寻址。立即数的类型如下。
数字:二进制(后缀为B)、十进制(不带后缀)、十六进制(后缀为H)。
字符:以单引号引起的字符,如‘K’。
立即数的字长可以是8位或16位。
例:MOV A,#61H;把十六进制的立即数61H送入累加器A中
该指令的执行过程如图4-1所示。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/59_02.jpg?sign=1738909333-doQ2MKpo460a1MM41T1s8Jizo5zHOBBT-0-109e37c5254d8d5c666454d14d4bf736)
图4-1 MOV A,#61H指令执行示意图
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/59_03.jpg?sign=1738909333-13mK2ZN1yJC3UCiZcOAOQBd7eLP0NlOo-0-ead4b1811ec2bbdfe2e88a472a28ffbe)
2.直接寻址
直接寻址就是在指令中包含了操作数的地址,即在指令中直接包含了参加运算或传送的单元或位的地址。直接寻址可访问以下3种地址空间。
1)特殊功能寄存器SFR:直接寻址是唯一的访问形式。
2)内部数据RAM中的00H~7FH的128个字节单元。
3)位地址空间。
例:MOV A,60H;把60H单元的内容送入累加器A中
假设60H单元中的内容是89H,则执行指令后,A中的内容为89H。执行过程如图4-2所示。
3.寄存器寻址
指定某一可寻址的寄存器的内容为操作数,对寄存器ACC、B、DPTR和CY(进位标志,也是布尔处理机的累加器)寻址时,具体的寄存器已隐含在其操作码中。而对选定的8个工作寄存器R7~R0,则用指令操作码的低3位指明所用的寄存器。在应用中,可以先通过PSW中的RS1、RS0两个位来选择寄存器组,再用操作码中低3位来确定是组内哪一个寄存器,以达到寻址的目的。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/60_01.jpg?sign=1738909333-rhIvKfWeSNUbx7OSfLxTlQ7ykOOQEZtq-0-4bec35e9dd49e72088f0a3daf81cc00f)
图4-2 MOV A,60H指令执行示意图
例 INC R5;把寄存器R5的内容加1后再送回R5
该指令的执行过程如图4-3所示。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/60_02.jpg?sign=1738909333-yXHpt1VKkeroS2dVNkT8eLKGM3jifCtE-0-4f9d510aed79309b442cb76e9883603c)
图4-3 INC R5指令执行示意图
4.寄存器间接寻址
指令指定某一寄存器的内容作为操作数地址。8051单片机中可用来间接寻址的寄存器有:选定工作寄存器区的R0、R1、堆栈指针SP或者16位的数据指针DPTR,使用时前面加@表示间接寻址。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/60_03.jpg?sign=1738909333-SaWCtKiOu90qIgBTYRYTMcfuLmDwtOSM-0-a902af2c720504356f2784788561cc79)
该指令的执行过程如图4-4所示。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/60_04.jpg?sign=1738909333-7waJjThdeIxRTajxG1EnTUVPzUChUy5t-0-b72da58e13469105cf6c836de17173d4)
图4-4 MOV A,@R0指令执行示意图
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/60_05.jpg?sign=1738909333-4yeMM5mX7LEsV1E3igYNYunne4OILaOc-0-9aa81b8110b3a23ee431f3c7ef653d40)
5.变址寻址
由指令指定的偏移量寄存器和基址寄存器DP TR或P C相加所得结果作为操作数地址。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/61_01.jpg?sign=1738909333-TTPti18WQ8LIe6MGmMp5hm9Hbs98sNIf-0-9fb647470c69e9dc99c0a06079180674)
其中,A作为偏移量寄存器(称为变址寄存器),PC作为基址寄存器,A中内容为无符号数和PC相加,从而得到其真正的操作数地址。
6.相对寻址
该寻址方式主要用于相对跳转指令。把指令中给定的地址偏移量与本指令所在单元地址(即程序计数器PC中的内容)相加,得到真正的程序转移地址。与变址方式不同,该偏移量有正、负号,在该机器指令中必须以补码形式给出,所转移的范围为相对于当前PC值的-128~+127之间。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/61_02.jpg?sign=1738909333-PEo893L9NjOPu1nTriYfn2vqsBV8TFrD-0-ed41eac88e664a1c1144770405f98bd4)
若CY=0,则PC值不变,若CY=1,则以现行的PC为基地址加上80H得到转向地址。
若转移指令放在1005H,取出操作码后PC指向1006H单元,取出偏移量后PC指向1007单元,所以计算偏移量时PC现行地址为1007H,是转移指令首地址加2了(有些指令如JB bit,rel则加3)。注意指令偏移量以补码给出,所以80H代表着-80H,补码运算后,就形成跳转地址0F87H。
该指令的执行过程如图4-5所示。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/61_03.jpg?sign=1738909333-rlGIlXFqTy0tG9geJkUTW86SKOIUKHdD-0-669611a74b2e540cfe576a8757fda6ac)
图4-5 JC 80H指令执行示意图
7.位寻址
支持位单元存取操作是8051单片机的一个主要特点。位操作指令能对位地址空间的每一位都可进行运算和传送操作。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/61_04.jpg?sign=1738909333-9mg4w9s0B4GrDDw1cyVXrgVmFNfIwPl3-0-2f2db88a6c962f589d6dcb76e2e8f16f)