完整的51单片机汇编语言指令手册

参考链接
https://blog.csdn.net/weixin_45702442/article/details/115874162
https://blog.csdn.net/acslsr/article/details/106881712
在这里稍作终结,方便复习

51单片机汇编语言指令大全

  • 一.数据传输类指令
  • 1. 累加器是目的操作数指令
  • 2.以Rn为目的操作数的指令
  • 3.以直接地址为目的操作数指令
  • 4.以寄存器间接地址为目的操作数指令
  • 5.16位传送指令
  • 6.堆栈操作指令
  • 7.累加器A与外部数据存储器传送指令
  • 8.查表指令
  • 9.字节交换命令
  • 10.半字节交换指令
  • 二、算数操作类指令
  • 1.加法指令
  • 2.带进位加法指令
  • 3.增1指令
  • 4.十进制调整指令
  • 5.带借位减法
  • 6.减1指令
  • 7.乘法指令
  • 8.除法指令
  • 三、逻辑操作类指令
  • 1.简单逻辑操作指令
  • 2.左循环指令
  • 3.右移指令
  • 4.累加器半字节交换指令
  • 5.逻辑与指令
  • 6.逻辑或指令
  • 7.逻辑异或指令
  • 四、控制转移类指令
  • 1.无条件转移指令
  • 2.条件转移指令
  • 3.比较不相等转移指令
  • 4.减1不为0转移指令
  • 5.调用子程序指令
  • 6.返回指令
  • 7.空操作指令
  • 五、位操作指令
  • 1.数据位传送指令
  • 2.位变量修改指令
  • 3.位变量逻辑与指令
  • 4.条件转移类指令
  • 六.汇编语言伪指令
  • 51系列单片机按照功能分科分为5大类

    数据传送类指令28条;
    算数操作类指令24条;
    逻辑运算类指令25条;
    控制转移类17条;
    位操作类17条。

    一.数据传输类指令

    1. 累加器是目的操作数指令

    MOV A,Rn
    MOV A,@Ri
    MOV A,direct
    MOV A,#data

    A作为51单片机内比较重要的特殊寄存器,用途十分广泛,它能和Rn(当前寄存器区的8个工作寄存器),直接地址,间接地址,间接寻址的寄存器进行数据传输

    2.以Rn为目的操作数的指令

    MOV Rn,A
    MOV Rn,direct
    MOV Rn,#data
    

    注意Rn工作寄存器无法直接将Rn中的内容送入Rn中,所以其数据传送类指令少了一个工作寄存器之间的传送

    3.以直接地址为目的操作数指令

    MOV direct,A
    MOV direct,Rn
    MOV direct1,direct2
    MOV direct,@Ri
    MOV direct,#data
    

    直接地址能与直接地址之间进行数据传输

    4.以寄存器间接地址为目的操作数指令

    MOV @Ri,A
    MOV @Ri,direct
    MOV @Ri,#data
    

    5.16位传送指令

    MOV DPTR,#data16
    

    6.堆栈操作指令

    进栈:PUSH direct
    出栈:POP direct
    

    7.累加器A与外部数据存储器传送指令

    MOVX A,@DPTR
    MOVX A,@Ri
    MOVX @DPTR,A
    MOVX @Ri,A
    

    能与外部存储器进行数据传输的只有A累加器,所有需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A读入。

    8.查表指令

    MOVC A,@A+PC
    MOVC A,@A+DPTR
    

    9.字节交换命令

    XCH A,Rn
    XCH A,direct
    XCH A,@Ri
    

    10.半字节交换指令

    XCHD @Ri
    

    二、算数操作类指令

    1.加法指令

    ADD A,Rn
    ADD A,direct
    ADD A,@Ri
    ADD A,#data
    

    将A中的内容和第二操作数中的内容相加然后送入A中去,寻址方式的不同导致指令的不同

    2.带进位加法指令

    ADDC A,Rn
    ADDC A,direct
    ADDC A,@Ri
    ADDC A,#data
    

    有进位时,cy=1,带进位位的加法指令常用于多字节的加法指令中。

    3.增1指令

    INC A
    INC Rn
    INC direct
    INC @Ri
    INC DPTR
    

    累加器 A的加1指令影响P标志位

    4.十进制调整指令

    DA A
    

    将A中的16进制数据改成与之等价的10进制数据值,便于人读取,显示还是16进制值,但是要把它看成与十进制等价的值
    在进行BCD码加法运算时,跟在ADD和ADDC指令之后,用来对BCD码加法运算结果进行自动修正。
    例:A = 0001 0101 BCD(代表十进制数15)
    ADD A,#8 ;执行完之后,A = 1DH
    DA A ;调整后,A = 23H

    5.带借位减法

    SUBB A,Rn
    SUBB A,direct
    SUBB A,@Ri
    SUBB A,#data
    

    注意,没有不带借位位的减法指令,若需要则要先令CY位的值为0即可
    当A-操作数小于0,产生借位,借位标志位c=1,一般与JC,JNC配合

    6.减1指令

    DEC A
    DEC Rn
    DEC direct
    DEC @Ri
    

    同理,累加器A减1影响p标志位

    7.乘法指令

    MUL  AB
    

    A和B中的两个8位无符号数相乘,两数相乘结果一般比较大,因此最终结果用1个16位数来表达,其中高8位放在B中,低8位放在A中。

    8.除法指令

    DIV AB
    

    将A中的8位无符号数除B中的8位无符号数(A/B)。除了以后,商放在A中,余数放在B中。
    CY和OV都是0。如果在做除法前B中的值是00H,也就是除数为0,那么0V=1

    三、逻辑操作类指令

    1.简单逻辑操作指令

    累加器A清零:
    CLR A
    累加器A按位取反:
    CPL A
    

    2.左循环指令

    不带进位左移指令
    RL A
    带进位左移指令
    RLC A
    

    带进位的左移指令,将A中的8位,从左往右依次循环移动,此时最高位给CY位,CY位到最低位去了

    3.右移指令

    不带进位循环指令
    RR A
    带进位循环指令
    RRC A
    

    同莉,带进位的右移指令,将A中的8位,从右往左依次循环移动,此时最低位给CY位,CY位到最高位

    4.累加器半字节交换指令

    SWAP A
    

    5.逻辑与指令

    ANL A,Rn
    ANL A,direct
    ANL A,#data
    ANL A,@Ri
    ANL direct,A
    ANL direct,#data
    

    第一操作数无Rn

    6.逻辑或指令

    ORL A,Rn
    ORL A,direct
    ORL A,#data
    ORL A,@Ri
    ORL direct,A
    ORL direct,#data
    

    7.逻辑异或指令

    XRL A,Rn
    XRL A,direct
    XRL A,#data
    XRL A,@Ri
    XRL direct,A
    XRL direct,#data
    

    四、控制转移类指令

    跳转指令非常重要,主要在判断语句中经常使用

    1.无条件转移指令

    短转移类指令: AJMP addr11
    长转移类指令: LJMP addr16
    相对转移指令: SJMP rel
    间接转移指令: JMP @A+DPTR
    

    当发生跳转时,PC指针会跳转到标号处(即想要跳转的位置)
    短跳转指令和长跳转指令后跟的都是直接地址,区别时是跳转范围,AJMP的跳转范围是 2k(2^11 )
    LJMP的跳转范围是64k(2^16),
    SJMP后跟的是相对地址,跳转范围是256B(-128~128)
    间接转移 JMP @A+DPTR 指令
    用途也是跳转,转移地址由A+DPTR形成,并直接送入PC。
    本指令可代替众多的判别跳转指令,又称为散转指令,多用于多分支程序结构中。
    该指令类似于C语言中的 switch(){case:…}语句的功能。

    2.条件转移指令

    若累加器为0则转移:
    JZ rel
    若累加器非0则转移:
    JNZ rel
    

    转移到相对于当前PC值的8位移量的地址去。即: 新的PC值=当前PC+偏移量rel
    使用时,一般将rel理解成标号

    3.比较不相等转移指令

    CJNE A,direct,rel
    CJNE A,#data,rel
    CJNE Rn,#data,rel
    CJNE @Ri,#data,rel
    

    此类指令的功能是将两个操作数比较,如果两者相等,就顺序执行,如果不相等,就转移。
    同样地,使用时,我们可以将rel理解成标号,如果不相等,就转移到我们给出的标号的位置处去
    利用CJNE指令,可以判断两数是否相等。
    但有时还想得知两数比较之后哪个大,哪个小,CJNE指令也具有这样的功能:
    如果两数不相等,则CPU还会用CY来反映哪个数大,哪个数小。
    如果前面的数大,则CY=0,否则CY=1。
    因此在程序转移后再次利用CY就可判断出哪个数大,哪个数小了

    4.减1不为0转移指令

    DJNZ Rn,rel
    DJNZ direct,rel
    

    注意第一操作数只能为Rn和直接地址
    DJNZ指令的执行过程是这样的:
    它将第一个参数中的值减1,然后看这个值是否等于0,如果等于0,就往下执行,如果不等于0,就转移到第二个参数所指定的地方去。

    5.调用子程序指令

    ACALL addr11
    LCALL addr16
    

    上面两条指令都是在主程序中调用子程序,短调用指令,被调用子程序入口地址必须与调用指令的下一条指令的第一字节在相同的2KB存储区之内。

    6.返回指令

    子程序返回指令:RET
    中断子程序返回指令:RETI
    

    RET指令的执行过程是:堆栈栈顶内容(2字节,调用时保存的ACALL下面的一条指令的地址)弹出给PC,实现返回到ACALL下面的那条指令的位置中去
    RETI指令除了具有RET指令的功能实现程序返回外,还有对中断优先级状态触发器的清零的功能。

    7.空操作指令

    NOP
    

    空操作,就是什么事也不干,停一个周期,一般用作短时间的延时

    五、位操作指令

    1.数据位传送指令

    MOV C,bit
    MOV bit,C
    

    这组指令的功能是实现位累加器(CY)和其它位地址之间的数据传递。注意:无法直接传递某个数给某个位

    2.位变量修改指令

    清0:
    CLR C
    CLR bit
    求反:
    CPL C
    CPL bit
    置1:
    SETB C
    SETB bit
    

    3.位变量逻辑与指令

    ANL C,bit;C与指定位的值相与,结果送C
    ANL C,/bit;先将指定的位地址中的值取出后取反,再和Cy相与,结果送回C。
    

    但注意:指定的位地址中的值本身并不发生变化。即bit的值前后并不发生变化

    4.条件转移类指令

    判断C转移指令
    JC rel
    JNC rel
    判断位变量转移指令
    JB bit,rel;(bit)=1,则转移,否则顺序执行;
    JNB bit,rel
    JBC bit,rel;(bit)=1,则转移,并把该位清0,否则顺序执行。也就是说执行与否该位的最终结果都为0,要特别注意这一点
    

    第一条指令的功能是如果C = 1就转移,否则就顺序执行。注意:与JZ A 不同,A=0就跳转
    第二条指令则和第一条指令相反,即如果C = 0就转移,否则就顺序执行。

    六.汇编语言伪指令

    写给汇编编译器看的指令,并非指导CPU运行的指令,只是告诉编译器相关内容,编译时并不产生代码
    伪指令解析
    ORG addr16
    指定该指令之后的指令(或数据块)的起始地址。
    END
    程序结束标志。END必须放在程序的最后,在END之后的程序不会被编译成机器码。
    DB
    定义字节(一个字节,也可定义两个字节,编译器不会报错),一般格式为:
    标号: DB 字节常数或字符或表达式
    DW
    定义字(两个字节,eg:‘我’、‘ab’)。一般格式为:
    标号: DW 字或字串
    DS
    定义预留存储区。eg: DS 2,预定两个字节的存储空间,下一条指令空格2个字节开始存储
    BIT
    定义位变量。一般格式为:
    字符名 BIT 位地址,(将位地址赋值给字符名)eg:stop Bit P1.7(对stop的操作就是对P1.7的操作)

    EQU
    赋值伪指令。一般格式为:
    符号名 EQU 数值(功能为给符号赋值,eg zxb EQU 66H,执行后,zxb==66H)
    #HIGH / #LOW
    取目标代码的高字节/低字节数

    物联沃分享整理
    物联沃-IOTWORD物联网 » 完整的51单片机汇编语言指令手册

    发表评论