MCS-51单片机寻址方式详解

寻址方式

  1. 寻址空间

    • 对程序存储器,片外数据存储器都是以字节为单位寻址的。而对片内数据存储器,有些存储单元既可以字节为单位寻址,又可以位为单位寻址。位地址空间包括特殊功能寄存器SFR中能被8整除的寄存器地址中的88个位地址。格式如下:

      SFR 位地址 字节地址
      A E7~E0 E0H
      B F7~F0 F0H

      特殊功能寄存器:(MSB:最高有效位–Most S Bit)

      • A(ACC) -> E0H
      • B -> F0H
      • PSW:程序状态字 -> D0H
      • SP:堆栈指针 ->
      • DPTR:数据指针(由DPH和DPL组成,DPH是高位,DPL是低位)->
      • P0P3:P0口锁存器P3口锁存器 ->
      • IP:中断优先级控制寄存器 ->
      • IE:中断允许级控制寄存器 ->
      • TMOD:定时器/计数器方式控制寄存器(Time MOD) ->
      • TCON:定时器/计数器控制寄存器(Time CON)->
      • TH0:定时器/~0(高字节)->
      • TL0 ->
      • TH1 ->
      • TL1 ->
      • SCON:串行口控制寄存器
      • SBUF:串行口数据缓冲器
      • PCON:电源控制寄存器(Power CON)
    • 一共有22个特殊功能寄存器,其中有11个特殊功能寄存器由于字节地址正好能被8整除,所以既可以按字节寻址,又可以按位寻址,不带括号。剩余的11个寄存器只能按字节地址进行寻址。

    • 位地址空间还包括片内数据存储器地址20H~2FH区间内的128个位地址字节地址和位地址对应如下:

      字节地址 位地址
      2FH 7F~79
      ~ ~
      20H 07~00
  2. 符号注释

    • Rn:当前选中的工作寄存器组R0R7(n=07)。它在RAM中的地址由PSW中的R0和R1决定【RAM有四个工作寄存器区,刚好由0,1决定】
    • Ri:当前选中的工作寄存器组中可以作为地址指针的两个工作寄存器R0,R1。片内的地址通过计算可得。
    • # data:8位立即数。其中"#"是立即寻址符,符号后面的数是立即数。
    • # data 16:16位立即数
    • direct :8位片内RAM(包括SFR)的直接地址。
    • addr 11:11位目的地址
    • addr 16:16位目的地址
    • rel:相对地址,用于相对转移指令,书写源程序时,rel一般用符号表示,汇编程序自动计算rel的偏移量。
    • bit:片内RAM或SFR的直接寻址位地址
    • @:寄存器间接寻址符
    • /:位操作命令中,表示对该为先取反再参与操作,但不影响该原位原值
  3. 立即寻址

    MOV A,#45H ;MOV DPTR,#DATA
    ;机器代码 74(PC) 45
    
    PC_74
    PC+1_45
    A_45
  4. 直接寻址

    • 由指令直接给出参加操作的数的字节地址。由于操作数地址只能以8位数指定。所以直接寻址方式只能在SFR和RAM的低128字节地址空间进行寻址

    • MOV A,45H;该指令中,直接给出了操作数的地址45H,实际参加的数就在45H单元中。
      
      PC
      E5
      PC+1
      45H
      片内RAM
      2F
      A
      • 注意:指令助记符中的direct是操作数所在的存储单元地址,由2位16进制数表示。当直接地址为SFR中某个寄存器的地址时,direct既可以用SFR的实际地址,也可以用SFR的名字符号(通常使用后者),有利于增强程序的可读性。

        PUSH DPH;机器码:C0 83
        PUSH 83H;机器码:C0 83
        ;利用直接寻址的方式访问累加器A的时候,应该用ACC(或0EH)表示累加器A,以免与寄存器寻址混淆。
        PUSH A;错误
        PUSH ACC;正确
        
  5. 寄存器寻址

    • 寄存器寻址是由指令指出某一个寄存器的内容为操作数。在寄存器寻址方式的指令中,寄存器用寄存器名来表示。对选定的工作寄存器区中的R0~R7、累加器A,B,DPTR以及进位CY中的数进行操作,当前工作寄存器组的选择,由PSW的RS1和RS2来指定。

    • MOV A,R3;将R3中的数给累加器A;
      ;机器代码 EB
      ;指令操作码为EBH,其二进制形式为11101011,即操作码的低三位为011,表示工作寄存器R1~R3的地址.
      ;流程图如图
      
      58
      11101011
      PC
      片内RAM
      R3_13H
      累加器A
    • 执行结果:累加器A中的内容为58H,R3(13H)中的内容不变

  6. 寄存器间接寻址

    • 这种寻址方式中,指令操作数所指定的寄存器中存放的是操作数的地址,而不是操作数本身。在MSC-51中,可以作为寄存器间接寻址有工作寄存器R0、R1和堆栈指示器SP以及数据指针DPTR

    • 当寻址片内RAM低于128或者片外低于256字节时,可以使用R0或R1。采用DPTR作为间接地址寄存器,可以寻址片外64K的数据存储器。

    • 例如:

      MOV A,@R0
      ;机器代码:11100110
      ;设工作寄存器为第0组,R0中存放5EH,它为片内RAM的一个存储单元,其中的内容是78H.执行指令后,再将78H传送给累加器A.
      

      注意:在使用@R0,@R1对片外RAM的0000H~00FFH单元进行寻址的时候,应该先将P2口置为0输出

  7. 变址寻址(基址寄存器+变址寄存器间接寻址)

    • 变址寻址方式以PC或DPTR作为基址寄存器,存放操作数的基本地址。累加器A为变址寄存器,存放被寻址操作数地址相对于基地址的偏移量,该偏移量为1字节无符号数。操作数的有效地址为:

      有效地址=基址寄存器PC(或DPTR)+A 表现为A=PC+A

      MOVC A,@A+DPTR
      ;机器代码:93
      ;设累加器A=47H,DPTR=2000H,(2047H)=5CH,该指令是将操作数的有效地址2047H单元中的内容传送给累加器A.指令执行后,A=5CH
      
  8. 相对寻址

    • 相对地址是仅用于相对转移指令的一种寻址方式。这种寻址方式是要寻找指令地址,而不是数,即寻找下一条要执行指令的地址。相对寻址的有效地址为:

      D=PC+rel

      式子中,rel是相对地址。相对地址的机器码称为偏移量disp,rel=disp+b。若转移指令为二字节,则b=2,若转移指令为三字节,则b=3。

      偏移量为一字节二进制补码数,取值为-128~+127。对应的相对地址取值范围容易计算。

      JC 18H
      ;机器代码:40 16(18-2)
      ;这是一个二字节指令,它是以进位标志CY为条件的相对转移指令。若CY等于0,则不转移,PC=PC=2,顺序往下执行;若CY等于1,则以PC当前内容(+2)与机器代码的第二字节数相加,结果得到转移指令的目的地址PC.
      
  9. 位寻址

    • 位寻址仅用于位操作指令的一种寻址方式,它是指对片内RAM位寻址区和某些可以位寻址的特殊功能寄存器(11个)进行位操作的寻址。在进行位操作时,首先借助于进位标志CY作为位操作累加器。当位地址与直接寻址中的字节地址形式完全一样的时候,主要有操作码加以区分。

    • SETB 3AH
      ;RAM可寻址区内位地址3AH是片内RAM中27H单元中的第二位。若设(27H)=00H,执行SETB操作后,第二项的值置为1,变为00000100B,此时(27H)=04H.
      

你可能感兴趣的:(51单片机)