51单片机的寻址方式

目录


前言

        在上一篇文章中,初步了解了单片机的内部结构,下面我们将继续学习单片机的寻址方式。


一、汇编语言的程序框架

        在先前学习的c语言中,可以看出c语言的框架为:

#include <stdio.h>
 
  main()
{
    /********************
    *********************
    ********************/
}

        其中/**********/为以后代码填写的内容,可以发现C语言的框架包含了入口和结束;与之相比,汇编语言的程序框架为:

    /********************
    *********************
    ********************/
END

        其中/**********/为以后代码填写的内容,END为结束的伪代码。

二、汇编语言的语言格式

        汇编语言的语言格式为:

[标号:] 助记符   [操作数1,操作数2]    [; 注释]

        其中助记符为指令功能,[操作数1,操作数2]为指令处理对象,[; 注释]是为了增加程序的可读性。下面写一条简单的汇编程序:

ADF: 
    MOV A,#10  ;ADD程序的功能 将累加器A赋值为10
END

        观察程序可知道,程序中的ADF为标号;MOV 是助记符,实现的是赋值功能的指令;A,#10为操作数;[;]为注释符;END为结束的伪代码。

三、单片机的寻址方式

3.1 什么是寻址方式

        寻址方式:指令处理对象(操作数)所在RAM / ROM / I/O接口的位置(存储器)以何种方式告诉CPU,这就是寻址方式。简而言之就是用不同的方式告诉CPU关于操作数的地址,举例子为:你想通知你的伙伴,你搬家后的新地址,那么你可以打电话通知他这个消息,或者发短信,亦或者当面通知他,而打电话/发短信/当面通知他关于你搬家后的新地址,就是寻址方式。

3.2 寻址方式的种类

3.2.1立即寻址

         立即寻址就是不寻址,直接把被操作的数据(立即数)写在指令当中。在指令代码中,需要在立即数前面加上#,其中#作为立即寻址的标识符。 

         例如:把数据30H传送到累加器ACC中,A为目的操作数,#30H为源操作数。指令:

MAIN:
    MOV A,#30H  ;立即寻址,将30H赋给A  A为目的操作数,#30H为源操作数
END

        调试步骤为:

         Debug调试:
执行第二步程序时,累加器A内数据变为十六进制0x30。

 3.2.2.直接寻址

        直接寻址就是操作数在用户RAM区(30H-7FH)或除A、DPTR之外的SFR中,用户RAM地址以直接地址或符号地址给出。换言之就是将被操作的数据在存储器中的地址写在指令代码当中。也就是将操作数的地址写在指令当中。

  例如:地址31H中的数据为2AH,将31H中的数据传入累加器ACC中。指令:

MAIN:
	MOV 31H,#2AH
	MOV A,31H
END

         这条指令中的31H,与立即寻址中的#30H意义不同,这里的31H表示数据#2AH的地址。
Debug:

         单步执行到第3行指令时,累加器A中的数据变为0x2A。

 3.2.3.寄存器寻址

         寄存器寻址就是将操作数(被操作的数据)存放在寄存器中。能够实现寄存器寻址的寄存器有A、B(乘/除法时运用)、DPTR、工作寄存区(R0 ~ R7)。指令: 

MAIN:
	MOV A,#2AH
	MOV R0,A
END

        debug:

         在第2行指令中,对于目的操作数来说就是寄存器寻址,对于源操作数来说就是立即寻址。

在第3行指令中,目的操作数和源操作数都是寄存器,那么二者都是寄存器寻址。

3.2.4.寄存器间接寻址

        与寄存器寻址相似,在寄存器寻址时,寄存器中存放的是操作数,而寄存器间接寻址时,寄存器中存放的是操作数的地址。只用R0、R1、DPTR可以实现寄存器间接寻址
   寄存器R0中存放的是数据5FH的地址30H,这样寄存器间接寻址可以将数据5FH传到累加器ACC中。

  指令:

MAIN:
	MOV 30H,#05FH
	MOV R0,#30H
	MOV A,@R0      ;寄存器间接寻址
END

 DEBUG:

累加器A的数据变为0x5fH。

   如果第3行中,对R0用的为直接寻址会发生什么呢?
Debug:

        A中的数据没有变,可以看见R0中是0x5f,这时候a通过寄存器间接寻址得到的是地址5fh中的数据0x00H。 

3.2.5.基址加变址寻址

         基址寄存器只能是PC和DPTR,变址寄存器为累加器A。这种寻址方式是将PC或DPTR中得值与A中的值相加,得到的结果是操作数的地址。注意:是操作数的地址,不是操作数本身。
例如:MOVC A, @A+DPTR
   这条指令是把A和DPTR中的值相加,得到操作数的地址,存到A中,然后A在根据地址去找到操作数。
     MOVC A,@A+PC
同理,这条只是将DPTR换为PC。

3.2.6.相对寻址

        相对寻址就是PC指针当前指向的值,与设置的JC偏移量相加得到的值作为目标地址,其中偏移量是自己设定的。
JC 80H
假如这条指令存放在1005H,取出操作码后PC指向1006H,取出偏移量后PC指向1007H,那么目标地址就是1007H + 80H,但是偏移量是有符号数,80H是-128的补码,因此最后的目标地址是0F87H。

3.2.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

  • 15
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值