单片机原理与应用第3章课件

上传人:工**** 文档编号:568308598 上传时间:2024-07-24 格式:PPT 页数:123 大小:2.12MB
返回 下载 相关 举报
单片机原理与应用第3章课件_第1页
第1页 / 共123页
单片机原理与应用第3章课件_第2页
第2页 / 共123页
单片机原理与应用第3章课件_第3页
第3页 / 共123页
单片机原理与应用第3章课件_第4页
第4页 / 共123页
单片机原理与应用第3章课件_第5页
第5页 / 共123页
点击查看更多>>
资源描述

《单片机原理与应用第3章课件》由会员分享,可在线阅读,更多相关《单片机原理与应用第3章课件(123页珍藏版)》请在金锄头文库上搜索。

1、第第3 3章章 MCS-51MCS-51单片机的指单片机的指令系统令系统3.1 指令格式及分类指令格式及分类3.2 寻址方式寻址方式3.3 指令系统分析指令系统分析3.4 单片机汇编语言程序设计单片机汇编语言程序设计3.5 汇编语言编程实训汇编语言编程实训u掌握汇编指令的基本格式;掌握汇编指令的基本格式;u掌握掌握5151系列单片机的寻址方式;系列单片机的寻址方式; u掌握掌握5151系列单片机的各指令;系列单片机的各指令;u能阅读程序并能编写简单程序。能阅读程序并能编写简单程序。本章重点本章重点1.1.汇编语言的概念汇编语言的概念 计算机要完成某项工作所需过程是这样的:按照程序规定的次序,计

2、算机要完成某项工作所需过程是这样的:按照程序规定的次序,依次从程序存储器中取出要执行的指令代码,送到控制器的指令寄存依次从程序存储器中取出要执行的指令代码,送到控制器的指令寄存器中对所取的指令进行分析,由控制器发出完成操作所需的一系列控器中对所取的指令进行分析,由控制器发出完成操作所需的一系列控制电平,指挥计算机有关部件完成相应的操作。制电平,指挥计算机有关部件完成相应的操作。 机器语言自身的特点决定了其难于用它进行程序设计,为了既能机器语言自身的特点决定了其难于用它进行程序设计,为了既能保持机器语言的特点,又能方便编写程序和阅读程序,人们采用助记保持机器语言的特点,又能方便编写程序和阅读程序

3、,人们采用助记符来代替机器指令代码,助记符与机器指令代码一一对应,人们把这符来代替机器指令代码,助记符与机器指令代码一一对应,人们把这种编程语言称为汇编语言。种编程语言称为汇编语言。3.1 3.1 指令格式及分类指令格式及分类3.1.1 3.1.1 汇编语言的概念及格式汇编语言的概念及格式2.2.汇编语言的指令格式汇编语言的指令格式 MCS-51MCS-51单片机的指令由标号、操作码、操作数和注释单片机的指令由标号、操作码、操作数和注释4 4个部分组成,格个部分组成,格式如下:式如下: 标号:标号: 操作码操作码 目的操作数目的操作数,源操作数源操作数,第三操作数第三操作数;注释注释 说明:带

4、有方括号说明:带有方括号 的部分代表可选项。的部分代表可选项。【例】【例】 LOOP:MOV ALOOP:MOV A,31H 31H ;将立即数;将立即数31H31H送累加器送累加器A A中中操作码操作码目的操作数目的操作数源操作数源操作数标号标号注释注释机器语言指令格式机器语言指令格式(1 1)单字节指令格式:操作码)单字节指令格式:操作码【例】汇编语言指令【例】汇编语言指令 ADD AADD A,R0 R0 对应的机器语言是:对应的机器语言是: 2828(2 2)双字节指令格式:操作码操作数)双字节指令格式:操作码操作数【例】汇编语言指令【例】汇编语言指令 ADD AADD A,31H 3

5、1H 对应的机器语言是对应的机器语言是: : 24 31 24 31(3 3)三字节指令格式:操作码)三字节指令格式:操作码 第一操作数第一操作数 第二操作数第二操作数【例】汇编语言指令【例】汇编语言指令 MOV 30HMOV 30H,7AH 7AH 对应的机器语言是:对应的机器语言是: 75 30 7A75 30 7A3.1.2 3.1.2 指令系统中的符号约定指令系统中的符号约定RnRn:0 07 7,代表工作寄存器,代表工作寄存器R0R7R0R7。RiRi:代表工作寄存器代表工作寄存器RiRi间接寻址间接寻址8 8位存储单元,存储单元地址位存储单元,存储单元地址00H00HFFHFFH。

6、其中其中0 0、1 1,RiRi代表工作寄存器代表工作寄存器R0R0、R1R1。directdirect:代表代表8 8位地址,该位地址,该8 8位地址可以是内位地址可以是内RAMRAM的任何一个地址(的任何一个地址(00H00H7FH7FH),也可以为),也可以为SFRSFR(特殊功能寄存器)中的任何一个(特殊功能寄存器)中的任何一个(80H80HFFHFFH)。)。datadata:为为8 8位的立即数,该数为真正参与运算或传送的数据。位的立即数,该数为真正参与运算或传送的数据。data16data16:为为1616位的立即数,该数为参与传送的数据。位的立即数,该数为参与传送的数据。add

7、r16addr16:为为1616位目的地址,用于位目的地址,用于LCALLLCALL、LJMPLJMP二个指令中,可以实现在二个指令中,可以实现在64K64K程序存储器范围内调用子程序或转移。程序存储器范围内调用子程序或转移。addr11addr11:为为1111位目的地址,用于位目的地址,用于ACALLACALL、AJMPAJMP二个指令中,可以实现在下二个指令中,可以实现在下条指令地址所在的条指令地址所在的2K2K范围内调用子程序或转移。范围内调用子程序或转移。relrel:为带符号的为带符号的8 8位偏移地址,用于位偏移地址,用于SJMPSJMP和所有的条件转移指令,可以和所有的条件转移

8、指令,可以在下条指令地址所在的在下条指令地址所在的-128-128+127+127的程序存储器范围内转移。的程序存储器范围内转移。DPTRDPTR:数据指针,可用作数据指针,可用作1616位地址寄存器。位地址寄存器。A A:累加器累加器ACCACC。B B:通用寄存器,主要用于乘法通用寄存器,主要用于乘法MULMUL和除法和除法DIVDIV指令中。指令中。CyCy:代表进位标志位或在布尔处理器中的累加器。代表进位标志位或在布尔处理器中的累加器。bitbit:位地址。片内位地址。片内RAMRAM中的位寻址单元及中的位寻址单元及SFRSFR中的可寻址位。中的可寻址位。/bit/bit:在位操作指令

9、中,表示对该位(在位操作指令中,表示对该位(bitbit)先取反,再进行传送或运算,)先取反,再进行传送或运算,不改变该位(不改变该位(bitbit)的原值。)的原值。 寻址就是寻找操作数的地址,寻找操作数地址的方式,称为操寻址就是寻找操作数的地址,寻找操作数地址的方式,称为操作数地址的寻址方式,简称寻址方式。作数地址的寻址方式,简称寻址方式。 序号序号寻址方式寻址方式存储空间存储空间1直接寻址直接寻址内部内部RAM的的00H7FH,SFR,程序存储器,程序存储器2立即数寻址立即数寻址程序存储器程序存储器3寄存器寻址寄存器寻址R0R7,A,B,Cy,DPTR寄存器寄存器4寄存器间接寻址寄存器间

10、接寻址内部内部RAM的的00H7FH,外部外部RAM5变址寻址变址寻址程序存储器程序存储器6相对寻址相对寻址程序存储器程序存储器7位寻址位寻址内部内部RAM中中20H2FH的的128位,位,SFR中的中的93位位寻址方式所对应的寄存器和存储空间寻址方式所对应的寄存器和存储空间3.2 3.2 寻址方式寻址方式3.2.1 3.2.1 直接寻址直接寻址 直接寻址方式就是指令中给出操作数地址的寻址方式,即指令中给直接寻址方式就是指令中给出操作数地址的寻址方式,即指令中给出的数据作为地址,该地址对应存储单元中的数据才是真正的操作数。出的数据作为地址,该地址对应存储单元中的数据才是真正的操作数。【例】【例

11、】 设内设内RAM 60HRAM 60H单元中的内容为单元中的内容为55H55H,则执行指令,则执行指令 MOV AMOV A,60H 60H 后,后,A A中的内容为中的内容为55H55H,即,即A A55H55H直接寻址示意图直接寻址示意图3.2.2 3.2.2 立即数寻址立即数寻址 立即数寻址(立即数寻址(immediate constant addressingimmediate constant addressing)也称为立即寻址。)也称为立即寻址。把参与运算的操作数直接在指令中给出,操作数紧跟在操作符之后,这把参与运算的操作数直接在指令中给出,操作数紧跟在操作符之后,这种由指令直

12、接提供的操作数叫种由指令直接提供的操作数叫“立即数立即数”,是一个常数,可以是,是一个常数,可以是8 8位或者位或者1616位,并要在其前冠以位,并要在其前冠以“# #”前缀,以区别于地址,主要用于赋值操作。前缀,以区别于地址,主要用于赋值操作。例如:例如:MOV A,#55H ;(A)55HMOV A,#55H ;(A)55H立即数寻址示意图立即数寻址示意图3.2.3 3.2.3 寄存器寻址寄存器寻址 寄存器寻址(寄存器寻址(register register addressingaddressing)方式在指令中指出了参与)方式在指令中指出了参与运算的操作数所在的寄存器,操作数存运算的操作

13、数所在的寄存器,操作数存储在寄存器中。寄存器寻址方式中的寄储在寄存器中。寄存器寻址方式中的寄存器为工作寄存器存器为工作寄存器R0R0R7R7、DPTRDPTR、累加、累加器器A A、寄存器、寄存器B(B(仅在乘除法时仅在乘除法时) )和布尔累和布尔累加器加器C C。 例如:例如: MOV A,R0 ;(A)(R0)MOV A,R0 ;(A)(R0) 该指令执行的操作是把工作寄存器该指令执行的操作是把工作寄存器R0R0中的数送到累加器中的数送到累加器A A中,若中,若R0R0寄存器寄存器单元中的内容是单元中的内容是55H55H,则该指令执行后,则该指令执行后A A的内容就是的内容就是55H55H

14、。寄存器寻址示意图寄存器寻址示意图3.2.4 3.2.4 寄存器间接寻址寄存器间接寻址 寄存器间接寻址方式就是将指令指定的寄存器中的内容作为地寄存器间接寻址方式就是将指令指定的寄存器中的内容作为地址,将该地址所对应的存储单元中的数据作为真正参与运算或传送址,将该地址所对应的存储单元中的数据作为真正参与运算或传送的操作数的寻址方式。寄存器间接寻址也简称寄存器间址。的操作数的寻址方式。寄存器间接寻址也简称寄存器间址。 注意:注意:与寄存器寻址方式的格式不同在于寄存器前加与寄存器寻址方式的格式不同在于寄存器前加 。例如:例如:MOV A,R0 ;(A)(R0)MOV A,R0 ;(A)(R0) 该指

15、令执行的操作是把该指令执行的操作是把R0R0寄存器指向地址单元中的内容送到累加器寄存器指向地址单元中的内容送到累加器A A中。若寄存器中。若寄存器R0R0的内容为的内容为20H20H,20H20H单元的内容是单元的内容是55H55H,就是将地址寄存器,就是将地址寄存器R0R0的内容的内容20H20H作为操作数所在单元地址,该单元中的内容作为操作数所在单元地址,该单元中的内容55H55H为操作数,为操作数,则执行该指令后累加器则执行该指令后累加器A A的内容是的内容是55H55H。寄存器间接寻址示意图寄存器间接寻址示意图3.2.5 3.2.5 变址寻址变址寻址 变址寻址(变址寻址(indexed

16、 addressingindexed addressing)方式也称为基址寄存器加变址寄)方式也称为基址寄存器加变址寄存器间接寻址方式。存放操作数单元的地址为基址寄存器和变址寄存器存器间接寻址方式。存放操作数单元的地址为基址寄存器和变址寄存器两者内容之和。变址寻址是以两者内容之和。变址寻址是以DPTRDPTR或或PCPC作为基址寄存器,以累加器作为基址寄存器,以累加器A A作为作为变址寄存器,将两寄存器的内容相加形成变址寄存器,将两寄存器的内容相加形成1616位地址操作数的实际地址。位地址操作数的实际地址。该类寻址方式主要用于查表操作。该类寻址方式主要用于查表操作。例如:例如:MOV A,A+

17、DPTR ;(A)(A+DPTR)MOV A,A+DPTR ;(A)(A+DPTR) 该指令执行的操作是把累加器该指令执行的操作是把累加器A A的内容和基址寄存器的内容和基址寄存器DPTRDPTR的内容累加,的内容累加,相加结果作为操作数存放的地址(地址在内部存储器中),再将操作数相加结果作为操作数存放的地址(地址在内部存储器中),再将操作数取出来送到累加器取出来送到累加器A A中。若中。若A A的内容为的内容为20H20H,DPTRDPTR的内容为的内容为1000H1000H,程序存,程序存储单元储单元1020H1020H中的内容是中的内容是55H55H,则执行该指令后,则执行该指令后A A

18、的内容就是的内容就是55H55H。变址寻址示意图变址寻址示意图3.2.6 3.2.6 相对寻址相对寻址 相对寻址(相对寻址(relative addressingrelative addressing)方式是为了程序的相对转移而设)方式是为了程序的相对转移而设计的。其原理是以程序计数器(计的。其原理是以程序计数器(PCPC)的内容为基址,加上给出的相对偏)的内容为基址,加上给出的相对偏移量移量relrel作为新的有效的转移地址,从而实现程序的转移。值得注意的是,作为新的有效的转移地址,从而实现程序的转移。值得注意的是,相对偏移量相对偏移量relrel是有正负之分的,以补码表示。偏移量的取值范围

19、是是有正负之分的,以补码表示。偏移量的取值范围是- -128+127128+127。例如:例如:SJMP 08H ;(PC)(PC)+08HSJMP 08H ;(PC)(PC)+08H 该指令执行的操作是将该指令执行的操作是将PCPC当前值与当前值与08H08H相加,结果再送回到相加,结果再送回到PCPC中,成中,成为下一条将要执行指令的地址。指令为下一条将要执行指令的地址。指令“SJMP 08HSJMP 08H”是双字节指令,其机是双字节指令,其机器码为器码为“80H80H、08H08H”,若存放在,若存放在1000H1000H处,当执行到该指令时,取出操作处,当执行到该指令时,取出操作码后

20、码后PCPC指向指向1001H1001H单元,取出偏移量后单元,取出偏移量后PCPC指向指向1002H1002H单元(转移指令首地单元(转移指令首地址加址加2 2,有些指令如,有些指令如JB bit,relJB bit,rel则加则加3 3),再把),再把PCPC的内容与操作数的内容与操作数08H08H相加,相加,形成目标地址形成目标地址100AH100AH,再送回,再送回PCPC,使得程序跳转到,使得程序跳转到100AH100AH单元继续执行。单元继续执行。相对寻址示意图相对寻址示意图 注意:在相对寻址方式时,在注意:在相对寻址方式时,在relrel为正数和负数两种不同情况下,目为正数和负数

21、两种不同情况下,目的地址的地址PCPC的求法可以用下列不同的公式求:的求法可以用下列不同的公式求: 当当relrel为正数时,为正数时, PCPC目的目的PCPC当前当前当前指令字节数当前指令字节数relrel 当当relrel为负数时,为负数时, PCPC目的目的PCPC当前当前当前指令字节数当前指令字节数relrel100H100H 在人工汇编时,往往知道在人工汇编时,往往知道PCPC目的目的和和PCPC当前当前,需要求,需要求relrel,如果,如果PCPC目的目的PCPC当前当前, ,采用第一个公式;如果采用第一个公式;如果PCPC目的目的PCPC当前当前, ,采用第二个公式。采用第二

22、个公式。3.2.7 3.2.7 位寻址位寻址 位寻址就是对内部位寻址就是对内部RAMRAM和特殊功能寄存器的可寻址位的内容进行操作和特殊功能寄存器的可寻址位的内容进行操作的寻址方式。这种寻址方式只是对指令指定的的寻址方式。这种寻址方式只是对指令指定的1 1位进行操作,其寻址方式位进行操作,其寻址方式与直接寻址方式相同。与直接寻址方式相同。【例】如果【例】如果A A74H74H,则执行指令,则执行指令 SETB ACC.3SETB ACC.3后,后,A A7CH7CH,见下图。,见下图。执行前执行前A A01110100执行后执行后A A011111003.3 3.3 指令系统分析指令系统分析

23、数据传送指令共有数据传送指令共有2929条,数据传送指令一般的操作是把源条,数据传送指令一般的操作是把源操作数传送到目的操作数,指令执行完成后,源操作数不变,操作数传送到目的操作数,指令执行完成后,源操作数不变,目的操作数等于源操作数。如果要求在进行数据传送时,目的目的操作数等于源操作数。如果要求在进行数据传送时,目的操作数不丢失,则不能用直接传送指令,而采用交换型的数据操作数不丢失,则不能用直接传送指令,而采用交换型的数据传送指令,数据传送指令不影响标志传送指令,数据传送指令不影响标志CyCy,ACAC和和OVOV,但可能会对,但可能会对奇偶标志奇偶标志P P有影响。有影响。3.3.1 3.

24、3.1 数据传送指令数据传送指令1.1.以累加器为目的操作数的指令以累加器为目的操作数的指令基本格式:基本格式:MOV A,MOV A,源操作数源操作数 这组指令的作用是把源操作数指向的内容送到累加器这组指令的作用是把源操作数指向的内容送到累加器A A。有直接、立即数、。有直接、立即数、寄存器和寄存器间接寻址方式:寄存器和寄存器间接寻址方式:MOV A,direct ;MOV A,direct ;直接单元地址中的内容送到累加器直接单元地址中的内容送到累加器A AMOV A,#data ;MOV A,#data ;立即数送到累加器立即数送到累加器A A中中MOV A,Rn ;RnMOV A,Rn

25、 ;Rn中的内容送到累加器中的内容送到累加器A A中中MOV A,Ri ;RiMOV A,Ri ;Ri内容指向的地址单元中的内容送到累加器内容指向的地址单元中的内容送到累加器A A例如:例如:MOV A,30H ;MOV A,30H ;把内部把内部RAMRAM地址为地址为30H30H单元的内容送到累加器单元的内容送到累加器A AMOV A,#36H ;MOV A,#36H ;把常数把常数36H36H送到累加器送到累加器A A中中MOV A,R2 ;MOV A,R2 ;把寄存器把寄存器R2R2中的内容送到累加器中的内容送到累加器A A中中MOV A,R0 ;MOV A,R0 ;把内部寄存器把内部

26、寄存器R0R0内容指向的地址单元中的内容送到累加器内容指向的地址单元中的内容送到累加器A A43H指令:指令:MOVMOVA A,direct direct ;A(directA(direct) )功能:该指令是将数据存储器地址为功能:该指令是将数据存储器地址为directdirect单元中的内容送到累加器中,单元中的内容送到累加器中,该单元中的内容保持不变。该单元中的内容保持不变。【例】如果当前(【例】如果当前(40H40H)=6DH,A=43H=6DH,A=43H,则执行指令:,则执行指令: MOVMOVA,40HA,40H结果:结果:6D6D14H6DH41H41H40H40HA A6D

27、H43H指令:指令:MOVMOVA A,data data ;AdataAdata功能:该指令是将立即数功能:该指令是将立即数datadata送到累加器中。送到累加器中。注意:与注意:与MOVMOVA A,directdirect的形式与功能的区别的形式与功能的区别 【例】如果当前【例】如果当前A=43H,A=43H,则执行指令:则执行指令: MOVMOVA,#40HA,#40H结果:结果:A=40HA=40H14H6DH41H41H40H40HA A40H立即数立即数93H指令:指令:MOVMOVA A ,RnRn ;ARnARn,n=0n=07 7功能:该指令是将寄存器功能:该指令是将寄存

28、器RnRn中的内容送到累加器中,中的内容送到累加器中,RnRn中的中的内容保持不变。内容保持不变。【例】如果当前【例】如果当前R0=56HR0=56H,A=93H,A=93H,则执行指令:则执行指令: MOV AMOV A,R0R0 结果:结果:A=56HA=56H14H6BHA3H56HR3R3R2R2R1R1R0R0A A56H93H指令:指令:MOVMOVA A ,RiRi ;A(RiA(Ri) ),i=0i=0,1 1功能:该指令是将寄存器功能:该指令是将寄存器RiRi中的内容作为数据存储器的地址,中的内容作为数据存储器的地址,将该地址对应单元中的内容送到累加器中,该单元及将该地址对应

29、单元中的内容送到累加器中,该单元及RiRi中的中的内容保持不变。内容保持不变。【例】如果当前【例】如果当前R0=30HR0=30H,(30H)=0B3H,A=93H,(30H)=0B3H,A=93H,执行指令:执行指令: MOV AMOV A,R0R0 结果:结果:B3B314HB3H30H31H31H30H30HR0R0A AB3H2.2.以寄存器以寄存器RnRn为目的操作数的指令为目的操作数的指令基本格式:基本格式:MOV Rn,MOV Rn,源操作数源操作数这组指令的功能是把源操作数指定的内容送到所选定的工作寄存器这组指令的功能是把源操作数指定的内容送到所选定的工作寄存器RnRn中。中。

30、有直接、立即数和寄存器寻址方式:有直接、立即数和寄存器寻址方式:MOV Rn,direct ;MOV Rn,direct ;直接寻址单元中的内容送到寄存器直接寻址单元中的内容送到寄存器RnRn中中MOV Rn,#data ;MOV Rn,#data ;立即数直接送到寄存器立即数直接送到寄存器RnRn中中MOV Rn,A ;MOV Rn,A ;累加器累加器A A中的内容送到寄存器中的内容送到寄存器RnRn中中6DHB3H指令:指令:MOVMOVRnRn,direct direct ;Rn(directRn(direct) )功能:该指令是将数据存储器地址为功能:该指令是将数据存储器地址为dire

31、ctdirect单元中的内容送到单元中的内容送到RnRn中,该单元中的内容保持不变。中,该单元中的内容保持不变。【例】如果当前【例】如果当前(41H)=73H,R1=6DH,(41H)=73H,R1=6DH,则执行指令:则执行指令: MOVMOVR1,41HR1,41H结果:结果:R1R1737314H6DH78HR2R2R1R1R0R042H42H73H41H41HA3H40H40H73H6DHB3H指令:指令:MOVMOVRnRn, ,datadata ;RndataRndata功能:该指令是将立即数功能:该指令是将立即数datadata送到寄存器送到寄存器RnRn中。中。【例】如果当前(

32、【例】如果当前(41H)=73H,R1=6DH41H)=73H,R1=6DH,则执行指令:,则执行指令: MOVMOVR1,#40HR1,#40H结果:结果:R1R1404014H6DH78HR2R2R1R1R0R042H42H40H41H41HA3H40H40H73H立即数立即数A3H93H指令:指令:MOVMOVRnRn,A A ;RnARnA ,n=0n=07 7功能:该指令是将累加器中的内容送到寄存器功能:该指令是将累加器中的内容送到寄存器RnRn中,中的中,中的内容保持不变。内容保持不变。【例】如果当前【例】如果当前R1R1A3H,A=93H,A3H,A=93H,则执行指令:则执行指

33、令: MOVMOVR1,AR1,A结果:结果: R1R1939314H6BH56HR3R3R2R2R1R1R0R0A A93H3.3.以直接地址为目的操作数的指令以直接地址为目的操作数的指令基本格式:基本格式:MOV direct,MOV direct,源操作数源操作数 这组指令的功能是把源操作数指定的内容送到由直接地址这组指令的功能是把源操作数指定的内容送到由直接地址directdirect所选定的片所选定的片内内RAMRAM中,是最为丰富的一组指令,支持任意两个单元之间的数据传送,不管该中,是最为丰富的一组指令,支持任意两个单元之间的数据传送,不管该单元的地址是直接给定的还是由地址寄存器间

34、接指出来的。有直接、立即数、寄单元的地址是直接给定的还是由地址寄存器间接指出来的。有直接、立即数、寄存器和寄存器间接存器和寄存器间接4 4种寻址方式:种寻址方式:MOV direct1, direct2 ;MOV direct1, direct2 ;直接地址单元中的内容送到直接地址单元直接地址单元中的内容送到直接地址单元MOV direct,#data ;MOV direct,#data ;立即数送到直接地址单元立即数送到直接地址单元MOV direct,A ;MOV direct,A ;累加器累加器A A中的内容送到直接地址单元中的内容送到直接地址单元MOV direct,Rn ;MOV d

35、irect,Rn ;寄存器寄存器RnRn中的内容送到直接地址单元中的内容送到直接地址单元MOV direct,Ri ;MOV direct,Ri ;寄存器寄存器RiRi中的内容指定的地址单元中的数据送到直接地址中的内容指定的地址单元中的数据送到直接地址单元单元73HB3H指令:指令: MOVMOVdirectdirect,data data ;(;(directdirect)datadata功能:该指令是将立即数功能:该指令是将立即数datadata送到地址为送到地址为directdirect的内存单元中。的内存单元中。【例】如果当前【例】如果当前(41H)=73H,(41H)=73H,则执行

36、指令:则执行指令: MOVMOV41H,#40H41H,#40H结果:(结果:(41H41H)404042H42H40H41H41HA3H40H40H立即数立即数指令:指令:MOV direct1,direct2MOV direct1,direct2;(;(direct1direct1)(direct2)(direct2)功能:该指令是将内存单元地址为功能:该指令是将内存单元地址为direct2direct2的单元中的数据送的单元中的数据送到地址为到地址为direct1direct1的内存单元中。的内存单元中。【例】如果当前内存情况如图所示,执行指令:【例】如果当前内存情况如图所示,执行指令:

37、 MOVMOV31H,30H 31H,30H 结果:结果:(31H)=0B3H(31H)=0B3H14HB3H31H31H30H30HR0R030HB3HB3H93H指令:指令:MOVMOVdirectdirect,A A ;(;(directdirect)A A 功能:该指令是将累加器的内容送到地址为功能:该指令是将累加器的内容送到地址为directdirect的数据存的数据存储器单元中,累加器中的内容保持不变。储器单元中,累加器中的内容保持不变。【例】如果当前内存情况如图所示,执行指令:【例】如果当前内存情况如图所示,执行指令: MOVMOV30H,A30H,A 结果:结果:(30H)=9

38、3H(30H)=93H14H30H31H31H30H30HR0R0A A93HB3H指令:指令:MOVMOVdirectdirect,RnRn ;(;(directdirect)Rn,nRn,n=0-7=0-7功能:该指令是将寄存器功能:该指令是将寄存器RnRn的内容送到地址为的内容送到地址为directdirect的数据存的数据存储器单元中,寄存器储器单元中,寄存器RnRn中的内容保持不变。中的内容保持不变。【例】如果当前内存情况如图所示,执行指令:【例】如果当前内存情况如图所示,执行指令: MOVMOV30H,R0 30H,R0 结果:结果:(30H)=30H(30H)=30H14H30H

39、31H31H30H30HR0R030H指令:指令:MOVMOVdirectdirect,RiRi ;(;(directdirect)(Ri),i(Ri),i=0,1=0,1功能:该指令是将寄存器功能:该指令是将寄存器RiRi的内容作为地址,该地址所对应内的内容作为地址,该地址所对应内存单元中的数据送到地址为存单元中的数据送到地址为directdirect的内存单元中。的内存单元中。【例】如果当前内存情况如图所示,执行指令:【例】如果当前内存情况如图所示,执行指令: MOVMOV31H,R0 31H,R0 结果:结果:(31H)=0B3H(31H)=0B3H14HB3H31H31H30H30HR

40、0R030HB3H4.4.以间接地址为目的操作数的指令以间接地址为目的操作数的指令基本格式:基本格式:MOV Ri,MOV Ri,源操作数源操作数这组指令的功能是把源操作数指定的内容送到以这组指令的功能是把源操作数指定的内容送到以RiRi中的内容为地址的片内中的内容为地址的片内RAMRAM中。与上组指令不同的是,单元地址不是直接给出的,而是由地址寄存中。与上组指令不同的是,单元地址不是直接给出的,而是由地址寄存器器R0R0或或R1R1的内容间接给出的。有直接、立即数和寄存器的内容间接给出的。有直接、立即数和寄存器3 3种寻址方式:种寻址方式:MOV Ri,direct ;MOV Ri,dire

41、ct ;直接地址单元中的内容送到以直接地址单元中的内容送到以RiRi中的内容为地址的中的内容为地址的RAMRAM单元单元MOV Ri,#data ;MOV Ri,#data ;立即数送到以立即数送到以RiRi中的内容为地址的中的内容为地址的RAMRAM单元单元MOV Ri,A ;MOV Ri,A ;把累加器把累加器A A中内容送到以中内容送到以RiRi单元中的内容为地址的单元中的内容为地址的RAMRAM单单元元B3H指令:指令: MOVMOVRiRi,directdirect;(;(RiRi)(direct)(direct)功能:该指令是将数据存储器地址为功能:该指令是将数据存储器地址为dir

42、ectdirect单元中的内容送到以寄存器单元中的内容送到以寄存器i i中的数据作为地址对应的数据存储器单元中,原单元中的内容保持不变。中的数据作为地址对应的数据存储器单元中,原单元中的内容保持不变。【例】如果当前【例】如果当前R0=30H,(30H)=0B3H,(31H)=14H,R0=30H,(30H)=0B3H,(31H)=14H,则执行指令:则执行指令: MOVMOVR0R0,31H31H 结果:结果:(R0)=14H(R0)=14H 即即:(30H)=14H:(30H)=14H 而而 R0=30HR0=30H14H30H31H31H30H30HR0R014H73HB3H指令:指令:

43、MOVMOVRiRi,data data ;(;(RiRi)datadata功能:该指令是将立即数功能:该指令是将立即数datadata送到以寄存器送到以寄存器i i中的数据作为中的数据作为地址对应的数据存储器单元中。地址对应的数据存储器单元中。【例】如果当前【例】如果当前R1=41H,(41H)=73H,R1=41H,(41H)=73H,则执行指令:则执行指令: MOVMOVR1,#40HR1,#40H结果:(结果:(R1R1)4040 即:即:(41H)=40H(41H)=40H 而:而:R1R141H41H41H78HR1R1R0R042H42H40H41H41HA3H40H40H立即数

44、立即数B3H93H指令:指令: MOVMOVRiRi,A A ;(;(RiRi)A,iA,i=0=0, 功能:该指令是将累加器的内容送到以寄存器功能:该指令是将累加器的内容送到以寄存器i i中的数据中的数据作为地址对应的数据存储器单元中,累加器中的内容保持不作为地址对应的数据存储器单元中,累加器中的内容保持不变。变。【例】如果当前【例】如果当前R0R030H,(30H)=0B3H,A=93H30H,(30H)=0B3H,A=93H,则执行指令:,则执行指令: MOVMOVR0R0,A A 结果:结果:(R0)(R0)93H93H 即即(30H30H)93H93H 而而 R0=30HR0=30H

45、14H30H31H31H30H30HR0R0A A93H5.5.查表指令查表指令 查表指令又称为累加器查表指令又称为累加器A A外部外部ROMROM的数据传送指令。这组指令的功能的数据传送指令。这组指令的功能是对存放于程序存储器中的数据表格进行查找传送,使用变址寻址方式,是对存放于程序存储器中的数据表格进行查找传送,使用变址寻址方式,指令的一般格式为:指令的一般格式为:MOVC A,A+DPTR ;MOVC A,A+DPTR ;表格地址单元中的内容送到表格地址单元中的内容送到A A中中MOVC A,A+PC ;MOVC A,A+PC ;表格地址单元中的内容送到表格地址单元中的内容送到A A中中

46、 第一条指令采用第一条指令采用DPTRDPTR作为基址寄存器,查表时用来存放表的起始地作为基址寄存器,查表时用来存放表的起始地址。由于用户可以很方便地通过上述址。由于用户可以很方便地通过上述1616位数据传送指令把任意一个位数据传送指令把任意一个1616位位地址送入地址送入DPTRDPTR,所以外部,所以外部ROMROM的的64 KB64 KB范围内的任意一个子域都可以用来范围内的任意一个子域都可以用来存放被查表的表格数据。存放被查表的表格数据。 第二条指令以第二条指令以PCPC作为基址寄存器,但指令中作为基址寄存器,但指令中PCPC的地址是可以变化的,的地址是可以变化的,它随着指令在程序中位

47、置的不同而不同,一旦指令在程序中位置确定以它随着指令在程序中位置的不同而不同,一旦指令在程序中位置确定以后,后,PCPC中内容也被给定。中内容也被给定。【例】执行下面程序,则【例】执行下面程序,则A A为多少?为多少? ORG 2000H;ORG 2000H;伪指令,定义下列程伪指令,定义下列程序从序从2000H2000H开始存放开始存放 MOV AMOV A,02H02H MOV DPTRMOV DPTR,DATADATA MOVC AMOVC A,A+DPTRA+DPTR RETRETDATA:DATA:11H,12H,13H11H,12H,13H由于在程序第一条赋给由于在程序第一条赋给A

48、 A的值是的值是02H02H,第,第二条指令赋给二条指令赋给DPTRDPTR的值是的值是2007H2007H,所以,所以形成的地址是形成的地址是2009H2009H,因此结果,因此结果A A13H13H。地址地址ROM2000H742001H022002H902003H202004H072005H932006H222007H112008H122009H13【例】执行下面程序,则【例】执行下面程序,则A A为多少?为多少? ORG 2000H;ORG 2000H;伪指令,定义下列程伪指令,定义下列程序从序从2000H2000H开始存放开始存放 MOV AMOV A,02H02H MOVC AMO

49、VC A,A+PCA+PC RETRETDATA:DATA:11H,12H,13H,14H,15H11H,12H,13H,14H,15H由于在程序第一条赋给由于在程序第一条赋给A A的值是的值是02H02H,第,第二条指令二条指令PCPC值为值为2002H2002H,加加1 1后后PCPC为为2003H2003H再加再加A A中的值中的值02H02H,所以形成的地,所以形成的地址是址是2005H2005H,因此结果,因此结果A A12H12H。地址地址ROM2000H742001H022002H832003H222004H112005H122006H132007H142008H152009H6

50、.6.累加器累加器A A与片外部数据存储器与片外部数据存储器RAMRAM传送指令传送指令 这组指令的作用是实现累加器这组指令的作用是实现累加器A A与片外与片外RAMRAM间的数据传送。它们之间的数据传间的数据传送。它们之间的数据传送是通过送是通过P0P0口进行的,只能采用间接寻址方式寻址外部口进行的,只能采用间接寻址方式寻址外部RAMRAM。一般格式如下:。一般格式如下:MOVX DPTR,A ;MOVX DPTR,A ;累加器中的内容送到数据指针指向的片外累加器中的内容送到数据指针指向的片外RAMRAM地址中地址中MOVX A,DPTR ;MOVX A,DPTR ;数据指针指向片外数据指针

51、指向片外RAMRAM地址中的内容送到累加器地址中的内容送到累加器A A中中MOVX A,Ri ;MOVX A,Ri ;寄存器寄存器RiRi指向片外指向片外RAMRAM地址中的内容送到累加器地址中的内容送到累加器A A中中MOVX Ri,A ;MOVX Ri,A ;累加器中的内容送到寄存器累加器中的内容送到寄存器RiRi指向片外指向片外RAMRAM地址中地址中 前两条指令采用前两条指令采用1616位数据指针位数据指针DPTRDPTR作为间接地址,完成作为间接地址,完成DPTRDPTR所指定的片外数所指定的片外数据存储器与据存储器与A A的数据传送,可寻址范围达的数据传送,可寻址范围达64 KB6

52、4 KB。其中,低。其中,低8 8位地址由位地址由P0P0口分时使口分时使用,高用,高8 8位地址由位地址由P2P2口输出。口输出。 后两条指令采用当前工作寄存器组的后两条指令采用当前工作寄存器组的R0R0或或R1R1作为间接寻址寄存器,完成以作为间接寻址寄存器,完成以R0R0或或R1R1为间接地址的片外数据存储器与为间接地址的片外数据存储器与A A的数据传送,可寻址的数据传送,可寻址256256个单元页内地址。个单元页内地址。8 8位的地址和数据均由位的地址和数据均由P0P0口分时输入口分时输入/ /输出,高输出,高8 8位页面地址需要用指令位页面地址需要用指令“MOV P2MOV P2,#

53、data#data”指定。指定。【例】如果要将内存【例】如果要将内存30H30H单元中的数据送到外单元中的数据送到外RAM 3000RAM 3000单元中,请编写指单元中,请编写指令。令。 MOV P2MOV P2,30H30H MOV A,30H MOV A,30H MOV R0,#00H MOV R0,#00H MOVX R0,A MOVX R0,A或者或者 MOV A,30HMOV A,30H MOV DPTR,#3000H MOV DPTR,#3000H MOVX DPTR,A MOVX DPTR,A【例】如果要将外【例】如果要将外RAM 2340HRAM 2340H单元中数据读到内存

54、单元中数据读到内存50H50H单元中,请编写指单元中,请编写指令。令。 MOV P2MOV P2,23H23H MOV R0,#40H MOV R0,#40H MOVX A,R0 MOVX A,R0 MOV 50H,A MOV 50H,A或者或者 MOV DPTR,#2340HMOV DPTR,#2340H MOVX A,DPTR MOVX A,DPTR MOV 50H,A MOV 50H,A 7.7.堆栈操作类指令堆栈操作类指令PUSH dierct ;PUSH dierct ;堆栈指针首先加堆栈指针首先加1 1,直接寻址,直接寻址 ; ;单元中的数据送到堆栈指针单元中的数据送到堆栈指针SP

55、SP所指的单元中所指的单元中POP direct ;POP direct ;堆栈指针堆栈指针SPSP所指单元数据送到直接寻址单元中,所指单元数据送到直接寻址单元中, ; ;堆栈指针堆栈指针SPSP再进行减再进行减1 1操作操作 第一条指令称为压栈命令,用于将第一条指令称为压栈命令,用于将directdirect为地址的操作数压入到堆为地址的操作数压入到堆栈中去。这条指令执行时分为两步:第一步是先使栈中去。这条指令执行时分为两步:第一步是先使SPSP中的栈顶地址加中的栈顶地址加1 1,使之指向堆栈新的栈顶单元;第二步是把使之指向堆栈新的栈顶单元;第二步是把directdirect中的操作数压入由

56、中的操作数压入由SPSP指指示的栈顶单元。示的栈顶单元。 第二条指令称为弹出指令,其功能是把栈顶单元中的操作数弹出到第二条指令称为弹出指令,其功能是把栈顶单元中的操作数弹出到directdirect单元,指令执行时仍分为两步:第一步是把由单元,指令执行时仍分为两步:第一步是把由SPSP所指栈顶单元中所指栈顶单元中的操作数弹到的操作数弹到directdirect单元;第二步使单元;第二步使SPSP中的原栈顶地址减中的原栈顶地址减1 1,使之指向新,使之指向新的栈顶地址。的栈顶地址。8CH3AH60H58H【例】当前数据状态如图所【例】当前数据状态如图所示,点击页面,可以演示执示,点击页面,可以演

57、示执行指令行指令PUSHPUSH时数据变化过程。时数据变化过程。 MOV SP,#70HMOV SP,#70H PUSH A PUSH A PUSH R0 PUSH R033H45H3AH58HR0R0A A71H71H73H73H07HSPSP70H71H72H70H70H72H72H3AH8CH58H33H60H【例】当前数据状态如【例】当前数据状态如图所示,点击页面,可图所示,点击页面,可以演示执行指令以演示执行指令POPPOP时数时数据变化过程。据变化过程。 MOV SP,#73HMOV SP,#73H POP A POP A POP R0 POP R033H45H8CHR0R0A A

58、71H71H73H73H07HSPSP73H72H71H70H70H72H72H注意:堆栈指令用于现场保护时,要成对出现,并遵循先进后出的规则。注意:堆栈指令用于现场保护时,要成对出现,并遵循先进后出的规则。【例】下列就是对【例】下列就是对A A、R0R0进行现场保护的中断服务子程序。进行现场保护的中断服务子程序。 PUSH APUSH A PUSH R0 PUSH R0 POP R0 POP R0 POP A POP A RETI RETI成对,呈嵌套成对,呈嵌套8.8.交换指令交换指令 这组指令的功能是把累加器这组指令的功能是把累加器A A中的内容与源操作数所指的数据相互中的内容与源操作数

59、所指的数据相互交换。交换。XCH A,Rn ;XCH A,Rn ;累加器累加器A A与工作寄存器与工作寄存器RnRn中的内容互换中的内容互换XCH A,Ri ;XCH A,Ri ;累加器累加器A A与工作寄存器与工作寄存器RiRi所指的存储单元中的内容互换所指的存储单元中的内容互换XCH A,direct ;XCH A,direct ;累加器累加器A A与直接地址单元中的内容互换与直接地址单元中的内容互换XCHD A,Ri ;XCHD A,Ri ;累加器累加器A A与工作寄存器与工作寄存器RiRi所指的存储单元中的内容所指的存储单元中的内容; ;低半字节互换低半字节互换SWAP A ;SWAP

60、 A ;累加器累加器A A中的内容高、低半字节互换中的内容高、低半字节互换9.169.16位数据传送指令位数据传送指令 MOVMOVDPTRDPTR,#data16;DPTRdata16#data16;DPTRdata16 功能说明:该指令是将功能说明:该指令是将1616位数据送到数据指针位数据送到数据指针DPTRDPTR中,其中数据的高中,其中数据的高8 8位送到位送到DPHDPH中,而数据的低中,而数据的低8 8位送到位送到DPLDPL中。中。【例】如果当前【例】如果当前DPTRDPTR2000H2000H,执行指令:,执行指令: MOVMOVDPTRDPTR,236BH236BH结果:结

61、果:DPTRDPTR236BH236BH 即:即:DPHDPH23H23H,DPLDPL6BH6BH3.3.2 3.3.2 算术运算指令算术运算指令1.1.加法指令加法指令注意:加法指令将影响注意:加法指令将影响PSWPSW中的中的CyCy、ACAC、OVOV、P P标志位。标志位。1 1)不带进位位加法指令)不带进位位加法指令 (1 1) ADDADD A,Rn;AA+Rn A,Rn;AA+Rn (2 2) ADD A,direct;AA+(direct)ADD A,direct;AA+(direct) (3 3) ADD A,Ri;AA+(Ri)ADD A,Ri;AA+(Ri) (4 4)

62、 ADDADD A,#data;AA+data A,#data;AA+data【例【例3-13-1】不带进位的加法指令示例。】不带进位的加法指令示例。 若(若(A A)=85H=85H,(,(R0R0)=20H=20H,(,(20H20H)=0AFH=0AFH,执行指令:,执行指令:ADD AADD A,R0 R0 解:解: 1000010110000101 1010111110101111 100110100 100110100结果:(结果:(A A)=34H=34H,(,(CyCy)=1=1,(,(ACAC)=1=1,(,(P P)=1=1,(,(OVOV)=1=1。【例【例3-23-2】

63、分析下述指令的执行结果。】分析下述指令的执行结果。MOV ALMOV AL,8DH8DHMOV BLMOV BL,0AH0AHADD ALADD AL,BLBL 分析:将数据分析:将数据8DH8DH送入寄存器送入寄存器A A的低的低8 8位,将数据位,将数据0AH0AH送入寄存器送入寄存器B B的低的低8 8位位, ,将寄存器将寄存器A A的低的低8 8位中的数据与寄存器位中的数据与寄存器B B的低的低8 8位中的数据位中的数据相加,结果送给寄存器相加,结果送给寄存器A A的低的低8 8位。指令执行后,(位。指令执行后,(ALAL)=97H=97H。 对于加法,溢出只能发生在两个加数符号相同的

64、情况。在进行对于加法,溢出只能发生在两个加数符号相同的情况。在进行带符号数的加法运算时,溢出标志带符号数的加法运算时,溢出标志OVOV是一个重要的编程标志,利用是一个重要的编程标志,利用它可以判断两个带符号数相加的和数是否溢出。它可以判断两个带符号数相加的和数是否溢出。 2 2)带进位位加法指令)带进位位加法指令ADDC A,direct;AA+(direct)+CyADDC A,direct;AA+(direct)+CyADDC A,#data;AA+data+CyADDC A,#data;AA+data+CyADDCADDC A,Rn;AA+Rn+Cy A,Rn;AA+Rn+CyADDCA

65、DDC A,Rn;AA+(Ri)+Cy A,Rn;AA+(Ri)+Cy注意:带进位位加法指令必须加上注意:带进位位加法指令必须加上CyCy,因此必须考虑在程序执行过程中,因此必须考虑在程序执行过程中CyCy状态的变化情况。状态的变化情况。【例【例3-33-3】带进位的加法指令示例。】带进位的加法指令示例。若(若(A A)=85H=85H,(,(20H20H)=0FFH=0FFH,Cy=1Cy=1执行指令:执行指令:ADDC AADDC A,20H 20H 解:解: 1000010110000101 11111111 11111111 1 1 110000101 110000101 结果:(结果

66、:(A A)=85H=85H,(,(CyCy)=1=1,(,(ACAC)=1=1,(,(P P)=1=1,(OVOV)=1=1。 3 3)加)加1 1指令(指令(5 5条)条)基本格式:基本格式:INC INC 目的操作数目的操作数这组指令有直接、寄存器、寄存器间址等寻址方式:这组指令有直接、寄存器、寄存器间址等寻址方式:INC A ;INC A ;累加器累加器A A中的内容加中的内容加1 1,结果存在,结果存在A A中中INC direct ;INC direct ;直接地址单元中内容加直接地址单元中内容加1 1,结果送回原地址单元,结果送回原地址单元INC Ri ;INC Ri ;寄存器的

67、内容指向的地址单元中的内容加寄存器的内容指向的地址单元中的内容加1 1,结果送回原,结果送回原地址单元中地址单元中INC Rn ;INC Rn ;寄存器寄存器RnRn的内容加的内容加1 1,结果送回原地址单元中,结果送回原地址单元中INC DPTR ;INC DPTR ;数据指针的内容加数据指针的内容加1 1,结果送回数据指针中,结果送回数据指针中在在“INC dataINC data”这条指令中,如果直接地址是这条指令中,如果直接地址是I/OI/O,其功能是先读入,其功能是先读入I/OI/O锁存器的内容,然后在锁存器的内容,然后在CPUCPU进行加进行加1 1操作,再输出到操作,再输出到I/

68、OI/O上,这就是上,这就是“读读修改修改写写”操作。操作。2.2.减法指令减法指令1 1)带借位减法指令()带借位减法指令(4 4条)条)基本格式:基本格式:SUBB SUBB 目的操作数,源操作数目的操作数,源操作数 这组指令的功能是将累加器这组指令的功能是将累加器A A的内容与第二操作数及进位标志相减,的内容与第二操作数及进位标志相减,结果送回到累加器结果送回到累加器A A中。该指令包含立即数、直接地址、间接地址及工作中。该指令包含立即数、直接地址、间接地址及工作寄存器连同借位位寄存器连同借位位CyCy内容与累加器内容与累加器A A相减,结果送回累加器相减,结果送回累加器A A中。中。S

69、UBB A,direct;SUBB A,direct;累加器累加器A A中内容与直接地址单元中的内容连同借位位相减,中内容与直接地址单元中的内容连同借位位相减, ; ;结果存在结果存在A A中中SUBB A,#data ;SUBB A,#data ;累加器累加器A A中内容与立即数连同借位位相减,结果存在中内容与立即数连同借位位相减,结果存在A A中中SUBB A,Rn ;SUBB A,Rn ;累加器累加器A A中的内容与工作寄存器中内容连同借位位相减,中的内容与工作寄存器中内容连同借位位相减, ; ;结果存在结果存在A A中中SUBB A,Ri ;SUBB A,Ri ;累加器累加器A A中内

70、容与工作寄存器中内容与工作寄存器RiRi指向的地址单元中的内容指向的地址单元中的内容 ; ;连同借位位相减,结果存在连同借位位相减,结果存在A A中中2 2)减)减1 1指令指令(4(4条条) )基本格式:基本格式:DEC DEC 目的操作数目的操作数这组指令的作用是把所指的寄存器内容减这组指令的作用是把所指的寄存器内容减1 1,结果送回原寄存器,若原,结果送回原寄存器,若原寄存器的内容为寄存器的内容为00H00H,减,减1 1后即为后即为FFHFFH,运算结果不影响任何标志位,这,运算结果不影响任何标志位,这组指令有直接寻址、寄存器寻址、寄存器间接寻址等寻址方式,当直组指令有直接寻址、寄存器

71、寻址、寄存器间接寻址等寻址方式,当直接地址是接地址是I/OI/O口锁存器时,口锁存器时,“读读修改修改写写”操作与加操作与加1 1指令类似。指令类似。 DEC A ;DEC A ;累加器累加器A A中的内容减中的内容减1 1,结果送回累加器,结果送回累加器A A中中DEC direct ;DEC direct ;直接地址单元中内容减直接地址单元中内容减1 1,结果送回直接地址单元,结果送回直接地址单元DEC Ri ;DEC Ri ;寄存器寄存器RiRi指向的地址单元中内容减指向的地址单元中内容减1 1,结果送回原地址单,结果送回原地址单元中元中DEC Rn ;DEC Rn ;寄存器寄存器RnR

72、n中的内容减中的内容减1 1,结果送回寄存器,结果送回寄存器RnRn中中3.3.乘法指令(乘法指令(1 1条)条)基本格式:基本格式:MUL MUL 源操作数源操作数 乘法指令完成单字节的乘法,只有一条指令。这条指令的功能乘法指令完成单字节的乘法,只有一条指令。这条指令的功能是:将累加器是:将累加器A A的内容与寄存器的内容与寄存器B B的内容相乘,乘积的低的内容相乘,乘积的低8 8位存放在位存放在累加器累加器A A中,高中,高8 8位存放于寄存器位存放于寄存器B B中,如果乘积超过中,如果乘积超过0FFH0FFH,则溢出,则溢出标志标志OVOV置置1 1,否则清零,进位标志,否则清零,进位标

73、志CyCy总是被清零。总是被清零。 MUL AB ;MUL AB ;累加器累加器A A中的内容与寄存器中的内容与寄存器B B中的内容相乘,结果存在中的内容相乘,结果存在A A、B B中。中。【例】设当前【例】设当前A A33H33H,B B37H,37H,则执行指令则执行指令MUL ABMUL AB后,后,A A、B B、OVOV、P P分别为多少?分别为多少?解:解:所以:所以:A A0F5H0F5H,B B0AH0AH,OVOV1,P1,P0 00 0 0 0 1 1 1 1 0 0 0 0 1 11 1 B Bx x 0 0 0 0 1 1 1 1 0 0 1 1 1 11 1 B B0

74、 0 0 0 1 1 1 1 0 0 0 0 1 11 10 0 0 0 1 1 1 1 0 0 0 0 1 1 1 10 00 0 1 1 1 1 0 0 0 0 1 1 1 10 0 0 0 1 11 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 10 0 0 0 1 1 1 10 0 1 1 0 0 1 10 0 1 1 1 1 1 1 1 1 0 0 1 1 0 01 1 B B4.4.除法指令除法指令注意:除法指令影响标志位注意:除法指令影响标志位OVOV、P P。当除数。当除数B B中的数据为中的数据为0 0时,时,OVOV1,1,否则否则OVOV0 0。 DIV

75、 AB; ADIV AB; A(A/BA/B)商商,BB(A/BA/B)余数余数【例】设当前【例】设当前A A33H33H,B B05H,05H,则执行指令则执行指令DIV ABDIV AB后,后,A A、B B、OVOV、P P分别为分别为多少?多少?解:解:所以:所以:A A0AH0AH,B B01H01H,OVOV0,P0,P0 00 00 00 00 01 10 01 10 01 10 0 1 1B B0 00 01 11 10 00 01 11 1B B- -1 10 01 11 10 01 1- -1 10 01 11 1B B 1. 1.循环移位指令循环移位指令 1 1)循环左移

76、:)循环左移: RL ARL A 2 2)带)带CyCy循环左移:循环左移:RLC ARLC A 3 3)循环右移:)循环右移: RR ARR A 4 4)带)带CyCy循环右移:循环右移:RRC ARRC A3.3.3 3.3.3 逻辑运算指令逻辑运算指令2.2.累加器半字节交换指令(累加器半字节交换指令(1 1条)条)基本格式:基本格式:SWAP SWAP 源操作数源操作数SWAP A ;SWAP A ;累加器中的内容高低半字节互换累加器中的内容高低半字节互换这条指令是将累加器中的内容高低半字节互换,前文已有介绍。这条指令是将累加器中的内容高低半字节互换,前文已有介绍。3.3.求反指令(求

77、反指令(1 1条)条)基本格式:基本格式:CPL CPL 源操作数源操作数 CPL A ;CPL A ;累加器中的内容按位取反累加器中的内容按位取反这条指令将累加器中的内容按位取反,不影响标志位。这条指令将累加器中的内容按位取反,不影响标志位。4.4.清零指令(清零指令(1 1条)条)基本格式:基本格式:CLR CLR 源操作数源操作数CLR A ;CLR A ;累加器中的内容清零累加器中的内容清零这条指令将累加器中的内容清零。这条指令将累加器中的内容清零。 5. 5.逻辑与运算指令逻辑与运算指令 1 1) ANL A,Rn;AARnANL A,Rn;AARn 2 2) ANL A,Rn;AA

78、(RiANL A,Rn;AA(Ri) ) 3 3) ANL A,direct;AA(directANL A,direct;AA(direct) ) 4 4) ANL A,#data;AAdataANL A,#data;AAdata 5 5) ANL direct,A;(direct)(direct)AANL direct,A;(direct)(direct)A 6 6) ANL direct,#data; (direct)(direct)dataANL direct,#data; (direct)(direct)data 注意:逻辑与运算要逐位相与,遵守注意:逻辑与运算要逐位相与,遵守“有有0

79、 0为为0 0,全,全1 1为为1 1”规则。规则。【例】执行下列程序后,【例】执行下列程序后,A A? MOV A,#7BH MOV A,#7BH ;A=7BH;A=7BH MOV R0,#40H MOV R0,#40H ;R0=40H;R0=40H MOV 40H,#0D9H MOV 40H,#0D9H ;(40H)=0D9H;(40H)=0D9H ANL A,R0 ANL A,R0 ;A=01111011B11011001B=01011001B;A=01111011B11011001B=01011001B ANL A,#6FH ANL A,#6FH ;A=01011001B0110111

80、1B=01001001B;A=01011001B01101111B=01001001B ANL A,R0 ANL A,R0 ;A=01001001B01000000B=01000000B;A=01001001B01000000B=01000000B所以:所以:A=40HA=40H 6. 6.逻辑或运算指令逻辑或运算指令 1 1) ORL A,Rn;AARnORL A,Rn;AARn 2 2) ORL A,Rn;AA(RiORL A,Rn;AA(Ri) ) 3 3) ORL A,direct;AA(directORL A,direct;AA(direct) ) 4 4) ORL A,#data;

81、AAdataORL A,#data;AAdata 5 5) ORL direct,A;(direct)(direct)AORL direct,A;(direct)(direct)A 6 6) ORL direct,#data; (direct)(direct)dataORL direct,#data; (direct)(direct)data 注意:逻辑与运算要逐位相或,遵守注意:逻辑与运算要逐位相或,遵守“有有1 1为为1 1,全,全0 0为为0 0”规则。规则。【例】执行下列程序后,【例】执行下列程序后,A A?(40H)=?(40H)=? MOV A,#7BH MOV A,#7BH ;A

82、=7BH;A=7BH MOV R0,#40H MOV R0,#40H ;R0=40H;R0=40H MOV 40H,#0D9H MOV 40H,#0D9H ;(40H)=0D9H;(40H)=0D9H ORL A,R0 ORL A,R0 ;A=01111011B01000000B=01111011B;A=01111011B01000000B=01111011B ORL A,#63H ORL A,#63H ;A=01111011B01100011B=01111011B;A=01111011B01100011B=01111011B ORL 40H,A ORL 40H,A ;(40H)=110110

83、01B01111011B=11111011B;(40H)=11011001B01111011B=11111011B所以:所以:A=7BH,(40H)=0FBHA=7BH,(40H)=0FBH 7. 7.逻辑异或运算指令逻辑异或运算指令 1 1) XRL A,Rn;AAXRL A,Rn;AARnRn 2 2) XRL A,Rn;AAXRL A,Rn;AA(Ri(Ri) ) 3 3) XRL A,direct;AAXRL A,direct;AA(direct)(direct) 4 4) XRL A,#data;AAXRL A,#data;AAdatadata 5 5) XRL direct,A;(

84、direct)(directXRL direct,A;(direct)(direct) )A A 6 6) XRL direct,#data; (direct)(directXRL direct,#data; (direct)(direct) )datadata 注意:逻辑与运算要逐位相异或,遵守注意:逻辑与运算要逐位相异或,遵守“相同为相同为0 0,不同为,不同为1 1”规则。规则。3.3.4 3.3.4 位操作指令位操作指令 位操作指令又称为布尔变量操作指令,共有位操作指令又称为布尔变量操作指令,共有1717条。在硬件上,条。在硬件上,MCSMCS5151单片机的布尔处理是一个完整的系统,

85、它包括位处理器、位寻单片机的布尔处理是一个完整的系统,它包括位处理器、位寻址空间、可以位寻址的址空间、可以位寻址的I/OI/O口等。布尔处理功能是口等。布尔处理功能是MCSMCS5151系列单片机的系列单片机的一个重要特征,这是出于实际应用需要而设置的。布尔变量即开关变量,一个重要特征,这是出于实际应用需要而设置的。布尔变量即开关变量,它是以位(它是以位(bitbit)为单位进行操作的。)为单位进行操作的。 在物理结构上,在物理结构上,MCSMCS5151单片机有一个布尔处理机,它以进位标志单片机有一个布尔处理机,它以进位标志作为累加位,以内部作为累加位,以内部RAMRAM可寻址的可寻址的12

86、8 B128 B为存储位。为存储位。 位操作指令包括位传送、位修正、位运算以及位控制转移命令。位操位操作指令包括位传送、位修正、位运算以及位控制转移命令。位操作指令支持对位的直接操作,为测控系统中的逻辑处理提供了一种高效的作指令支持对位的直接操作,为测控系统中的逻辑处理提供了一种高效的方法,可以实现硬件逻辑电路软件化,减少系统中元件的数量,从而提高方法,可以实现硬件逻辑电路软件化,减少系统中元件的数量,从而提高了系统的可靠性。了系统的可靠性。11.1.位传送指令位传送指令1 1) MOV CMOV C,bitbit;Cy(bitCy(bit) ) 2 2) MOV bitMOV bit,C C

87、;(bit)Cy(bit)Cy【例】设当前程序状态字【例】设当前程序状态字PSWPSW和累加器和累加器A A的数据状态如图,执行下列程序后,的数据状态如图,执行下列程序后,其数据变化如图所示(点击页面即可)。其数据变化如图所示(点击页面即可)。 MOV C,ACC.2MOV C,ACC.2 MOV ACC.5,C MOV ACC.5,C0000000PSWA111111000102.2.位修正指令位修正指令1 1)位清零指令)位清零指令 (1 1) CLR CCLR C;Cy0 Cy0 (2 2) CLR bitCLR bit;(bit)0(bit)0【例】当前程序状态字【例】当前程序状态字P

88、SWPSW状态如图所示,要求将当前工作寄存器区设置状态如图所示,要求将当前工作寄存器区设置为为2 2区,试编程(点击页面即可)。区,试编程(点击页面即可)。 CLR RS0CLR RS00001000PSW1 012 2)位复位指令)位复位指令 (1 1) SETB CSETB C;Cy1Cy1 (2 2) SETB bitSETB bit;(bit)1(bit)1【例】当前程序状态字【例】当前程序状态字PSWPSW状态如图所示,要求将当前工作寄存器区设置状态如图所示,要求将当前工作寄存器区设置为为3 3区,试编程(点击页面即可)。区,试编程(点击页面即可)。 SETB RS1SETB RS1

89、 SETB RS0 SETB RS0000000PSW1003.3.位运算指令位运算指令1 1)位逻辑与运算指令)位逻辑与运算指令 (1 1) ANL C,bit ; CyCy(bitANL C,bit ; CyCy(bit) ) (2 2) ANL C,bit ; CyCy(bitANL C,bit ; CyCy(bit) ) 2 2)位逻辑或运算指令)位逻辑或运算指令 (1 1) ORL C,bit ; CyCy(bitORL C,bit ; CyCy(bit) ) (2 2) ORL C,bit ; CyCy(bitORL C,bit ; CyCy(bit) ) 3 3)位取反指令)位取

90、反指令 (1 1) CPL C CPL C ;CyCyCyCy (2 2) CPL bit CPL bit ;(bit)(bit(bit)(bit) )4.4.位控制转移指令(位控制转移指令(5 5条)条) 位控制转移指令以位的状态作为实现程序转移的判断条件,是一种位控制转移指令以位的状态作为实现程序转移的判断条件,是一种条件转移指令。有以下条件转移指令。有以下5 5种:种:uJC rel ;(Cy)=1JC rel ;(Cy)=1转移,(转移,(PCPC)+2+relPC+2+relPC,否则程序往下执,否则程序往下执行,(行,(PCPC)+2PC+2PCuJNC rel ;(Cy)=0JN

91、C rel ;(Cy)=0转移,(转移,(PCPC)+2+relPC+2+relPC,否则程序往下执,否则程序往下执行,(行,(PCPC)+2PC+2PCuJB bit,rel ;(bit)=1JB bit,rel ;(bit)=1转移转移, ,(PCPC)+3+relPC+3+relPCuJNB bit,rel ;(bit)=0JNB bit,rel ;(bit)=0转移转移, ,(PCPC)+3+relPC+3+relPCuJBC bit,rel ;(bit)=1JBC bit,rel ;(bit)=1转移,(转移,(PCPC)+3+relPC+3+relPC,且,且0bit0bit3.3

92、.5 3.3.5 控制转移指令控制转移指令1.1.无条件转移指令无条件转移指令1 1)短转移指令)短转移指令 AJMP addr11 ;AJMP addr11 ;程序计数器赋予新值(程序计数器赋予新值(1111位地址),(位地址),(PC15-11PC15-11)不改变不改变 该指令仅提供该指令仅提供1111位目标地址,因此,位目标地址,因此,CPUCPU执行程序的转移范围为本指执行程序的转移范围为本指令上下令上下2 KB2 KB的空间。的空间。CPUCPU执行程序时,碰到该指令立即转移到目标地址处执行程序时,碰到该指令立即转移到目标地址处执行程序。执行程序。2 2)长转移指令)长转移指令 L

93、JMP addr16 ;LJMP addr16 ;给程序计数器赋予新值(给程序计数器赋予新值(1616位地址)位地址) 该指令直接指出了要转移到的该指令直接指出了要转移到的1616位目标地址,因此,位目标地址,因此,CPUCPU可以转移到可以转移到程序存储器程序存储器64 KB64 KB地址空间的任何单元去执行程序。地址空间的任何单元去执行程序。CPUCPU执行程序时,碰执行程序时,碰到该指令立即转移到指令指定的目标地址处执行程序。到该指令立即转移到指令指定的目标地址处执行程序。3 3)相对转移指令)相对转移指令SJMP rel ;SJMP rel ;当前程序计数器先加上当前程序计数器先加上2

94、 2,再加上偏移量给程序计数器赋,再加上偏移量给程序计数器赋予新值予新值 指令代码中给定的转移相对偏移量指令代码中给定的转移相对偏移量relrel为为8 8位二进制补码,因此,该位二进制补码,因此,该指令的转移范围为本条指令上方最远指令的转移范围为本条指令上方最远128128个字节,下方最远个字节,下方最远127127个字节。个字节。4 4)间接转移指令(散转指令)间接转移指令(散转指令)JMP A+DPTR ;JMP A+DPTR ;累加器所指向地址单元的值加上数据累加器所指向地址单元的值加上数据 ; ;指针的值给程序计数器赋予新值指针的值给程序计数器赋予新值2.2.条件转移指令条件转移指令

95、 条件转移指令就是当条件满足时发生转移,如果条件不满足则执行条件转移指令就是当条件满足时发生转移,如果条件不满足则执行下一条指令。下一条指令。1 1)以累加器)以累加器A A内容为条件的转移指令(判内容为条件的转移指令(判0 0指令)指令) JZJZrelrel;若;若A A0 0,则,则PCPCPCPCrelrel2 2 ;若;若A0A0,则,则PCPCPCPC2 2说明:即说明:即A A为零则转移,否则执行紧跟为零则转移,否则执行紧跟JZ relJZ rel的下一条指令。的下一条指令。 JNZJNZrelrel ;若;若A0A0,则,则PCPCPCPCrelrel2 2 ;若;若A A0

96、0,则,则PCPCPCPC2 2说明:即说明:即A A不为零则转移,否则执行紧跟不为零则转移,否则执行紧跟JNZ relJNZ rel的下一条指令。的下一条指令。 JNZ relJNZ rel的流程图的流程图A0?YES转移转移NO往下执行往下执行JZ relJZ rel的流程图的流程图A0?YES转移转移NO往下执行往下执行【例【例】阅读程序,阅读程序, 结果结果R0R0? ORG 2000HORG 2000H START:MOV R0,#00H START:MOV R0,#00H MOV A,#20H MOV A,#20H LOOP:SUBB A,#04H LOOP:SUBB A,#04H

97、 INC R0 INC R0 JNZ LOOP JNZ LOOP RET RET结果:结果:R0=08HR0=08H【例】要求从内存【例】要求从内存30H30H开始寻找关键字开始寻找关键字0AAH0AAH,找到第一个,找到第一个0AAH0AAH后停止寻找,后停止寻找,且将该地址存放在且将该地址存放在A A中。试编程。中。试编程。 ORG 2000HORG 2000H START:MOV R0,#30H START:MOV R0,#30H LOOP1:CLR C LOOP1:CLR C MOV A,#0AAH MOV A,#0AAH SUBB A,R0 SUBB A,R0 JZ LOOP2 JZ

98、 LOOP2 INC R0 INC R0 SJMP LOOP1 SJMP LOOP1 LOOP2:MOV A,R0 LOOP2:MOV A,R02 2)比较转移指令)比较转移指令 CJNECJNE第一操作数,第二操作数,第一操作数,第二操作数,relrel具体指令格式为:具体指令格式为: CJNE A,direct,relCJNE A,direct,rel CJNE A,#data,rel CJNE A,#data,rel CJNE Rn,#data,rel CJNE Rn,#data,rel CJNE CJNE Ri,#data,relRi,#data,rel 说明:第一操作数与第二操作数比

99、较,若二者相等,则不转移;说明:第一操作数与第二操作数比较,若二者相等,则不转移;若不等,则转移,且当第一操作数小于第二操作数时,对若不等,则转移,且当第一操作数小于第二操作数时,对CyCy置置1,1,否则否则清零。清零。【例】判断内存【例】判断内存30H30H单元中内容是否为单元中内容是否为AAHAAH,若是则置,若是则置40H40H单元为单元为FFHFFH,若不,若不是则置是则置40H40H单元为单元为00H00H。使用使用CJNE A,direct,relCJNE A,direct,rel ST:MOV A,ST:MOV A,0AAH0AAH MOV 40H,#0FFH MOV 40H,

100、#0FFH CJNE A,30H,ST1 CJNE A,30H,ST1 MOV 40H,#00H MOV 40H,#00HST1:ENDST1:END使用使用CJNE A,#data,relCJNE A,#data,rel ST:MOV A,30HST:MOV A,30H MOV 40H,#0FFH MOV 40H,#0FFH CJNE A,#0AA,ST1 CJNE A,#0AA,ST1 MOV 40H,#00H MOV 40H,#00HST1:ENDST1:END使用使用CJNE CJNE R0,#data,relR0,#data,rel ST:MOV R0,#30HST:MOV R0,#

101、30H MOV 40H,#0FFH MOV 40H,#0FFH CJNE CJNE R0,#0AAH,ST1R0,#0AAH,ST1 MOV 40H,#00H MOV 40H,#00HST1:ENDST1:END使用使用CJNE Rn,#data,relCJNE Rn,#data,rel ST:MOV R0,30HST:MOV R0,30H MOV 40H,#0FFH MOV 40H,#0FFH CJNE R0,#0AA,ST1 CJNE R0,#0AA,ST1 MOV 40H,#00H MOV 40H,#00HST1:ENDST1:END 3 3)循环转移指令)循环转移指令 DJNZ Rn,

102、relDJNZ Rn,rel ;RnRnRnRn1,1, ;若;若Rn0Rn0,则转移,则转移PCPCPCPC2 2relrel; ;若;若RnRn0 0,则执行下一条指令,则执行下一条指令 DJNZ direct,rel ;(direct)(directDJNZ direct,rel ;(direct)(direct) )1 1 ; ;若若(direct)0(direct)0,则,则PCPCPCPC3 3relrel ; ;若若(direct)=0(direct)=0,则执行下一条指令,则执行下一条指令NYRn Rn-1Rn=0?NY(direct)(direct)(direct)-1(di

103、rect)-1(direct)=0?(direct)=0?【例】将内存【例】将内存30H30H3FH3FH单元中的内容移送到单元中的内容移送到40H40H4FH4FH单元中。单元中。程序程序1 1:MOV 40H,30HMOV 40H,30HMOV 41H,31HMOV 41H,31HMOV 42H,32HMOV 42H,32HMOV 4FH,3FHMOV 4FH,3FHENDEND程序程序2 2:START:MOV R0,#30HSTART:MOV R0,#30H MOV R1,#40H MOV R1,#40H MOV R2,#10H MOV R2,#10HLOOP1:MOV A,LOOP1

104、:MOV A, R0R0 MOV MOV R1,AR1,A INC R0 INC R0 INC R1 INC R1 DJNZ R2,LOOP1 DJNZ R2,LOOP1 END END 哪个程哪个程序更好序更好? 【例】判断内存从【例】判断内存从30H30H3FH3FH中是否存在关键字为中是否存在关键字为AAHAAH的单元,若有则置的单元,若有则置40H40H单元为单元为FFHFFH,若没有则置,若没有则置40H40H单元为单元为00H00H。START:MOV 40H,#00HSTART:MOV 40H,#00H MOV R0,#30H MOV R0,#30H MOV R1,#10H MO

105、V R1,#10HLOOP1:CJNE LOOP1:CJNE R0,#0AAH,LOOP2R0,#0AAH,LOOP2 MOV 40H,#0FFH MOV 40H,#0FFH SJMP LOOP3 SJMP LOOP3LOOP2:INC R0LOOP2:INC R0 DJNZ R1,LOOP1 DJNZ R1,LOOP1LOOP3:ENDLOOP3:END 【例】统计从内存【例】统计从内存30H30H3FH3FH单元中有多少个关键字为单元中有多少个关键字为AAHAAH的单元,将的单元,将统计结果存放在统计结果存放在40H40H单元中。单元中。START:MOV 40H,#00HSTART:MO

106、V 40H,#00H MOV R0,#30H MOV R0,#30H MOV R1,#10H MOV R1,#10HLOOP1:CJNE LOOP1:CJNE R0,#AAH,LOOP2R0,#AAH,LOOP2 INC 40H INC 40HLOOP2:INC R0LOOP2:INC R0 DJNZ R1,LOOP1 DJNZ R1,LOOP1LOOP3:ENDLOOP3:END3.3.子程序调用指令子程序调用指令1 1)长调用指令)长调用指令基本格式:基本格式:LCALL addr16LCALL addr16 长调用指令,可在长调用指令,可在64 KB64 KB空间调用子程序。此时(空间调

107、用子程序。此时(PCPC)+3+3(PCPC),),(SPSP)+1+1(SPSP),(),(PC7-0PC7-0)(SPSP),(),(SPSP)+1+1(SPSP),(),(PC15-PC15-8 8)(SPSP),),addr16addr16(PC15-0PC15-0),即分别从堆栈中弹出调用子程序时),即分别从堆栈中弹出调用子程序时压入的返回地址。压入的返回地址。2 2)短调用指令)短调用指令基本格式:基本格式:ACALL addr11ACALL addr11 短调用指令,可在短调用指令,可在2 KB2 KB空间调用子程序。此时(空间调用子程序。此时(PCPC)+2+2(PCPC),)

108、,(SPSP)+1+1(SPSP),(),(PC7-0PC7-0)(SPSP),(),(SPSP)+1+1(SPSP),(),(PC15-PC15-8 8)(SPSP),),addr11addr11(PC10-0PC10-0)。)。3 3)子程序返回指令)子程序返回指令基本格式:基本格式:RETRET 子程序返回指令。此时(子程序返回指令。此时(SPSP)(PC15-8PC15-8),(),(SPSP)-1-1(SPSP),),(SPSP)(PC7-0PC7-0),(),(SPSP)-1-1(SPSP)。)。4 4)中断返回指令)中断返回指令基本格式:基本格式:RETI RETI 中断返回指令

109、除具有中断返回指令除具有RETRET功能外,还具有恢复中断逻辑的功能,需注意的功能外,还具有恢复中断逻辑的功能,需注意的是,是,RETIRETI指令不能用指令不能用RETRET代替。代替。60H8CH20H 【例】当前【例】当前PCPC2000H2000H,执行指令,执行指令LCALL 3000HLCALL 3000H,数据状态变,数据状态变化如图所示(点击页面可以演示)。化如图所示(点击页面可以演示)。 LCALL 3000HLCALL 3000H70H33H45H00HPCPC71H71H73H73HSPSP72H71H70H70H72H72H03H03H203000H4.4.空操作指令空

110、操作指令 NOP NOP ;PCPC+1PCPC+1 说明:本指令仅将程序计数器说明:本指令仅将程序计数器PCPC加加1,1,不作任何具体操作。本指不作任何具体操作。本指令用于时间子程序中的时间调节,或为了提高抗干扰能力而在程序令用于时间子程序中的时间调节,或为了提高抗干扰能力而在程序中插入本指令。中插入本指令。 3.4.1 3.4.1 源程序的编辑与汇编源程序的编辑与汇编1.1.源程序的编辑源程序的编辑 源程序的编写要依据源程序的编写要依据80C5180C51汇编语言的基本规则,特别要用好常用汇编语言的基本规则,特别要用好常用的汇编命令(即伪指令),例如:的汇编命令(即伪指令),例如:ORG

111、 0040HORG 0040HMOV AMOV A,#7FH#7FHMOV R1MOV R1,#44H#44HENDEND 这里的这里的ORGORG和和ENDEND是两条伪指令,其作用是告诉汇编程序此汇编源程是两条伪指令,其作用是告诉汇编程序此汇编源程序的起止位置。编辑好的源程序应以序的起止位置。编辑好的源程序应以.ASM.ASM扩展名存盘,以备汇编程序调扩展名存盘,以备汇编程序调用。用。3.4 3.4 单片机汇编语言程序设计单片机汇编语言程序设计2.2.源程序的汇编源程序的汇编 将汇编语言源程序转换为单片机能执行的机器码形式的目标程序,将汇编语言源程序转换为单片机能执行的机器码形式的目标程序

112、,这个过程叫汇编。汇编常用的方法有两种:一是手工汇编,二是机器这个过程叫汇编。汇编常用的方法有两种:一是手工汇编,二是机器汇编。汇编。 手工汇编时,把程序用助记符指令写出后,通过手工方式查指令手工汇编时,把程序用助记符指令写出后,通过手工方式查指令编码表,逐个把助记符指令翻译成机器码,然后把得到的机器码程序编码表,逐个把助记符指令翻译成机器码,然后把得到的机器码程序(以十六进制形式)输入到单片机开发机中,并进行调试。由于手工(以十六进制形式)输入到单片机开发机中,并进行调试。由于手工汇编是按绝对地址进行定位的,所以,对于偏移量的计算和程序的修汇编是按绝对地址进行定位的,所以,对于偏移量的计算和

113、程序的修改非常不便。通常只有程序较小或开发条件有限制时才使用。改非常不便。通常只有程序较小或开发条件有限制时才使用。 机器汇编是在常用的个人计算机上,使用交叉汇编程序将汇编语机器汇编是在常用的个人计算机上,使用交叉汇编程序将汇编语言源程序转换为机器码形式的目标程序。言源程序转换为机器码形式的目标程序。3.4.2 3.4.2 伪指令伪指令 伪指令在形式上是一条指令,但它并不译成机器语言,只是为汇编伪指令在形式上是一条指令,但它并不译成机器语言,只是为汇编时提供必须的控制信息命令。时提供必须的控制信息命令。1.1.汇编起始伪指令汇编起始伪指令ORGORG基本格式:基本格式:标号:标号: ORG 1

114、6ORG 16位地址位地址 功能:规定程序块或数据块存放的起始地址。在一个汇编语言程序功能:规定程序块或数据块存放的起始地址。在一个汇编语言程序中,可以多次定义中,可以多次定义ORGORG伪指令,但要求给定的地址由小到大安排,各段之伪指令,但要求给定的地址由小到大安排,各段之间地址不能重叠。间地址不能重叠。2.2.汇编结束伪指令汇编结束伪指令ENDEND基本格式:基本格式:标号:标号: ENDEND表达式表达式 功能:结束汇编。汇编程序遇到功能:结束汇编。汇编程序遇到ENDEND伪指令后即结束汇编。处于伪指令后即结束汇编。处于ENDEND之后的程序,汇编程序不予以处理。之后的程序,汇编程序不予

115、以处理。例如:例如: ORG 2000HORG 2000HSTARTSTART: MOV AMOV A,# 00H# 00H END START END START ;标号;标号STARTSTART开始的程序段结束开始的程序段结束3.3.等值指令等值指令EQUEQU基本格式:基本格式:字符名称字符名称 EQU EQU 项项 这里使用的这里使用的“字符名称字符名称”不是标号,不能用不是标号,不能用“:”来隔分隔符;其来隔分隔符;其中的中的“项项”可以是一个数值,也可以是一个已经有定义的名字或可以求可以是一个数值,也可以是一个已经有定义的名字或可以求值的表达式。该指令的功能是将一个数或特定的汇编符

116、号赋予规定的字值的表达式。该指令的功能是将一个数或特定的汇编符号赋予规定的字符名称。用符名称。用EQUEQU指令赋值的字符名称可以用做数据地址、代码地址、位地指令赋值的字符名称可以用做数据地址、代码地址、位地址或直接当做一个立即数使用。因此,给字符名称所赋的值可以是址或直接当做一个立即数使用。因此,给字符名称所赋的值可以是8 8位二位二进制数,也可以是进制数,也可以是1616位二进制数。位二进制数。4.4.定义字节指令定义字节指令DBDB 基本格式:基本格式:标号:标号: DB 8DB 8位二进制数表位二进制数表 DBDB命令是从指定的地址单元开始,定义若干个命令是从指定的地址单元开始,定义若

117、干个8 8位内存单元的位内存单元的内容。该命令主要是在程序存储器的某一部分存入一组内容。该命令主要是在程序存储器的某一部分存入一组8 8位二进制位二进制数,或者是将一个数据表格存入程序存储器。这个伪指令在汇编以数,或者是将一个数据表格存入程序存储器。这个伪指令在汇编以后,将影响程序存储器的内容。后,将影响程序存储器的内容。5.5.定义字命令定义字命令DWDW 指令格式:指令格式: 标号:标号:DW 16DW 16位二进制数表位二进制数表 说明:说明:DWDW伪指令是定义字的伪指令,即从指定的地址单元开始,定伪指令是定义字的伪指令,即从指定的地址单元开始,定义若干个义若干个1616位二进制数据,

118、每个字占用两个单元,先存高位二进制数据,每个字占用两个单元,先存高8 8位,再存低位,再存低8 8位。用法同位。用法同DBDB伪指令。伪指令。6.6.定义空间指令定义空间指令DSDS指令格式:指令格式:标号:标号:DS DS 说明:说明:DSDS伪指令是定义存储区,即从标伪指令是定义存储区,即从标号指定的单元开始保留表达式所代表的号指定的单元开始保留表达式所代表的存储单元数。存储单元数。【例【例】 ORG 2000HORG 2000H DS 04H DS 04H MOV A,#02H MOV A,#02H RET RET 地址地址ROMROM2000H2000H2001H2001H2002H2

119、002H2003H2003H2004H2004H74742005H2005H02022006H2006H2222保留保留单元单元7.7.位地址赋值指令位地址赋值指令BITBIT 基本格式:基本格式: 标号:标号: BIT BIT 位地址位地址 功能:将位地址赋给本语句的标号。经赋值的标号可以代替指令中功能:将位地址赋给本语句的标号。经赋值的标号可以代替指令中的位,即在程序中,标号和该位地址是等价的。的位,即在程序中,标号和该位地址是等价的。 例如:例如: DLY1DLY1: BIT 31HBIT 31H DLY2 DLY2: BIT 32HBIT 32H 经过上述定义后,在编程时,可以把经过上

120、述定义后,在编程时,可以把DLY1DLY1和和DLY2DLY2当做位地址当做位地址31H31H和和32H32H。3.4.3 3.4.3 汇编语言程序设计的方法和步骤汇编语言程序设计的方法和步骤程序设计的步骤:程序设计的步骤:1 1)分析题意,明确要求。)分析题意,明确要求。2 2)确定算法)确定算法3 3)画程序流程图)画程序流程图4 4)分配内存工作单元,确定程序与数据区的存放地址。)分配内存工作单元,确定程序与数据区的存放地址。5 5)编写源程序。)编写源程序。6 6)程序优化)程序优化7 7)上机调试、修改和最后确定源程序。)上机调试、修改和最后确定源程序。程序流程图框图程序流程图框图3

121、.4.4 3.4.4 基本程序结构基本程序结构 在程序设计中,将会遇到简单的和复杂的程序,但无论程序如何在程序设计中,将会遇到简单的和复杂的程序,但无论程序如何复杂,都可以看成是一个个基本程序结构的组合。这些基本结构包括复杂,都可以看成是一个个基本程序结构的组合。这些基本结构包括顺序结构、分支结构、循环结构和子程序结构。顺序结构、分支结构、循环结构和子程序结构。1.1.顺序结构顺序结构 顺序结构是一种最简单、最基本的顺序结构是一种最简单、最基本的程序结构。顺序程序只由算术运算和逻程序结构。顺序程序只由算术运算和逻辑运算指令构成,程序是按指令顺序逐辑运算指令构成,程序是按指令顺序逐条执行的。顺序

122、程序结构如右图:条执行的。顺序程序结构如右图: 程序段程序段1程序段程序段2 2. 2.分支结构分支结构 分支结构程序的特点是程序中含有转移指令。由于转移指令有无分支结构程序的特点是程序中含有转移指令。由于转移指令有无条件转移和条件转移之分,所以分支结构程序也可分为无条件分支程条件转移和条件转移之分,所以分支结构程序也可分为无条件分支程序和条件分支程序两类。分支结构程序首先要对问题的条件进行判断,序和条件分支程序两类。分支结构程序首先要对问题的条件进行判断,根据判断结果转向不同的分支。根据判断结果转向不同的分支。典型的分支结构典型的分支结构 条件成立条件成立?程序段程序段N NY Y 条件成立

123、条件成立?程序段程序段1 1程序段程序段2 2N NY Y(a)(a)(b)(b)3.3.循环结构循环结构 循环结构本质上也是一种分支结构,只是其分支出口中,有一个循环结构本质上也是一种分支结构,只是其分支出口中,有一个出口又回到入口,结果造成程序不断循环。对于需要重复一些操作的出口又回到入口,结果造成程序不断循环。对于需要重复一些操作的问题,如统计数据个数、多个字符传送等,可采用循环程序实现。问题,如统计数据个数、多个字符传送等,可采用循环程序实现。 循环程序结构有循环程序结构有“先处理后判断先处理后判断”和和“先判断后处理先判断后处理”两种,如两种,如下图所示:下图所示: 循环条件循环条件

124、?循环体循环体置循环初值置循环初值NYN 循环条件循环条件?循环体循环体置循环初值置循环初值Y(a)先处理后判断方式)先处理后判断方式 (b)先判断后处理方式)先判断后处理方式 4.4.子程序结构子程序结构 在汇编语言程序设计时,通过循环程序可以解决连续重复执行同在汇编语言程序设计时,通过循环程序可以解决连续重复执行同一程序段的问题,而对于不连续重复执行同一程序段的问题,为避免一程序段的问题,而对于不连续重复执行同一程序段的问题,为避免重复编制程序,节省程序代码所占的存储空间,可将其编制成独立的重复编制程序,节省程序代码所占的存储空间,可将其编制成独立的程序即子程序,在需要的位置采用特定的指令

125、调用该子程序,执行后程序即子程序,在需要的位置采用特定的指令调用该子程序,执行后再返回到调用位置继续执行后序程序指令。子程序调用是实现再返回到调用位置继续执行后序程序指令。子程序调用是实现I/OI/O操操作的重要方法。作的重要方法。【例】试编制程序,实现【例】试编制程序,实现1 12 23 39999?结果千、百位存?结果千、百位存放在放在31H31H单元,十、个位存放在单元,十、个位存放在30H30H单元。单元。解:本题是十进制数累加,必须解:本题是十进制数累加,必须对和要进行对和要进行BCDBCD码调整;同时加码调整;同时加数的增长不能用数的增长不能用INCINC指令,也必指令,也必须进行

126、须进行BCDBCD码调整,因此只能用码调整,因此只能用ADD AADD A,0101指令,再进行指令,再进行BCDBCD码码调整。调整。开始开始初始赋值初始赋值和与加数相加和与加数相加对和对和BCDBCD码调整码调整Cy=1?千、百位加千、百位加1 1 BCDBCD码调整码调整加数加加数加1 1 BCDBCD码调整码调整结束否结束否数据保存数据保存 YNNY结束结束START:CLR ASTART:CLR A MOV R1,A MOV R1,A MOV R2,#99 MOV R2,#99 MOV R0,#01 MOV R0,#01LOOP1:ADD A,R0LOOP1:ADD A,R0 DA

127、A DA A JNC LOOP2 JNC LOOP2 MOV 30H,A MOV 30H,A MOV A,R1 MOV A,R1 ADD A,#01 ADD A,#01 DA A DA A MOV R1,A MOV R1,A MOV A,30H MOV A,30HLOOP2:MOV 30H,ALOOP2:MOV 30H,A MOV A,R0 MOV A,R0 ADD A,#01 ADD A,#01 DA A DA A MOV R0,A MOV R0,A MOV A,30H MOV A,30H DJNZ R2,LOOP1 DJNZ R2,LOOP1 MOV 30H,A MOV 30H,A MOV

128、 31H,R1 MOV 31H,R1 END END【例】在内【例】在内RAM 30HRAM 30H3FH3FH存存放符号数,试统计中间负数放符号数,试统计中间负数的个数,将统计结果存放在的个数,将统计结果存放在40H40H单元中,试编制程序。单元中,试编制程序。解:判断负数的方法只要对解:判断负数的方法只要对最高进行判断,如果是最高进行判断,如果是1 1则为则为负数,否则为零或正数。负数,否则为零或正数。开始开始初始赋值初始赋值取数送取数送A AACC.7=1?统计数加统计数加1 1 源单元地址加源单元地址加1 1 结束否结束否YNNY结束结束START:MOV 40H,#00HSTART:

129、MOV 40H,#00H MOV R0,#30H MOV R0,#30H MOV R2,#10H MOV R2,#10HLOOP1:MOV A,R0LOOP1:MOV A,R0 JNB ACC.7,LOOP2 JNB ACC.7,LOOP2 INC 40H INC 40HLOOP2:INC R0LOOP2:INC R0 DJNZ R2,LOOP1 DJNZ R2,LOOP1 END END3.5 3.5 汇编语言编程实训汇编语言编程实训3.5.1 3.5.1 传送指令训练传送指令训练【例【例3-293-29】 不同存储区域之不同存储区域之间的数据传输。将内部间的数据传输。将内部RAM RAM

130、30H30H单元开始的内容依次传送单元开始的内容依次传送到外部到外部RAM 0100HRAM 0100H单元开始的单元开始的区域,直到遇到传送的内容区域,直到遇到传送的内容是是0 0为止。为止。不同存储区域之间数据传输程序流程图不同存储区域之间数据传输程序流程图汇编语言源程序如下:汇编语言源程序如下:ORG0000HMOVR0,#30H ;R0指向内部指向内部RAM数据区首地址数据区首地址MOVXDPTR,#0100H;DPTR指向外部指向外部RAM数据区首地址数据区首地址TRANS:MOVA,R0 ;A(R0)MOVXDPTR,A;(;(DPTR)ACJNEA,#00H,NEXTSJMPFI

131、NISH ;A=0,传送完成,传送完成NEXT:INC R0 ;修改地址指针;修改地址指针INC DPTRAJMPTRANS ;继续传送;继续传送FINISH:SJMP$END3.5.2 3.5.2 查找、排序程序查找、排序程序【例【例3-303-30】 片内片内RAMRAM中数据中数据检索程序设计。检索程序设计。 片内片内RAMRAM中有一数据块,中有一数据块,R0 R0 指向块首地址,指向块首地址,R1R1中为数中为数据块长度,请在该数据块中查据块长度,请在该数据块中查找关键字,关键字存放在累加找关键字,关键字存放在累加器器A A中,若找到关键字,把关中,若找到关键字,把关键字在数据块中的

132、序号存放到键字在数据块中的序号存放到A A中,若找不到关键字,中,若找不到关键字,A A中存中存放序号放序号00H00H。数据检索程序流程图数据检索程序流程图汇编语言源程序如下:汇编语言源程序如下:; ;程序名:程序名:FINDFIND; ;功能:片内功能:片内RAMRAM中数据检索中数据检索; ;入口参数:入口参数:R0 R0 指向块首地址,指向块首地址,R1R1中为数据块长度,关键字存放在累加器中为数据块长度,关键字存放在累加器A A中中; ;出口参数:若找到关键字,把关键字在数据块中的序号存放到出口参数:若找到关键字,把关键字在数据块中的序号存放到A A中,若找不中,若找不; ;到关键字

133、,到关键字,A A中存放序号中存放序号00H00H; ;占用资源:占用资源:R0,R1,R2,A,PSWR0,R1,R2,A,PSWFIND:PUSH PSWFIND:PUSH PSWPUSH ACCPUSH ACCMOV R2MOV R2,#00H#00HLOOPLOOP:POP ACCPOP ACCMOV BMOV B,A AXRL AXRL A,R0 R0 ;关键字与数据块中的数据进行异或操作;关键字与数据块中的数据进行异或操作INC R0INC R0;指向下一个数;指向下一个数INC R2INC R2;R2R2中的序号加中的序号加1 1 JZ LOOP1 JZ LOOP1;找到;找到P

134、USH BPUSH BDJNZ R1,LOOPDJNZ R1,LOOPMOV R2,#00HMOV R2,#00H;找不到,;找不到,R2R2中存放中存放00H00HLOOP1:MOV A,R2LOOP1:MOV A,R2POP PSWPOP PSWRETRET3.5.3 3.5.3 代码转换程序代码转换程序 【例【例3-333-33】 BCDBCD码转换为二进制数:把累加器码转换为二进制数:把累加器A A中的中的BCDBCD码码转换成二进制数,结果仍存放在累加器转换成二进制数,结果仍存放在累加器A A中。中。 分析:分析:A A中存放的中存放的BCDBCD码数的范围是码数的范围是025502

135、55,转换成二进制数,转换成二进制数后是后是011111111B011111111B,所以仍然可以存放在累加器,所以仍然可以存放在累加器A A中。本例采用中。本例采用将将A A中的高半字节(十位)乘以中的高半字节(十位)乘以1010,再加上,再加上A A的低半字节(个位)的低半字节(个位)的方法,计算公式是的方法,计算公式是A A747410+A10+A3030。汇编语言源程序如下:汇编语言源程序如下:; ;程序名:程序名:BCDBINBCDBIN; ;功能:功能:BCDBCD码转换为二进制数码转换为二进制数; ;入口参数:要转换的入口参数:要转换的BCDBCD码存在累加器码存在累加器A A中

136、中; ;出口参数:转换后的二进制数存放在累加器出口参数:转换后的二进制数存放在累加器A A中中; ;占用资源:寄存器占用资源:寄存器B BBCDBIN: PUSHB BCDBIN: PUSHB ;保护现场;保护现场PUSHPSWPUSHPSWPUSH ACC PUSH ACC ;暂存;暂存A A的内容的内容ANLA,#0F0HANLA,#0F0H;屏蔽掉低;屏蔽掉低4 4位位SWAPASWAPA;将;将A A的高的高4 4位与低位与低4 4位交换位交换MOVB,#10MOVB,#10MULABMULAB;乘法指令,;乘法指令,A A中高半字节乘以中高半字节乘以1010MOVB,AMOVB,A;

137、乘积不会超过;乘积不会超过256256,因此乘积在,因此乘积在A A中,暂存到中,暂存到B BPOPACCPOPACC;取原;取原BCDBCD数数ANLA,#0FHANLA,#0FH;屏蔽掉高;屏蔽掉高4 4位位ADDA,BADDA,B;个位数与十位数相加;个位数与十位数相加POPPSWPOPPSWPOPBPOPB;恢复现场;恢复现场RETRET本章小结本章小结u主要掌握立即寻址、直接寻址、寄存器寻址、寄存器间接寻址主要掌握立即寻址、直接寻址、寄存器寻址、寄存器间接寻址等寻址方式。等寻址方式。u掌握各指令的格式及用法。掌握各指令的格式及用法。u能阅读程序,写出结果。能阅读程序,写出结果。u能编写简单结构化程序。能编写简单结构化程序。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号