51单片机汇编语言指令教程汇集.ppt_第1页
51单片机汇编语言指令教程汇集.ppt_第2页
51单片机汇编语言指令教程汇集.ppt_第3页
51单片机汇编语言指令教程汇集.ppt_第4页
51单片机汇编语言指令教程汇集.ppt_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二章:MCS-51单片机指令系统,2.1概述,2.2寻址方式,2.3数据传送指令,2.4算逻运算和移位指令,2.5控制转移和位操作指令,2.1:MCS-51指令系统的概述,MCS-51共有111条指令,指令的长度和执行时间因不同的指令而各不相同。2.1.1指令格式2.1.2指令的三种表示形式2.1.3指令的字节数2.1.4指令的分类,继续,2.1.1指令格式:,指令格式:既指令的结构形式。,操作码,操作数或操作数地址,由操作码和操作数(或操作数地址)构成指令的结构。,举例:MOVA,#0FFHADDA,R0,返回,指令的表示形式是识别指令的标志。1,二进制的表示形式:(以“累加器的内容+08H”为例)00100100B操作码OP(加法)00001000B操作数DATA(08H)特点:能被CPU直接识别、运行的形式。也称机器码、汇编语言的目标代码。缺点:不便于阅读、记忆和调试修改。,2.1.2指令的三种表示形式:,2,十六进制表示方式:它是对二进制形式的一种简化。00100100B24H00001000B08H在实验室等少数环境下,可以将这种形式作为输入程序的一种辅助手段。但是,这种形式的指令格式必须由对应的监控程序把它们翻译成二进制的“机器码”后存入程序存储器并运行。,二进制表示的形式十六进制表示的形式,3,指令的“助记符”方式(也称“汇编格式”):00100100B24H00001000B08HADDA,#08H1,这是一种由英文单词或字母、数字来表征指令功能的形式。是一种便于阅读、书写和交流的表示形式。2,这种“汇编”格式的指令必须把它“翻译”为二进制形式“机器码”后才能为CPU所识别和执行。3,三种不同的表示方法适用于不同的场合。本章内容都以汇编的形式介绍指令系统。,二进制表示形式十六进制表示汇编格式,返回,2.1.3指令的字节数,在MCS-51单片机的指令系统中,因指令操作码和操作数的不同,指令(在存储器中)长度也各不相同。分为单字节、双字节和三字节。单字节指令(49条):分无操作数、有操作数两种。无操作数:如INCDPTR10100011BINCA00000100B【特点】:操作数隐含在操作码中。含有操作数寄存器名称的单字节指令:如:MOVA,R011101000BMOVA,R111101001B【特点】:寄存器名以三位数代码的形式在指令的后三位。,双字节指令(46条):指令的操作码和操作数各占一个字节。如:MOVA,#data01110100Bdata很明显:8位的操作数本身占据一个字节。,n,n+1,mova,#data,双字节指令在程序存储器的存放示意图,三字节指令(16条):指令中的操作数为双字节。如:MOVDPTR,#data161001000B,data15-8,data7-0或者:指令中分别包含1个字节的操作数和1个字节的操作数地址。如:MOVdirect,#data举例:MOV20H,#0FFH,MOVdptr,#data16,MOVdirect,#data,三字节指令在存储器中存放的方式示意图,指令的字节数与指令的运行时间,指令的字节多是否意味着指令周期就长?,从表中可见,指令的字节数与指令周期不是对等的关系,返回,2.1.4指令的分类,MCS-51单片机的指令如果按功能划分可以分为五类:1,数据传送类指令:完成数据在单片机内部之间的传送。分为8位数和16位两种。除了奇偶位外,指令的执行对PSW无影响。2,算术运算指令:用于操作数之间的加、减、乘除运算。【特点】:多数情况下:操作数之一在累加器A中,结果也保留在A中,运算结果要影响PSW(进位标志、奇偶和溢出标志等)。3,逻辑操作和循环移位指令:操作数之间的逻辑加、逻辑与、取反和异或等操作。多数情况下一个操作数在A中,结果也存于A。移位指令分为左移、右移和带进位和不带进位几种情况。与算术类指令相比逻辑类指令基本不影响PSW的内容。,4,控制转移类指令:条件转移、无条件转移,调用和返回。【特点】:通过修改程序指针PC的内容,使CPU转到另一处执行,从而改变程序的流向。5,位操作指令:位传送、位置位、位运算和位控制转移等操作。【特点】:按位操作而不是按字节的操作。位控转移的判断不是检测某一个字节而是对某一个位进行检测并决定是否进行程序转移。这类指令基本不影响PSW的内容。,返回,2.2寻址方式,在指令的操作数位置上,用于表征、寻找操作数的方式定义为“寻址方式”。正确的理解、掌握寻址方式,是学习、使用指令的关键。在MCS-51单片机中,共使用了七种寻址方式。它们分别是:1,寄存器寻址5,变址寻址;2,直接寻址6,相对寻址;3,立即数寻址7,位寻址。4,寄存器间接寻址,继续,2.2.1寄存器寻址,当所需要的操作数在内部某一个寄存器Rn中时,将此寄存器名Rn直接写在指令的操作数的位置上。如:MOVA,R7;将寄存器R7中的内容送累加器A中。MOV20H,R0;将寄存器R0中的数据送内存20H单元INCR1;将寄存器R1中的内容加一ADDA,R3;A的内容与寄存器R3的内容相加送A寄存器寻址方式的指令大多是单字节指令。指令本身并不带有操数,而是含有存放操作数的寄存器的3位代码。以MOVA,Rn为例,使用R7寄存器,所以rrr=111,既指令的机器码为:0EFH,11101rrr,操作码,寄存器代码,返回,E8HEFH,MOVA,Rn,2.2.2直接寻址,指令本身含有操作数的8位或16位地址。既指令直接给出了操作数的地址。如:MOVA,30H;将RAM30H单元内容送累加器这里30H是操作数在RAM中的地址。很明显,直接寻址的指令长度是两个或三个字节。,n,n+1,30H,累加器A,直接寻址示意图,使用直接寻址应注意的三个问题:,1,指令助记符中direct是用16进制数表示的操作数地址。当地址恰好在SFR区域时,指令也可以用寄存器名来表示。如:MOVA,80H可以写成MOVA,P0后者用SFR中寄存器的名字取代它的物理地址80H。很明显,后者更容易阅读和交流,所以我们提倡使用SFR中寄存器名称来代替直接地址。如:MOVA,SBUF;串口数据缓冲器数据送AMOVIE,#00H;初始化中断允许寄存器MOVTH1,#0FEH;为定时器1赋初值尽管使用SFR的寄存器名称来取代直接地址,可以带来程序的可读性,但是在汇编时,仍要将寄存器名字转换为直接地址。,2,当直接地址时在工作寄存器区中时,可以使用两种寻址方式来访问。如:MOVA,00H;将RAM中00H单元数据送累加器AMOVA,R0;将工作寄存器R0的内容送累加器A这里使用了不同的寻址方式,其指令的结构也不相同。前者是:11100101(0E5H)、00000000(00H)双字节。后者的机器码是:11101000(0E8H)单字节;在物理结构上,R0与RAM的00H单元恰好是同一单元,所以不同的指令而执行结果是一样的。类似的还有累加器A:INCA寄存器寻址方式(单字节);INCACC直接寻址方式(双字节);INC0E0H直接寻址方式(双字节)。,3,在指令系统中:字节地址与位地址是完全不同的概念。前者用direct表示,而后者用bit表示,但在指令中都是用16进制表示的数。如:MOVA,20H;将RAM的20H单元内容送AMOVC,20H;将位寻址区中的位地址为20H位内容送PSW中的Cy中。,片内RAM(20H-2FH)中的位寻址区结构图,2FH,20H,字节地址,返回,24H,位地址,返回前一次,2.2.3立即寻址,指令本身直接含有所需要的8位或16位的操作数。将此数称为“立即数”(使用#标明)。如:MOVA,#30H;将(8位)立即数送累加器AMOVDPTR,#2000H;16位立即数送DPTR积存器【注意】:MOVA,#30HMOVA,30H两者的区别。立即数寻址的指令长度为2或3个字节。,n,n+1,ROM,累加器A,MOVA,#30H指令执行流程,ROM,DPTR,MOVDPTR,#2000H指令的存储和执行,返回,2.2.4寄存器间接寻址,指令中含有保存操作数地址的寄存器Ri。MOVA,Ri(i=0、1)CPU首先根据指令中寄存器名Ri找到操作数地址,然后再从该地址中找到操作数x。如:MOVR0,#30H;立即数送R0寄存器MOVA,R0;从RAM的H单元取数送累加器A【注意】MOVA,R0和MOVA,R0指令的区别。,30H,R0,00H,累加器A,1,2,3,使用寄存器间址指令时应注意的三个问题:,1,间址寄存器Ri只能使用R0、R1寄存器(i=0、1)。2,间址方式不仅用于片内RAM,同样也适用于片外RAM。对于片内RAM使用Ri寄存器,寻址范围为00HFFH。对于片外RAM,可以使用Ri,也可以使用DPTR做间址寄存器。两者区别在于后者寻址范围为0000HFFFFH,两者都可以RAM和ROM。3,间址方式的指令不能访问SFR中的单元。如下面的程序是错误的:MOVR1,#80HMOVA,R1(因为80H为SFR的物理地址),MCS-51片内、片外数据存储器示意图,特殊功能寄存器SFR,通用数据存储器,80H7FH,00H,FFH,片内数据存储器片外数据存储器256B个字节64KB个字节,片外数据存储器64KB,0000H,FFFFH,注意:1,访问片内RAM20H存储单元;MOVA,20H2,访问片外RAM存储单元;MOVR0,#20HMOVXA,R03,尽管片内与片外的RAM单元的00H-FFH地址相重叠但由于指令的不同不会发生地址混乱。,返回,2.2.5变址寻址,指令使用DPTR或PC中的内容作为基地址,再与累加器A的内容相加,其和作为操作数地址。如:MOVXA,A+PC;PC内容与A的内容相加得操作数地址并将此操作数送AMOVXA,A+DPTR;DPTR内容与A的内容相加得操作数地址并将此操作数送A使用变址指令时,要事先分别为A、DPTR赋值,以便获得操作数得地址。,变址指令只适用于对ROM存储器得访问,如查表等。【举例】:已知ROM中0302H单元有一个数x,现要把它送到累加器A中,试编程。MOVDPTR,#0300H;立即数送DPTRMOVA,#02H;立即数送累加器AMOVCA,A+DPTR;从ROM的00302单元取数送A,变址寻址示意图,02H,0300H,ALU,0302H,累加器A,DPTR,0300H+02H0302H,MOVCA,A+DPTR,返回,2.2.6相对寻址,转移指令中使用的一种寻址方式。MCS-51单片机的指令系统中,有两类转移指令:相对转移(2个或3个字节)绝对转移(3个字节)。在绝对转移指令中,指令直接给出转移的目标地址(2字节地址),执行时将目标地址直接送给PC,从而控制程序转移;而相对转移指令在执行中是将PC值与指令中的8位偏移量进行相加,形成指令要转移的目标地址。SJMPrel由指令中有一个8位偏移量rel为带符号位的补码,所以控制程序转移的范围为+127-128。,54H,2002H,ALU,2056H,累加器A,PC,2002H+54H2056H,操作码,偏移量,例如:SJMP54H;(80H、54H),2000H,2002H,(LOOP1),相对寻址使用中应注意的问题,与绝对寻址相比,相对寻址具有很好的“浮动性”,因此是编程人员普遍使用的一种寻址方式。使用时,要注意3点:1,CPU进行地址计算时,PC取值是执行本指令后的地址值。以上面的例子说明:指令本身的首地址是2000H,执行完后变为2002H(既下一条指令的首地址)。如果使用三字节的相对转移指令,则PC=PC+3。,返回上一页,2,偏移量的计算:rel=目标地址-源地址-2(2字节指令)或:rel=目标地址-源地址-3(3字节指令)结果用补码的形式书写。为了减少计算偏移量的计算,汇编程序允许使用“符号地址”的方式代替偏移量。如:SJMPloop1汇编程序在翻译时,自动计算并将结果替换符号地址。3,如果转移地址的范围超过相对寻址的范围(如:-127+128)时,就要采用别的方式法,否则在编译时,提示出错。,返回,2.2.7位寻址,在位寻址指令(位操作指令)中使用的位地址。在一般的情况下,系统的数据都是按字节(8位)来存放、处理。单片机在控制、检测的应用中,系统的输入、输出数据有很多属于开关量信号。这些开关量信号以bit-“位”的形式进行各种运算、处理和存储的。,MCS-51单片机控制、检测系统,驱动器,电动机,外设1,外设2,状态信号,状态信号,控制信号,在MCS-51单片机的硬件设计上充分考虑了这种“布尔”变量的处理,不仅在指令系统中设计了“位操作”指令,而且在片内RAM区中还专门开辟了一个“位寻址区”。这样,布尔变量可以向字节数据一样进行存储、寻址。除了位寻址区外,RAM中的大多SFR都可以按位寻址,换句话,SFR除了有自己的字节地址外,在寄存器内的每一位还有其位地址。,【举例】:SETB20H;将位地址为20H的位置一SETB90H;将P1口的d0位置一同字节寻址中的直接寻址一样,为了增加程序的可读性,凡在SFR中的位地址都可以使用符号地址来替代。如第二例中,完全可以使用下面的指令格式:MOVP1.0;将P0口的d0位置一类似还有:MOVC,ACC.7;将累加器中的d7位送PSW的cy这种指令在汇编程序进行翻译时,还是要先将符号地址转换为真正的位地址。,返回,2.3数据传送指令,2.3.0传送指令的特点2.3.1内部数据传送类指令2.3.2外部数据传送类指令2.3.3堆栈操作指令2.3.4数据交换指令,继续,数据传送是编程中使用最多、最主要的操作。它的功能是将数据在累加器、片内的RAM、SFR及片外ROM、RAM之间进行传送。在传送类指令中,必须指定被传送数据的源地址和目标地址。在传送过程中,源地址的内容不被改变。传送类指令除了以累加器A为目标的传送对PSW的P有影响外,其余的传送类指令对PWS一概无影响。,【举例】:MOVA,R0;将R0寄存器中的数据送累加器A中(注意寻址方式),指令通式:MOV,2.3.0传送指令的特点,返回,2.3.1内部数据传送类指令,特点:指令的源操作数和目的操作数都在单片机内部。,1,立即寻址型传送指令,2,直接寻址型传送指令,3,寄存器寻址型传送指令,4,寄存器间址型传送指令,5,内部数据传送类指令的使用,继续,1,立即寻址型传送指令,【特点】:原操作数字节是立即数,处在指令的第二或第三字节,所以这类指令都是多字节指令。这类指令有如下4条。MOVA,#data;Adata(双字节指令)MOVRn,#data;Rndata(双字节指令)MOVRi,#data;(Ri)data(双字节指令)MOVdirect,#data;directdata(三字节指令)这类指令多用于程序的初始化。如:MOVR0,#20HMOVA,#00H,立即寻址指令举例,已知:R0=20H,试问单片机执行如下指令后,累加器A、R7、20H和21H单元中的内容是什么。MOVA,#18H;立即数18H送累加器AMOVR7,#28H;立即数28H送寄存器R7MOVR0,#38H;立即数38H送内存20H单元MOV21H,#48H;立即数48H送内存21H单元,返回,2,直接寻址型传送指令,【特点】:指令中至少含有一个源操作数或目的操作数的地址。很明显,这也是2个或3个字节的指令格式,其中直接地址在第2或第3个字节上。这类指令有如下5条:MOVA,directMOVdirect,AMOVRn,directMOVRi,directMOVdirect2,direct1【注意】:direct为内部寄存器、RAM和SFR的地址,换句话说:direct适用于片内所有的地址(寄存器、SFR和RAM)。,直接寻址指令举例,MOVA,30H;内存RAM30h单元数据送AMOV50H,A;A中内容送RAM的50h单元MOVR6,31H;RAM的30h内容送R6寄存器MOVRi,30H;RAM30h内容送Ri指定的RAM单元MOVP1,32H;RAM32h内容送P1口(p1:符号地址)MOV90H,32H;(同上,试比较两种表示方法),返回,3,寄存器寻址型传送指令,指令中含有存放操作数的寄存器名Rn其中(n0,1,2,3,4,5,6,7)。共有如下三条:MOVA,RnMOVRn,AMOVdirect,Rn,返回,4,寄存器间接寻址型传送指令,指令特点:指令中Ri中存放的不是操作数本身,而是操作数在RAM中的地址(i=0、1)。格式如下:MOVA,RiMOVRi,AMOVdirect,Ri【注意】;Ri中存放操作数的地址是有所选择的,只有非SFR的RAM单元才能使用这种寻址方式。,寄存器间接寻址指令举例,已知(40h)=11h,(41h)=22h,R0=40h和R1=41h。试问,下面的指令执行后,累加器A、40h、41h和42h单元中的内容是什么。MOVA,R0;RAM40h单元内容11h送AMOVR1,A;A中的11h送RAM的41h单元MOV42H,R1;RAM的41h单元内容11h送RAM42h中,返回,5,内部数据传送类指令的使用,1,在使用传送指令时,可以根据实际情况选用恰当寻址方式。上面给出的各种类型的传送指令是INTEL公司在设计MCS-51的硬件时就已经确定下来。编程人员只能像查字典一样去查找、使用。不能根据主观意愿去“创造”指令。例如:要将R0中的数据传送到R1中。如何使用指令去完成上面的操作?movr1,r0是否可以?回答是否定的!因为在MCS-51的指令系统中没有此条指令!只能使用:1,mova,r0或:2,mov01h,00hmovr1,a因此,必须从MCS-51的指令表中选择使用指令。,MCS-51内部数据传送类指令方式图,累加器A,direct直接寻址,Ri间址,Rn寄存器,Data立即数,返回上一次,2,以累加器A为目的寄存器的传送指令会影响PSW中的奇偶位P,而其余的指令对PSW均无影响。3,要会正确地估计指令的字节。凡是指令中包含有立即数、直接地址的指令,都应当在原有的基础上加1。【举例】:mova,Ri()个字节mova,direct()个字节movdirect,data()个字节movdirect2,direct1()个字节,4,对于同一问题可以有不同的编程方法。使用不同的方法虽然都可以实现题目的要求,但从指令长度、运行时间和可阅读性上等综合因素考虑,不同的方法就有合理和不合理、优化和繁杂之分。所以,在学习指令系统和编程时开始就要养成一个好的、合理的编程习惯。5,注意给程序进行正确的注释,这对于阅读、编写和修改程序都是非常重要的。下面就是一些注释的例子:MOVA,30H;(30h)AMOVA,R0;R0AMOV40H,30H;(30h)40hMOVA,Ri;(Ri)A,内部传送类指令举例,试编出把30h和40h单元内容进行交换。MOVA,30H;(30h)AMOV30H,40H;(40h)30hMOV40H,A;A40h,累加器A,30H,40H,返回,2.3.2外部数据传送类指令,1,16位数传送指令,2,外部ROM的字节传送,3,外部RAM的字节传送指令,继续,1,16位数传送指令,MCS-51指令系统中唯一的一条16位数据传送类指令。MOVDPTR,#data16DPTR是单片机内部SFR中的两个寄存器DPH、DPL组合而成。其中DPH为高八位,DPL为低八位。DPTR是一个专门用于访问外部存储器的间址寄存器。寻址能力为64K(065535)。,返回,2,外部ROM的字节传送指令,这类指令有两条,都属于变址寻址指令。MOVCA,A+DPTR;A(A+DPTR)MOVCA,A+PC;PCPC+1,A(A+PC)该指令也称为“查表”指令。在ROM中建立一个数据表,可以使用DPTR、PC作为数据表格的基地址。在第一条指令中:用DPTR作为基地址。使用前,先将数据表的首地址送入DPTR中,累加器A作为偏移量。由两者数据相加得到待查的表中数据地址并取出。第二条指令是以程序计数器PC为基地址。由于PC的内容与该指令在ROM中的位置有关,所以一旦该指令在程序中的位置确定,其PC的值也就确定。,外部ROM的字节传送指令举例,已知累加器A中存有09范围内的数,试用查表指令编写出查找出该数平方的程序。1,采用DPTR作基址寄存器:设平方表的首地址为2000h,累加器A中的内容恰好是查表的偏移量。首先将表的起始地址2000h送入DPTR中。MOVDPTR,#2000H;指针赋值MOVCA,A+DPTR;平方值送A,2000h,2009h,2008h,2007h,2006h,2005h,2004h,2003h,2002h,2001h,2,采用PC作基址寄存器:与DPTR不同,使用PC作为基地址时,必须对累加器A的数据进行修正,以保证a+pc恰好找到待查的平方值地址。ORG1FFBH1FFBH74dataADDA,#data;data=02h1FFDH83HMOVCA,A+PC;PC=1FFE1FFEH80FEHSJMP$2000H00HDB0;平房表首址2001H01HDB12002H04HDB42003H09HDB92004H10HDB162005H19HDB25:2009H51HDB81ENDdata为MOVC指令首地址与表头地址之间的单元数。,2000h,2009h,2008h,2007h,2006h,2005h,2004h,2003h,2002h,2001h,1FFFh,1FFEh,1FFDh,1FFCh,1FFBh,返回,3,外部RAM的字节传送指令,实现外部RAM和累加器A之间的数据传送。只有寄存器间接寻址的指令。MOVXA,Ri使用Ri寄存器间址寻址范围0255hMOVXRi,A在硬件电路中P0口输出8位地址数据。MOVXA,DPTR使用DPTR间址,寻址范围065535hMOVXDPTR,A在硬件电路中,使用P0口输出低8位,P2口输出高8位外部RAM地址。,外部RAM的字节传送指令举例,已知外部RAM的88H单元有一个数x,试编程将x送外部RAM的1818H单元。【解】:外部RAM中的数据是不能直接传送的,因此必须使用两次MOVX指令完成此操作。ORG2000HMOVR0,#88H;为8位指针赋值MOVDPTR,#1818H;为16位指针赋值MOVXA,R0;取x到累加器AMOVXDPTR,A;x送RAM的1818h单元SJMP$;停机END,返回,2.3.3堆栈操作指令,堆栈操作是一种特殊的数据传送指令。堆栈:一个用来保存程序断点、数据的特殊的存储区域。在MCS-51单片机中,栈区是占用片内RAM的存储空间,具体栈位置由指针SP来确定(系统上电时,SP=07h)。1,进栈操作:pushdirect;sp+1sp,(direct)(sp)2,出栈操作:popdirect;(sp)(direct),sp-1sp【注意】:寻址方式为直接寻址,所以pusha是错误的,应当是pushacc或push0e0h,同理:pushr0也是错误的。进栈是堆栈向上“生长”的过程,即sp+1;出栈则相反。系统上电时,sp=07h。SP的值可以根据需要进行修改,以适应具体编程的需要。在确定栈区位置时要考虑对数据区的影响,以避免数据区与栈区冲突。,堆栈操作指令举例(一),下面是一个BCD码转换为二进制的子程序BCDB中有关堆栈操作的例子。在这里,进栈操作是为了保护主程序中相关寄存器中的数据,因为子程序要使用这些寄存器。org0800hbcdb:pushpswpushaccpushb:popbpopaccpoppswret,SP,堆栈操作指令举例(二),堆栈操作指令除了可以在子程序的设计中,对主程序的数据进行保护。还可以根据堆栈操作的特点完成一些特殊的操作。【举例】:设片内RAM的30h单元存有x,40h单元存有y。试将两个单元内容互换。push30hpush40hpop30hpop40h,SP=07h,40h,30h,继续,2.3.4数据交换指令,为提供一种方便的累加器和寄存器或RAM之间的数据交换。避免了使用一般mov传送指令完成交换时的不便。格式:xcha,Rn;aRnxcha,direct;a(direct)xcha,Ri;a(Ri)xchda,Ri;a30(Ri)30举例:已知,片外RAM20h单元、内部RAM20h单元分别有数x和y,试编程互将两数相交换。movR1,#20h;指针赋初值movxa,R1;xaxcha,R1;交换a(20h),yamovxR1,a;y(20h)片外RAM,数据交换指令举例(一),举例:已知,片外RAM20h单元、内部RAM20h单元分别有数x和y,试编程互将两数相交换。movR1,#20h;指针赋初值movxa,R1;xaxcha,R1;交换a(20h),yamovxR1,a;y(20h)片外RAM,(y)x,20h,20h,累加器A,1,2,3,数据交换指令举例(二),已知RAM50h单元有一个09的数,试编程将它变成相应的ASCII码。【解】:09的ASCII码是30h39h,两者相差30h。方法一:对50h单元的数据高四位组装一个30h。movr0,#50h;指针赋值mova,#30h;30hAxchda,r0;A30(r0)30,在A中组成ASCII码movr0,a;A中的ASCII送回50h单元,50h,00110101,A=30h,交换后A=35h,1,2,继续,2.4算逻运算和移位指令,功能:完成算术运算、逻辑运算和循环移位三大功能。特点:大多指令都要由累加器A来存放一个源操作数,并把操作结果放回累加器A中。,2.4.1:算术运算指令,2.4.2:逻辑运算指令,2.4.3:移位指令,继续,2.4.1:算术运算指令,不带进位的加法指令(ADD)1,加法指令:带进位的加法指令(ADC)加1指令(INC)(编程举例)2,减法指令:带进位的减法指令(SUBB)减1指令(DEC)3,十进制调整指令:(DAA)4,乘法和除法指令:(MULDIV),加法指令(一):不带进位的加法指令,格式:ADDA,Rn;A+RnAADDA,direct;A+(direct)AADDA,Ri;A+(Ri)AADDA,#data;A+dataA【注意】:1,参加运算的数据都应当是8位的,结果也是8位并影响PSW。2,根据编程者的需要,8位数据可以是无符号数(0255),也可以是有符号数(-127+128)。3,不论编程者使用的数据是有符号数还是无符号数,CPU都将它们视为有符号数(补码)进行运算并影响PSW。,不带进位的加法指令举例(一),试分析执行下列指令后累加器A和PSW中各标志的变化。MOVA,#19HCy=0;ADDA,#66HAC=0OV=CPCS=025A=00011001BP=1+102data=01100110B127001111111B1,若两数都是无符号数,则因Cy=0无溢出,25+102=127。2,若两个数是有符号数,则因OV=0无溢出。,cy,000CPCSAC,不带进位的加法指令举例(二),试分析执行下列指令后累加器A和PSW中各标志的变化。MOVA,#5AHCy=0;ADDA,#6BHAC=0;OV=CPCS=190A=01011010BP=0+107data=01101011B197011000101BCPCSAC1,若两数是无符号数,因Cy=0无溢出:90+107=1972,若两数是有符号数,因OV=1,故有溢出,两个正数相加后变为负数,很明显结果是不正确的。,加法指令(二):带进位的加法指令,格式:ADDCA,Rn;A+Rn+CyAADDCA,direct;A+(direct)+CyAADDCA,Ri;A+(Ri)+CyAADDCA,#data;A+data+CyA【注意】:这里的Cy是指令执行前的Cy;对PSW的影响同ADD指令。,加1指令,格式:INCA;累加器A加一INCRn;Rn+1RnINCdirect;内存单元数据加一INCRi;内存单元数据加一INCDPTR;dptr+1dptr【注意】:1,除了第一条对PSW的P有影响外,其余对PSW均无影响。2,由于上面的原因,INC指令不能作为一般的数据算术运算使用,INC主要用于修改数据指针等控制、循环语句中使用。,返回本节目录,编程举例,已知M1、M2单元中存有两个16位无符号数x1、x2(低位在前)。试写出x1+x2,并将结果放入M1、M1+1单元(低8位在M1单元)。设两数之和不会超过16位(65535)。【解】:MOVR0,#M1;x1指针赋初值MOVR1,#M2;x2指针赋初值MOVA,R0;取x1低8位送AADDA,R1;x1与x2低8位相加MOVR0,a;低8位和送m1单元INCR0INCR1;修改指针MOVA,R0;取x1的高8位送AADDCA,R1;x1与x2的高8位和Cy相加MOVR0,A;结果送M1+1单元,M1,M1+1,M2,M2+1,返回本节目录,减法指令(带进位的减法指令),在MCS-51单片机的指令系统中,只有:带进位的减法SUBB减一DEC两种指令。1减法指令:格式:SUBBA,Rn;ARnCyASUBBA,direct;A(direct)CyASUBBA,Ri;A(Ri)CyASUBBA,#data;AdataCyA,使用减法指令要注意的几个问题,1,在单片机内部,减法指令实际上是采用补码的加法实现的。但要判定减法结果编程者可以按二进制减法法则验证。2,无论相减两数是无符号数还是有符号数,减法操作总是按有符号数来处理、影响PSW中相关的标志(详见举例)。3,在MCS-51的指令系统中没有不带Cy的减法,所以在使用SUBB指令前必须使用一条清除Cy的指令:CLRC。,减法指令应用举例,试分析执行下列指令后累加器A和PSW中各标志的变化。CLRCMOVA,#52H01010010B=82SUBBA,#0B4H10110100B=-7682a=01010010-76data=10110100158110011110=-62H=-98手工计算CPCSAC101【分析】:CPU的计算得-98,很明显答案是错误的。原因是OV=1,既产生了溢出。所以,对于符号数的减法在运算后一定要检测OV=1?,返回本节目录,减一指令,格式:DECA;累加器A减一DECRn;Rn-1RnDECdirect;内存单元数据减一DECRi;内存单元数据减一【注意】:1,除了第一条对PSW的P有影响外,其余对PSW均无影响。2,由于上面的原因,DEC指令一般不作为数据算术运算使用(因为不能对PSW的OV等位产生影响,它主要用于修改数据指针在控制、循环语句中使用)。,返回本节目录,十进制调整指令,在CPU进行BCD码运算时,必须在运算后进行十进制调整,这是因为,CPU在运算时,并不知道数据是二进制还是BCD码。格式:DAA;若AC=1或A309,则A+06hA;若Cy=1或A749,则A+60hA【注意】:1,DAA指令必须紧跟在加法指令之后;2,DAA指令只适用于加法指令的调整。,十进制调整指令应用举例(一),1,BCD加法运算:试写出完成85+59的BCD码的加法程序。MOVA,#85HADDA,#59HDAASJMP$85a=10000101B+59dtat=01011001低4位9,所以加06h+00000110B11100100B高4位9,所以加60h01100000B101000100B结果为144h(1包含在Cy)【注意】:144H是用16进制数来表示十进制,既BCD码。,十进制调整指令应用举例(二),2,BCD减法运算:由于DAA指令只能对BCD码的加法进行调整,所以遇到BCD码的加法时就要将其减法变为加法运算,然后再使用DAA指令进行调整。减法变加法就是使用BCD码的补码运算法则:将被减数-减数变为被减数+减数的补码。减数的补码=BCD码的模-减数其中BCD码的模为100H=99H+01H=9AH,已知:在M1、M2中分别存有被减数91和减数36。试编程求19-36并将结果存入M3单元。【解】:1,算法:91-36=91+(100-36)=91+(9A-36)2,编程:CLRC;清除CyMOVA,#9AH;BCD码的模100送ASUBBA,M2;计算减数的补码(结果在A中)ADDA,M1;被减数+减数的补码(结果在A中)DAA;十进制调整MOVM3,A;结果送M3单元CLRC;清除进位位(不要Cy)(请同学自己验证一下),返回本节目录,乘法和除法指令,这是MCS-51单片机唯一的一类单字节4周期指令,它相当于4条加法指令的运行时间。格式:MULAB;ab=ba(b存高8位,a存低8位)DIVAB;ab=ab(a存商,b存余数)【注意】:指令对标志的影响:1,在乘法指令中对PSW的影响有Cy、OV、和P。具体如下:Cy0;P取决于A中“1”的个数;OV表明积的大小。当积超过255(B0)时,OV=1。2,在除法指令中,Cy、P与乘法相同。在执行除法指令时,若B=0时OV=1,表示除数=0除法无意义,其余情况下OV被复位。,返回本节目录,2.4.2:逻辑运算指令,功能:对2个8位二进制数进行逻辑与、或、非和异或操作;特点:除了以累加器A为目标寄存器的指令影响PSW的P位外,其余指令对PSW均无影响。1,逻辑与运算指令(ANL)2,逻辑或运算指令(ORL)3,逻辑异或指令(XRL)4,累加器清零和取反指令(CLR或运算可以“置位”某些位。,返回本节目录,逻辑异或运算指令,格式:XRLA,Rn;ARnAXRLA,direct;A(direct)AXRA,Ri;A(RI)AXRLA,#data;AdataAXRLdirect,A;(direct)AdirectXRLdirect,#data;(direct)datadirect特点:按位运算,相同时为0,不同时为1。使用异或可以实现将某个字节的数据或将数据的某几位变反。,举例,已知:外部RAM的30H单元中有一个数AAH,现要将其高4位不变,低4位取反,试编程。解1,利用MOVXA,Ri指令:MOVR0,#30H10101010MOVXA,R000001111XRLA,#0FH10100101MOVXR0,A解2,利用MOVXA,DPTRMOVDPTR,#0030HMOVXA,DPTRXRLA,#0FHMOVXDPTR,A,返回本节目录,累加器清零和取反指令,用传送指令可以实现对累加器A的清零和取反操作,但是它们都是双字节指令。在MCS-51的指令系统中专门设计了单字节、单周期对累加器清零和取反的指令。格式:CLRA;累加器清零CPLA;累加器取反取反指令可以方便的实现求补操作。举例:已知30H单元中有一个数x,写出对它求补的程序。MOVA,30HCPLAINCAMOV30H,A,逻辑运算指令应用举例,设X、Y和Z分别存在X、Y和Z单元。试编出能实现此电路功能的程序,并将结果送入F单元。解:MOVA,XANLA,Y;XYAMOVR1,A;送R1暂存MOVA,YXRLA,Z;YZACPLA;A取反ORLA,R1;(XY)(YZ)AMOVF,A;AF,+,X,Y,Z,F,返回本节目录,2.4.3:移位指令,虽然MCS-51只有5条移位指令,但它可以处理所有移位问题。格式:RLARRARLCARRCASWAPA【注意】:只能对累加器A进行移位。,A7A0,A7A0,A7A0,Cy,Cy,A7A0,举例(一),已知:在M1和M1+1单元有一个16位数(M1存低8位),试编程将其扩大2倍(设结果小于65535)。解:扩大2倍可以用左移一位来实现。,M1M1+1,1001110,1,0101101,0,程序清单,CLRC;清除Cy位MOVR1,#M1;指针赋值MOVA,R1;取低8位数据RLCA;循环左移,Cy进低位,高位进CyMOVR1,A;移位后数据回送INCR1;指针加一MOVA,R1;取高8位数据RLCA;循环左移Cy进低位MOVR1,A;数据回送,举例(二),已知:M1、M2单元中有2个BCD码,试编程将其紧缩为一个字节并存入M1单元。解:MOVR1,#M1MOVA,R1SWAPAINCR1ORLA,R1MOVM1,A,M1M1+1,BCD10000,BCD1BCD2,0000BCD1,返回本章目录,累加器A,2.5控制转移和位操作指令,2.5.1控制转移指令1,无条件转移指令2,条件转移指令3,子程序调用和返回4,空操作指令2.5.2,位操作指令1,位传送指令:2,位置位和位清零指令:3,位运算指令:4,位控制转移指令:,返回本章目录,1,无条件转移指令:,格式:LJMPaddr16长转移指令,寻址范围65535;AJMPaddr11绝对转移,寻址范围2K;SJMPrel短转移,转移范围(+127-128);JMPA+DPTR变址转移,寻址范围65535。,LJMP指令(三字节),AJMP指令(双字节),SJMP指令(双字节),JMP指令(单字节),长转移指令:(三字节双周期指令),指令执行时,将指令码中的addr16送入PC中,使程序无条件的转向addr16所指向的新地址执行程序。【举例】:已知某单片机的监控程序地址为A080H,试问用什么方法使单片机开机后自动的转向该监控程序?【解】:因为单片机上电时,PC=0000H,所以在0000H单元存放一条LJMP0A080H的指令即可。,ROM,0000H0001H0002H0003H,绝对转移指令:,双字节、双周期指令。将AJMP指令中的11位转移地址替换掉原来PC中16位地址中的低11位地址。指令中的11位地址,确定了地址的转移范围在2K以内,所以AJMP也称“页内转移”指令。,A10a9a8操作码a7a0,AJMP指令,PC程序计数器,MCS-15的ROM系统是以2K为一页来划分程序存储器,这样对于4K的片内ROM存储器可以分为2页;片外64K的ROM可以分为32页。在执行AJMP指令时,PC的高5位决定了ROM中的页地址;而AJMP指令的低11位地址用来选择页内地址。在一般情况下,AJMP指令应当与目标地址在同一页内。更具体的说:目标地址应当与AJMP指令取出后的PC值(PC=PC+2)在同一页内。否则转移将会出现错误。,ROM的64K存储空间的页面(部分)划分表,ROM的64K存储空间的页面示意图,:AAA:MOVA,R0MOVR1,A:AJMPAAA,0100H,07FEH,00000111111111111110,PC值,00001000000000000000,PC+2值,00001001000000000000,AJMP指令中的11位地址,原本AJMP指令要转到本页的0100H单元但是由于PC的高5位页面地址发生了变化使AJMP指令实际转到下一页0900H单元。,最后PC值,发生跨页错误,AJMP转一指令是用来做页内2K范围的转移,如果使用不当,会发生错误的“跨页”操作。产生跨页的原因是AJMP指令处于每一页的最后两个单元的结果,所以避免这种现象的方法就是不要在每一页的最后两个单元使用AJMP指令。如果目标地址与AJMP地址不再同一页内,建议使用LJMP指令替代AJMP。使用AJMP指令时,11位的绝对地址可以用符号地址取代,正确使用AJMP转移指令,短转移SJMP指令,格式:SJMPrelrel为偏移量(+127-128)rel(偏移量)的计算公式:rel=目标地址源地址2(其中:2为SJMP指令的长度)【例1】:如图,要转到0116H时:rel=0116H-0110H-2=04H【例2】:要转到0109H时:rel=0109H-0110H-2=F7H(-9)实际编程时,使用符号地址取代rel以简化计算,在汇编时由汇编程序来计算rel。,PC,PC+2,0109H,0110H,0116H,变址转移指令,格式:JMPA+DPTR单字节操作码为73H特点:转移地址由累加器A的内容与DPTR相加形成。用途:用来制作一个多分支的转移结构。【举例】:MOVDPTR,#TABLE;指针赋表头地址JMPA,DPTR;转移地址由A+DPTR产生TABLE:AJMPROUT0;多分支转移表AJMPROUT1AJMPROUT1AJMPROUT2:,返回,2,条件转移指令:,(1)累加器A判零转移指令(双字节指令)JZrel;若A=0,则PC=PC+2+rel;若A0,则PC=PC+2JNZrel;若A0,则PC=PC+2+rel;若A=0,则PC=PC+2,(2)比较条件转移指令(3字节)a=data时:PC+3PC,Cy=0CJNEA,#data,reladata时:PC+3+rel,Cy=0CJNERn,#data,relaY时;若Cy=1则X0时,同无符号数相同;b,当x、y均0,yy;d,当x0时,x0?,Y0?,Y0?,Cy0?,XY,Y,N,Y,Y,Y,N,N,N,(3)减一条件转移指令,1,DJNZRn,rel;Rn-1Rn,若Rn0则PC+2+relPC若Rn=0则PC+2PC2,DJNZdirect,rel;(direct)-1direct,若(direct)0则PC+3+relPC若(direct)=0则PC+3PC注意:第一条指令为双字节,第二条指令为三字节。指令本身先做一个带回送的减一运算操作,然后根据运算的结果是否为零作为转移的条件,应用举例,令片内RAM中DATA为起始地址的数据块中连续10个无符号数相加,并把和送到SUN单元(设其和小于256)。ORG1000HSTART:MOVR2,#0AH;数据块长度10送计数器R2MOVR0,#DATA;数据块起始地址送指针R0CLRA;累加器清零LOOP:ADDA,R0;累加

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论