㈠ 51单片机指令集
51汇编语言指令集
符号定义表
符号 含义
Rn R0~R7寄存器n=0~7
Direct 直接地址,内部数据区的地址RAM(00H~7FH)
SFR(80H~FFH) B,ACC,PSW,IP,P3,IE,P2,SCON,P1,TCON,P0
@Ri 间接地址Ri=R0或R1 8051/31RAM地址(00H~7FH) 8052/32RAM地址(00H~FFH)
#data 8位常数
#data16 16位常数
Addr16 16位的目标地址
Addr11 11位的目标地址
Rel 相关地址
bit 内部数据RAM(20H~2FH),特殊功能寄存器的直接地址的位
指令介绍
指令 字节 周期 动作说明
算数运算指令
1.ADD A,Rn 1 1 将累加器与寄存器的内容相加,结果存回累加器
2.ADD A,direct 2 1 将累加器与直接地址的内容相加,结果存回累加器
3.ADD A,@Ri 1 1 将累加器与间接地址的内容相加,结果存回累加器
4.ADD A,#data 2 1 将累加器与常数相加,结果存回累加器
5.ADDC A,Rn 1 1 将累加器与寄存器的内容及进位C相加,结果存回累加器
6.ADDC A,direct 2 1 将累加器与直接地址的内容及进位C相加,结果存回累加器
7.ADDC A,@Ri 1 1 将累加器与间接地址的内容及进位C相加,结果存回累加器
8.ADDC A,#data 2 1 将累加器与常数及进位C相加,结果存回累加器
9.SUBB A,Rn 1 1 将累加器的值减去寄存器的值减借位C,结果存回累加器
10.SUBB A,direct 2 1 将累加器的值减直接地址的值减借位C,结果存回累加器
11.SUBB A,@Ri 1 1 将累加器的值减间接地址的值减借位C,结果存回累加器
12.SUBB A,#data 2 1 将累加器的值减常数值减借位C,结果存回累加器
13.INC A 1 1 将累加器的值加1
14.INC Rn 1 1 将寄存器的值加l
15.INC direct 2 1 将直接地址的内容加1
16.INC @Ri 1 1 将间接地址的内容加1
17.INC DPTR 1 1 数据指针寄存器值加1
说明:将16位的DPTR加1,当DPTR的低字节(DPL)从FFH溢出至00H时,会使高字节(DPH)加1,不影响任何标志位
18.DEC A 1 1 将累加器的值减1
19.DEC Rn 1 1 将寄存器的值减1
20.DEC direct 2 1 将直接地址的内容减1
21.DEC @Ri 1 1 将间接地址的内容减1
22.MUL AB 1 4 将累加器的值与B寄存器的值相乘,乘积的低位字节存回累加器,高位字节存回B寄存器
说明:将累加器A和寄存器B内的无符号整数相乘,产生16位的积,低位字节存入A,高位字节存入B寄存器。如果积大于FFH,则溢出标志位(OV)被设定为1,而进位标志位为0
23.DIV AB 1 4 将累加器的值除以B寄存器的值,结果的商存回累加器,余数存回B寄存器
说明:无符号的除法运算,将累加器A除以B寄存器的值,商存入A,余数存入B。执行本指令后,进位位(C)及溢出位(OV)被清除为0
24.DA A 1 1 将累加器A作十进制调整,
若(A) 3-0>9或(AC)=1,则(A) 3-0←(A)3-0+6
若(A) 7-4>9或 (C)=1,则(A) 7-4←(A)7-4+6
逻辑运算指令
25.ANL A,Rn 1 1 将累加器的值与寄存器的值做AND的逻辑判断,结果存回累加器
26.ANL A,direct 2 1 将累加器的值与直接地址的内容做AND的逻辑判断,结果存回累加器
27.ANL A,@Ri 1 1 将累加器的值与间接地址的内容做AND的逻辑判断,结果存回累加器
28.ANL A,#data 2 1 将累加器的值与常数做AND的逻辑判断,结果存回累加器
29.ANL direct,A 2 1 将直接地址的内容与累加器的值做AND的逻辑判断,结果存回该直接地址
30.ANL direct,#data 3 2 将直接地址的内容与常数值做AND的逻辑判断,结果存回该直接地址
31.ORL A,Rn 1 1 将累加器的值与寄存器的值做OR的逻辑判断,结果存回累加器
32.ORL A,direct 2 1 将累加器的值与直接地址的内容做OR的逻辑判断,结果存回累加器
33.ORL A,@Ri 1 1 将累加器的值与间接地址的内容做OR的逻辑判断,结果存回累加器
34.ORL A,#data 2 1 将累加器的值与常数做OR的逻辑判断,结果存回累加器
35.ORL direct,A 2 1 将直接地址的内容与累加器的值做OR的逻辑判断,结果存回该直接地址
36.ORL direct,#data 3 2 将直接地址的内容与常数值做OR的逻辑判断,结果存回该直接地址
37.XRL A,Rn 1 1 将累加器的值与寄存器的值做XOR的逻辑判断,结果存回累加器
38.XRL A,direct 2 1 将累加器的值与直接地址的内容做XOR的逻辑判断,结果存回累加器
39.XRL A,@Ri 1 1 将累加器的值与间接地扯的内容做XOR的逻辑判断,结果存回累加器
40.XRL A,#data 2 1 将累加器的值与常数作XOR的逻辑判断,结果存回累加器
41.XRL direct,A 2 1 将直接地址的内容与累加器的值做XOR的逻辑判断,结果存回该直接地址
42.XRL direct,#data 3 2 将直接地址的内容与常数的值做XOR的逻辑判断,结果存回该直接地址
43.CLR A 1 1 清除累加器的值为0
44.CPL A 1 1 将累加器的值反相
45.RL A 1 1 将累加器的值左移一位
46.RLC A 1 1 将累加器含进位C左移一位
47.RR A 1 1 将累加器的值右移一位
48.RRC A 1 1 将累加器含进位C右移一位
49.SWAP A 1 1 将累加器的高4位与低4位的内容交换。(A)3-0←(A)7-4
数据转移指令
50.MOV A,Rn 1 1 将寄存器的内容载入累加器
51.MOV A,direct 2 1 将直接地址的内容载入累加器
52.MOV A,@Ri 1 1 将间接地址的内容载入累加器
53.MOV A,#data 2 1 将常数载入累加器
54.MOV Rn,A 1 1 将累加器的内容载入寄存器
55.MOV Rn,direct 2 2 将直接地址的内容载入寄存器
56.MOV Rn,gdata 2 1 将常数载入寄存器
57.MOV direct,A 2 1 将累加器的内容存入直接地址
58.MOV direct,Rn 2 2 将寄存器的内容存入直接地址
59.MOV direct1, direct2 3 2 将直接地址2的内容存入直接地址1
60.MOV direct,@Ri 2 2 将间接地址的内容存入直接地址
61.MOV direct,#data 3 2 将常数存入直接地址
62.MOV @Ri,A 1 1 将累加器的内容存入某间接地址
63.MOV @Ri,direct 2 2 将直接地址的内容存入某间接地址
64.MOV @Ri,#data 2 1 将常数存入某间接地址
65.MOV DPTR,#data16 3 2 将16位的常数存入数据指针寄存器
66.MOVC A,@A+DPTR 1 2 (A) ←((A)+(DPTR))
累加器的值再加数据指针寄存器的值为其所指定地址,将该地址的内容读入累加器
67.MOVC A,@A+PC 1 2 (PC)←(PC)+1;(A)←((A)+(PC))累加器的值加程序计数器的值作为其所指定地址,将该地址的内容读入累加器
68.MOVX A,@Ri 1 2 将间接地址所指定外部存储器的内容读入累加器(8位地址)
69.MOVX A,@DPTR 1 2 将数据指针所指定外部存储器的内容读入累加器(16位地址)
70.MOVX @Ri,A 1 2 将累加器的内容写入间接地址所指定的外部存储器(8位地址)
71.MOVX @DPTR,A 1 2 将累加器的内容写入数据指针所指定的外部存储器(16位地址)
72.PUSH direct 2 2 将直接地址的内容压入堆栈区
73.POP direct 2 2 从堆栈弹出该直接地址的内容
74.XCH A,Rn 1 1 将累加器的内容与寄存器的内容互换
75.XCH A,direct 2 1 将累加器的值与直接地址的内容互换
76.XCH A,@Ri 1 1 将累加器的值与间接地址的内容互换
77.XCHD A,@Ri 1 1 将累加器的低4位与间接地址的低4位互换
布尔代数运算
78.CLR C 1 1 清除进位C为0
79.CLR bit 2 1 清除直接地址的某位为0
80.SETB C 1 1 设定进位C为1
81.SETB bit 2 1 设定直接地址的某位为1
82.CPL C 1 1 将进位C的值反相
83.CPL bit 2 1 将直接地址的某位值反相
84.ANL C,bit 2 2 将进位C与直接地址的某位做AND的逻辑判断,结果存回进位C
85.ANL C,/bit 2 2 将进位C与直接地址的某位的反相值做AND的逻辑判断,结果存回进位C
86.ORL C,bit 2 2 将进位C与直接地址的某位做OR的逻辑判断,结果存回进位C
87.ORL C,/bit 2 2 将进位C与直接地址的某位的反相值做OR的逻辑判断,结果存回进位C
88.MOV C,bit 2 1 将直接地址的某位值存入进位C
89.MOV bit,C 2 2 将进位C的值存入直接地址的某位
90.JC rel 2 2 若进位C=1则跳至rel的相关地址
91.JNC rel 2 2 若进位C=0则跳至rel的相关地址
92.JB bit,rel 3 2 若直接地址的某位为1,则跳至rel的相关地址
93.JNB bit,rel 3 2 若直接地址的某位为0,则跳至rel的相关地址
94.JBC bit,rel 3 2 若直接地址的某位为1,则跳至rel的相关地址,并将该位值清除为0
程序跳跃
95.ACALL addr11 2 2 调用2K程序存储器范围内的子程序
96.LCALL addr16 3 2 调用64K程序存储器范围内的子程序
97.RET 1 2 从子程序返回
98.RETI 1 2 从中断子程序返回
99.AJMP addr11 2 2 绝对跳跃(2K内)
100.LJMP addr16 3 2 长跳跃(64K内)
101.SJMP rel 2 2 短跳跃(2K内)-128~+127字节
102.JMP @A+DPTR 1 2 跳至累加器的内容加数据指针所指的相关地址
103.JZ rel 2 2 累加器的内容为0,则跳至rel所指相关地址
104.JNZ rel 2 2 累加器的内容不为0,则跳至rel所指相关地址
105.CJNE A,direct,rel 3 2 将累加器的内容与直接地址的内容比较,不相等则跳至rel所指的相关地址
106.CJNE A,#data,rel 3 2 将累加器的内容与常数比较,若不相等则跳至rel所指的相关地址
107.CJNE @Rn,#data,rel 3 2 将寄存器的内容与常数比较,若不相等则跳至rel所指的相关地址
108.CJNE @Ri,#data,rel 3 2 将间接地址的内容与常数比较,若不相等则跳至rel所指的相关地址
109.DJNZ Rn,rel 2 2 将寄存器的内容减1,不等于0则跳至rel所指的相关地址
110.DJNZ direct,rel 3 2 将直接地址的内容减1,不等于0则跳至rel所指的相关地址
111.NOP 1 1 无动作
㈡ 单片机的基本指令有哪些
不知道你是问的哪种单片机下面给你的是MCS-51的,希望对你有帮助,如有,麻烦采纳,谢谢 数据传送指令共有29条,数据传送指令一般的操作是把源操作数传送到目的操作数,指令执行完成后,源操作数不变,目的操作数等于源操作数。如果要求在进行数据传送时,目的操作数不丢失,则不能用直接传送指令,而采用交换型的数据传送指令,数据传送指令不影响标志C,AC和OV,但可能会对奇偶标志P有影响。
[1]. 以累加器A为目的操作数类指令(4条)
这4条指令的作用是把源操作数指向的内容送到累加器A。有直接、立即数、寄存器和寄存器间接寻址方式:
MOV A,data ;(data)→(A) 直接单元地址中的内容送到累加器A
MOV A,#data ;#data→(A) 立即数送到累加器A中
MOV A,Rn ;(Rn)→(A) Rn中的内容送到累加器A中
MOV A,@Ri ;((Ri))→(A) Ri内容指向的地址单元中的内容送到累加器A
[2]. 以寄存器Rn为目的操作数的指令(3条)
这3条指令的功能是把源操作数指定的内容送到所选定的工作寄存器Rn中。有直接、立即和寄存器寻址方式:
MOV Rn,data ;(data)→(Rn) 直接寻址单元中的内容送到寄存器Rn中
MOV Rn,#data ;#data→(Rn) 立即数直接送到寄存器Rn中
MOV Rn,A ;(A)→(Rn) 累加器A中的内容送到寄存器Rn中
[3]. 以直接地址为目的操作数的指令(5条)
这组指令的功能是把源操作数指定的内容送到由直接地址data所选定的片内RAM中。有直接、立即、寄存器和寄存器间接4种寻址方式:
MOV data,data ;(data)→(data) 直接地址单元中的内容送到直接地址单元
MOV data,#data ;#data→(data) 立即数送到直接地址单元
MOV data,A ;(A)→(data) 累加器A中的内容送到直接地址单元
MOV data,Rn ;(Rn)→(data) 寄存器Rn中的内容送到直接地址单元
MOV data,@Ri ;((Ri))→(data) 寄存器Ri中的内容指定的地址单元中数据送到直接地址单元
[4]. 以间接地址为目的操作数的指令(3条)
这组指令的功能是把源操作数指定的内容送到以Ri中的内容为地址的片内RAM中。有直接、立即和寄存器3种寻址方式:
MOV @Ri,data ;(data)→((Ri)) 直接地址单元中的内容送到以Ri中的内容为地址的RAM单元
MOV @Ri,#data ;#data→((Ri)) 立即数送到以Ri中的内容为地址的RAM单元
MOV @Ri,A ;(A)→((Ri)) 累加器A中的内容送到以Ri中的内容为地址的RAM单元
[5]. 查表指令(2条)
这组指令的功能是对存放于程序存储器中的数据表格进行查找传送,使用变址寻址方式:
MOVC A,@A+DPTR ;((A))+(DPTR)→(A) 表格地址单元中的内容送到累加器A中
MOVC A,@A+PC ;((PC))+1→(A),((A))+(PC)→(A) 表格地址单元中的内容送到累加器A中
[6]. 累加器A与片外数据存储器RAM传送指令(4条)
这4条指令的作用是累加器A与片外RAM间的数据传送。使用寄存器寻址方式:
MOVX @DPTR,A ;(A)→((DPTR)) 累加器中的内容送到数据指针指向片外RAM地址中
MOVX A, @DPTR ;((DPTR))→(A) 数据指针指向片外RAM地址中的内容送到累加器A中
MOVX A, @Ri ;((Ri))→(A) 寄存器Ri指向片外RAM地址中的内容送到累加器A中
MOVX @Ri,A ;(A)→((Ri)) 累加器中的内容送到寄存器Ri指向片外RAM地址中
[7]. 堆栈操作类指令(2条)
这4类指令的作用是把直接寻址单元的内容传送到堆栈指针SP所指的单元中,以及把SP所指单元的内容送到直接寻址单元中。这类指令只有两条,下述的第一条常称为入栈操作指令,第二条称为出栈操作指令。需要指出的是,单片机开机复位后,(SP)默认为07H,但一般都需要重新赋值,设置新的SP首址。入栈的第一个数据必须存放于SP+1所指存储单元,故实际的堆栈底为SP+1所指的存储单元。
PUSH data ;(SP)+1→(SP),(data)→(SP) 堆栈指针首先加1,直接寻址单元中的数据送到堆栈指针SP所指的单元中
POP data ;(SP)→(data)(SP)-1→(SP), 堆栈指针SP所指的单元数据送到直接寻址单元中,堆栈指针SP再进行减1操作
[8]. 交换指令(5条)
这5条指令的功能是把累加器A中的内容与源操作数所指的数据相互交换。
XCH A,Rn ;(A)←→(Rn)累加器与工作寄存器Rn中的内容互换
XCH A,@Ri ;(A)←→((Ri))累加器与工作寄存器Ri所指的存储单元中的内容互换
XCH A,data ;(A)←→(data)累加器与直接地址单元中的内容互换
XCHD A,@Ri ;(A 3-0 )←→((Ri) 3-0 )累加器与工作寄存器Ri所指的存储单元中的内容低半字节互换
SWAP A ;(A 3-0 )←→(A 7-4 )累加器中的内容高低半字节互换
[9]. 16位数据传送指令(1条)
这条指令的功能是把16位常数送入数据指针寄存器。
MOV DPTR,#data16 ;#dataH→(DPH),#dataL→(DPL)16位常数的高8位送到DPH,低8位送到DPL
MCS-51算术运算指令
算术运算指令共有24条,算术运算主要是执行加、减、乘、除法四则运算。另外MCS-51指令系统中有相当一部分是进行加、减1操作,BCD码的运算和调整,我们都归类为运算指令。虽然MCS-51单片机的算术逻辑单元ALU仅能对8位无符号整数进行运算,但利用进位标志C,则可进行多字节无符号整数的运算。同时利用溢出标志,还可以对带符号数进行补码运算。需要指出的是,除加、减1指令外,这类指令大多数都会对PSW(程序状态字)有影响。这在使用中应特别注意。
[1]. 加法指令(4条)
这4条指令的作用是把立即数,直接地址、工作寄存器及间接地址内容与累加器A的内容相加,运算结果存在A中。
ADD A,#data ;(A)+#data→(A) 累加器A中的内容与立即数#data相加,结果存在A中
ADD A,data ;(A)+(data)→(A) 累加器A中的内容与直接地址单元中的内容相加,结果存在A中
ADD A,Rn ;(A)+(Rn)→(A) 累加器A中的内容与工作寄存器Rn中的内容相加,结果存在A中
ADD A,@Ri ;(A)+((Ri))→(A) 累加器A中的内容与工作寄存器Ri所指向地址单元中的内容相加,结果存在A中
[2]. 带进位加法指令(4条)
这4条指令除与[1]功能相同外,在进行加法运算时还需考虑进位问题。
ADDC A,data ;(A)+(data)+(C)→(A) 累加器A中的内容与直接地址单元的内容连同进位位相加,结果存在A中
ADDC A,#data ;(A)+#data +(C)→(A) 累加器A中的内容与立即数连同进位位相加,结果存在A中
ADDC A,Rn ;(A)+Rn+(C)→(A) 累加器A中的内容与工作寄存器Rn中的内容、连同进位位相加,结果存在A中
ADDC A,@Ri ;(A)+((Ri))+(C)→(A) 累加器A中的内容与工作寄存器Ri指向地址单元中的内容、连同进位位相加,结果存在A中
[3]. 带借位减法指令(4条)
这组指令包含立即数、直接地址、间接地址及工作寄存器与累加器A连同借位位C内容相减,结果送回累加器A中。
这里我们对借位位C的状态作出说明,在进行减法运算中,CY=1表示有借位,CY=0则无借位。OV=1声明带符号数相减时,从一个正数减去一个负数结果为负数,或者从一个负数中减去一个正数结果为正数的错误情况。在进行减法运算前,如果不知道借位标志位C的状态,则应先对CY进行清零操作。
SUBB A,data ;(A)-(data) - (C)→(A) 累加器A中的内容与直接地址单元中的内容、连同借位位相减,结果存在A中
SUBB A,#data ;(A)-#data -(C)→(A) 累加器A中的内容与立即数、连同借位位相减,结果存在A中
SUBB A,Rn ;(A)-(Rn) -(C)→(A) 累加器A中的内容与工作寄存器中的内容、连同借位位相减,结果存在A中
SUBB A,@Ri ;(A)-((Ri)) -(C)→(A) 累加器A中的内容与工作寄存器Ri指向的地址单元中的内容、连同借位位相减,结果存在A中
[4]. 乘法指令(1条)
这个指令的作用是把累加器A和寄存器B中的8位无符号数相乘,所得到的是16位乘积,这个结果低8位存在累加器A,而高8位存在寄存器B中。如果OV=1,说明乘积大于FFH,否则OV=0,但进位标志位CY总是等于0。
MUL AB ;(A)×(B)→(A)和(B) 累加器A中的内容与寄存器B中的内容相乘,结果存在A、B中
[5]. 除法指令(1条)
这个指令的作用是把累加器A的8位无符号整数除以寄存器B中的8位无符号整数,所得到的商存在累加器A,而余数存在寄存器B中。除法运算总是使OV和进位标志位CY等于0。如果OV=1,表明寄存器B中的内容为00H,那么执行结果为不确定值,表示除法有溢出。
DIV AB ;(A)÷(B)→(A)和(B) 累加器A中的内容除以寄存器B中的内容,所得到的商存在累加器A,而余数存在寄存器B中。
[6]. 加1指令(5条)
这5条指令的的功能均为原寄存器的内容加1,结果送回原寄存器。上述提到,加1指令不会对任何标志有影响,如果原寄存器的内容为FFH,执行加1后,结果就会是00H。这组指令共有直接、寄存器、寄存器减间址等寻址方式:
INC A ;(A)+1→(A) 累加器A中的内容加1,结果存在A中
INC data ;(data)+1→(data) 直接地址单元中的内容加1,结果送回原地址单元中
INC @Ri ;((Ri))+1→((Ri)) 寄存器的内容指向的地址单元中的内容加1,结果送回原地址单元中
INC Rn ;(Rn)+1→(Rn)寄存器Rn的内容加1,结果送回原地址单元中
INC DPTR ;(DPTR)+1→(DPTR)数据指针的内容加1,结果送回数据指针中
在INC data这条指令中,如果直接地址是I/O,其功能是先读入I/O锁存器的内容,然后在CPU进行加1操作,再输出到I/O上,这就是“读—修改—写”操作。
[7]. 减1指令(4条)
这组指令的作用是把所指的寄存器内容减1,结果送回原寄存器,若原寄存器的内容为00H,减1后即为FFH,运算结果不影响任何标志位,这组指令共有直接、寄存器、寄存器间址等寻址方式,当直接地址是I/O口锁存器时,“读—修改—写”操作与加1指令类似。
DEC A ;(A)-1→(A)累加器A中的内容减1,结果送回累加器A中
DEC data ;(data)-1→(data)直接地址单元中的内容减1,结果送回直接地址单元中
DEC @Ri ;((Ri))-1→((Ri))寄存器Ri指向的地址单元中的内容减1,结果送回原地址单元中
DEC Rn ;(Rn)-1→(Rn)寄存器Rn中的内容减1,结果送回寄存器Rn中
[8]. 十进制调整指令(1条)
在进行BCD码运算时,这条指令总是跟在ADD或ADDC指令之后,其功能是将执行加法运算后存于累加器A中的结果进行调整和修正。
DA A
MCS-51逻辑运算及移位指令
逻辑运算和移位指令共有25条,有与、或、异或、求反、左右移位、清0等逻辑操作,有直接、寄存器和寄存器间址等寻址方式。这类指令一般不影响程序状态字(PSW)标志。
[1]. 循环移位指令(4条)
这4条指令的作用是将累加器中的内容循环左或右移一位,后两条指令是连同进位位CY一起移位。
RL A ;累加器A中的内容左移一位
RR A ;累加器A中的内容右移一位
RLC A ;累加器A中的内容连同进位位CY左移一位
RRC A ;累加器A中的内容连同进位位CY右移一位
[2]. 累加器半字节交换指令(1条)
这条指令是将累加器中的内容高低半字节互换,这在上一节中内容已有介绍。
SWAP A ; 累加器中的内容高低半字节互换
[3]. 求反指令(1条)
这条指令将累加器中的内容按位取反。
CPL A ; 累加器中的内容按位取反
[4]. 清零指令(1条)
这条指令将累加器中的内容清0。
CLR A ; 0→(A),累加器中的内容清0
[5]. 逻辑与操作指令(6条)
这组指令的作用是将两个单元中的内容执行逻辑与操作。如果直接地址是I/O地址,则为“读—修改—写”操作。
ANL A,data ;累加器A中的内容和直接地址单元中的内容执行与逻辑操作。结果存在寄存器A中。
ANL data,#data ;直接地址单元中的内容和立即数执行与逻辑操作。结果存在直接地址单元中。
ANL A,#data ;累加器A的内容和立即数执行与逻辑操作。结果存在累加器A中。
ANL A,Rn ;累加器A的内容和寄存器Rn中的内容执行与逻辑操作。结果存在累加器A中。
ANL data,A ;直接地址单元中的内容和累加器A的内容执行与逻辑操作。结果存在直接地址单元中。
ANL A,@Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行与逻辑操作。结果存在累加器A中。
[6]. 逻辑或操作指令(6条)
这组指令的作用是将两个单元中的内容执行逻辑或操作。如果直接地址是I/O地址,则为“读—修改—写”操作。
ORL A,data ;累加器A中的内容和直接地址单元中的内容执行逻辑或操作。结果存在寄存器A中。
ORL data,#data ;直接地址单元中的内容和立即数执行逻辑或操作。结果存在直接地址单元中。
ORL A,#data ;累加器A的内容和立即数执行逻辑或操作。结果存在累加器A中。
ORL A,Rn ;累加器A的内容和寄存器Rn中的内容执行逻辑或操作。结果存在累加器A中。
ORL data,A ;直接地址单元中的内容和累加器A的内容执行逻辑或操作。结果存在直接地址单元中。
ORL A,@Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑或操作。结果存在累加器A中。
[7]. 逻辑异或操作指令(6条)
这组指令的作用是将两个单元中的内容执行逻辑异或操作。如果直接地址是I/O地址,则为“读—修改—写”操作。
XRL A,data ;累加器A中的内容和直接地址单元中的内容执行逻辑异或操作。结果存在寄存器A中。
XRL data,#data ;直接地址单元中的内容和立即数执行逻辑异或操作。结果存在直接地址单元中。
XRL A,#data ;累加器A的内容和立即数执行逻辑异或操作。结果存在累加器A中。
XRL A,Rn ;累加器A的内容和寄存器Rn中的内容执行逻辑异或操作。结果存在累加器A中。
XRL data,A ;直接地址单元中的内容和累加器A的内容执行逻辑异或操作。结果存在直接地址单元中。
XRL A,@Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑异或操作。结果存在累加器A中。
MCS-51控制转移指令
控制转移指令用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机的控制转移指令相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对转移指令,还有在一页范围内短相对转移及其它无条件转移指令,这些指令的执行一般都不会对标志位有影响。
[1]. 无条件转移指令(4条)
这组指令执行完后,程序就会无条件转移到指令所指向的地址上去。长转移指令访问的程序存储器空间为16地址64kB,绝对转移指令访问的程序存储器空间为11位地址2kB空间。
LJMP addr16 ;addr16→(PC),给程序计数器赋予新值(16位地址)
AJMP addr11 ;(PC)+2→(PC),addr11→(PC 10-0 )程序计数器赋予新值(11位地址),(PC 15-11 )不改变
SJMP rel ;(PC)+ 2 + rel→(PC)当前程序计数器先加上2再加上偏移量给程序计数器赋予新值
JMP @A+DPTR ;(A)+ (DPTR)→(PC),累加器所指向地址单元的值加上数据指针的值给程序计数器赋予新值
[2]. 条件转移指令(8条)
程序可利用这组丰富的指令根据当前的条件进行判断,看是否满足某种特定的条件,从而控制程序的转向。
JZ rel ; A=0,(PC)+ 2 + rel→(PC),累加器中的内容为0,则转移到偏移量所指向的地址,否则程序往下执行
JNZ rel ; A≠0,(PC)+ 2 + rel→(PC),累加器中的内容不为0,则转移到偏移量所指向的地址,否则程序往下执行
CJNE A, data, rel ; A≠(data),(PC)+ 3 + rel→(PC),累加器中的内容不等于直接地址单元的内容,则转移到偏移量所指向的地址,否则程序往下执行
CJNE A, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),累加器中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行
CJNE Rn, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Rn中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行
CJNE @Ri, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Ri指向地址单元中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行
DJNZ Rn, rel ; (Rn)-1→(Rn),(Rn)≠0,(PC)+ 2 + rel→(PC)工作寄存器Rn减1不等于0,则转移到偏移量所指向的地址,否则程序往下执行
DJNZ data, rel ; (Rn)-1→(Rn),(Rn)≠0,(PC)+ 2 + rel→(PC)直接地址单元中的内容减1不等于0,则转移到偏移量所指向的地址,否则程序往下执行
[3]. 子程序调用指令(1条)
子程序是为了便于程序编写,减少那些需反复执行的程序占用多余的地址空间而引入的程序分支,从而有了主程序和子程序的概念,需要反复执行的一些程序,我们在编程时一般都把它们编写成子程序,当需要用它们时,就用一个调用命令使程序按调用的地址去执行,这就需要子程序的调用指令和返回指令。
LCALL addr16 ; 长调用指令,可在64kB空间调用子程序。此时(PC)+ 3→(PC),(SP)+ 1→(SP),(PC 7-0 )→(SP),(SP)+ 1→(SP),(PC 15-8 )→(SP),addr16→(PC),即分别从堆栈中弹出调用子程序时压入的返回地址
ACALL addr11 ; 绝对调用指令,可在2kB空间调用子程序,此时(PC)+ 2→(PC),(SP)+ 1→(SP),(PC 7-0 )→(SP),(SP)+ 1→(SP),(PC 15-8 )→(SP),addr11→(PC 10-0 )
RET ; 子程序返回指令。此时(SP)→(PC 15-8 ),(SP)- 1→(SP),(SP)→(PC 7-0 ),(SP)- 1→(SP)
RETI ; 中断返回指令,除具有RET功能外,还具有恢复中断逻辑的功能,需注意的是,RETI指令不能用RET代替
[4]. 空操作指令(1条)
这条指令将累加器中的内容清0。
NOP ; 这条指令除了使PC加1,消耗一个机器周期外,没有执行任何操作。可用于短时间的延时
MCS-51布尔变量操作指令
布尔处理功能是MCS-51系列单片机的一个重要特征,这是出于实际应用需要而设置的。布尔变量也即开关变量,它是以位(bit)为单位进行操作的。
在物理结构上,MCS-51单片机有一个布尔处理机,它以进位标志做为累加位,以内部RAM可寻址的128个为存储位。
既然有布尔处理机功能,所以也就有相应的布尔操作指令集,下面我们分别谈论。
[1]. 位传送指令(2条)
位传送指令就是可寻址位与累加位CY之间的传送,指令有两条。
MOV C,bit ;bit→CY,某位数据送CY
MOV bit,C ;CY→bit,CY数据送某位
[2]. 位置位复位指令(4条)
这些指令对CY及可寻址位进行置位或复位操作,共有四条指令。
CLR C ; 0→CY,清CY
CLR bit ; 0→bit,清某一位
SETB C ; 1→CY,置位CY
SETB bit ; 1→bit,置位某一位
[3]. 位运算指令(6条)
位运算都是逻辑运算,有与、或、非三种指令,共六条。
ANL C,bit ;(CY)∧(bit)→CY
ANL C,/bit ;(CY)∧( )→CY
ORL C,bit ;(CY)∨(bit)→CY
ORL C,/bit ;(CY)∧( )→CY
CPL C ;( )→CY
CPL bit ;( )→bir
[4]. 位控制转移指令(5)
位控制转移指令是以位的状态作为实现程序转移的判断条件,介绍如下:
JC rel ; (CY)=1转移,(PC)+2+rel→PC,否则程序往下执行,(PC)+2→PC。
JNC rel ; (CY)=0转移,(PC)+2+rel→PC,否则程序往下执行,(PC)+2→PC。
JB bit, rel ; 位状态为1转移。
JNB bit, rel ; 位状态为0转移。
JBC bit, rel ; 位状态为1转移,并使该位清“0”。
后三条指令都是三字节指令,如果条件满足,(PC)+3+rel→PC,否则程序往下执行,(PC)+3→PC
㈢ 单片机查表指令MOVC A @A+DPTR
51单片机的指令系统中,是没有MOVC
A,@R0+DPTR的,查表指令只有两条:
1、MOVC
A,@A+DPTR
2、MOVC
A,@A+PC
㈣ STC单片机指令表
上边这几条指令好像STC单片机里边都没有,你到宏晶官方网站上去下载随便一个单片机的数据手册,里边就包含了所有的汇编指令了。
㈤ 51单片机的所有指令
单片机指令功能一览表
助记符 代码 说明
MOV A,Rn E8~EF 寄存器A
MOV A,direct E5 dircet 直接字节送A
MOV A,@Ri ER~E7 间接RAM送A
MOV A,#data 74 data 立即数送A
MOV Rn,A F8~FF A送寄存器
MOV Rn,dircet A8~AF dircet 直接字节送寄存器
MOV Rn,#data 78~7F data 立即数送寄存器
MOV dircet,A F5 dircet A送直接字节
MOV dircet,Rn 88~8F dircet 寄存器送直接字节
MOV dircet1,dircet2 85 dircet1 dircet2 直接字节送直接字节
MOV dircet,@Ro 86~87 间接RAM送直接字节
MOV dircet,#data 75 dircet data 立即数送直接字节
MOV @Ri,A F6~F7 A送间接RAM
MOV @Ri,#data 76~77 data 直接字节送间接RAM
MOV @Ri,#data 76~77 data 立即数送间接RAM
MOV DPTR,#data16 90 data 15~8 16位常数送数据指针
data7~0
MOVC A,@A+DPTR 93 由((A)+(DPTR))寻址的程序存贮
器字节选A
MOVC A,@A+PC 83 由((A)+(PC));寻址的程序存贮器字节送A
MOVX A,@Ri E2~E3 送外部数据(8位地址)送A
MOVX A,@DPTR E0 送外部数据(16位地址)送A
MOVX @Ri,A F2~F3 A送外部数据(8位地址)
MOVX @DPTR,A F0 A送外部数据(16位地址)
PUSH dircet C0 dircet 直接字节进栈,SP加1
POP dircet D0 dircet 直接字节退栈,SP减1
XCH A,Rn C8~CF 交换A和寄存器
XCH A,dircet C5 dircet 交换A和直接字节
XCH A,@Ri C6~C7 交换A和间接RAM
XCH A,@Ri D6~D7 交换A和间接RAM的低位
SWAP A C4
算术操作 (A的二个半字节交换)
ADD A,Rn 28~2F 寄存器加到A
ADD A,dircet 25 dircet 直接字节加到A
ADD A,@Ri 26~27 间接RAM加到A
ADD A,#data 24data 立即数加到A
ADD A,Rn 38~3F 寄存器和进位位加到A
ADD A,dircet 35dircet 直接字节和进位位加到A
ADD A,@Ri 36~37 间接字节和进位位加到A
ADD A,data 34 data 立即数和进位位加到A
ADD A,Rn 98~9F A减去寄存器和进位位
ADD A,dircet 95 dircet A减去直接字节和进位位
ADD A,@Ri 36~37 间接RAM和进位位加到A
ADD A,data 34 data 立即数和进位位加到A
SUBB A,Rn 98~9F A减去寄存器和进位位
SUBB A,dircet 95 dircet A减去直接字节和进位位
SUBB A,@Ri 96~97 A减去间接RAM和进位位
SUBB A,#data 94 data A减去立即数和进位位
INC A 04 A加1
INC Rn 08~0F 寄存器加1
INC dircet 05 dircet 直接字节加1
INC @Ri 06~07 间接RAM加1
DEC A 14 A减1
DEC Rn 18~1F 寄存器减1
DEC dircet 15 dircet 直接字节减1
DEC @Ri 16~17 间接RAM减1
INC DPTR A3 数据指针加1
MUL AB A4 A乘以B
DIV AB 84 A除以B
DA A D4 A的十进制加法调整
逻辑操作
ANL A,Rn 58~5F 寄存器“与”到A
ANL A,dircet 55 dircet 直接字节“与”到A
ANL A,@Ri 56~57 间接RAm“与”到A
ANL A,#data 54 data 立即数“与”到A
ANL dircet A 52 dircet A“与”到直接字节
ANL dircet,#data 53 dircet data 立即数“与”到直接字节
ORL A,Rn 48~4F 寄存器“或”到A
ORL A,dircet 45 dircet 直接字节“或”到A
ORL A,@Ri 46~47 间接RAM“或”到A
ORL A,#data 44 data 立即数“或”到A
ORL dircet,A 42 dircet A“或”到直接字节
ORL dircet,#data 43 dircet data 立即数“或”到直接字节
XRL A,Rn 68~6F 寄存器“异或”到A
XRL A,dircet 65 dircet 直接字节“异或”到A
XRL A,@Ri 66~67 间接RAM“异或”到A
XRL A,#data 64 data 立即数“异或”到A
XRL dircet A 62 dircet A“异或”到直接字节
XRL dircet,#data 63 dircet data 立即数“异或”到直接字节
CLR A E4 清零
CPL A F4 A取反
RL A 23 A左环移
RLC A 33 A通过进位左环移
RR A 03 A右环移
RRC A 13 A通过进位右环移
控制程序转移
ACALL addr 11 *1 addr(a7~a0) 绝对子程序调用
LCALL addr 16 12 addr(15~8) 长子程序调用
addr(7~0)
RET 22 子程序调用返回
RETI addr 11 32 中断调用返回
AJMP addr 11 △1 addr(a7~a6) 绝对转移
LJMP addr 16 02addr(15~8) 长转移
addr(7~0)
SJMP rel 80 rel 短转移,相对转移
JMP @A+DPTR 73 相对于DPTR间接转移
JZ rel 60 rel A为零转移
JNZ rel 70 rel A为零转移
CJNE A,dircet,rel B5 dircet rel 直接字节与A比较,不等则转移
CJNE A,#data,rel B4 data rel 立即数与A比较,不等则转移
CJNE A,Rn,#data,rel B8~BF data rel 立即数与寄存器比较,不等则转移
CJNE @Ri,#data,rel B6~B7 data rel 立即数与间接RAM比较,不等则转移
DJNZ Rn,rel D8~DF rel 寄存器减1,不为零则转移
DJNZ dircet,rel B5 dircet rel 直接字节减1,不为零则转移
NOP 00 空操作
*=a10a9a8l
△=a10a9a80
布尔变量操作
CLR C C3 清零进位
CLR bit C2 清零直接位
SETB C D3 置位进位
SETB bit D2 置位直接位
CPL C B3 进位取反
CPL bit B2 直接位取反
ANL C,bit 82 dit 直接数“与”到进位
ANL C,/bit B0 直接位的反“与”到进位
ORL C,bit 72 bit 直接位“或”到进位
ORL C,/bit A0 bit 直接位的反“或”到进位
MOV C,bit A2 bit 直接位送进位
MOV bit,C 92 bit 进位送直接位
JC rel 40 rel 进位位为1转移
JNC rel 50 rel 进位位为0转移
JB bit,rel 20 bit rel 直接位为1相对转移
JNB bit,rel 30 bit rel 直接位为0相对转移
JBC bit,rel 10 bit rel 直接位为1相对转移,然后清零该位
[1]. 循环移位指令(4条)
RL A ;累加器A中的内容左移一位
RR A ;累加器A中的内容右移一位
RLC A ;累加器A中的内容连同进位位CY左移一位
RRC A ;累加器A中的内容连同进位位CY右移一位
[2]. 累加器半字节交换指令(1条)
SWAP A ; 累加器中的内容高低半字节互换
[3]. 求反指令(1条)
CPL A ; 累加器中的内容按位取反
[4]. 清零指令(1条)
CLR A ; 0→(A),累加器中的内容清0
[5]. 逻辑与操作指令(6条)
ANL A,data ;累加器A中的内容和直接地址单元中的内容执行与逻辑操作。结果存在寄存器A中。
ANL data,#data ;直接地址单元中的内容和立即数执行与逻辑操作。结果存在直接地址单元中。
ANL A,#data ;累加器A的内容和立即数执行与逻辑操作。结果存在累加器A中。
ANL A,Rn ;累加器A的内容和寄存器Rn中的内容执行与逻辑操作。结果存在累加器A中。
ANL data,A ;直接地址单元中的内容和累加器A的内容执行与逻辑操作。结果存在直接地址单元中。
ANL A,@Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行与逻辑操作。结果存在累加器A中。
[6]. 逻辑或操作指令(6条)
这组指令的作用是将两个单元中的内容执行逻辑或操作。如果直接地址是I/O地址,则为“读—修改—写”操作。
ORL A,data ;累加器A中的内容和直接地址单元中的内容执行逻辑或操作。结果存在寄存器A中。
ORL data,#data ;直接地址单元中的内容和立即数执行逻辑或操作。结果存在直接地址单元中。
ORL A,#data ;累加器A的内容和立即数执行逻辑或操作。结果存在累加器A中。
ORL A,Rn ;累加器A的内容和寄存器Rn中的内容执行逻辑或操作。结果存在累加器A中。
ORL data,A ;直接地址单元中的内容和累加器A的内容执行逻辑或操作。结果存在直接地址单元中。
ORL A,@Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑或操作。结果存在累加器A中。
[7]. 逻辑异或操作指令(6条)
XRL A,data ;累加器A中的内容和直接地址单元中的内容执行逻辑异或操作。结果存在寄存器A中。
XRL data,#data ;直接地址单元中的内容和立即数执行逻辑异或操作。结果存在直接地址单元中。
XRL A,#data ;累加器A的内容和立即数执行逻辑异或操作。结果存在累加器A中。
XRL A,Rn ;累加器A的内容和寄存器Rn中的内容执行逻辑异或操作。结果存在累加器A中。
XRL data,A ;直接地址单元中的内容和累加器A的内容执行逻辑异或操作。结果存在直接地址单元中。
XRL A,@Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑异或操作。结果存在累加器A中
控制转移类指令分析
[1]. 无条件转移指令(4条)
LJMP addr16 ;addr16→(PC),给程序计数器赋予新值(16位地址)
AJMP addr11 ;(PC)+2→(PC),addr11→(PC10-0)程序计数器赋予新值(11位地址),(PC15-11)不改变
SJMP rel ;(PC)+ 2 + rel→(PC)当前程序计数器先加上2再加上偏移量给程序计数器赋予新值
JMP @A+DPTR ;(A)+ (DPTR)→(PC),累加器所指向地址单元的值加上数据指针的值给程序计数器赋予新值
[2]. 条件转移指令(8条)
JZ rel ; A=0,(PC)+ 2 + rel→(PC),累加器中的内容为0,则转移到偏移量所指向的地址,否则程序往下执行
JNZ rel ; A≠0,(PC)+ 2 + rel→(PC),累加器中的内容不为0,则转移到偏移量所指向的地址,否则程序往下执行
CJNE A, data, rel ; A≠(data),(PC)+ 3 + rel→(PC),累加器中的内容不等于直接地址单元的内容,则转移到偏移量所指向的地址,否则程序往下执行
CJNE A, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),累加器中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行
CJNE Rn, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Rn中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行
CJNE @Ri, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Ri指向地址单元中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行
布尔变量操作指令分析
[1]. 位传送指令(2条)
MOV C,bit ;bit→CY,某位数据送CY
MOV bit,C ;CY→bit,CY数据送某位
[2]. 位置位复位指令(4条)
CLR C ; 0→CY,清CY
CLR bit ; 0→bit,清某一位
SETB C ; 1→CY,置位CY
SETB bit ; 1→bit,置位某一位
[3]. 位运算指令(6条)
ANL C,bit ;(CY)∧(bit)→CY
ANL C,/bit ;(CY)∧( )→CY
ORL C,bit ;(CY)∨(bit)→CY
ORL C,/bit ;(CY)∧()→CY
CPL C ;()→CY
CPL bit ;()→bir
[4]. 位控制转移指令(5)
JC rel ; (CY)=1转移,(PC)+2+rel→PC,否则程序往下执行,(PC)+2→PC。
JNC rel ; (CY)=0转移,(PC)+2+rel→PC,否则程序往下执行,(PC)+2→PC。
JB bit, rel ; 位状态为1转移。
JNB bit, rel ; 位状态为0转移。
JBC bit, rel ; 位状态为1转移,并使该位清“0”。
㈥ 单片机查表指令movc什么意思
MOVC指令意思是表示程序存储器里的内容和别的存储单元进行传送的,主要是用在累加器A和程序存储器的数据传送。
单片机的操作语言使用的是汇编语言,是一种用于电子计算机、微处理器、微控制器或其它可编程器件的低级语言。
包括通用数据传送指令MOV、条件传送指令CMOVcc、堆栈操作指令PUSH/PUSHA/PUSHAD/POP/POPA/POPAD、交换指令XCHG/XLAT/BSWAP、地址或段描述符选择子传送指令LEA/LDS/LES/LFS/LGS/LSS等。
(6)单片机指令表扩展阅读
测试指令BT、位测试并置位指令BTS、位测试并复位指令BTR、位测试并取反指令BTC、位向前扫描指令BSF、位向后扫描指令BSR等。
加法指令ADD/ADC、减法指令SUB/SBB、加一指令INC、减一指令DEC、比较操作指令CMP、乘法指令MUL/IMUL、除法指令DIV/IDIV、符号扩展指令CBW/CWDE/CDQE、十进制调整指令DAA/DAS/AAA/AAS、逻辑运算指令NOT/AND/OR/XOR/TEST等。
无条件转移指令JMP、条件转移指令Jcc/JCXZ、循环指令LOOP/LOOPE/LOOPNE、过程调用指令CALL、子过程返回指令RET、中断指令INTn、INT3、INTO、IRET等。
㈦ 单片机所有指令的英文全称
MCS-51使用汇编语言指
令,它共有44个操作码助记符,33种功能,
其操作数有#data、direct、Rn、@Ri等。这里先介绍指令助记符及其相关符号的记忆方
法。
一、助记符号的记忆方法
1�表格列举法
把44个指令助记符按功能分为五类,每类列表记忆。此处从略,请读者自己总结。
2�英文还原法
单片机的操作码助记符是该指令功能的英文缩写,将缩写还原成英语原文,再对照汉
语有助于理解其助记符含义,从而加强记忆。例如:
增量 INC-Incremect 减量 DNC-Decrement
短转移 SJMP-Short jump 长转移 LJMP-Long jump
比较转移 CJNE-Compare jump not equality
绝对转移 AJMP-Absolute jump 空操作 NOP-No operation
交换 XCH-Exchange 加法 ADD-Addition
乘法 MUL-Multiplication 除法 DIV-Division
左环移 RL-Rotate left 进位左环移 RLC-Rotate
left carry
右环移 RR-Rotate right 进位右环移RRC-Rotate
right carry
3�功能模块记忆法
单片机的44个指令助记符,按所属指令功能可分为五大类,每类又可以按功能相似原
则为2~3组。这样,化整为零,各个击破,实现快速记忆。
1)数据传送组。 2)加减运算组
MOV 内部数据传送 ADD 加法
MOVC 程序存储器传送 ADDC 带进位加法
MOVX 外部数据传送 SUBB 带进位减法
3)逻辑运算组。 4)子程序调用组。
ANL 逻辑与 LCALL 长调用
ORL 逻辑或 ALALL 绝对调用
XRL 逻辑异或 RET 子程序返回
二、指令的记忆方法
1�指令操作数的有关符号
MCS-51的寻址方式共有六种:立即数寻址、直接寻址、寄存器寻址、寄存器间址、变
址寻址、相对寻址。我们必须掌握其表示的方法。
1)立即数与直接地址。ata表示八位立即数,#data16表示是十六位立即数,data或
direct表示直接地址。
2)Rn(n=0-7)、A、B、CY、DPTR寄存器寻址变量。
3)@R0、@R1、@DPTR、SP表示寄存器间址变量。
4)DPTR+A、PC+A表示变址寻址的变量。
5)PC+rel(相对量)表示相对寻址变量。
记住指令的助记符,掌握不同寻址方式的指令操作数的表示方法,为我们记忆汇编指
令打下了基础。MCS-51指令虽多,但按功能可分为五类,
其中数据传送类28条,算术运算类24条,逻辑操作类25条,控制转移类17条,布尔位操作
类17条。在每类指令里,根据其功能,抓住其源、
目的操作数的不同组合,再辅之以下方法,是完全能记住的。
我们约定,可能的目的操作数按(#data/direct/A/Rn/@Ri)顺序表示。
对于MOV指令,其目的操作数按A、Rn、direct、@Ri的顺序书写,则可以记住MOV的15
条指令。例如以累加器A为目的操作数,可写出如下4条指令。
MOV A,#data/direct/A/Rn/@Ri
以此类推,写出其它指令。
MOV Rn,#data/direct/A
MOV direct,#data/direct/A/Rn/@Ri
MOV @Ri,#data/direct/A
2�指令图示记忆法
图示记忆法是把操作功能相同或相似、但其操作数不同的指令,用图形和箭头将目
的、源操作数的关系表示出来的一种记忆方法。
例如:由助记符MOV、MOVX、MOVC组成的送数组指令,可以用图1、2帮助记忆。
由助记符CJNE形成的四条指令,也可以用图示法表示,如图3。
CJNE A,#data,rel CJNE A,direct,rel
CJNE @Rn,#data,rel CJNE @Ri,#data,rel
另外,对于由(ANL、ORL、ARL)形成的18条逻辑操作指令,有关A的四条环移指令,
也可以用图示法表示,请读者自行画出记忆。
3�相似功能归类法
在MCS-51指令中,我们发现部分指令其操作码不同,但功能相似,而操作数则完全一
样。相似功能归类法就是把具有这样特点的指令放在一起记忆,
只要记住其中的一条,其余的也就记住了。如加、减法的十二条指令,与、或、非的十八
条指令,现列举如下。
ADD/ADDC/SUBB A,#data/direct/Rn/@Ri
ANL/ORL/XRL A,#data/direct/Rn/@Ri
ANL/ORL/XRL direct,#data/a
上述每一排指令,功能相似,其操作数都相同。其它的如加1(INC)、减1(DEC)指令也
可照此办理。
4�口诀记忆法
对于有些指令,我们可以把相关的功能用精练的语言编成一句话来记忆。如PUSH
direct和POP direct这两条指令。
初学者常常分不清堆栈SP的变化情况,为此编成这样一句话:(SP的内容)加1(direct的内
容)再入栈,(SP的内容)弹出(到direct单元)SP才减1。
又如乘法指令中积的存放,除法指令中被除数和除数以及商的存放,都可以编成口诀记忆
如下。
MUL AB 高位积(存于)B,低位积(存于)A。
DIV AB A除以B,商(存于)A余(下)B。
上面介绍了几种快速记忆单片机指令的方法,希望能起到抛砖引玉的作用,相信读者
在学习单片机的过程中能找到适合自己的方法来记忆。
但是,有了好的方法还不够,还需要实践,即多读书上的例题和别人编写的程序,自己再
结合实际编写一些程序。只有这样,
才能更好更快地掌握单片机指令系统。
㈧ 单片机指令
单片机指令功能一览表
助记符 代码 说明
MOV A,Rn E8~EF 寄存器A
MOV A,direct E5 dircet 直接字节送A
MOV A,@Ri ER~E7 间接RAM送A
MOV A,#data 74 data 立即数送A
MOV Rn,A F8~FF A送寄存器
MOV Rn,dircet A8~AF dircet 直接字节送寄存器
MOV Rn,#data 78~7F data 立即数送寄存器
MOV dircet,A F5 dircet A送直接字节
MOV dircet,Rn 88~8F dircet 寄存器送直接字节
MOV dircet1,dircet2 85 dircet1 dircet2 直接字节送直接字节
MOV dircet,@Ro 86~87 间接RAM送直接字节
MOV dircet,#data 75 dircet data 立即数送直接字节
MOV @Ri,A F6~F7 A送间接RAM
MOV @Ri,#data 76~77 data 直接字节送间接RAM
MOV @Ri,#data 76~77 data 立即数送间接RAM
MOV DPTR,#data16 90 data 15~8 16位常数送数据指针
data7~0
MOVC A,@A+DPTR 93 由((A)+(DPTR))寻址的程序存贮
器字节选A
MOVC A,@A+PC 83 由((A)+(PC));寻址的程序存贮器字节送A
MOVX A,@Ri E2~E3 送外部数据(8位地址)送A
MOVX A,@DPTR E0 送外部数据(16位地址)送A
MOVX @Ri,A F2~F3 A送外部数据(8位地址)
MOVX @DPTR,A F0 A送外部数据(16位地址)
PUSH dircet C0 dircet 直接字节进栈,SP加1
POP dircet D0 dircet 直接字节退栈,SP减1
XCH A,Rn C8~CF 交换A和寄存器
XCH A,dircet C5 dircet 交换A和直接字节
XCH A,@Ri C6~C7 交换A和间接RAM
XCH A,@Ri D6~D7 交换A和间接RAM的低位
SWAP A C4
算术操作 (A的二个半字节交换)
ADD A,Rn 28~2F 寄存器加到A
ADD A,dircet 25 dircet 直接字节加到A
ADD A,@Ri 26~27 间接RAM加到A
ADD A,#data 24data 立即数加到A
ADD A,Rn 38~3F 寄存器和进位位加到A
ADD A,dircet 35dircet 直接字节和进位位加到A
ADD A,@Ri 36~37 间接字节和进位位加到A
ADD A,data 34 data 立即数和进位位加到A
ADD A,Rn 98~9F A减去寄存器和进位位
ADD A,dircet 95 dircet A减去直接字节和进位位
ADD A,@Ri 36~37 间接RAM和进位位加到A
ADD A,data 34 data 立即数和进位位加到A
SUBB A,Rn 98~9F A减去寄存器和进位位
SUBB A,dircet 95 dircet A减去直接字节和进位位
SUBB A,@Ri 96~97 A减去间接RAM和进位位
SUBB A,#data 94 data A减去立即数和进位位
INC A 04 A加1
INC Rn 08~0F 寄存器加1
INC dircet 05 dircet 直接字节加1
INC @Ri 06~07 间接RAM加1
DEC A 14 A减1
DEC Rn 18~1F 寄存器减1
DEC dircet 15 dircet 直接字节减1
DEC @Ri 16~17 间接RAM减1
INC DPTR A3 数据指针加1
MUL AB A4 A乘以B
DIV AB 84 A除以B
DA A D4 A的十进制加法调整
逻辑操作
ANL A,Rn 58~5F 寄存器“与”到A
ANL A,dircet 55 dircet 直接字节“与”到A
ANL A,@Ri 56~57 间接RAm“与”到A
ANL A,#data 54 data 立即数“与”到A
ANL dircet A 52 dircet A“与”到直接字节
ANL dircet,#data 53 dircet data 立即数“与”到直接字节
ORL A,Rn 48~4F 寄存器“或”到A
ORL A,dircet 45 dircet 直接字节“或”到A
ORL A,@Ri 46~47 间接RAM“或”到A
ORL A,#data 44 data 立即数“或”到A
ORL dircet,A 42 dircet A“或”到直接字节
ORL dircet,#data 43 dircet data 立即数“或”到直接字节
XRL A,Rn 68~6F 寄存器“异或”到A
XRL A,dircet 65 dircet 直接字节“异或”到A
XRL A,@Ri 66~67 间接RAM“异或”到A
XRL A,#data 64 data 立即数“异或”到A
XRL dircet A 62 dircet A“异或”到直接字节
XRL dircet,#data 63 dircet data 立即数“异或”到直接字节
CLR A E4 清零
CPL A F4 A取反
RL A 23 A左环移
RLC A 33 A通过进位左环移
RR A 03 A右环移
RRC A 13 A通过进位右环移
控制程序转移
ACALL addr 11 *1 addr(a7~a0) 绝对子程序调用
LCALL addr 16 12 addr(15~8) 长子程序调用
addr(7~0)
RET 22 子程序调用返回
RETI addr 11 32 中断调用返回
AJMP addr 11 △1 addr(a7~a6) 绝对转移
LJMP addr 16 02addr(15~8) 长转移
addr(7~0)
SJMP rel 80 rel 短转移,相对转移
JMP @A+DPTR 73 相对于DPTR间接转移
JZ rel 60 rel A为零转移
JNZ rel 70 rel A为零转移
CJNE A,dircet,rel B5 dircet rel 直接字节与A比较,不等则转移
CJNE A,#data,rel B4 data rel 立即数与A比较,不等则转移
CJNE A,Rn,#data,rel B8~BF data rel 立即数与寄存器比较,不等则转移
CJNE @Ri,#data,rel B6~B7 data rel 立即数与间接RAM比较,不等则转移
DJNZ Rn,rel D8~DF rel 寄存器减1,不为零则转移
DJNZ dircet,rel B5 dircet rel 直接字节减1,不为零则转移
NOP 00 空操作
*=a10a9a8l
△=a10a9a80
布尔变量操作
CLR C C3 清零进位
CLR bit C2 清零直接位
SETB C D3 置位进位
SETB bit D2 置位直接位
CPL C B3 进位取反
CPL bit B2 直接位取反
ANL C,bit 82 dit 直接数“与”到进位
ANL C,/bit B0 直接位的反“与”到进位
ORL C,bit 72 bit 直接位“或”到进位
ORL C,/bit A0 bit 直接位的反“或”到进位
MOV C,bit A2 bit 直接位送进位
MOV bit,C 92 bit 进位送直接位
JC rel 40 rel 进位位为1转移
JNC rel 50 rel 进位位为0转移
JB bit,rel 20 bit rel 直接位为1相对转移
JNB bit,rel 30 bit rel 直接位为0相对转移
JBC bit,rel 10 bit rel 直接位为1相对转移,然后清零该位
㈨ 求单片机总汇编语言指令表、____
编号 指令名称 指令助记符 指令说明
数据传送类指令
1 一般传送 MOV A, #data 将立即数#data送累加器A
2 MOV direct, #data 将立即数#data送片内RAM direct地址单元内
3 Mov Rn, #data 将立即数#data送寄存器Rn
4 Mov @Ri, #data 寄存器Ri内为RAM地址,将立即数#data送该地址单元内
5 Mov direct2, direct1 将direct1地址单元的数据送 direct2地址单元内
6 Mov direct, rn 将Rn的数据送 direct地址单元内
7 Mov Rn, direct 将direct地址单元内的数据送Rn寄存器
8 Mov direct, @Ri 寄存器Ri内为RAM地址,将该地址单元内的数据送direct地址单元内
9 Mov @Ri, direct 寄存器Ri内为RAM地址,将direct地址单元内的数据送该地址单元内
10 Mov A, Rn 将寄存器Rn内的数据送累加器A
11 Mov Rn, A 将累加器A内的数据送寄存器Rn
12 Mov A, direct 将direct地址单元内的数据送累加器A
13 Mov direct, A 将累加器A内的数据送direct地址单元内
14 Mov A, @Ri 寄存器Ri内为RAM地址,将该地址单元内的数据送累加器A
15 Mov @Ri , A 寄存器Ri内为RAM地址,将累加器A的数据送该地址单元内
16 目的地址传送 Mov DPTR, #data16 将16位立即数送数据指针DPTR寄存器
17 字节交换 SWAP A 累加器A高低4位数据交换
18 XCH A, Rn 将累加器A数据和寄存器Rn内的数据交换
19 XCH A, direct 将累加器A数据和direct地址单元内的数据交换
20 XCH A, @Ri 寄存器Ri内为RAM地址,将该地址单元内的数据与累加器A的数据交换
21 XCHD A, @Ri 寄存器Ri内为RAM地址,将该地址单元内的数据低4位与的低4位交换
22 与外部RAM传送 MOVX @DPTR, A 将累加器A的数据送数据指针DPTR寄存器所指外部RAM地址单元内
23 MOVX A , @DPTR 将DPTR寄存器所指外部RAM地址单元内的数据送累加器A
24 MOVX A, @Ri 寄存器Ri内为片外RAM地址,将该地址单元内的数据送累加器A
25 MOVX @Ri, A 寄存器Ri内为片外RAM地址,将该地址单元内的数据送累加器A
26 与ROM传送 MOVC A, @A+DPTR A+DPTR构成ROM地址,将该地址内的数据送累加器A内
27 MOVC A, @A+PC A+PC构成ROM地址,将该地址内的数据送累加器A内
28 栈操作 PUSH direct 堆栈指针SP自加1后,将direct地址单元的数据压进堆栈,
29 POP direct 堆栈的数据送direct地址单元中,后堆栈指针减1,
算术运算指令
30 加法指令 ADD A, Rn 将寄存器Rn与累加器A的数据相加后,结果保存到累加器A
31 ADD A, direct 将direct地址单元内的数据与累加器A的数据相加后结果保存到累加器A
32 ADD A, @Ri 寄存器Ri内位地址,将该地址单元内的数据与累加器A的数据相加后结果保存到累加器A
33 ADD A, #data 将立即数与累加器A的数据相加后结果保存到累加器A
34 带进位加法 ADDC A, Rn 将寄存器Rn与累加器A的数据相加,再加上进位标志内的值后,结果保存到累加器A
35 ADDC A, direct 将direct地址单元内的数据与累加器A的数据相加,再加上进位标志内的值后,结果保存到累加器A
36 ADDC A, @Ri 寄存器Ri内为RAM地址,将该地址单元内的数据与累加器A的数据相加,再加上进位标志内的值后,结果保存到累加器A
37 ADDC A, #data 将立即数与累加器A的数据相加,再加上进位标志内的值后结果保存到累加器A
38 带借位减法 SUBB A, Rn 将与累加器A的数据减去寄存器Rn的数据,再减去进位标志内的值,结果保存到累加器A
39 SUBB A, direct 将与累加器A的数据减去direct地址单元内的数据,再减去进位标志内的值,结果保存到累加器A
40 SUBB A, @Ri 寄存器Ri内为RAM地址,将累加器A的数据减去该地址单元内的数据,再减去进位标志内的值后,结果保存到累加器A
41 SUBB A, #data 将累加器A的数据减去立即数,再减去进位标志内的值后,结果保存到累加器A
42 加1指令 INC A 累加器A的值自加1
43 INC Rn 寄存器Rn的值自加1
44 INC direct direct地址单元内值自加1
45 INC @Ri 寄存器Ri内为RAM地址,该地址单元内的值自加1
46 INC DPTR 数据指针寄存器DPTR内的值自加1
47 减1指令 DEC A 累加器A的值自减1
48 DEC Rn 寄存器Rn的值自减1
49 DEC direct direct地址单元内的值自减1
50 DEC @Ri 寄存器Ri内为RAM地址,该地址单元内的值自减1
51 乘法 MUL AB 累加器A与寄存器B内的值相乘,乘积的高8位保存在B寄存器,低8位保存在累加器A中
52 除法 DIV AB 累加器A的值除以寄存器B的值,商保存在累加器A中,余数保存在B寄存器
53 二-十进制调整 DA A 对累加器A的结果进行十进制调整
逻辑运算指令
54 逻辑与 ANL A, Rn 将累加器A的值和寄存器Rn的值进行与操作,结果保存到累加器A中
55 ANL A, direct 将累加器A的值和direct地址单元内的值进行与操作,结果保存到累加器A中
56 ANL A, @Ri 寄存器Ri内为RAM地址,将累加器A的值和该地址单元内的值进行与操作,结果保存到累加器A中
57 ANL A, #data 将累加器A的值和立即数进行与操作,结果保存到累加器A中
58 ANL direct, A 将累加器A的值和direct地址单元内的值进行与操作,结果保存到direct地址单元内
59 ANL direct, #data 将立即数和direct地址单元内的值进行与操作,结果保存到direct地址单元内
60 逻辑或 ORL A, Rn 将累加器A的值和寄存器Rn的值进行或操作,结果保存到累加器A中
61 ORL A, direct 将累加器A的值和direct地址单元内的值进行或操作,结果保存到累加器A中
62 ORL A, @Ri 寄存器Ri内为RAM地址,将累加器A的值和该地址单元内的值进行或操作,结果保存到累加器A中
63 ORL A, #data 将累加器A的值和立即数进行或操作,结果保存到累加器A中
64 ORL direct, A 将累加器A的值和direct地址单元内的值进行或操作,结果保存到direct地址单元内
65 ORL direct, #data 将立即数和direct地址单元内的值进行或操作,结果保存到direct地址单元内
66 逻辑异或 XRL A, Rn 将累加器A的值和寄存器Rn的值进行异或操作,结果保存到累加器A中
67 XRL A, direct 将累加器A的值和direct地址单元内的值进行异或操作,结果保存到累加器A中
68 XRL A, @Ri 寄存器Ri内为RAM地址,将累加器A的值和该地址单元内的值进行异或操作,结果保存到累加器A中
69 XRL A, #data 将累加器A的值和立即数进行异或操作,结果保存到累加器A中
70 XRL direct, A 将累加器A的值和direct地址单元内的值进行异或操作,结果保存到direct地址单元内
71 XRL direct, #data 将立即数和direct地址单元内的值进行异或操作,结果保存到direct地址单元内
72 按位取反 CPL A 累加器A的值按位取反
73 累加器清零 CLR A 累加器A清0
74 逻辑右移 RR A 累加器A的值循环右移1位
75 逻辑左移 RL A 累加器A的值循环左移1位
76 带进位右移 RRC A 累加器A的值带进位循环右移1位
77 带进位左移 RLC A 累加器A的值带进位循环左移1位
控制转移指令
78 无条件转移 SJMP rel rel为地址偏移量,PC加2后的地址加上rel作为目标地址,程序跳到目标地址继续运行
79 AJMP addr11(a10- a0) addr11为11位地址,PC加2后的地址高5位与指令中的低11位地址构成目标地址,程序跳到目标地址继续运行
80 LJMP addr16 将addr16的16位地址送程序计数器PC,使机器执行下一条指令时无条件转移到addr16处执行程序
81 JMP @A+DPTR 目标地址的基地址放在DPTR中,目标地址对基地址的偏移量放在累加器A中,它们相加构成目标地址
82 条件转移 JZ rel If(累加器A=0)则PC加2再加上rel作为目标地址
83 JNZ rel If(累加器A!=0)则PC加2再加上rel作为目标地址
84 CJNE A, direct, rel If(累加器A!= direct地址单元的值)则PC加2再加上rel作为目标地址
85 CJNE A, #data, rel If(累加器A!= 立即数)则PC加2再加上rel作为目标地址
86 CJNE Rn, #data, rel If(寄存器Rn的值!= 立即数)则PC加2再加上rel作为目标地址
87 CJNE @Ri, #data, rel 寄存器Ri内为RAM地址,If(该地址单元的值!= 立即数)则PC加2再加上rel作为目标地址
88 循环转移 DJNZ Rn, rel 寄存器Rn的值减1后,If(寄存器Rn的值!=0)则PC加2再加上rel作为目标地址
89 DJNZ direct, rel Direct地址单元的值减1后,If(该值!=0)则PC加3再加上rel作为目标地址
90 布尔条件转移 JC rel If(CY=1)则PC加2再加上rel作为目标地址
91 JNC rel If(CY=0)则PC加2再加上rel作为目标地址
92 JB bit, rel If(bit位=1)则PC加3再加上rel作为目标地址
93 JNB bit, rel If(bit位=0)则PC加3再加上rel作为目标地址
94 JBC bit, rel If(bit位=1)则PC加3再加上rel作为目标地址,且bit位清0
95 调用指令 ACALL addr11 addr11为11位地址,PC加2后的地址PUSH进堆栈,再将PC的地址高5位与指令中的低11位地址构成目标地址,程序跳到目标地址继续运行
96 LCALL addr16 PC加3后的地址PUSH进堆栈,再将16位地址送PC作为目标地址,程序跳到目标地址继续运行
97 返回指令 RET 子程序返回指令,把堆栈中的地址恢复到PC中使程序回到调用处
98 RETI 中断程序返回指令,把堆栈中的地址恢复到PC中使程序回到调用处
99 空操作 NOP 空操作
位操作指令
100 布尔传送 MOV C, bit 将bit位地址中的值送PSW中的进位标志位CY
101 MOV bit, C 将PSW中的进位标志位CY的值送bit位地址中
102 位清0 CLR C 将进位标志位CY清0
103 位清0 CLR bit 将bit位地址内清0
104 位置1 SETB C 将进位标志位CY置1
105 SETB bit 将bit位地址内置1
106 位与 ANL C, bit 将Cy和bit位地址中的值进行与操作后,结果送Cy
107 ANL C, /bit bit位地址中的值取反后再与Cy进行与操作,结构送Cy
108 位或 ORL C, bit 将Cy和bit位地址中的值进行或操作后,结果送Cy
109 ORL C, /bit bit位地址中的值取反后再与Cy进行或操作,结构送Cy
110 位取反 CPL C 将Cy取反
111 CPL bit 将bit位地址的值取反
说明:
1)Ri, Rn指当前工作寄存器,i,n = 0 – 7,当前工作寄存器由程序状态字寄存器PSW的2个位RS1, RS0决定
㈩ 求一MCS-51系列单片机指令表
传送指令是指令系统中最基本,使用最多的一类指令,主要用于数据的传送、保存以及交换等场合。
1.以累加器A为目的操作数的指令(4条)
这组指令的功能是把源操作数指定的内容送入累加器A中。
有寄存器、直接、寄存器间接和立即4种寻址方式。
MOV A, Rn MOV A, data
MOV A,@Rn MOV A,#data
2.以寄存器Rn为目的的操作数的指令(3条)
这组指令的功能是把源操作数指定的内容送到所选定的工作寄存器Rn中。
有寄存器、直接和立即3种寻址方式。
MOV Rn, A MOV Rn,data
MOV Rn,#data
3.以直接地址为目的操作数的指令(5条)
这组指令的功能是把源操作数指定的内容送到由直接地址data所指定的片内RAM中。
有寄存器、直接、寄存器间接和立即4种寻址方式。
MOV data,A MOV data,Rn
MOV data1,data2 MOV data,@Ri
MOV data,#data
4.以间接地址为目的操作数的指令(3条)
这组指令的功能是把源操作数指定的内容送到以Ri中的内容为地址的片内RAM中。
有寄存器、直接和立即3种寻址方式。
MOV @Ri,A MOV @Ri,data
MOV @Ri,#data
5.查表指令(2条)
这组指令的功能是对存放于程序存储器中的数据表格进行查找传送。使用变址寻址方式。
MOVC A,@A+DPTR MOVC A, @A+PC
6.累加器A与片外AM传送指令(4条)
这组指令的功能为累加器A与片RAM间的相互传送。由于MCS-51指令系统中没有专门的输入/输出指令,且片外扩展的I/O口与片外RAM是统一编址的,故以下4条指令也可作为输入/输出指令。使用寄存器间接寻址方式。
MOVX A,@DPAR MOVX @DPTR,A
MOVX A,@Ri MOVX @Ri,A
7.堆栈操作类指令(2条)
该类指令的功能是把直接寻址单元的内容传送到堆栈指针SP所指的单元中,以及把SP所指单元的内容送到直接寻址单元中。
PUSH data POP data
前一条指令称为入栈操作指令,后一条指令称为出栈指令。由于开机复位后,(SP)=07H,故一般需重新设置SP的初值。由于压入堆栈的第一个数必须存放在SP+1所指存储单元,故实际的栈底为SP+1所指存储单元。
8.交换指令(4条)
该类指令的功能是把累加器A中的内容与源操作数所指出的数据相互交换。
有寄存器、直接和寄存器间接3种寻址方式。
XCH A,Rn XCH A,data
XCH A,@Ri XCHD A,@Ri
9.16位数据传送类指令(1条)
MOV DPTR,#data
该指令的功能是把16位常数送入数据指针寄存器,使用立即寻址方式。译成机器码时,是高位字节在前,低位字节在后。
MCS-51具有强大的加、减、乘、除四则算术运算指令。
1.程序状态字PSW
MCS-51有一个程序状态字寄存器PSW,用来保存指令执行结果的标志,供程序查讯和判别。PSW是特殊功能寄存器中的一个,其格式如下:
PSW7--既是布尔处理机的累加器C,又是进位标志CY,如果操作结果在最高位有进位输出(加法时)或借位输入(减法时),置位CY,否则清“0”CY。
AC--辅助进位(半进位)标志。如果操作结果的低4位有进位(加法时)或向高4位借位时(减法),置AC,否则清“0”AC,AC主要用于二-十进制数加法调整。
OV--溢出标志。如果操作结果有进位进入最高位,但最高位没有产生进位,或者最高位产生进位而低位没有向最高位进位,这时置位溢出标志位,否则OV清“0”。溢出标志位用于补码运算,当有符号的数运算结果不能用8位二进制数表示时,OV将置位。
P--累加器A的奇偶标志位,如果累加器A的8位的模2和为1(奇),则P=1;否则P=0。由于P总是表示A的奇偶性,随着A的内容变化的,所以一个值写入PSW的P位的值不变。
RS1、RS0--指示当前使用的工作寄存器区。
F0--用户标志位。可作为软件标志,它的作用和内部RAM位寻址区的各位相似。
PSW1--保留位,对它的操作无效。
2.加法指令
1、不带进位加法指令
ADD A,#data ADD A,data
ADD A,@Ri ADD A,Rn
工作寄存器、内部RAM单元内容或立即数的8位无符号二进制数和累加器A中数相加,所得和存放于累加器A中,当和的第3、7位有进位时,分别将AC,CY标志位置1;否则为0。
上述指令的执行将影响标志位AC、CY、OV、P。
对于无符号数,进位标志位CY=1,表示溢出;CY=0表示无溢出。带符号数运算的溢出取决于第6、7位中有一位产生进位,而另一位不产生进位,溢出标志位OV置“1”否则被清“0”。OV=1表示两个正数相加,和变为负数,或两个负数相加,和变为正数的错误结果。
源操作数有四种寻址方式:寄存器、直接、间接和立即数。
2、带进位加法指令:
ADDC A,#data ADDC A,data
ADDC A,@Ri ADDC A,Rn
这是四条带进位的加法指令。将累加器A内容加当前CY标志位内容,再加无符号单字节的数,和存于累加器A中。当运算结果第3、7位产生进位溢出时,则分别置位AC、CY和OV标志位。本指令执行将影响标志位AC、CY、OV、P。
本指令常用于多字节加法。
3、加1指令:
INC A INC data
INC @Ri INC Rn
INC DPTR
INC指令将指定的内容加1,结果仍存放于原A或原单元中。如原值为0FFH,加1运算后将变成00H,运算结果不影响标志位。
本指令可对累加器A、工作寄存器RN、RI间址和直接寻址的单元内容进行加1运算。可见MCS-51加1指令是较丰富的。
注意:当用本指令使输出并行I/O内容加1时,用作输出口原始值,将从输出口的数据锁存器中读入,而不是从输出口的引脚上读入。
4、二-十进制调正指令:
DA A
若[(A0-3)>9]或[(AC)=1),则(A0-3)(A0-3)+06H
本指令是对A的BCD码加法结果进行调正。两个压缩型BCD码按二进制数相加之后,必须经本指令调正,才能得到压缩型BCD码的和数。
本指令的操作为:若累加器A的低4位数值大于9或者第3位向第4位产生进位,即AC辅助进位位为1,则需将A的低4位内容加6调正,以产生低4位正确的BCD码值。如果加0调正后,低4位产生进位,且高4位均为1时,则内部加法将置位CY,反之,它并不清“0”CY标志位。
若累加器A的高4位值大于9或最高进位位CY=1,则高位4位需加6调正,以产生高4位的正确BCD码值。同样,在加6调正后产生最高进位,则置位CY,反之,不清“0”CY这时CY的置位,表示和数BCD码值大于等于100。这对多字节十进制加法有用。不影响OV标志。
由此可见,本指令是根据累加器A的原始数值和PSW的状态,对累加器A进行加O6H、60H或66H的操作。
必须注意:本指令不能简单地把累加器A中的16进制数交换成BCD码,也不能用于十进制减法的调正。
3.减法指令
MCS-51在MCS-48的基础上增加了带借位减法指令,加强了计算机的运算功能。
1、带借位减法指令:
SUBB A,#data SUBB A,data
SUBB A,@Ri SUBB A,Rn
带借位减法指令SUBB,从累加器A中减去进位标志位CY和指定的变量,结果在累加器A中,若第七位有借位,则置位位CY,否则CY清0。若第3位有错位,则置位辅助进位标志AC,否则清0 AC。若第7和第6位中有一位需借位,而另一位不借位,则置位溢出标志OV。溢出位OV用于带符号的整数减法,它表示(OV=1)一个正数减负数结果为负数;或一个负数减正数结果为正数的错误结果。
源操作数允许有四种寻址方式:寄存器RN,直接地址direct,间址Ri或立即数。
当在进行单字节或多字节减法前,不知道进位标志位CY的值,则应在减法指令前先将CY清“0”。
4.乘法指令
MUL AB
乘法指令是MCS-51新增加的,运算速度只需4个机器周期。它大大增加了MCS-51单片机的运算功能,克服了MCS-48系列单片机的不足。
本指令将累加器A和寄存器B中二个8位无符号整数进行相乘,16位乘积的低8位存于A中,高8位存于B中,如果乘积大于255(0FFH),即B的内容不为0时,则置位溢出标志位OV,否则清“0”OV。进位标志位CY总是清“0”。
5.除法指令
DIV AB
MCS-51系列单片机增加的除法指令,运算时间亦只需4个机器周期,同样也增强了MCS-51的运算功能,使它能适用于复杂的且要求运算功能较强的控制系统。除法指令格式:
本指令将累加器A中8位无符号整数除以B寄存器中8位无符号整数,所得结果商的整数部分存于A中,整数作数部分存于寄存器B中。清“0”CY和OV标志位。当除数(B中内容)为00H时,则执行结果将为不定值,即执行结果送往A和B中的为不定值,且置位溢出标志位OV。在任何情况下,均清“0”CY。
6.减一指令
DEC A DEC data
DEC @Ri DEC Rn
DEC指令把所指的寄存器内容减1,结果仍送回原寄存器,若原来寄存器的内容为00H,则减1后将为FFH,运算结果不影响任何标志位,该组指令使用了直接、寄存器和寄存器间寻址。同加1指令一样,在第二条指令中,若直接地址是I/O口,则进行“读-改-写”操作。
逻辑操作类指令共有效25条,有与、或、异或、求反、左右移位、清0等逻辑操作,对应的寻址方式有直接、寄存器和间接寻址,该类指令的执行一般不影响PSW。
1.循环移位指令(4条)
RL A; RR A;
RLC A; RRC A;
前两条指令的功能分别是将累加器A的内容循环左移一位,后两条指令的功能分别是将累加器A的内容连同进位位CY一起循环左移或右移一位。
2.累加器半字节交换指令(1条)
SWAP A;
这条指令的功能是将累加器A的高低两半字节交换。如(A)=56H,执行指令SWAP A 后,结果(A)=65H。
3.求反指令(1条)
CPL A;
4.清0指令(1条)
CLR A;
5.逻辑与指令(6条)
ANL A,#data; ANL data,#data
ANL A,Rn ANL A,data
ANL data,A ANL A,@Ri
这组指令的第二条和第五条指令中,若直接地址正好是I/O口,则也是“读-改-写”操作。
6.逻辑或指令(6条)
ORL A,#data ORL data,#data
ORL A,Rn ORL A,data
ORL data,A ORL A,@Ri
这组指令的第二条和第五条也具有“读-改-写”功能。
7.逻辑异或指令(6条)
XRL A,#data XRL data,#data
XRL A,Rn XRL A,data
XRL data,A XRL A,@Ri
同样,这组指令的第二条和第五条也具有“读-写-改”功能。
控制转移类指令用于控制程序的走向,故其作用区间是程序存储器空间。利用具有16位地址的长调用、长转移指令可对64K程序存储器的任一地址单元进行访问,也可用具有11位地址的绝对调用和绝对转移指令,访问2K字节的空间。另外,还有在一页范围的短相对转移以及许多条件转移指令,这类指令一般不影响标志位,不面分别给予介绍。
1.无条件转移语句(4条)
LJMP addr16 AJMP addr11 SJMP rel JMP @(A)+DPTR
上述指令的功能是当程序执行完该指令时,程序就无条件地转移到指令所提供的地址上去。
第一条指令称为长转移指令,指令提供16位目标地址,将指令中第二字节和第三字节地址码分别装入PC的高8位中,所以无条件转移的目标地址范围是64K字节空间。
第二条指令称为绝对转移指令,指令提供11位目标地址,所以,无条件转移的目标地址范围是从下条指令开始的2K字节空间。
第三条指令称为相对短转移指令,指令控制程序无条件的转向指定地址。该指令的rel是一个带符号的相对偏移量,范围为-128~+127。负数表示向后转移,正数表示向前转移。这条指令的优点是指令给出的是相对转移地址,不具体指出地址值,这样当程序地址发生变化时,只要相对地址不发生变化,该指令就不需作任何改动。在用汇编语言写程序时,rel是一个标号,由汇编程序在汇编过程中自动计算偏移地址。在手工汇编时,可用下式计算偏移地址:
向后转移时:rel=FEH-(源、目的地址的绝对值)
向前转移时:rel=(源、目的地址差的绝对值)-2
第四条指令称为散转指令(又称为间接转移指令),该指令把累加器A中的8位无符号数与作为基址寄存器DPTR中的16位数据相加,所得的值送入PC作为转移的目的地址。该指令执行后不影响累加器A和数据指针DPTR中的原内容,也不影响任何标志位。这条指令的特点是其转移地址不是编程时确定的,而是在程序运行时动态决定的。因此,可以在DPTR中装入多条转移程序的首地址,而由累加器A中的内容来动态选择该时刻应转向那一条分支程序。
2.条件转移指令(8条)
1.JZ rel 2.JNZ rel
3.CJNEA,data,rel 4.CJNE A,#data,rel
5. CJNE Rn,#data,rel
6.CJNE @Ri,data,rel
7.DJNZ Rn,rel
8.DJNZ data,rel
上述指令执行满足某种特定条件的转移,其目标在以下一条指令的起始地址为中心的256个字节范围内(-128~+127)。
第一条和第二条指令是判别累加器A中的内容是否为0来确定是顺序执行还是转移。
第三条至第六条是比较转移指令,该指令通过比较前面两个操作数的大小,如果它们的值不相等则转移,相等则继续执行。指令执行后要影响进位位CY,若操作数1小于操作数2,则CY=1;若操作数1大于操作数2,则CY=0。
3.调用指程序及返回指令(4条)
1.LCALL addr16 2.ACALL addr11 3.RET 4.RETI
在程序设计中,经常需要对某段程序反复执行,为了减少程序的编写以及浪费不必要的地址空间,于是引入了主程序和子程序的概念,通常把某一段需要反复调用的程序称为子程序,子程序的最后一条指令为返回主程序指令(RET),而对具有调用子程序功能的指令称为调用指令。
第一条指令称为长调用指令,其与LJMP一样提供16位地址,可调用64K字节范围内的子程序。由于其为三字节指令,所以执行时首先(PC)+3,以获得下一条指令地址,并把此时的PC内容压入堆栈,作为返回地址,然后把地址addr16装入PC,转去执行子程序。
第二条指令称为绝对调用指令,该指令提供11位目标地址,限制在2K字节范围内调用,由于是双字节指令,所以执行时(PC)+2以获得下一条指令的地址,然后把该地址压入堆栈作为返回地址。其操作码的形成与AJMP指令相同。
第三条指令称为子程序返回指令,表示子程序结束需返回主程序,所以执行该指令时,分别从堆栈中弹出调用子程序时压入的返回地址。
第四条指令称为中断返回指令,该指令的执行过程类似指令RET,但其还能恢复中断逻辑,RETI和RET决不能互换使用。
4.空操作指令(1条)
NOP;
空操作指令除了PC加1外,CPC不作任何操作,而转向下一条指令去执行。这条指令常用于产生一个机器周期的延时。
位操作类指令共有17条,均以位为操作对象,分别完成位传送、位状态控制、位逻辑运算、位条件转移等功能,在汇编语言中,位地址的表示方式有以下4种:
直接用位地址表示:如91H。
字节地址位数方式:如P1.0(90H)。
位名称方式:如RS0。
用户使用伪指令事先定义过的符号地址。
1.位数据传送指令(2条)
MOV C,bit MOV bit,C
上述指令把源操作数指定的变量传送到目的操作数指定的单元中。第二条指令若是对I/O口的位进行操作,则也是“读-改-写”操作。
2.位状态控制指令(6条)
CLR C CLR bit CPL C
CPL bit SETB C SETB bit
上述指令的功能是分别对进位标志和直接寻址进行清0、求反以及直接位地址是I/O口的某一位时,也具有“读-改-写”功能。
3.位逻辑运算指令(4条)
ANL C,bit ANL C,/bit
ORL C,bit ORL C/bit
上述指令的功能是将位累加器C的内容与直接位地址的内容或直接位地址内容的反进行逻辑与、逻辑或,结果仍送回C中。
4.位条件转移指令(5)
JC rel JNC rel
JB bit,rel JNB bit,rel
JBC bit,rel
上述指令的功能分别是判别进位位C和直接位地址的内容是“1”还是“0”,以此来决定程序的走向。最后一条指令的功能是:若直接位址的内容为“1”则转移,并且同时将该位清0,否则顺序执行。这条指令若是对I/O口某一位操作,也具有“读-改-写”功能。