![单片机原理及应用(第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=1739393239-vfruJFFM1kJCEkC2Qm8eo1H1lHKa7BX7-0-95ade0af2115cbc895ba4bb99a90a1b0)
图4-1 MOV A,#61H指令执行示意图
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/59_03.jpg?sign=1739393239-Z6TYbeBbG1p7ded1GZf1g81gWzES0JWa-0-0c07c8a2394adc91e1986d8e01429208)
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=1739393239-r2CRFJf3K2QlYO1YAxoiSYthN6Spvm8l-0-88a984398c4f3d2e6e9f399561de4362)
图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=1739393239-je9M88pvPdwt0SUvj2gXJ9IHQrQcxv0y-0-24603b98ccb2fe232bc2ab1a221bd1af)
图4-3 INC R5指令执行示意图
4.寄存器间接寻址
指令指定某一寄存器的内容作为操作数地址。8051单片机中可用来间接寻址的寄存器有:选定工作寄存器区的R0、R1、堆栈指针SP或者16位的数据指针DPTR,使用时前面加@表示间接寻址。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/60_03.jpg?sign=1739393239-u4uP77uXnk4qkZ30D45jGyWR0BXNPzbm-0-297700b570e7163264017d58840b0187)
该指令的执行过程如图4-4所示。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/60_04.jpg?sign=1739393239-4Q8lHm7eB0eSMtdZ8u7YaeCDnzL75GMD-0-28473c7b9baa1c16fc15fd4d2d44f7b7)
图4-4 MOV A,@R0指令执行示意图
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/60_05.jpg?sign=1739393239-3q7fK7na8OtFkabDLKdUkY02RT1wM3cG-0-61e29b017da22e5f96d9b41dbf3c5f3c)
5.变址寻址
由指令指定的偏移量寄存器和基址寄存器DP TR或P C相加所得结果作为操作数地址。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/61_01.jpg?sign=1739393239-6brCFaZBJutiSGkV2fTwrXmWV1cYqKjM-0-6b32c59780f0b1eacbdee0608f77b5d3)
其中,A作为偏移量寄存器(称为变址寄存器),PC作为基址寄存器,A中内容为无符号数和PC相加,从而得到其真正的操作数地址。
6.相对寻址
该寻址方式主要用于相对跳转指令。把指令中给定的地址偏移量与本指令所在单元地址(即程序计数器PC中的内容)相加,得到真正的程序转移地址。与变址方式不同,该偏移量有正、负号,在该机器指令中必须以补码形式给出,所转移的范围为相对于当前PC值的-128~+127之间。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/61_02.jpg?sign=1739393239-oKBm4hyRthZSZc9ot5qOvJ6mhkXbCB9L-0-c98b8c9ad5fb5fedf349cfa468d54a76)
若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=1739393239-6yYL2t7t7A0LTWzMkWvgLTYctJ26TpxN-0-5843766609b80127868a566a033a5586)
图4-5 JC 80H指令执行示意图
7.位寻址
支持位单元存取操作是8051单片机的一个主要特点。位操作指令能对位地址空间的每一位都可进行运算和传送操作。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/61_04.jpg?sign=1739393239-dOe3DG6L8nVJBxSZ1TTbYbF6QPe2lNzE-0-4e4af25a4e61c0a68c08af454b889f52)