• 80C51单片机指令寻址方式



    首先介绍单片机指令系统的操作码和操作数

    操作码

    1.用于规定指令进行什么操作
    2.用英文缩写表示,如加法ADD、减法SUBB、传送MOV等
    3.操作码与操作数之间用空格分隔,操作数与操作数之间用“,”隔开
    4.在指令中不能缺少操作码
    5.操作码是给定的,不能自创

    操作数

    1. 什么是操作数?

    操作数同样是指令的一部分,其中包含要操作的数据在寄存器中的内存位置。

    2. 操作数是由寄存器地址、内存地址或立即数来指定的。

    **立即操作数:**指令要操作的数据以常量的形式出现在指令中,称为立即数,它只能作为源操作数 。
    **寄存器操作数:**指令要操作的数据存放在CPU中的寄存器里,指令中给出寄存器名即可。
    **内存操作数:**指令要操作的数据存放在内存某些单元中,指令中给出内存单元物理地址(实际上指令只给出了偏移地址,段地址采用隐含方式给出,也可以使用跨段方式指出当前段地址)

    3.操作数的数量和位宽根据CPU和指令的不同而不同。根据可使用的操作数的数量,指令可以分为3操作数形式、2操作数形式和 1操作数形式.

    符号含义
    Rnn=07,表示当前寄存器组的8个通用寄存器R0R7中的一个
    Rii=0、1,可用作间址寻址的寄存器,只能是R0,R1中的一个
    Direct内部的8位地址,直接寻址方式,寻址范围为256个单元
    #data指令中的8位立即数
    #data16指令中的16位立即数
    addr1616位目的地址,只限于LCALL和LJMP中使用
    addr1111位目的地址,只限于ACALL和AJMP指令使用
    rel相对转移指令中的偏移量,为8位带符号数,为SJMP和所有条件转移指令所使用
    DPTR数据指针
    bit片内数据存储器中的直接寻址位
    A累加器
    BB寄存器
    C进位标志位
    /位地址的前缀标志,表示对该位操作数取反

    指令寻址方式

    大多数指令执行时都需要使用操作数,所以存在如何取得操作数的问题,这个叫做指令的寻址方式。

    寄存器寻址方式

    此操作数在寄存器中,只要指定了寄存器就能得到操作数。

    1. 主要对象是通用寄存器R0-R7
    2. 部分专用寄存器,累加器A、AB寄存器以及数据指针DPTR
    ;后为注释
    INC   R3    	;(R3)(R3)+1
    MOV   A ,R0    ;把寄存器R0的内容传送到累加器A中
    
    • 1
    • 2
    • 3

    直接寻址方式

    1. 操作数直接以存储单元地址的形式给出。
    2. 主要对象是内部数据存储器。
    3. 这种寻址方式只限于内部RAM
    位置具体
    低128单元直接以单元地址形式给出
    专用寄存器可以寄存器符号形式给出
    MOV   A,70H     ;(A)(70H)
    
    • 1

    把内部RAM 70H单元中的数据传送给累加器A。

    寄存器间接寻址

    寄存器中是操作数的地址,而不是操作数本身。与寄存器寻址方式的不同。
    为了区别寄存器寻址和寄存器间接寻址,间接寻址中,常在寄存器名称前加@

    位置具体
    内部RAM低128单元只能使用R0或R1作为间址寄存器@Ri i=0/1
    外部RAM64KB@DPTR 或@Ri
    MOV   A,@R0 ;(A)((R0))以RO寄存器3AH为地址,把该地址单元的内容送给累加器A
    MOVX A,@DPTR ;把DPTR指定的外部RAM的内容送给累加器A
    MOVX   A,@R0  ;由R0指定的低位字节的地址外部RAM单元的内容送给累加器A
    
    • 1
    • 2
    • 3

    立即寻址方式

    指令的操作数直接在指令中给出,称为立即数“#”前缀
    立即数可以多种进制表达
    十六进制后缀H、二进制后缀B、十进制带后缀D或省略。
    #data8
    #data16

    MOV   A,#20H      	;(A)20H
    MOV DPTR,#3456H	;(DPH)34H ;(DPL)56H(需要注意两者位数是否相同)
    MOV A,#0BH	
    MOV A,#1011B 
    MOV A,#11D 
    MOV A,#11
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    变址寻址方式

    以程序计数器PC或数据指示器DPTR中的内容为基地址,加上累加器A(变址寄存器)中的内容作为操作数的地址。
    应注意A中的数为无符号数。
    变址寻址方式只能对程序存储器ROM进行寻址, 是一字节指令。
    注意变址寻址指令只有以下三条:

    MOVC  A,@A+DPTR		 ;(A)((A)+(DPTR))把DPTR和A的内容相加得到一个程序存储器地址,再把该地址单元的内容送给累加器A
    MOVC  A,@A+PC     ;(A)((A)+(PC))
    JMP @A+DPTR
    
    • 1
    • 2
    • 3

    下面是关于第一条指令的解释会更清晰一点
    在这里插入图片描述

    位寻址方式

    位寻址范围

    1. 内部RAM中的位寻址区(20H-2FH),位地址范围00H-7FH。寻址位的两种表示方法:位地址和单元地址加位数,如7FH单元第0位,用位地址表示为78H,单元地址加位数表示为7FH.0
    2. 专用寄存器中的可寻址位(特殊功能寄存器的单元地址能被8整除可位寻址80H 90H…)。
    直接使用位地址:	CLR D3H
    位名称表示: 	CLR RS0	
    单元地址加位数: 	CLR D0H.3
    专用寄存器名称加位数:CLR PSW.3
    
    • 1
    • 2
    • 3
    • 4

    相对寻址方式

    是为解决程序转移而设置的,只为转移指令所采用
    目的地址=转移指令地址+转移指令字节数+rel
    偏移量rel是一个带符号的8位二进制数,所能表示的数的范围为-128~+127
    则以转移指令所在地址为基点向前最大可转移(127+转移指令字节数)个单元地址,向后最大可转移(128-转移指令字节数)个单元地址。

  • 相关阅读:
    docker之daemon.json文件
    在STM32F103C8T6上使用RT_Thread Nano移植控制台和Finsh
    C--六、字符串
    TS第二讲 ----- 接口
    java基于微信小程序校园二手闲置商品交易跳蚤市场 uniapp 小程序
    [ARC098F] Donation(找性质+点 Kruskal 重构树)
    细聊init进程和Linux系统启动流程
    基于ADuCM4050的串口打印printf重定向输出
    Kotlin 泛型
    尚品汇_第6章_商品详情页
  • 原文地址:https://blog.csdn.net/fcxgfdjy/article/details/126707219