第三章 8051指令系统主要内容
1、汇编语言
2、寻址方式
3,MCS-51单片机的指令系统
3.1 汇编语言
3.1.1 指令和程序设计语言指令,是 CPU根据人们的意图来执行某种操作的命令。
指令系统,是计算机所能够执行的全部指令的集合。
程序,是按人们的要求所编制的指令操作序列。
程序设计语言,是编写程序的某种规则。
三类编程语言,
机器语言、汇编语言、高级语言
3.1.2 指令格式操作码 [操作数 1] [,操作数 2] [,操作数 3] [;注释 ]
单字节指令,有两种情况,共 49条
( 1)指令码中隐含着对某一个寄存器的操作。
( 2)指令码中的某些位指定某一个寄存器。
双字节指令,一个字节示操作码,另一个字节示操作数。共 46条三字节指令,一个字节示操作码及某些位指定某一个寄存器,另两个字节示操作数。共 16条
3.2 寻址方式
3.2.0 寻址方式概述寻址方式,就是指令中找到操作数或操作数地址的方式。
8051单片机有 七种寻址方式,
1、寄存器寻址 2、直接寻址
3、立即数寻址 4、寄存器间接寻址
5、变址寻址 6、相对寻址
7、位寻址
3.2.1 七种寻址方式一、寄存器寻址操作数在某一个寄存器中。
所用的寄存器可以是,R0~R7,A,B,DPTR等。
如,MOV A,R0 ;( R0)?A
DEC B ;( B) -1?B
ADD A,R1 ;( A) +( R1)?A
INC DPTR ;( DPTR) +1?DPTR
二、直接寻址指令中直接给出操作数所在存储单元的地址。
可以直接寻址的存储单元是,片内 RAM中的所有单元,即片内 RAM的低 128字节和所有的特殊功能寄存器( SFR) 。
如,MOV A,3AH ;( 3AH)?A
MOV P1,R0 ;( R0)?P1口
INC 58H ;( 58H) +1?58H
SUBB A,TL0 ;( A) -( TL0)?A
三、立即数寻址操作数在指令中,在操作码后面。用,#”表示。
操作数可以是 8位的,也可以是 16位的。
如,MOV A,3AH ;( 3AH)?A
MOV A,#3AH ; 3AH?A
MOV DPTR,#23C8H ; 23C8H?DPTR
ADD A,#0D4H ;( A) +0D4H?A
四、寄存器间接寻址指令中寄存器中的内容给出的是操作数的地址。
8051规定,R0,R1和 DPTR可以作为间接寻址寄存器。
1,R0,R1间址访问片内 RAM的低 128B或片外 RAM
的低 256B空间如:设( R0) =65H,( 65H) =47H
MOV A,@R0 ; (65H)?A,A中的值是 47H
MOV @R0,#3AH ; 3AH?65H
MOVX A,@R0 ;外 RAM的( 65H)?A
2,DPTR间址访问片外 RAM的 64KB空间如:设( DPTR) =2000H
MOVX @DPTR,A ; A?外 RAM的 2000H单元
MOVX A,@DPTR ; 外 RAM的 2000H单元? A
五、变址寻址(基址 +变址间接寻址)
DPTR或 PC作为基地址寄存器,A作为变地址寄存器的间接寻址。
只能访问程序存储器,范围,64KB
如,MOVC A,@A+DPTR ; ((A)+(DPTR))?A
MOVC A,@A+PC ; ((A)+(PC))?A
JMP @A+DPTR ; ((A)+(DPTR))?PC
该寻址方式 多用于查表操作 。
六、相对寻址以当前的 PC值加上指令中给出的 地址偏移量 rel而形成的实际地址。
相对寻址只出现在相对转移指令中。
目的地址 =源地址 +指令的字节数( 2或 3) +rel
rel =目的地址 --源地址 --指令的字节数( 2或 3)
rel:-128~+127 用补码表示,大于 0正向跳转,
小于 0则反向跳转。
如,JC rel
SJMP NEXT1
JZ FIRST
DJNZ R1,LOOP2
七、位寻址位操作指令中的操作数是位地址。 用,bit”示
1、位寻址区域在片内 RAM中:
( 1) 20H~2FH16个单元的 128位( 00H~7FH)
( 2)字节地址能被 8整除的 11个 SFR中的位 (80H~FFH)
2、位地址的表示方法
( 1)直接用位地址 如,00H,7FH,82H,0B0H
( 2)用特殊功能寄存器名加位数 如,PSW.3 P1.2
( 3)用位名 如,TR0,EX0
( 4)用 bit定义的有名字的位地址
3、位寻址例子
MOV C,00H SETB PSW.3
CLR TR1 JB 01H,NEXT2
3.2.2 寻址空间及符号注释一、寻址空间二、寻址方式中的常用符号注释
1,Rn( n=0~7) 示当前选中的 工作寄存器 R0~R7
2,Ri( i=0,1)
示当前选中的,作地址指针的寄存器 R0,R1
3,#data 示 8位立即数
4,#data16 示 16位立即数如,MOV DPTR,#data16
5,direct 8位片内 RAM单元 (包括 SFR)的 直接地址如,MOV direct,#data ;#data?direct
6,addr11
11位目的地址,用于 ACALL和 AJMP指令中
7,addr16
16位目的地址,用于 LCALL和 LJMP指令中
8,rel 补码形式的 8位地址偏移量
9,bit 片内 RAM或 SFR的直接寻址的 位地址
10,@ 间接地址方式中,表示间址寄存器的符号
11,/ 对位取反操作,指令中,示对 RAM或 SFR的直接寻址的位地址。如,ANL C,/P1.2
12、( × ) 指 × 中的内容,其内容 是数据 ; × 是地址
13、(( × )) 由 × 指出的地址 单元中的内容,×
中的内容 是地址,× 地址如:设 58H单元的数据是 36H,R0的内容是 58H
INC 58H ;( 58H) +1?58H
DEC @R0 ;(( R0))- 1?( R0)
14,? 示将箭头左边的 内容传送 到箭头右边的单元
3.3 MCS-51单片机的指令系统
3.3.0 指令系统概述共 111条指令。
按字节数分,单字节指令 49条,双字节指令 46条,
三字节指令 16条。
按执行时间分,单机器周期指令 64条,双周期指令 45条,四周期指令 2条(乘、除指令)
按功能分,MCS-51指令系统分为五大类:
数据传送指令( 29条) 算术运算指令( 24条)
逻辑运算及位移指令 (24条 ) 控制转移指令( 17条)
位操作或布尔操作( 17条)
3.3.1 数据传送指令数据传送类指令丰富,功能强。分成九个小类,
一般不影响标志位。不介绍机器码。共 29条指令。
一、以 A为目的操作数的指令( 4条)
MOV A,Rn ;( Rn)?A
MOV A,direct ;( direct )?A
MOV A,@Ri ;(( Ri))?A
MOV A,#data ; data?A
如,MOV A,R2
MOV A,30H
MOV A,@R0
MOV A,#36H
二、以 Rn为目的操作数的指令( 3条)
MOV Rn,A ;( Rn)? Rn
MOV Rn,direct ;( direct )? Rn
MOV Rn,#data ; data?Rn
如,MOV R0,A
MOV R3,30H
MOV R7,#36H
MOV R1,#30
MOV R6,#01101100B
三、以直接地址为目的操作数的指令( 5条)
MOV direct,A ;( A)?direct
MOV direct,Rn ;( Rn)?direct
MOV direct,direct ;(源 direct)?目的 direct
MOV direct,@Ri ;(( Ri))?direct
MOV direct,#data ; data?direct
如,MOV 30H,A
MOV P1,R2
MOV 38H,60H
MOV TL0,@R1
MOV 58H,#36H
四、以间接地址为目的操作数的指令( 3条)
MOV @Ri,A ;( A)?( Ri)
MOV @Ri,direct ;( direct)?( Ri)
MOV @Ri,#data ; data? ( Ri)
如,MOV @R0,A
MOV @R1,36H
MOV @R0,SBUF
MOV @R1,#48
MOV @R0,#0D6H
MOV指令在片内 RAM的允许操作图不允许的操作有,
@Ri@Ri RnRn @RiRn
五、十六位数据传送指令( 1条)
MOV DPTR,#data16 ;dataH?DPH,dataL?DPL
如,MOV DPTR,#2368H
MOV DPTR,#35326
六、查表指令( 2条)
MOVC A,@A+DPTR ; (( A) +( DPTR) )?A
一般 DPTR放表的首地址,A放所查数据在表中的偏移;查表范围为 64KB空间,称为远程查表。
MOVC A,@A+PC ;(( A) +( PC))?A
PC的值为下条指令的地址,A放所查数据相对 PC
值的偏移;查表范围为最大为 256B空间,称为近程查表。
例 1 近程查表设程序中的数据表格为:
1010H,02H
1011H,04H
1012H,06H
1013H,08H
执行程序:
1000H,MOV A,#0DH
1002H,MOVC A,@A+PC ;( 0DH+1003H)?A
1003H,MOV R0,A ;( A)? R0
结果为:( A) =02H,( R0) =02H,( PC) =1004H
例 2 远程查表设程序中的数据表格为:
执行程序:
1000H,MOV A,#10H
1002H,PUSH DPH
1004H,PUSH DPL
1006H,MOV DPTR,#7000H
1009H,MOVC A,@A+DPTR ;(10H+7000H)?A
100AH,POP DPL
100CH,POP DPH
结果为:( A) =02H,( PC) =100EH,( DPTR) =原值
7010H,02H
7011H,04H
7012H,06H
7013H,08H
七、累加器 A与片外 RAM的数据传送指令( 4条)
用间址方式
MOVX A,@Ri ; (( Ri) )?A,且使 /RD=0
MOVX A,@ DPTR ; ((DPTR))?A,且使 /RD=0
MOVX @Ri,A ; (A)? ( Ri),且使 /WR=0
MOVX @ DPTR,A ; (A)? (DPTR),且使 /WR=0
说明:
1、第 2,4两条指令以 DPTR为片外 RAM16位地址指针,
寻址范围为 64KB空间;
2、第 1,3两条指令以 R0或 R1作低 8位地址指针,由 P0
口送出,寻址范围为 256B空间( P2口仍可作通用 I/O
口)。
八、堆栈操作指令( 2条)
PUSH direct ;先 (SP)+1?SP,后( direct)?( SP)
POP direct ;先 (( SP))? direct,后 (SP)-1?SP
如,PUSH 0E0H ;实际是( A)?( SP)
POP 05H ;实际是( ( SP) )?R5
注意,其操作数为直接地址,不能用寄存器名。
九、交换指令( 5条)
1、字节交换指令
XCH A,Rn ;( A)( Rn)
XCH A,direct ;( A)( direct)
XCH A,@Ri ;( A)(( Ri))
2、半字节交换指令
( 1)二低半字节交换指令
XCHD A,@Ri ;( A0~3)(( Ri) 0~3 )
如:设( A) =36H,( R1) =65H,( 65H) =42H
XCHD A,@R1 ;( A) =32H,( 65H) =46H
A
( 2)累加器 A高、低半字节交换指令
SWAP A ;( A0~3)( A4~7 )
如:设( A) =36H
SWAP A ;( A) =63H
3.3.2 算术运算指令包括加、减、乘、除运算;第一操作数一般为 A;
一般影响标志位 CY,AC,OV和 P。
共 24条指令,分成七个小类。
一、不带进位加法指令( 4条)
ADD A,Rn ;( A) +( Rn)?A
ADD A,direct ;( A) +( direct)?A
ADD A,@Ri ;( A) +(( Ri))?A
ADD A,#data ;( A) +#data?A
例 3-1( A) =0C3H,( R0) =0AAH
执行,ADD A,R0”的和为 6DH,标志位 CY=1,
OV=1,AC=1。
OV=C7 C6 对第 6、第 7位的进位位 C7,C6异或。
二、带进位加法指令( 4条)
ADDC A,Rn ;( A) +( Rn) +CY?A
ADDC A,direct ;( A) +( direct) +CY?A
ADDC A,@Ri ;( A) +(( Ri)) +CY?A
ADDC A,#data ;( A) +#data +CY?A
三、带借位减法指令( 4条)
SUBB A,Rn ;( A) - CY -( Rn)?A
SUBB A,direct ;( A) - CY -( direct)?A
SUBB A,@Ri ;( A) - CY -(( Ri))?A
SUBB A,#data ;( A) - CY - #data?A
注意:这两类指令其助记符与 8086的不同。
四、乘除法指令( 2条)
1、乘法指令
MUL AB ;( A) × ( B)?B15~8,A7~0
说明,( 1)为无符号乘法;
( 2)若结果的 B≠0,则 OV=1,若 B=0,则
OV=0; CY=0。
2、除法指令
DIV AB ;( A) /( B)的商?A,余数?B
说明,( 1)为无符号除法;
( 2)若除数 B=0,则 OV=1,若 B≠ 0,则 OV=0;
CY=0。
五、加 1指令( 5条)
INC A ;( A) +1?A
INC Rn ;( Rn) +1? Rn
INC direct ;( direct) +1? direct
INC @Ri ;(( Ri)) +1?( Ri)
INC DPTR ;( DPTR) +1?DPTR
说明,此类指令不影响标志 CY,AC和 OV
六、减 1指令( 4条)
DEC A ;( A) -1?A
DEC Rn ;( Rn) -1? Rn
DEC direct ;( direct) -1? direct
DEC @Ri ;(( Ri)) -1?( Ri)
说明,此类指令不影响标志 CY,AC和 OV
七、十进制数调整指令( 1条)
DA A ;调整累加器内容为 BCD码(压缩的)
说明,
( 1)此指令跟在 ADD或 ADDC指令之后,将 A中的和调整为 BCD码,并且 ADD或 ADDC的两个操作数是
BCD码;
( 2)调整方法:
若( A0~3) >9或 AC=1,则( A0~3) +6?( A0~3) ;
若( A4~7) >9或 CY=1,则( A4~7) +6?( A4~7) ;
( 3)对标志的影响:若结果 A>99,则 CY=1;不影响
OV。
3.3.3 逻辑操作指令包括与、或、异或、清除、求反、移位等操作。
这类指令一般不影响标志位 CY,AC和 OV。
共 24条指令,分成五个小类。
一、累加器 A清 0与取反指令( 2条)
1、累加器 A清 0 指令
CLR A ; 0? A
说明:只影响标志位 P。
2、累加器 A取反指令 (按位取反)
CPL A ;( /A)? A,相当于 0FFH - A? A
说明:不影响标志位。
如,( A) =56H
CPL A ;结果为 0A9H
二、移位指令( 4条)
1、累加器 A循环左移
RL A ;
2、累加器 A循环右移
RR A ;
3、累加器 A带进位位循环左移
RLC A ;
4、累加器 A带进位位循环右移
RRC A ;
说明:
( 1)各条指令每次只移动一位;
( 2)左移一位相当于乘以 2;右移一位相当于除以 2;
( 3)带进位位移动的影响标志位 CY和 P。
三、逻辑“与”指令( 6条)
ANL A,Rn ;( A) ∧ ( Rn)?A
ANL A,direct ;( A) ∧ ( direct)?A
ANL A,@Ri ;( A) ∧ (( Ri))?A
ANL A,#data ;( A) ∧ #data?A
ANL direct,A ;( direct ) ∧ ( A)?direct
ANL direct,#data ;( direct ) ∧ #data?direct
说明:
( 1)目的操作数只能是 A或者 direct;
( 2)前 4条指令仅影响标志位 P;后两条不影响标志位;
( 3)与运算常用于使某些位清 0。
四、逻辑“或”指令( 6条)
ORL A,Rn ;( A) ∨ ( Rn)?A
ORL A,direct ;( A) ∨ ( direct)?A
ORL A,@Ri ;( A) ∨ (( Ri))?A
ORL A,#data ;( A) ∨ #data?A
ORL direct,A ;( direct ) ∨ ( A)?direct
ORL direct,#data ;( direct ) ∨ #data?direct
说明:
( 1)目的操作数只能是 A或者 direct;
( 2)前 4条指令仅影响标志位 P;后两条不影响标志位。
( 3)或运算常用于使某些位置 1。
五、逻辑“异或”指令( 6条)
XRL A,Rn ;( A) ∨ ( Rn)?A
XRL A,direct ;( A) ∨ ( direct)?A
XRL A,@Ri ;( A) ∨ (( Ri))?A
XRL A,#data ;( A) ∨ #data?A
XRL direct,A ;( direct ) ∨ ( A)?direct
XRL direct,#data ;( direct ) ∨ #data?direct
说明:
( 1)目的操作数只能是 A或者 direct;
( 2)前 4条指令仅影响标志位 P;后两条不影响标志位。
( 3)用 1异或使对应位取反,用 0异或使对应位不变,
异或运算常用于使某些位取反。
逻辑操作类指令操作图
3.3.4 控制程序转移类指令包括无条件转移、条件转移、
子程序调用和返回指令等,共 17条。
只有比较转移指令影响标志 。
一、无条件转移指令( 4条)
1、短转移(绝对转移)指令
AJMP addr11 ;先( PC) +2?PC; addr11?PC10~0,( PC15~11)不变说明:( 1)该指令执行前 PC值为下一条指令的首地址;
( 2)转移范围:含有下一条指令首地址的同一个 2KB范围,即高 5位地址相同;
( 3)本指令有 8种操作码。
如,AJMP FIRST
(PC)
2、长转移指令
LJMP addr16 ; addr16?PC
说明:转移范围,64KB全程序空间任何单元。
如,LJMP NEXT
(PC)
3、相对转移(短转移)指令
SJMP rel ;先( PC) +2?PC,后 ( PC) +rel?PC;
说明:( 1)该指令执行前 PC值为下一条指令的首地址;
( 2)转移范围,-128~+127;对应 rel值为:
00H~7FH( 0~+127),80H~FFH( -128~-1);
如,SJMP FIRST
SJMP $ ;无限循环执行本指令,rel=FEH
WEIT,SJMP WEIT ;与上条指令相同
256B
0
4、间接转移指令
JMP @A+DPTR ;( A) +( DPTR)?PC
说明:( 1)具有多分枝转移功能,即散转功能,又叫散转指令;
( 2)转移范围:是以 DPTR为首地址的 256B。
例 3-11 根据累加器 A中的命令键键值,设计命令键操作程序入口跳转表。
CLR C
RLC A
MOV DPTR,#JPTAB
JMP @A+DPTR
JPTAB,AJMP CCS0
AJMP CCS1
AJMP CCS2

二、条件转移指令( 8条)
均为相对寻址方式。
1、累加器 A为零(非零)转移指令
JZ rel ;当 A=0时,( PC) +rel?( PC)转移;;当 A≠0时,顺序执行。
JNZ rel ;当 A≠0时,( PC) +rel?( PC)转移;;当 A=0时,顺序执行。
2、比较转移指令为新增设的,4条,均为三字节指令。一般形式为:
CJNE (目的操作数),(源操作数),rel
CJNE A,direct,rel;若 A >(direct),则 (PC)+rel?PC,且 0?CY;;若 A <(direct),则 (PC)+rel?PC,且 1?CY;;若 A =(direct),则顺序执行,且 0?CY。
CJNE A,#data,rel;若 A > #data,则 (PC)+rel?PC,且 0?CY;;若 A < #data,则 (PC)+rel?PC,且 1?CY;;若 A = #data,则顺序执行,且 0?CY。
CJNE Rn,#data,rel;若( Rn) >#data,则 (PC)+rel?PC,且 0?CY;;若( Rn) < #data,则 (PC)+rel?PC,且 1?CY;;若( Rn) = #data,则顺序执行,且 0?CY。
CJNE @Ri,#data,rel;若 ((Ri)) >#data,则 (PC)+rel?PC,且 0?CY;;若 ((Ri)) <#data,则 (PC)+rel?PC,且 1?CY;;若 ((Ri)) =#data,则顺序执行,且 0?CY。
说明,
( 1) PC值为下一条指令第一个字节的地址,为本条指令 PC值加 3,即( PC) +3?( PC);
( 2) ×?CY,实际是 A-( direct)操作的借位值送 CY;
CY可以作为进一步操作的依据。
如,CJNE A,38H,FIRST
CJNE A,#56H,SECOND
CJNE R2,#32,THIRD
CJNE @R1,#48H,FOURTH
3、循环转移指令
DJNZ Rn,rel ;( Rn) -1?Rn;;若 (Rn)≠0,则 (PC)+rel?PC ;;若 (Rn) = 0,则结束循环,顺序执行
DJNZ direct,rel ;( direct ) -1? direct ;;若 (direct)≠0,则 (PC)+rel?PC ;;若 (direct) = 0,则结束循环,顺序执行说明:
( 1) PC的含义同上;
( 2) Rn,direct相当于控制循环的计数器。
计数器 =0?
计数器 -1
(PC)+rel?PC
结束循环,顺序执行
Y
N
三、子程序调用和返回指令( 3条)
1、短 (绝对 )调用指令
ACALL addr11 ;( PC) +2?PC; (SP)+1?SP,(PC 0~7)?(SP); (SP)+1?SP,(PC 8~15)?(SP); addr0~10?PC0~10,( PC11~15不变)
说明:( 1)该指令执行前 PC值为下一条指令的首地址;
( 2)转移范围:含有下一条指令首地址的同一个 2KB范围,即高 5位地址相同。
如,ACALL SUBJIA
2、长调用指令
LCALL addr16 ;( PC) +3?PC; (SP)+1?SP,(PC 0~7)?(SP); (SP)+1?SP,(PC 8~15)?(SP); addr0~15?PC
说明:( 1)该指令执行前 PC值为下一条指令的首地址;
( 2)转移范围:整个程序存储空间,64KB范围。
如,LCALL SUBJIAN
例 3-12 设( SP) =5FH,符号地址,SUBRTN”指向 5678H,执行指令
0123H LCALL SUBRTN
0126H …….,结果:
26H?60H,[( SP) +1?SP,26H?( SP) ]
01H?61H,[( SP) +1?SP,01H?( SP) ]
5678H?PC,转去执行,SUBRTN”子程序
3、返回指令子程序返回指令
RET ; ((SP))?PC 8~15,(SP) -1?SP; ((SP))?PC 0~7,(SP) -1?SP
中断服务 程序返回指令
RETI ; ((SP))?PC 8~15,(SP) -1?SP; ((SP))?PC 0~7,(SP) -1?SP;开放中断逻辑
3.3.5 位操作类指令包括位变量传送、逻辑运算、控制转移等指令,
共 17条,分成 4个小类。 只有部分指令影响 CY标志 。
位地址的表示方法
( 1)直接用位地址 如,D4H
( 2)用特殊功能寄存器名加位数 如,PSW.4
( 3)用位名称 如,RS1
( 4)用 bit定义的有名字的位地址如,SUB.REG bit RS1,FLAGRUN bit 02H
一、位数据传送指令( 2条)
MOV C,bit ;( bit)?C
MOV bit,C ;( bit)?C
如,MOV C,TR0
MOV 08H,C
二、位修正指令( 6条)
1、位清 0指令
CLR C ; 0? C
CLR bit ; 0?( bit)
如,CLR TR0
2、位置 1指令
SETB C ; 1? C
SRTB bit ; 1?( bit)
如,SETB TR0
SETB 06H
3、位取反指令
CPL C ; ( /C)? C
CPL bit ;( /bit)? bit
如,CPL TR0
CPL EA
三、位逻辑运算指令( 4条)
1、位逻辑“与”指令
ANL C,bit ; ( C) ∧ ( bit)? C
ANL C,/bit ; ( C) ∧ ( /bit)? C
如,ANL C,P1.0
ANL C,/P1.2
2、位逻辑“或”指令
ORL C,bit ; ( C) ∨ ( bit)? C
ORL C,/bit ; ( C) ∨ ( /bit)? C
如,ORL C,P1.0
ORL C,/P1.2
四、位条件转移类指令( 5条)
1、判断 C值转移指令
JC rel ; ( PC) +2? PC; ( C) =1,则( PC) +rel? PC; ( C) =0,则顺序向下执行
JNC rel ; ( PC) +2?PC; ( C) =0,则( PC) +rel? PC; ( C) =1,则顺序向下执行如,JC NEXT1
JNC FIRST
2、判断位值转移指令
JB bit,rel ; ( PC) +2?PC;若 ( bit) =1,则( PC) +rel? PC;若 ( bit) =0,则顺序向下执行
JNB bit,rel ; ( PC) +2?PC;若 ( bit) =0,则( PC) +rel? PC;若 ( bit) =1,则顺序向下执行如,JB BA,NEXT1
JNB TI,$
3、判断位值并清 0转移指令
JBC bit,rel ; ( PC) +2?PC;若 (bit)=1,则 (PC)+rel? PC,0?bit;若 ( bit) =0,则顺序向下执行如,JBC FLAGRUN,NEXT1
第三章作业
4 5 6 10
11 12 13 18 19
31 32 39