![单片机原理及应用(第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=1739262691-OK9MFOkNKUev090Mw6vGdx04t1YLYV9D-0-27ad63cac8d4d3a3c8412aa27549a80c)
图4-1 MOV A,#61H指令执行示意图
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/59_03.jpg?sign=1739262691-AB692B6jI6RwFVwcx1sW9pmd9m1DtX2Q-0-4b244dacddc173a93c1e07c2347bd7de)
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=1739262691-D25Lpt6Iw6QMtaRsdYdfTE5LphdCsCTd-0-6726cf9fc42bf21ffd1a28da8e4c9b0e)
图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=1739262691-CLQtmOv0esHaNWQMhHCjoN2IHUqVPrrj-0-c32e5430c5ef62715bef9413222b45b3)
图4-3 INC R5指令执行示意图
4.寄存器间接寻址
指令指定某一寄存器的内容作为操作数地址。8051单片机中可用来间接寻址的寄存器有:选定工作寄存器区的R0、R1、堆栈指针SP或者16位的数据指针DPTR,使用时前面加@表示间接寻址。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/60_03.jpg?sign=1739262691-LAsHSKJ2VGlTWzn2nLiQ4wk5ncDvf8Hp-0-49208884f1638184ac179d5d5fa3b1e9)
该指令的执行过程如图4-4所示。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/60_04.jpg?sign=1739262691-7Ojk1dLpFrYCrqo6jVxHftL0wKJitkWj-0-671d336be9b2cea9a00fc805a10c8bde)
图4-4 MOV A,@R0指令执行示意图
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/60_05.jpg?sign=1739262691-YFR041PVe0NdjsVl1YaT6wWwCvn8mmDj-0-31968d5cbdd39ca728ae8f4e313364bb)
5.变址寻址
由指令指定的偏移量寄存器和基址寄存器DP TR或P C相加所得结果作为操作数地址。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/61_01.jpg?sign=1739262691-rwkYXspYfpuf7UbQnV0nW8jJNVrwqE58-0-4f312387f404eb5608b7d3990c42d5e8)
其中,A作为偏移量寄存器(称为变址寄存器),PC作为基址寄存器,A中内容为无符号数和PC相加,从而得到其真正的操作数地址。
6.相对寻址
该寻址方式主要用于相对跳转指令。把指令中给定的地址偏移量与本指令所在单元地址(即程序计数器PC中的内容)相加,得到真正的程序转移地址。与变址方式不同,该偏移量有正、负号,在该机器指令中必须以补码形式给出,所转移的范围为相对于当前PC值的-128~+127之间。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/61_02.jpg?sign=1739262691-wgbgf2mmx0k1tgPsWiHP1QEx3PVoEzVw-0-7a0a9cb9a84f1ef176069e55c6743531)
若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=1739262691-Ex2QY1WSy4ccwMSPsok7XVavKjrO5JJH-0-b14dd31f3805068632abd627f06a17f7)
图4-5 JC 80H指令执行示意图
7.位寻址
支持位单元存取操作是8051单片机的一个主要特点。位操作指令能对位地址空间的每一位都可进行运算和传送操作。
![](https://epubservercos.yuewen.com/3CCCBD/21122066408961206/epubprivate/OEBPS/Images/61_04.jpg?sign=1739262691-RtdjD4EAiZJukShyF7kf5LgPK12E0rlR-0-a46a13401662f5ad318af034f938eade)