1、第三章第三章 89C51单片机单片机指令系统指令系统Exit3.3 89C51单片机指令系统单片机指令系统3.1 汇编语言汇编语言3.2 寻址方式寻址方式3.4 程序设计举例程序设计举例指令学习要点指令学习要点 了解指令的操作了解指令的操作 了解指令的寻址格式了解指令的寻址格式 了解指令对程序状态字的影响了解指令对程序状态字的影响 合理使用指令合理使用指令3.1 汇编语言汇编语言3.1.1 指令和程序设计语言指令和程序设计语言3.1.2 指令格式指令格式BACK3.1 汇编语言汇编语言计算机指令系统是一套控制计算机操作的编码,称为机器语言。 计算机只能识别和执行机器语言的指令。 为了便于记忆和
2、使用,通常用符号指令符号指令(即汇编语言)来描述计算机的指令系统。 不同的计算机有不同的汇编语言不同的计算机有不同的汇编语言。 BACK3.1.1 指令和程序设计语言指令和程序设计语言指令:指令: 是CPU根据人的意图来执行某种操作的 命令。指令系统:指令系统:一台计算机所能执行的全部指令的集合。要使计算机按照人的思维完成一项工作,就必须让CPU按顺序执行各种操作。 即一步步地执行一条条的指令。 3.1.1 指令和程序设计语言指令和程序设计语言程序:程序:按人的要求编排的指令操作序列称为程序。程序设计:程序设计:编写程序的过程就叫作程序设计。3.1.1 指令和程序设计语言指令和程序设计语言程序
3、设计语言是实现人机交换信息的基本工具,分为:机器语言机器语言汇编语言汇编语言高级语言高级语言3.1.1 指令和程序设计语言指令和程序设计语言l机器语言:机器语言:用二进制编码表示每条指令,是计算机能直接识别和执行的语言。用机器语言编写的程序称为机器语言程序或指令程序(机器码程序)。 因为机器只能直接识别机器码程序,所以又称它为目标程序目标程序。3.1.1 指令和程序设计语言指令和程序设计语言l机器语言举例:机器语言举例:要做“10+20”的加法,在MCS-51中可用机器码指令编程:0111010001110100 0000101000001010 把10放到累加器A中;00100100 001
4、00100 0001010000010100 A加20,结果仍放在A中为了便于书写和记忆,可采用十六进制表示指令码:74 74 0AH0AH2424 14H14H3.1.1 指令和程序设计语言指令和程序设计语言l机器语言特点:机器语言特点:用机器语言编写程序不易记忆,不易查错,不易修改。 3.1.1 指令和程序设计语言指令和程序设计语言l汇编语言:汇编语言:用助记符、符号和数字等来表示指令的程序设计语言。它与机器语言指令是一一对应的。它与机器语言指令是一一对应的。 3.1.1 指令和程序设计语言指令和程序设计语言l汇编语言举例:汇编语言举例:例如:例如:“10+20”10+20”例子可写成例子
5、可写成: :汇编语言程序汇编语言程序 机器语言程序机器语言程序MOV AMOV A,#0AH #0AH 7474 0AH0AHADD AADD A,#14H #14H 24 24 14H14H3.1.1 指令和程序设计语言指令和程序设计语言l汇编语言特点:汇编语言特点:用与CPU的硬件结构紧密相关。不同的CPU其汇编语言是不同的。 汇编语言程序不能移植,使用不便汇编语言程序不能移植,使用不便。用汇编语言进行程序设计必须了解所使用的CPU硬件的结的与性能,对程序设计人员有较高的要求。 3.1.1 指令和程序设计语言指令和程序设计语言l高级语言:高级语言:脱离具体机器的语言。3.1.2 指令格式指
6、令格式p89C5189C51汇编语言指令由汇编语言指令由操作码助记符字段和操作数字段两部分组成。p指令格式如下指令格式如下: : 操作码操作码 目的操作数目的操作数 ,源操作数,源操作数 ;注释;注释 例如例如:MOVA,#00H 3.1.2 指令格式指令格式p操作码部分操作码部分 规定了指令所实现的操作功能,由2-5个英文字母表示。例如,JB, MOV,DJNZ,LCALL等。3.1.2 指令格式指令格式p操作数部分操作数部分 指出了参与操作的数据来源和操作结果存放的目的单元。 操作数可以直接是一个数(立即数), 或者是一个数据所在的空间地址,即在执行指令时从指定的地址空间取出操作数。 3.
7、1.2 指令格式指令格式p操作码和操作数都有对应的二进制代码,指令代码由若干字节组成。 p对于不同的指令,指令的字节数不同。p89C51指令系统中,有: 1 1、单字节指令、单字节指令 、双字节指令、双字节指令 、三字节指令。、三字节指令。 1 1、单字节指令、单字节指令p单字节指令中的8位二进制代码 既包含操作码的信息,也包含操作数的信息。 p这种指令有两种情况。1)指令码中隐含着对某一种寄存器的操作2)由指令中的rrr三位的不同编码指定某一寄存器1 1、单字节指令、单字节指令1)指令码中隐含着对某一种寄存器的操作INCINC DPTRDPTR指令代码:指令代码:A3H=A3H=1 1 1
8、0 1 r r r1 1 1 0 1 r r r1 1、单字节指令、单字节指令2)由指令中的rrr三位的不同编码指定某一寄存器 MOV AMOV A,RnRn指令代码:指令代码:2、双字节指令、双字节指令p用一个字节表示操作码,另一个字节表示操作数或操作数所在的地址。p格式为:操作码操作码立即数或地址立即数或地址3 3、三字节指令、三字节指令p一个字节操作码,两个字节操作数。p格式为:操作码操作码立即数或地址立即数或地址立即数或地址立即数或地址3.2 寻址方式寻址方式3.2.0 寻址的概念3.2.1 寻址方式的种类3.2.2 寻址空间及符号注释3.2.0 寻址的概念4寻址寻址: :就是寻找指令
9、中操作数或操作数所在地址。4寻址方式:寻址方式:就是如何找到存放操作数的地址,把操作数提取出来的方法。 寻址方式是计算机的重要性能指标之一,也是汇编语言程序设计中最基本的内容之一,必须十分熟悉,牢固掌握。3.2.1 寻址方式的种类11、寄存器寻址12、直接寻址13、立即数寻址14、寄存器间接寻址 15、变址寻址16、相对寻址 17、位寻址1 1、寄存器寻址、寄存器寻址p由指令指出寄存器组R0R7中的某一个或其他寄存器(A,B,DPTR等)的内容作为操作数。p例如例如: p MOV A,R0; (R0)Ap MOV P1,A; (A)P1口p ADD A,R0; (A)+(R0)A2、直接寻址、
10、直接寻址p在指令中直接给出操作数所在存储单元的地址。指令中操作数部分是操作数所在地址。p例如:例如:p MOV A,3AH; (3A) Ap MOV A,P1; (P1口) A p或: MOV A,90H; 90H是P1口的地址2、直接寻址、直接寻址p直接寻址方式可访问:片内RAM的128个单元、所有的SFR。对于SFR,既可以使用它们的地址,也可以使用它们的名字。p直接寻址的地址占一字节,所以,一条直接寻址方式的指令至少占内存两个单元。 2、直接寻址、直接寻址p注意下面指令的区别:MOV A,20HMOV C,20H3、立即数寻址、立即数寻址p指令操作码后面紧跟的是一字节或两字节操作数,用“
11、#”号表示,以区别直接地址。p例如:pMOV A,3AH;(3AH)ApMOV A,#3AH;3AHApMOV DPTR,#2000H;2000HDPTR ;(DPH)=20H ;(DPL)=00H4 4、寄存器间接寻址、寄存器间接寻址 p操作数的地址事先存放在某个寄存器中,p寄存器间接寻址是把指定寄存器的内容作为地址,由该地址所指定的单元内容作为操作数。p89C51规定R0R0、R1R1为间接寻址寄存器,它可寻址内部地址RAM低位的128B单元内容。p还可采用DPTRDPTR作为间接寻址寄存器,寻址外部数据存储器的64KB空间。p例如例如:例如:将片内将片内RAM 65HRAM 65H单元内
12、容单元内容47H47H送送A A,可执,可执行指令行指令“MOV AMOV A,R0”R0”。其中。其中R0R0内容为内容为65H65H。如图所示:。如图所示:65H47HR0A47H数据存储器数据存储器地址地址65H以指令中所指定的以指令中所指定的R0内内容(容(65H)为指针)为指针将片内将片内RAM 65H单单元内容元内容47H送送A5、变址、变址寻址寻址( (基址寄存器基址寄存器+ +变址寄存器间接寻址变址寄存器间接寻址) )p以某个寄存器的内容为基地址,在这个基地址的基础上加上地址偏移量形成真正的操作数地址。p89C51中没有专门的变址寄存器。而是采用DPTRDPTR或或PCPC为变
13、址寄存器,A A的内容为地址偏移量。p变址寻址只能访问程序存储器,访问范围为64KB。p例如例如:例如:MOVC AMOVC A,A+DPTRA+DPTR1EH0302HROMDPTRAA02F1H11H1EH+DPTRDPTR内容与内容与A A的内容之和的内容之和为程序存储器地址为程序存储器地址程序存储器内容送程序存储器内容送A A6、相对寻址、相对寻址 p相对寻址只出现在相对转移指令中。p以当前的PC值加上指令中规定的偏移量rel而形成实际的转移地址。p当前的当前的PCPC值值是指执行完相对指令后的PC值;p相对转移指令操作码所在地址称为源地址;p转移后的地址称为目的地址。6、相对寻址、相
14、对寻址 目的地址目的地址= =源地址源地址+ +相对转移指令字节数相对转移指令字节数+rel+relrel为补码表示的有符号数。7、位寻址、位寻址p采用位寻址方式的指令的操作数是8位二进制数中的某一位,指令中给出的是位地址。p位地址在指令中用bit表示。p例如:CLR bit;p位地址的两种表示方法:位地址的两种表示方法:直接使用位地址,如D3H;直接用寄存器名字加位数,如PSW.3。7、位寻址、位寻址p位寻址空间:位寻址空间:片内RAM的20H-2FH的16个字节单元中的128位(位地址:00HFFH)部分SFR(字节地址能被8整除的SFR)3.2.2 寻址空间及符号注释1 1、寻址空间、寻
15、址空间2 2、符号注释、符号注释1 1、寻址空间、寻址空间2、符号注释符号注释 Rn(n=0-7)Rn(n=0-7):当前选中的工作寄存器组:当前选中的工作寄存器组R0-R7R0-R7。 Ri(i=0,1)Ri(i=0,1):作为地址指针两个工作寄存器:作为地址指针两个工作寄存器R0R0, R1R1。 #data#data:8 8位立即数。位立即数。 #data16#data16:1616位立即数。位立即数。 directdirect:8 8位片内位片内RAMRAM单元单元( (包括包括SFR)SFR)的直接地址。的直接地址。 addr11addr11:1111位目的地址,用于位目的地址,用于
16、ACALLACALL和和AJMPAJMP指指 令中。令中。 addr16addr16:1616位目的地址。用于位目的地址。用于LCALLLCALL和和LJMPLJMP指指 令中。令中。2、符号注释符号注释 relrel:补码表示的:补码表示的8 8位地址偏移量。位地址偏移量。 范围:范围:-128 +127D-128 +127D。 bitbit:片内:片内RAMRAM或或SFRSFR的直接寻址位地址。的直接寻址位地址。 :间接寄存器的符号。:间接寄存器的符号。 / /:位操作指令中对该位先取反再参与操作,不影:位操作指令中对该位先取反再参与操作,不影响原值。响原值。 ( () ):中的内容。中
17、的内容。 ( () ):指出的地址单元中的内容。指出的地址单元中的内容。 :指令操作流程方向。:指令操作流程方向。3.3 89C51单片机指令系统单片机指令系统&3.3.0 绪绪&3.3.1 数据传送指令数据传送指令&3.3.2 算术运算指令算术运算指令&3.3.3 逻辑运算及移位指令逻辑运算及移位指令&3.3.4 控制程序转移指令控制程序转移指令&3.3.5 位操作指令(布尔操作)位操作指令(布尔操作)3.3.0 绪绪p89C51指令系统由111条指令组成。p单字节指令49条,双字节指令45条,三字 节指令17条。 p单周期指令64条,双周期45条, 只有乘、除指令为4个周期。3.3.0 绪
18、绪p指令系统可分为五大类指令系统可分为五大类: :数据传送指令:28条算术运算指令:24条逻辑运算及移位指令:25条控制转移指令:17条位操作指令(布尔操作):17条3.3.1 数据传送指令数据传送指令11.以累加器A为目的操作数的指令 (4条,即4种寻址方式)1 2.以寄存器Rn为目的操作数的指令(3条)1 3.以直接地址为目的操作数的指令(5条)1 4.以间接地址为目的操作数的指令(3条)p最基本、最重要的操作。 3.3.1 数据传送指令数据传送指令15.十六位数据传送指令(1条)16.查表指令(2条)17.累加器A与片外RAM传送指令(4条)18.栈操作指令(2条)19.交换指令(4条)
19、1 1、以累加器、以累加器A A为目的操作数的指令为目的操作数的指令 (4(4条条, ,即即4 4种寻址方式种寻址方式) )MOV A, Rn MOV A, directMOV A, RiMOV A, #data例:例:(30H)=11H, (R1)=30H MOV A MOV A,#30H #30H ;(;(A A)=30H=30H MOV A MOV A, 30H 30H ;(A A)=11H=11H MOV A MOV A,R1 R1 ;(;(A A)=11H=11H MOV A MOV A,R1 R1 ;(;(A A)=30H =30H 2 、以寄存器、以寄存器Rn为目的操作数的指令(
20、为目的操作数的指令(3条)条)MOV Rn, A MOV Rn, directMOV Rn, #data注意注意: : 在8051指令系统中没有 “MOV Rn,Rn”传送指令。例如:例如:(A A)=78H=78H,(,(R5R5)=47H=47H,(70H70H)=F2H=F2H,执行指令:,执行指令: MOV R5,A ; (R5)=78H MOV R5,70H ; (R5)=F2H MOV R5,#A3H; (R5)=A3H3 、以直接地址为目的操作数的指令(、以直接地址为目的操作数的指令(5条)条)MOV direct, A MOV direct, Rn MOV direct, di
21、rect MOV direct, Ri MOV direct, #datap这组指令的功能是把源操作数所指定的内容送入由直接地址直接地址directdirect所指出的片内存储单元中。p源操作数有寄存器寻址,直接寻址,寄存器间接寻址和立即寻址等方式。3 、以直接地址为目的操作数的指令(、以直接地址为目的操作数的指令(5条)条)4 、以间接地址为目的操作数的指令(、以间接地址为目的操作数的指令(3条)条)MOV Ri, A MOV Ri, direct MOV Ri, #data(Ri)表示Ri中的内容为指定的RAM单元。 Ri 为 R0, R1 5、 十六位数据传送指令十六位数据传送指令(1条
22、条) 这条指令的功能是把16位常数送入DPTR。 DPTR由DPH和DPL组成。MOV DPTR, #data16例:例: MOV DPTR, #1000H(DPTR)=1000H, (DPH)=10H, (DPL)=00H 5、 十六位数据传送指令十六位数据传送指令(1条条)6 、查表指令(、查表指令(2条)条)MOVC A,A+DPTR; 先(PC)+1PC, 后(A)+(DPTR) A (远程查表) MOVC A, A+PC; 先(PC)+1PC, 后(A)+(PC) A (近程查表)基地址寄存器+变址寄存器间接寻址PC+A(程序存储器0-64K)基地址寄存器+变址寄存 器间接寻址DPT
23、R+A(程序存储器0-64K)A寄存器程序存贮器传送程序存贮器传送例例: :若初始若初始ROM内容为:内容为: 1010H02H1011H04H1012H06H1013H08H1000H 74 0DMOVA, #0DH(A)=0DH1002H 83MOVC A,A+PC(PC)=1002+1=1003H(A)=(A)+(PC)=(0D+1003) =(1010H)(A)=02H1003H F8MOV R0, A(R0)=(A)=02H执行程序:执行程序: 所以,最后结果为:所以,最后结果为:(A)=02 (R0)=02 (PC)=1004H(A)=02 (R0)=02 (PC)=1004H例例
24、: :若初始若初始ROM内容为:内容为: 7010H02H7011H04H7012H06H7013H08H执行程序:执行程序:1000HMOVA, #10H1002HPUSH DPH1004HPUSH DPL1006HMOV DPTR,#7000H1009HMOVC A, A+DPTR(10H+7000H) A100AH POP DPL100CH POP DPH 所以,最后结果为:所以,最后结果为:(A)=02 (PC)=100EH (DPTR)=(A)=02 (PC)=100EH (DPTR)=原值7、 累加器累加器A与片外与片外RAM传送指令传送指令(4条条)MOVX A, RiMOVX
25、A, DPTRMOVX Ri, AMOVX DPTR, A 在8051指令系统中,CPU对片外RAM的访问只 能用寄存器间接寻址的方式,且仅有四条指令.第2,4两条指令以DPTR为片外数据存储器16位 地址指针,寻址范围达64KB。其功能是DPTR所 指定的片外数据存储器与累加器A之间传送数据第1,3两条指令是用R0或R1作低8位地址指针, 由P0口送出,寻址范围是256字节。这两条指令 完成以R0或R1为地址指针的片外数据存储器与 累加器A之间的传送数据。上述四条指令的操作如图7、 累加器累加器A与片外与片外RAM传送指令传送指令(4条条)累加器寄存器间接寻址R1、R0(片外RAM0-255
26、字节)寄存器间接寻址DPTR (片外RAM0-64KB)外部数据存储器传送操作MOV R1, #30HMOV R1, #30H;(R1)=30H(R1)=30HMOVX A, R1 MOVX A, R1 ;(A)=02H(A)=02HMOV R0, AMOV R0, A ;(R0)=(A)=02H(R0)=(A)=02HMOV AMOV A,R1R1 ;(A)=(R1)=01H(A)=(R1)=01HMOV R2, AMOV R2, A ;(R2)=(A)=01H(R2)=(A)=01H例例: : 若:片内若:片内RAM (30H)=01HRAM (30H)=01H,片外,片外RAM RAM
27、(30H)=02H(30H)=02H,执行下面程序段后的结果如何。,执行下面程序段后的结果如何。 8 、栈操作指令(条)、栈操作指令(条)PUSH direct ; 先(SP)+1(SP) 后(direct)(SP)POP direct ; 先(SP) (direct) 后(SP) -1(SP) 8 、栈操作指令(条)、栈操作指令(条)片内RAM128B单元中,可设定一个区域作为堆栈 一般可设在30H-7FH单元中, 栈顶由堆栈指针SP指出。 89C51复位后,(SP)=07H,若要更改则需重新 给SP赋值。 本操作不影响标志位。 堆栈中数据的压入和弹出遵循“先进后出”规则。 例:例:设(设(
28、SP)=60H,(,(ACC)=40H, (B)=80H执行下面指令: PUSH ACC PUSH B结果:(61H)=40H,(62H)=80H, (SP)=62H 例:例:设(设(SP)=62H,(,(61H)=40H, (62H)=80H执行下面指令: POP DPH POP DPL结果:(DPTR)=8040H,(SP)=60H 例:例:继续上例继续上例: :POP DPL; (DPL)=00H (SP)=1AHPOP DPH; (DPH)=10H (SP)=19HPOP A ; (A)=30H (SP)=18H 9、 交换指令交换指令(4条条)XCH A, RnXCH A, dire
29、ctXCH A, Ri(1) (1) 字节交换指令字节交换指令将第二操作数所指定的工作寄存器Rn(R0R7),直接寻址和间接寻址的单元内容与累加器A中内容互换. 9、 交换指令交换指令(4条条)XCHD A, Ri(2) (2) 半字节交换指令半字节交换指令Ri间接寻址的单元内容与累加器A中内容的低4位互换,高4位内容不变。该指令影响标志位P。 例例:例:设(A)=16H,(R0)=40H, (40H)=35H执行下面指令: XCHD A, R0结果:(A)=15H,(40H)=36HA: 0001 0110 (40H): 0011 0101 0001 0101 (15H) 0011 0110
30、 (36H)3.3.2 算术运算指令算术运算指令41、不带进位加法指令、不带进位加法指令(条条)42、带进位加法指令(条)、带进位加法指令(条)43、带借位减法指令(条)、带借位减法指令(条)44、乘法指令(、乘法指令(1条)条)45、除法指令(、除法指令(1条)条)46、加、加1指令(指令(5条)条)47、减、减1指令指令(4条条)48、十进制调整指令、十进制调整指令(1条条)1 1、不带进位加法指令、不带进位加法指令( (条条) )pADD A, Rn ; (A)+(Rn)ApADD A, direct ; (A)+(direct)ApADD A, Ri ;(A)+(Ri)ApADD A,
31、#data ;(A)+#dataA1 1、不带进位加法指令、不带进位加法指令( (条条) )p这些指令是将工作寄存器、内部工作寄存器、内部RAMRAM单元内容或立单元内容或立即数即数的8位无符号二进制数和累加器A中的数相加, p所得的“和”存放于累加器累加器A A中。 p当“和”的第3位或第7位有进位时,分别将AC,CY标志位置1,否则为0。 p上述指令的执行将影响标志位AC,CY,OV,P。 溢出标志OV只有带符号数运算时才有用。 例:例:2 2、带进位加法指令、带进位加法指令( (条条) )pADDC A, Rn ;(A)+CY+(Rn)ApADDC A, direct ; (A)+CY+
32、(direct)ApADDC A, Ri ; (A)+(Ri)+CYApADDC A,#data ;(A)+#data+CYA2 2、带进位加法指令、带进位加法指令( (条条) )p这组指令的功能是同时把源操作数所指出的内容和进位标志位CY都加到累加器A中, p结果存放在A中, 其余功能和ADD指令相同。p当运算结果第3,7位产生进位或溢出时,分别置位AC,CY和OV标志位。 p本指令的执行将影响标志位AC,CY,OV,P。p本指令常用于多字节加法。例:设(A)=0C3H,(R0)=0AAH, (CY)=1。执行指令“ADDC A,R0”后的结果及标志位如何?例:例:编程,将(30H),(31
33、H)单元中的数与 (40H),(41H)单元中的数相加,结果存于(30H),(31H)单元中。、带借位减法指令、带借位减法指令( (条条) )pSUBB A, Rn ; (A)-CY-(Rn)ApSUBB A, direct ;(A)-CY-(direct)ApSUBB A, Ri ; (A)-CY-(Ri)ApSUBB A,#data ;(A)-CY-#dataA、带借位减法指令、带借位减法指令( (条条) )p这组指令的功能是, 从累加器A中减去源操作数所指出的内容及进位位CY的值,差保留在累加器A中。p 由于89C51指令系统中没有不带借值的减法指令,如需要的话, 可以在“SUBB”指令
34、前用“CLR C”指令将CY清0。 p两个数相减,如果位7有借位,则CY置1,否则清0p若位3有借位,则AC置1,否则清0。 p两个带符号数相减,还要考查OV标志,若OV为l,表示差数溢出,即破坏了正确结果的符号位。 例:例:设(设(A A)=0C9H,=0C9H,(R2R2)=54H,Cy=1=54H,Cy=1。 执行指令执行指令“SUBB ASUBB A, R2”R2”的结果如何?的结果如何? 4、 乘法指令(乘法指令(1条)条)p指令的功能是,把累加器指令的功能是,把累加器A和寄存器和寄存器B中两个中两个8位位无符号数相乘,无符号数相乘,p所得所得16位积的低字节存放在位积的低字节存放在
35、A中,高字节存放在中,高字节存放在B中。中。p若乘积大于若乘积大于0FFH,则,则OV置置1,否则清否则清0(即即B的内的内容为容为0)。CY总是被清总是被清0。 MUL AB例:(A)=4EH,(B)=5DH, 执行指令“MUL AB”后结果如何?5、 除法指令(除法指令(1条)条)DIV ABp功能是进行A除以B的运算,A和B的内容均为8 位无符号整数。p指令操作后,整数商存于A中,余数存于B中, CY和OV均被清0。p若原(B)=00H,则结果无法确定,用OV=l表 示,而CY仍为0。 6、 加加1指令(指令(5条)条)INC A ; (A)+1AINC Rn INC direct IN
36、C Ri INC DPTR 6、 加加1指令(指令(5条)条)p指令功能是将操作数所指定的单元内容加1.p其操作不影响PSW。 p若原单元内容为FFH,加1后溢出为00H, 也不会影响PSW标志。 7、 减减1指令(条)指令(条)DEC A ; (A)-1ADEC Rn DEC direct DEC Ri (没有)DEC DPTR 7、 减减1指令(条)指令(条)p指令的功能是将操作数所指的单元内容减1p其操作不影响标志位CY。 8、 十进制调整指令十进制调整指令(1条条)p调整累加器内容为BCD码。 p这条指令跟在ADD或ADDC指令后,将相加后存 放在累加器A中的结果进行十进制调整,完成十
37、 进制加法运算功能。p两个压缩型BCD码按二进制数相加后,必须经本 指令调整才能得到压缩型BCD码的和的正确值。 DA A8、 十进制调整指令十进制调整指令(1条条)p若(A03)9或AC=l,则(A03)+6A03p若(A47)9或CY=l,则(A47)+6A47 。8、 十进制调整指令十进制调整指令(1条条)p执行DA A后,CPU根据累加器A的原始数值和 PSW的状态,由硬件自动对累加器A进行加06H, 60H或66H的操作。 p必须注意,本指令不能简单地把累加器A中的16进 制数变换成BCD码。p也不能用于十进制减法的调整。 例例: : 设累加器设累加器A A内容为:内容为:01010
38、110B01010110B(5656的的BCDBCD码),码),寄存器寄存器R3R3的内容为的内容为01100111B01100111B(6767的的BCDBCD码),码),CYCY内内容为容为1 1。求执行下列指令后的结果。求执行下列指令后的结果。 ADDC AADDC A,R3R3 DA A DA A3.3.3 逻辑运算及移位指令逻辑运算及移位指令4 1.1.累加器清零、取反指令(累加器清零、取反指令(2 2条)条)4 2. 2. 移位指令(移位指令(4 4条)条)4 3. 3. 累加器半字节交换指令(累加器半字节交换指令(1 1条)条)4 4. 4. 逻辑逻辑“与与”指令(指令(6 6条
39、)条)4 5. 5. 逻辑逻辑“或或”指令(指令(6 6条)条)4 6. 6. 逻辑逻辑“异或异或”指令(指令(6 6条)条)1.累加器清零、取反指令(累加器清零、取反指令(2条)条)CLR A ; 0A, 清0累加器A,只影响标志位P。CPL A ; AA , 累加器A逐位取反,不影响标志位。 例:例:设(设(A A)=01010101B=55H=01010101B=55H,执行指令:执行指令: CPL A CPL A结果:(结果:(A A)=10101010B=0AAH=10101010B=0AAH2 .移位指令(移位指令(4条)条)RL A ; 累加器累加器A循环左移循环左移 RR A
40、; 累加器累加器A循环右移循环右移RLC A ; 累加器累加器A连同进位位循环左移连同进位位循环左移 RRC A ; 累加器累加器A连同进位位循环右移连同进位位循环右移 p前两条指令的功能分别是,将累加器A的内容循环左 移或右移一位, p后两条指令的功能分别是,将累加器A的内容连同进 位位CY一起循环左移或右移一位。 p通常用RLC A指令将累加器A的内容做乘2运算。2 .移位指令(移位指令(4 4条)条)2 .移位指令(移位指令(4 4条)条)a7 a0a7 a0RL ARR A2 .移位指令(移位指令(4 4条)条)RLC ARRC Aa7 a0CYa7 a0CY3. 累加器半字节交换指令
41、(累加器半字节交换指令(1条)条) SWAP A指令功能:将累加器A的高低两半字节交换。 例:(A)=FAH。执行指令“ SWAP A”结果:为(A)=AFH。 4. 逻辑逻辑“与与”指令(指令(6条)条)ANL A,Rn ANL A,direct ANL A , Ri ANL A,#data ANL direct, A ANL direct, #data p这组指令中前四条指令是将累加器A的内容和操作数所指出的内容按位进行逻辑“与”,结果存放在A中。p后两条指令是将直接地址单元中的内容和操作数所指出的单元的内容按位进行逻辑“与”,结果存入直接地址单元中。若直接地址正好是I/O端口,则为“读改
42、写”操作。 4. 逻辑逻辑“与与”指令(指令(6条)条)例:例:设(A)=07H,(R0)=0FEH,执行指令: ANL A,R0结果:(A)=06H 0000 0111 (07H) 1111 1110 (FEH) 0000 0110 (06H) 4. 逻辑逻辑“与与”指令(指令(6条)条) 5. 逻辑逻辑“或或”指令(指令(6条)条)ORL A,Rn ORL A,direct ORL A , Ri ORL A,#data ORL direct, A ORL direct, #data p这组指令中前四条指令是将累加器A的内容和操作数所指出的内容按位进行逻辑“或”,结果存放在A中。p后两条指令
43、是将直接地址单元中的内容和操作数所指出的单元的内容按位进行逻辑“或”,结果存入直接地址单元中。若直接地址正好是I/O端口,则为“读改写”操作。 5. 逻辑逻辑“或或”指令(指令(6条)条)例:设(P1)=04H,(A)=33H,执行指令: ORL P1,A结果:(P1)=37H 0000 0100 (04H) 0011 0011 (33H) 0011 0111 (37H) 5. 逻辑逻辑“或或”指令(指令(6条)条) 6. 逻辑逻辑“异或异或”指令(指令(6条)条)XRL A,Rn XRL A,direct XRL A , Ri XRL A,#data XRL direct, A XRL di
44、rect, #data p这组指令中前四条指令是将累加器A的内容和操作数所指出的内容按位进行逻辑“异或”,结果存放在A中。p后两条指令是将直接地址单元中的内容和操作数所指出的单元的内容按位进行逻辑“异或”,结果存入直接地址单元中。若直接地址正好是I/O端口,则为“读改写”操作。 6. 逻辑逻辑“异或异或”指令(指令(6条)条)例:设(A)=91H,(R3)=73H,执行指令: XRL A,R3结果:(A)=0E2H 1001 0001 (91H) 0111 0011 (73H) 1110 0010 (E2H) 6. 逻辑逻辑“异或异或”指令(指令(6条)条)上述逻辑操作类指令操作上述逻辑操作类
45、指令操作均只影响标志位均只影响标志位P P。 3.3.4 控制程序转移类指令控制程序转移类指令4 1 . 无条件转移指令(无条件转移指令(4条条)4 2 . 空操作指令(空操作指令(1条)条)4 3 . 条件转移指令(条件转移指令(8条)条)4 4 . 调用和返回指令(调用和返回指令(4条)条)89C51单片机有丰富的转移类指令(17 条)。包括无条件转移、条件转移和调用指令 及返回指令等。所有这些指令的目标地址都是在64K字节 程序存储器地址空间范围内。 1、无条件转移指令(、无条件转移指令(4条)条)p无条件转移指令是当程序执行到该指令时,程序无条件的转移到指令所提供的地址处执行。p无条件
46、转移指令有长转移、短转移、相对转移和间接转移4条指令。1、无条件转移指令(、无条件转移指令(4条)条)短转移指令短转移指令 AJMP addrllAJMP addrll 长转移指令长转移指令 LJMP addrl6 LJMP addrl6 相对转移相对转移( (短转移短转移) )指令指令 SJMP relSJMP rel间接转移指令间接转移指令JMP A+DPTRJMP A+DPTR短转移指令短转移指令 AJMP addrll p先先(PC)+2PC,addrllPC10(PC)+2PC,addrllPC100 0,(PC15(PC1511)11)不变不变p这条指令提供了11位地址,可在2K范
47、围内无条件转移到由a10-a0所指出的地址单元中。p因为高5位为原PC11-15位值,因此,转移的目标地址必须在AJMP指令后面指令的第一个字节开始的同一2K字节范围内。长转移指令长转移指令 LJMP addrl6 paddr16PC p指令直接提供16位目标地址, 所以程序可转向64KB程序存储器地址空间的任何单元。 p3字节指令相对转移(短转移)指令相对转移(短转移)指令SJMP relp先(PC)+2PC,后(PC)+relPC 指令的操 作数是相对地址,prel是一个带符号的偏移字节数(2的补码), 其范围为-128+127p00H7FH对应表示0+127,p80HFFH对应表示-12
48、8-1。相对转移(短转移)指令相对转移(短转移)指令SJMP relp负数表示反向转移,p正数表示正向转移。p该指令为双字节指令,执行时先将PC内容 加2,再加相对地址rel,就得到了转移目标地址。例如,在(在(PCPC)=0100H=0100H地址单元有条地址单元有条 “ “SJMP relSJMP rel”指令,指令,若rel=55H(正数),则正向转移到 0102H+0055H=0157H地址上;若rel=F6H(负数)则反向转移到 0102H+FFF6H=00F8H地址上。 (-10)p编写程序时,rel可以是一个转移目的地址的标号,由汇编程序在汇编过程中自动计算偏 移地址,并且填入指
49、令代码中。p在手工汇编时,我们可用转移目的地址减转 移指令所在源地址,再减转移指令字节数2 得到偏移字节数rel。间接转移指令间接转移指令 JMP A+DPTR p(A)+(DPTR) PC(A)+(DPTR) PC p该指令的转移地址由数据指针DPTR的16位 数和累加器A的8位数进行无符号数相加形 成,并直接送入PC。p指令执行过程对DPTR,A和标志位均无影响p这条指令可代替众多的判别跳转指令,具有 散转功能(又称散转指令)。从程序中看出,当(A)=00H时,散转到CCS0;当(A)=01H时,散转到CCS1;。由于AJMP是双字节指令,散转前A中的键值应乘2。2、 空操作指令(空操作指
50、令(1条)条)NOP ; (PC)+lPCp这是一条单字节指令,除PC加l外,不影响其 他寄存器和标志位。pNOP指令常用来产生一个机器周期的延迟3 、条件转移指令(、条件转移指令(8条)条)(1)判零转移指令(判零转移指令(2条)条)(2)比较转移指令(比较转移指令(4条)条)(3)循环转移指令(循环转移指令(2条)条)(1) (1) 判零转移指令判零转移指令JZ和JNZ指令分别对累加器A的内容为全零和不为全零进行检测并转移,JZ rel ;(PC)+2PC。.。JNZ rel(1) (1) 判零转移指令判零转移指令当不满足条件时,程序继续往下执行;当满足条件时, 程序转移向指定的目标地址其