nullnull第三章 MCS-51单片机指令系统第一节 MCS-51指令系统的分类、格式及一般说明
第二节 寻址方式
第三节 分类指令null 高级语言
如C++汇编语言
如MCS-51指令汇编目标文件按照语法格式编写源程序*.ASM *.C按照语法格式将源程序翻译成机器代码计算机识别的二进制代码*.OBJ第一节 MCS-51指令系统的分类、格式及一般说明一、111条 MCS-51指令的分类方法一、111条 MCS-51指令的分类方法按照每条指令执行时间划分:
1、单机器周期(12个振荡周期)有64条
2、双机器周期(24个振荡周期)有45条
3、四机器周期(48个振荡周期)有2条
按照每条指令翻译成字节数划分:
1、单字节指令,有49条
2、双字节指令,有45条
3、三字节指令,有17条
按照指令功能划分:
数据传递与交换、算术运算、逻辑运算、程序转移、布尔处理操作、CPU控制等6类。
布尔处理操作类指令又称位操作指令。
null一般分为两部分:操作码和操作数
操作码 :规定指令进行什么操作
操作数:表示指令操作的对象,可以是数或是数据所在的地址,但最终对象都是数据。
汇编语言格式为:[标号:] 操作码助记符 [目的操作数,] [源操作数] [;注释]
MAIN: MOV A , #20H ; #### 二、指令格式按指令的字节数(机器语言)不同,分为一字节指令,二字节指令,三字节指令 1. 一字节指令
8位编码,既包含操作码,又包含操作数
如果指令无操作数(如指令:NOP)或,操作数都在Rn,A,B, DPTR, C中,则该指令一定是一字节指令。null如 INC DPTR
INC A
若是有工作寄存器,则指令码中的rrr三位的不同编码来指定该寄存器
MOV A,Rn 指令码为11101rrr (E8H~EFH)
二字节指令
16位编码,既包含操作码,又包含操作数
如果指令操作数只有一个8位直接地址或立即数,则该指令一定是二字节指令。ADD A,#22HADD A,22Hnull3. 三字节指令
24位编码,既包含操作码,又包含操作数
如果指令操作数有两个8位直接地址或是立即数,或是16位直接地址,
则该指令一定是三字节指令。null三、 指令描述符号介绍Rn——当前选中的寄存器组中的8个工作寄存器R0~R7(n=0~7)。
Ri——当前选中的寄存器组中的可作为间接寻址寄存器使用的2个工作寄存器R0、R1(i=0,1)。
direct—8位的内部数据存储器单元中的地址。可以是内部RAM单元地址或专用寄存器地址。 75H、 0A5H 、P1
#data——包含在指令中的8位立即数。 # 75H、 # 80H、 # 0A5H
#data16——包含在指令中的16位立即数。 # 2480H、 # 0D256H
addr16——16位目的地址。用于长转移指令中,能转移到64KB程序存储器地址空间的任何地方。
addr11——11位目的地址。目的地址应与下一条指令第一个字节在同一个2KB程序存储器的地址空间之内。
rel——8位带符号的偏移字节,简称偏移量。偏移量相对于下一条指令的第一个字节计算,在-128--+127范围内取值。null@——间址寄存器或基址寄存器的前缀, 如@Ri,@DPTR。
/ ——位操作数的前缀,表示对该位操作数取反, 如/bit。
×——片内RAM的直接地址或寄存器。
(×)——直接寻址方式中,表示直接地址X中的内容。注释用
((×))——在间接寻址方式中,表示由间址寄存器X指出的地址单元中的内容。注释用
——箭头左边的内容被箭头右边的内容所代替。注释用DPTR——数据指针,可用作16位地址寄存器。
bit——内部RAM或专用寄存器中的直接寻址位。
A——累加器。
ACC ——直接寻址方式的累加器。
B——专用寄存器,用于乘法和除法指令中。
CY——进位标志或进位位,或布尔处理机中的累加器。null第二节 寻址方式 1、寄存器寻址
2、 直接寻址
3、 寄存器间接寻址
4、 立即寻址
5、 变址寻址
6、 相对寻址
7、 位寻址返回本章首页寻址方式——找到存放数据的地址,提取操作数.null1.寄存器寻址方式
操作数给出形式为寄存器,
操作对象(数据)存放在寄存器当中
例如: MOV A ,R0
MOV R0 , A
寄存器:a.工作寄存器:Rn
b.部分专用寄存器:A、B、DPTR、C
这里源操作数和目标操作数均采用寄存器寻址。 寄存器寻址示意图 如果程序状态寄存器PSW的RS1RS0=10(选中第二组工作寄存器,对应地址为10H~17H),设累加器A的内容为4AH,则执行MOV R1,A 指令后,内部RAM 11H单元的值就变为4AH,如寄存器寻址示意图所示。 寄存器寻址示意图 null2.直接寻址方式:
操作数给出形式为单元地址,
操作对象(数据)存放在单元地址当中
例如: MOV A ,5BH
MOV 5BH , A
直接地址:a. 内部RAM低128字节区
b.专用寄存器区(直接寻址是访问SFR区的唯一方法)
既可用单元地址形式给出,也可用寄存器符号给出
MOV A ,P1 (二字节指令)
MOV A ,90H (二字节指令)直接寻址示意图 直接寻址示意图 88H2BH内部 RAM88HA例如指令:MOV A,2BH 执行的操作是将内部RAM 中地址为2BH的单元内容传送到累加器A中,其操作数2BH就是存放数据的单元地址,因此该指令是直接寻址。
设内部RAM 2BH单元的内容是88H,那么指令MOV A,2BH的执行过程如立即数寻址示意图所示。null3.寄存器间接寻址方式:
寄存器寻址: 寄存器当中存放的是操作对象
寄存器间接寻址:寄存器当中存放的是操作对象(数据)的地址,而不是操作对象本身。
例如: MOV 30H, #20H
MOV R0 , #30H
MOV A ,R0 ;R0 A A=30H
MOV A ,@R0 ; (R0) A A=20H
寄存器间接寻址范围:
a.访问内部RAM(SFR 不能用于寄存器间接寻址) :
只能使用R0和R1来作为间接寄存器,用@Ri表示(i=0、1) MOV A,@Ri
b.访问外部低256字节 :MOVX A,@Ri
c.访问外部RAM所有64K字节: MOVX A,@DPTR
d.访问内部RAM SP, SP隐含了
PUSH B 相当于 MOV @SP,B
POP B 相当于 MOV B,@S
注意:SFR不能用间接寻址方式,只能用 直接寻址方式@null片内RAMR0A30H寄存器间接寻址示意图34H30H34H例如:MOV @R0,A ;内部RAM(R0)←A
其指令操作过程示意图如下图所示。null4 .立即寻址方式: #
操作数就是操作对象(数据)本身,
此时把指令中操作数称为立即数,用#data表示
例如:
MOV A , # 3AH MOV DPTR,#3F00H MOV 30H, #30H
唯一一条16位立即寻址指令: MOV DPTR , #data16
例:MOV A,#2BH立即数寻址示意图 MOV DPTR , #3425H
MOVX A,@DPTR
通常与MOVX A,@DPTR 类指令搭配使用,#data16中表示的是16位的地址null5.变址寻址方式:
变址寻址是指将基址寄存器与变址寄存器的内容相加,结果作为操作数的地址。DPTR或PC是基址寄存器,累加器A是变址寄存器。该类寻址方式主要用于查表操作即访问程序存储器(ROM)中的数据表格,专门针对程序存储器的寻址方式。
例如,指令 MOVC A,@A+DPTR 执行的操作是将累加器A和基址寄存器DPTR的内容相加,相加结果作为操作数存放的地址,再将操作数取出来送到累加器A中。只有三条: MOVC A, @A+DPTR ; A←(A+DPTR)
MOVC A, @A+PC ; A←(A+PC)
JMP @A+DPTR ;程序跳转到以 A+DPTR 为地址的单元null变址寻址示意图10HA2010H2000HDPTR99HMOVC A,@A+DPTRnull6 .相对寻址方式:
相对寻址是指程序计数器PC的当前内容与指令中的操作数相加,其结果作为跳转指令的转移地址(也称目的地址)。相对寻址用于修改PC值,主要用于实现程序的分支转移(跳转)。相当于C语言中的goto语句。
例如:SJMP rel ;PC+rel→PC
注意两点:
a. 当前PC值:执行完该条相对寻址指令后的PC值
所以有:目的地址=指令地址+指令长度+rel
b. rel为8位补码:-128~+127,负数表示向后转移,正数表示向前转移
以指令地址为基点:
向地址增大方向,最大可转移(127+指令长度)个单元地址,
向地址减小方向,最大可转移(128-指令长度)个单元地址。只适用于程序存储器空间null例如,SJMP 06H ;PC←PC+2+06H
指令操作示意图如图3-5所示。
80H08H0300H0301H0302H转移指令地址PC当前PC值0308HPCrel(06H)七、 位寻址七、 位寻址 位寻址只能对有位地址的单元作位寻址操作。位寻址其实是一种直接寻址方式,不过其地址是位地址。在进行位操作时,用进位位C作为位累加器。位地址在指令中用bit表示。
MOV C,3AH
MOV PSW.3 , C
寻址范围:
a. 内部RAM中的位寻址区:16个字节单元 :20H~2FH
128位 :00H~7FH
b.专用寄存器的可寻址位:
可供位寻址的专用寄存器11个,实际寻址位83个,即有些位不能寻址
表示方法:
·直接使用位地址:例如PSW第5位 :0D5H
·位名称 :F0
·单元地址加位 : 0D0H.5
·专用寄存器符号名加位 : PSW.5null※寻址方式小结:寄存器寻址: 工作寄存器R0—R7,A,B,DPTR
直接寻址: 片内RAM低128字节和专用寄存器区,这是SFR区的 唯一寻址方式。
寄存器间接寻址: 片内RAM (@R0, @R1,SP)
片外RAM (@R0, @R1,@DPTR)
变址寻址: 程序存储器(用于访问程序存储器中的数据表格)
相对寻址: 程序存储器256字节范围(解决在ROM内部程序的转移)
null第三节 分类指令 按照指令的功能,可以把MSC-51的111条指令分成五类:
l 数据传送类指令(29条)
l 算术运算类指令(24条)
l 逻辑操作类指令(24条)
l 控制转移类指令(17条)
l 位操作类指令 (17条)
null数据传送类指令小节内部RAM间的数据传送指令(16条)
访问外部RAM的数据传送指令(4条)
访问ROM程序存储器的数据传送指令(2条)
交换类指令(5条)
堆栈指令(2条)一、 数据传送类指令一、 数据传送类指令 数据传送类指令共29条
内部RAM间的数据传送指令(16条)
访问外部RAM的数据传送指令(4条)
访问ROM程序存储器的数据传送指令(2条)
交换类指令(5条)
堆栈指令(2条)null通用格式为: MOV <目的操作数>,<源操作数>
传送指令的约定:从右向左传送数据,是将源操作数送到目的操作数。指令执行后,源操作数不变,目的操作数被源操作数取代。
数据传送类指令用到的助记符有MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP8种。
null<一>以A为目的操作数的指令(4条)
MOV A,Rn ; A (Rn) 如:MOV A,R2
MOV A,direct ; A (direct) 如: MOV A,30H
MOV A,0E3H
MOV A,@Ri ; A ((Ri)) 如: MOV A,@R0
MOV A,#data ; A data 如:MOV A,#36H
MOV A,#0D2Hnull<二>以Rn为目的操作数的指令(3条)
MOV Rn ,A ; ( Rn ) (A) 如:MOV R0,A
MOV Rn ,direct ; ( Rn ) (direct) 如: MOV R3,30H
MOV Rn ,#data ; ( Rn) data 如:
MOV R7,#36H
MOV R1,#30
MOV R6,#01101100Bnull<三>以直接地址为目的操作数的指令(5条)
MOV direct,A ; direct (A) 如:MOV 30H,A
MOV direct,Rn ; direct ( Rn ) 如:MOV P1,R2
MOV direct1,direct2 ; (direct1) (direct2 )
如:MOV 38H,60H
MOV direct,@Ri ; direct (( Ri ) )如: MOV TL0,@R1
MOV direct,#data ; direct data 如: MOV 58H,#36H null<四>以间接地址为目的操作数的指令(3条)
MOV @Ri,A ; ((Ri)) ( A ) 如:MOV @R0,A
MOV @Ri,direct ; ((Ri)) ( direct )如:MOV @R1,36H
MOV @R0,SBUF
MOV @Ri,#data ; ((Ri)) data 如: MOV @R1,#48
MOV @R0,#0D6Hnull不允许的操作有:@Ri@Ri RnRn @RiRn
注意:MOV Rn,Rn x
MOV @Ri, @Ri x
MOV Rn, @Ri x
MOV #data, A x
等等指令是非法指令。MOV指令在片内RAM的允许操作图null<五>十六位数据传送指令(1条)
MOV DPTR,#data16 ; (DPH) dataH8 ,(DPL) dataL8
如:MOV DPTR,#2368H MOV DPH,#23H
MOV DPL,#68H
MOV DPTR,#35326
null举例:设内部RAM40H单元的内容为30H,30H单元的内容为20H,20H单元的内容为10H,端口P1的内容为AAH,试问结果如何?
MOV R0, #40H
MOV A ,@R0
MOV R1,A
MOV B,@R1
MOV @R1,P1
MOV P2,P1
MOV 40H,#10H
问:R0=? R1=? B=? (40H)=? (30H)=? P2=? (20H)=?;A=30H
; R1=30H
; B=20H
; (30H)=AAH
; P2=AAH
; (40H)=10H改为MOV R0, 40H; A=20H
; R1=20H
; B=10H
; (20H)=AAH
; P2=AAH
; (40H)=10H
null<六>程序存储器数据传送指令(查表指令)(2条)
MOVC A,@A+DPTR ; A ((A)+(DPTR))
一般DPTR放表的首地址,A放所查数据在表中的偏移;查表范围为64KB空间,称为远程查表。
MOVC A, @A+PC ; A ((A) + (PC))
PC的值为下条指令的地址, A放所查数据相对PC值的偏移;查表范围为最大为256B空间,称为近程查表。
注意:内外程序存储器在逻辑上连续统一,传送单向,只读。
这类指令用于访问程序存储器中的数据表格。
null例1:近程查表
地址 标号 语句
2000 HBA:INC A ;A=(00H--0FH)
2001 MOVC A,@A+PC ;查表
2002 RET
TAB:DB 30H ;0的ASC码
DB 31H ;1的ASC码
。。。
DB 39H ;9的ASC码
DB 41H ;A的ASC码
。。。
DB 46H ;F的ASC码
例如A初值01H,查表得31H; A初值0FH,查表得46Hnull例2 远程查表
设程序中的数据表格为:
执行程序:
1000H:MOV A,#10H
1002H:PUSH DPH
1004H:PUSH DPL
1006H:MOV DPTR,#7000H
1009H:MOVC A,@A+DPTR ;
100AH: POP DPH
100CH:POP DPL
结果为:(A)= ,(PC)= ,(DPTR)=7010H:02H
7011H:04H
7012H:06H
7013H:08H02H 100EH 原值高低字节互换A (10H+7000H)null<七>累加器A与片外RAM的数据传送指令(4条)
用间址方式
MOVX A,@Ri ; A ((Ri)),且使/RD=0
MOVX A, @ DPTR ; A ((DPTR)),且使/RD=0
MOVX @Ri,A ; ((Ri)) (A) ,且使/WR=0
MOVX @ DPTR , A ; ((DPTR )) (A) ,且使/WR=0
注意:1、外部数据的传送只能使用A
2、@ DPTR两条指令以DPTR为片外RAM16位地址指针,寻址范围为64KB空间;P2输出高8位地址,P0口输出低8位地址和数据,分时复用
3、 @Ri两条指令以R0或R1作低8位地址指针,由P0口送出,寻址范围为256B空间(P2口仍可作通用I/O口)。null例:将外部RAM中F5H单元中的内容送到0645H单元中
MOV DPTR,#0645H
MOV R0,#0F5H
MOVX A , @R0
MOVX @DPTR , AMOV R0,#0F5H
MOVX A ,@R0例:将外部RAM中0F5H单元中的内容送到A单元中。null<八>交换指令(5条)
1、字节交换指令
XCH A,Rn ; (A) ( Rn )
XCH A,direct ; (A) ( direct )
XCH A,@Ri ; (A) (( Ri ))
2、半字节交换指令
(1)低半字节交换指令
XCHD A,@Ri ; (A) 0 ~3 (( Ri ) ) 0~3
将A的低4位与Ri间址单元的低4位内容交换,高4位不变。null如:设( A ) =36H, ( R1 ) =65H, ( 65H ) =42H
XCHD A,@R1 ; ( A ) =32H, ( 65H ) =46H(2)累加器A高、低半字节交换指令
SWAP A ; ( A ) 0~3 (A ) 4~7
如:设(A)=36H
SWAP A ;(A)=63Hnull<九>堆栈操作指令(2条)
进栈:PUSH direct ;先(SP)+1SP,后 (direct ) (( SP ))
出栈:POP direct ;先(( SP)) direct,后(SP)-1SP
如:PUSH 0E0H ;实际是(SP)+1SP,( A ) (( SP ))
POP 05H ;实际是(( SP )) R5 , (SP)-1SP
注意:其操作数为直接地址,不能用寄存器名。
POP ACC 正确
POP A 错误null例、进入中断服务程序,要将DPTR、PSW和A的内容保护起来。设DPTR=0123H,PSW=25H,A=10H,当前SP=30H,问执行下列入栈后结果如何?
PUSH DPL ;SP=31H,(31H)=23H
PUSH DPH ;SP= (32H)=
PUSH PSW ;SP= (33H)=
PUSH ACC ;SP= (34H)=
POP DPL ;DPL=10H,SP=33H。
POP DPH ;DPH= SP=
POP PSW ;PSW= SP=
POP ACC ;ACC= SP=32H01H31H25H34H10H25H32H01H33H23H30Hnull三、算术运算指令
共24条指令,分成七个小类
不带进位加法指令(4条)
带进位加法指令(4条)
带借位减法指令(4条)
加1指令(5条)
减1指令(4条)
乘除法指令(2条)
进制数调整指令(1条)
主要是对8位无符号数进行算术运算。算术运算结果将影响PSW的有关位。null<一>、不带进位加法指令(4条)
ADD A,Rn ;( A ) ( A ) + ( Rn )
ADD A,direct ; ( A ) ( A ) + ( direct )
ADD A,@Ri ; ( A ) ( A ) + (( Ri ))
ADD A,#data ; ( A ) ( A ) +#data
注意:如果位3有进位,则半进位标志位AC置1,否则清零。
如果位7有进位,则进位标志位CY置1,否则清零。
如果两个数(看作有符号数时)相加溢出,则OV置1,否则清零。
如果两个同符号数相加的结果变号即溢出,则OV置1,否则清零。null例:(A)=0C3H,(R0)=0AAH
执行“ADD A,R0”的和为6DH,标志位CY= ,OV= ,AC= , P= 。
OV=C7 C6 对第6、第7位的进位位C7、C6异或。
例:(A)=0BAH,(R0)=88H
执行“ADD A,R0”的和为42H,标志位CY= ,OV= ,AC= , P= 。
OV=C7 C6 对第6、第7位的进位位C7、C6异或。1 1 0 11 1 1 0两个同符号数相加的结果变号,则OV置1,否则清零。null<二>带进位加法指令(4条)
ADDC A,Rn ; (A)(A)+ (Rn) +CY
ADDC A,direct ; (A)(A) + (direct) +CY
ADDC A,@Ri ; (A)(A) + ((Ri)) +CY
ADDC A,#data ; (A)(A) +#data +CY
C为来自PSW状态寄存器中的进位位C。
把源操作数指出的内容和进位标志CY都同累加器A的内容相加,结果放于A中。多用于多字节数的加法。null例:两个16位无符号数相加。设被加数在内部RAM中30H(低位)、31H中,加数存放在内部RAM中40H (低位) 、41H单元中,将相加的结果存放到30H、31H和32H单元中。 MOV R0,#30H ;被加数低8位地址
MOV R1,#40H ;加数低8位地址
CLR C ;清CY
MOV A,@R0 ;取被加数低8位
ADD A,@R1 ;与加数低8位相加
MOV @R0,A ;和存入30H单元
INC R0 ;指向高8位地址
INC R1
MOV A,@R0 ;取被加数高8位
ADDC A,@R1 ;与加数高8位及进位位相加
MOV @R0,A ;结果存入31H单元
CLR A ;清A
ADDC A,#00H ;处理进位
INC R0 ;
MOV @R0,A ;进位存入32Hnull <三>、带借位减法指令(4条)
SUBB A,Rn ; (A)(A) - CY - (Rn)
SUBB A,direct ; (A)(A) - CY - (direct)
SUBB A,@Ri ; (A)(A) - CY - ((Ri))
SUBB A,#data ; (A)(A) - CY - #data
注意: 如果位3有借位,则半进位标志位AC置1,否则清零。
如果位7有借位,则进位标志位CY置1,否则清零。
如果两个数(看作有符号数时)相减溢出,则OV置1,否则清零。
如果两个异号数相减的结果与被减数符号不同即溢出,OV置1,否则清零。
无不带借位减法指令,需要时,先执行一条CLR C指令既可。例:(A)=0D1H,(R0)=54H (CY)=1
执行“SUBB A,R0”的结果为 ,标志位CY= ,OV= , AC= ,P= 。 7CH 0 1
1 1 null<四>、加1指令(5条)
INC A ; (A) (A)+1
INC Rn ; ( Rn ) ( Rn ) +1
INC direct ; (direct ) (direct ) +1
INC @Ri ; (( Ri )) (( Ri )) +1
INC DPTR ; ( DPTR ) ( DPTR ) +1
说明:INC A 影响P外,不影响PSW其它位(即标志位CY、AC、OV)。
例:MOV A,#0FEH ;P=1
INC A ;P=0null <五>、减1指令(4条)
DEC A ; (A) (A)-1
DEC Rn ; ( Rn ) ( Rn ) -1
DEC direct ; (direct ) (direct ) -1
DEC @Ri ; (( Ri )) (( Ri )) -1
DEC DPTR ; 无此指令
说明:DEC A 影响P外,不影响PSW其它位(即 标志位CY、AC、OV)。
例:MOV A,#0FFH ;P=0
DEC A ;P=1null<六>、乘除法指令(2条,单字节四周期指令)
1、乘法指令
MUL AB ; (A) x (B)B15~8,A7~0
说明:(1)为无符号乘法;
(2)若结果的B≠0 (乘积大于255) ,则OV=1,若B=0,则OV=0;CY总是清零,AC不影响,P影响。
2、除法指令
DIV AB ; (A)/ (B)的商A,余数B
说明:(1)为无符号除法;
(2)若除数B=0 (除法无意义) ,则OV=1,若B≠ 0,则OV=0;CY总是清零,AC不影响,P影响。null <七>、十进制数调整指令(1条)
DA A ;调整累加器内容为BCD码(二进制编码的十进制)
说明:
(1)此指令跟在ADD或ADDC指令之后,将A中的和调整为BCD码,并且ADD或ADDC的两个操作数是BCD码,即两个BCD码相加必须经过DA A指令后,才能得到正确的BCD码的结果。
(2)调整方法:
若(A0~3 ) >9或AC=1,则(A0~3 ) +6 (A0~3 ) ;
若( A4~7 )>9或CY=1,则(A4~7 ) +6 (A4~7 );
若( A4~7 ) ≥9且(A0~3 ) >9,则(A)+66H (A);
二---十进制编码BCD码 二---十进制编码BCD码 例:求十进制数876的BCD码
[876]BCD =1000 0111 0110
876= 36CH =0011 0110 1100BBCD码(Binary Coded Decimal)
二进制代码表示的十进制数。8421 BCD码 BCD码运算BCD码运算十进制调整:计算机实际按二进制法则计算,加入
十进制调整操作,可计算BCD码。
例:计算BCD码 56+67=?
0101 0110 [56]BCD
+ 0110 0111 + [67]BCD
1011 1101 产生非BCD码和半进位
+ 0110 0110 +66H调整
1 0010 0011 带进位结果: 123 null执行DA A后,CPU根据累加器的值,以及AC、CY的状态,来自动的对A进行修正,不需人为的干预。
注意: 1、DA指令不对减法进行修正
例:MOV A,#16
ADD A,#16
DA A
A=?
MOV A,#56H
ADD A,#67H
DA A
A=? CY=? 20H 23H 1null四、逻辑运算指令
包括与、或、异或、清除、求反、移位等操作。这类指令一般不影响标志位CY、AC和OV。
共24条指令,分成五个小类。
<一>、逻辑“与”指令(6条)<二>、逻辑“或”指令(6条)<三>、逻辑“异或”指令(6条)<四>、累加器A清0与取反指令(2条) <五>、移位指令(4条)逻辑运算是按位进行的;
当需要只改变字节数据的某几位,而其余位不变时,不能使用直接传送方法,只能通过逻辑运算完成。null<一>、逻辑“与”,“或”,“异或”指令(18条)
ANL(ORL,XRL) A,Rn
ANL(ORL,XRL) A,direct
ANL(ORL,XRL) A,@Ri
ANL(ORL,XRL) A,#data
ANL(ORL,XRL) direct,A
ANL(ORL,XRL) direct,#data
null说明:
(1)目的操作数只能是A或者direct; 按位进行操作
(2)前4条指令仅影响标志位P;后两条不影响标志位;
(3)“与”运算常用于使某些位清0;“或”或运算常用于使某些位置1;“异或”运算常用于使某些位取反或不变:用1异或使对应位取反,用0异或使对应位不变,例:试分析下列程序执行结果
MOV A,#0FFH
ANL P1,#00H
ORL P1,#55H
XRL P1,A;(A)=0FFH;SFR中P1口清零;P1口内容为55H;P1口内容为0AAHnull<二>、累加器A清0与取反指令(2条)
1、累加器A清 0 指令
CLR A ; (A) 0
说明:只影响标志位P。
2、累加器A取反指令(按位取反)
CPL A ;(A) (/A) ,相当于0FFH - A A
说明:不影响标志位。
如: (A)=56H
CPL A ;结果为0A9Hnull <三>、移位指令(4条)
1、累加器A循环左移
RL A ;
2、累加器A循环右移
RR A ;
3、累加器A带进位位循环左移
RLC A ;
4、累加器A带进位位循环右移
RRC A ;
说明:
(1)各条指令每次只移动一位;
(2)左移一位相当于乘以2;右移一位相当于除以2;
(3)带进位位移动的影响标志位CY和P。null
RL A
RR A
RLC A
RRC A0 0 1 1 1 1 0 1 3BH0 1 1 1 1 0 1 0 7AH0 0 1 1 1 1 0 1 3BH1 0 0 1 1 1 1 0 9EH0 0 1 1 1 1 0 1 3BH1 0 0 1 1 1 1 0 9EH0 0 1 1 1 1 0 1 3BH0 1 1 1 1 0 1 1 7BH1 0 1 1 null五、控制转移类指令
包括无条件转移、条件转移、子程序调用和返回指令等,共17条。
只有比较转移指令影响标志。
<一>、无条件转移指令(4条)
<二>、条件转移指令(8条)<三>、子程序调用和返回指令(4条)<四>、空操作指令(1条)null1、长转移指令
LJMP addr16 ; (PC) addr16
说明:转移范围:64KB全部程序空间任何单元。
如:
LJMP NEXT(PC)<一>、无条件转移指令(4条)null2、绝对转移指令
AJMP addr11 ;先(PC) (PC)+2
;再( PC10~0 ) addr11, ( PC15~11 )不变
说明: (1)两字节编码
(2)转移范围:含有下一条指令首地址的同一个2KB范围,即 高5位地址相同 ;
如:
2800H AJMP SUB
若SUB=543H
则PC=?(PC)2D43Hnull 3、短转移指令
SJMP rel ;先(PC)+2(PC),后(PC)+rel(PC)
说明:(1)两字节编码
(2)rel是补码形式存在,转移范围:-128~+127;对应rel值为:00H~7FH(0~+127)、80H~FFH(-128~-1);
如:
HERE: SJMP HERE ;无限循环执行本指令,REL= ?
SJMP $ ;与上条指令相同
例:
1100H SJMP 25H
PC=?
1100H SJMP E7H
PC=?FEH三种跳转对比三种跳转对比
AJMP addr11 LJMP addr16 SJMP rel
11位地址,跳转2K 16位地址,跳转64K 8位地址,跳转256
256
2K 64Knull 4、间接转移指令
JMP @A+DPTR ;(A)+(DPTR)(PC)
说明:(1)具有多分枝转移功能,即散转功能,又叫散转指令;
(2)转移范围:是以DPTR为首地址的256B。 DPTR作为基址寄存器,A作为变址寄存器。转移范围64KB.
null例 根据累加器A中的命令键键值,设计命令键操作程序入口跳转表。
CLR C
RLC A
MOV DPTR,JPTAB
JMP @A+DPTR
JPTAB: AJMP CCS0
AJMP CCS1
AJMP CCS2
AJMP CCS3
:1、本程序为典型的散转程序,非常适合类似根据键盘值跳转。
2、A必须取偶数的原因是:AJMP为双字节指令;如果全部改为
LJMP三字节指令,则A必须为0、3、6、9、12时,程序才能正
确散转。null<二>、条件转移指令(8条) 均为相对寻址方式。
1、累加器A为零(非零)转移指令(2条)
JZ rel ;当A=0时,(PC)+2+rel(PC)转移;
;当A≠0时,顺序执行(PC)+2(PC) 。
JNZ rel ;当A≠0时, (PC)+2+rel(PC)转移;
;当A=0时,顺序执行(PC)+2(PC) 。null例 将外部RAM的一个数据块(首址为DATAl)传送到内部RAM(首址为DATA2),遇到传送的数据为零时停止。解: START:MOV R0,#DATA2 ; 置内部RAM数据指针
MOV DPTR,#DATAl ; 置外部RAM数据指针
LOOPl:MOVX A,@DPTR ; 外部RAM单元内容送A
JZ LOOP2 ; 判传送数据是否为零,A为零则转移
MOV @R0,A ; 传送数据不为零,送内部RAM
INC R0 修改地址指针
INC DPTR
SJMP LOOP1 ; 继续传送
LOOP2:RET ; 结束传送,返回主程序null 2、比较转移指令(4条)
均为三字节指令。一般形式为:
CJNE X1(目的操作数),X2(源操作数),rel
语句说明:CJNE X1 , X2,rel
;若X1 > X2 ,则(PC)+3+rel ( PC ) ,且0CY ;
;若X1 < X2 ,则(PC) +3 +rel ( PC ) ,且1CY ;
;若X1 = X2 ,则顺序执行(PC)+3 ( PC ) ,且0CY。
实质是进行一次减法操作。(目的操作数-源操作数),相减结果若为负,则借位标志CY置1。不影响两个操作数CJNE A,direct,rel
CJNE A,#data,rel
CJNE Rn,#data,rel
CJNE @Ri,#data,relnullnullrel可以是转移目标地址的标号
例:设变量X存放在40H单元,要求编写按下式给Y赋值的程序,结果存入41H
X>0,Y=2;
X=0,Y=0
X<0,Y=-2
null解:参考程序如下
MOV A,40H ;取X
JZ NEX2 ;X=0,转NEX2
JNB ACC.7,NEX1 ;X>0,转NEX1
MOV A,#FEH ;X<0,则A= -2
SJMP NEX2
NEX1:MOV A,#02H
NEX2:MOV 41H,A
SJMP $
null 3、减1非零条件转移指令(2条)
DJNZ Rn,rel ;(Rn)-1Rn;
;若(Rn)≠0, 则(PC)+2+rel PC ;
;若(Rn) = 0, 则结束循环, 顺序执行(PC)+2 PC
DJNZ direct,rel ;( direct )-1 direct ;
;若(direct)≠0,则(PC)+3+rel PC ;
;若(direct) = 0,则结束循环, 顺序执行(PC)+3 PC
说明:
Rn、direct相当于控制循
环的计数器
。null例:将外部RAM地址1000H~10FFH的256个单元清零。
MOV R2,#0FFH
MOV DPTR,#1000H
CLR A
LOOP: MOVX @DPTR,A
INC DPTR
DJNZ R2,LOO
本文档为【第3章 MCS-51单片机指令系统】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。