已阅读5页,还剩161页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章:MCS-51单片机指令系统,4.1概述,4.2寻址方式,4.3数据传送指令,4.4算逻运算和移位指令,4.5控制转移和位操作指令,4.6位操作指令,指令和程序设计语言1、指令2、程序设计语言(1)机器语言(2)汇编语言,4.1概述,返回,指令格式:既指令的结构形式。MCS-51汇编语言格式如下:标号:操作码助记符操作数1,操作数2,操作数3;注释一条汇编指令由多个字段组成,各字段之间用空格或规定的标点符号隔开。方括号内的字段可以忽略。Eg:LOOP:MOVA,#00H;A#00HCJNEA,#data,relNOP在一条汇编指令中,其标号是指令的符号地址。一条指令之前是否要冠以标号,要根据程序的需要而定。不同的机器对标号字段的长度和构成有不同的规定,使用时注意。操作码部分:注释部分:,4.1:MCS-51指令系统的概述,MCS-51共有111条指令,其长度和执行时间各不相同。4.1.1指令格式4.1.2指令的三种表示形式4.1.3指令的字节数4.1.4指令的分类,继续,4.1.1指令格式:,指令格式:既指令的结构形式。,操作码,操作数或操作数地址,由操作码和操作数(或操作数地址)构成指令的结构。,举例:MOVA,#0FFHADDA,R0,返回,指令的表示形式是识别指令的标志。1,二进制的表示形式:以ADDA,#08H(累加器的内容+08H)为例:00100100B操作码OP(加法)00001000B操作数DATA(08H)特点:能被CPU直接识别、运行的形式。也称机器码、汇编语言的目标代码。缺点:不便于阅读、记忆和调试修改。,4.1.2指令的三种表示形式:,2,十六进制表示方式:它是对二进制形式的一种简化。00100100B24H00001000B08H在实验室等少数环境下,可以将这种形式作为输入程序的一种辅助手段。但是,这种形式的指令格式必须由对应的监控程序把它们翻译成二进制的“机器码”后存入程序存储器并运行。,二进制表示的形式十六进制表示的形式,3,指令的“助记符”方式(也称“汇编格式”):00100100B24H00001000B08HADDA,#08H1,这是一种由英文单词或字母、数字来表征指令功能的形式。是一种便于阅读、书写和交流的表示形式。2,这种“汇编”格式的指令必须把它“翻译”为二进制形式“机器码”后才能为CPU所识别和执行。3,三种不同的表示方法适用于不同的场合。本章内容都以汇编的形式介绍指令系统。,二进制表示形式十六进制表示汇编格式,返回,4.1.3指令的字节数,在MCS-51单片机的指令系统中,因指令的不同,指令长度(在存储器中所占空间)也各不相同。分为单字节、双字节和三字节。,单字节指令(49条):分无操作数、有操作数两种。无操作数:如INCDPTR10100011BINCA00000100B【特点】:操作数隐含在操作码中。含有操作数寄存器名称的单字节指令:如:MOVA,R011101000BMOVA,R111101001B:MOVA,R711101111B【特点】:寄存器名用3位二进制数包含在指令的后三位。,双字节指令(46条):指令的操作码和操作数各占一个字节。如:MOVA,#data01110100Bdata【特点】:8位的操作数data需占据一个字节(如图)。如:MOVA,#00H,n,n+1,mova,#00H,双字节指令在程序存储器的存放示意图,三字节指令(16条):指令中的操作数为双字节如:MOVDPTR,#data161001000B,data15-8,data7-0指令包含1个字节的操作数和1个字节的操作数地址如:MOVdirect,#data,MOVdptr,#data16,MOVdirect,#data,三字节指令在存储器中存放的方式示意图,指令的字节数与指令的运行时间,指令的字节多是否意味着指令周期就长?,从表中可见,指令的字节数与指令周期不是对等的关系,返回,4.1.4指令的分类,按功能划分可以分为五类:1,数据传送类指令:完成数据的传送。分8位数和16位数创送、内部传送和外部传送。传送指令除了奇偶位外,对PSW其它位无影响。2,算术运算指令:用于操作数的加、减、乘、除、加一和减一等运算。多数情况下操作数之一在累加器A中,结果保留在A中。运算结果要影响PSW(进位标志、奇偶和溢出标志)。,3,逻辑操作和循环移位指令:操作数之间的各种逻辑操作。多数情况下一个操作数在A中,结果也存于A。移位指令分为左移、右移和带进位和不带进位几种情况。逻辑类指令基本不影响PSW的内容。4,控制转移类指令:条件转移、无条件转移,调用和返回。通过修改程序指针PC的内容,控制改变程序的流向。,5,位操作指令:MCS-51单片机所具有的很有特色的一类指令。分为:位传送、位置位/复位、位运算和位控制转移等。【特点】:按位操作而不是按字节的操作;这类指令基本不影响PSW的内容。,返回,4.2寻址方式,在指令操作数位置上,用于表征、寻找操作数的方法定义为“寻址方式”。正确的理解、掌握和运用寻址方式,是学习、使用指令的关键。在MCS-51的指令系统中,共有七种寻址方式。,继续,MCS-51单片机的七种寻址方式,1,寄存器寻址5,变址寻址;2,直接寻址6,相对寻址;3,立即数寻址7,位寻址。4,寄存器间接寻址,4.2.1寄存器寻址,当所需要的操作数在某一个寄存器Rn(n=07)中时,将此寄存器名Rn直接写在指令的操作数的位置上。如:MOVA,R7;将寄存器R7中的内容送累加器A中。MOV20H,R0;将寄存器R0中的数据送内存20H单元INCR1;将寄存器R1中的内容加一ADDA,R3;A的内容与寄存器R3的内容相加送A,返回,【特点】:寄存器寻址方式的指令大多是单字节指令。指令本身并不带有操数,而是含有寄存器的3位代码。以MOVA,R7为例,使用R7寄存器,所以rrr=111,既指令的机器码为:0EFH,11101rrr,操作码,寄存器代码=111B,E8HEFH,MOVA,R7,4.2.2直接寻址,指令本身含有操作数的8位或16位地址。既指令直接给出操作数的地址。如:MOVA,30H;将RAM30H单元内容送累加器这里30H是操作数在RAM中的地址。,很明显,直接寻址的指令长度是两个或三个字节。,n,n+1,30H,累加器A,直接寻址示意图,MOVA,30H,使用直接寻址应注意的三个问题:,1,指令助记符中直接地址(direct)是用16进制数表示的操作数地址(如30H)。如果地址在SFR中时,直接地址也可以用寄存器名来替代。如:MOVA,80H可以写成MOVA,P0后者用SFR中寄存器的名字取代它的物理地址80H。很明显,后者更容易阅读和交流。,又如:MOVA,SBUF;串口数据缓冲器数据送AMOVIE,#00H;初始化中断允许寄存器MOVTH1,#0FEH;为定时器1赋初值使用SFR的寄存器名称取代直接地址,可增加程序的可读性,但在汇编时仍要将寄存器名字转换为直接地址。,2,当直接地址在工作寄存器区中时,可以使用两种寻址方式来访问。如:MOVA,00H;将RAM中00H单元数据送累加器AMOVA,R0;将工作寄存器R0的内容送累加器A这里使用了不同的寻址方式,其指令的结构也不相同。前者:11100101B(0E5H)、00000000(00H)双字节;后者:11101000(0E8H)单字节。,在物理结构上,R0与RAM的00H单元恰好是同一单元,所以不同的指令而执行结果是一样的。类似的还有累加器A:INCA寄存器寻址方式(单字节);INC0E0H直接寻址方式(双字节)。,3,在指令系统中:字节地址与位地址是完全不同的概念。前者用direct表示,而后者用bit表示,但在指令中都是用16进制表示的数。如:MOVA,20H;将RAM的20H单元内容送AMOVC,20H;将位寻址区中的位地址为20H位内容送PSW中的Cy中。,片内RAM(20H-2FH)中的位寻址区结构图,2FH,20H,字节地址,返回,24H,位地址,返回前一次,4.2.3立即寻址,指令本身直接含有所需要的8位或16位的操作数。将此数称为“立即数”(使用前缀符号#标明)。如:MOVA,#30H;将(8位)立即数30H送累加器AMOVDPTR,#2000H;16位立即数2000H送DPTR【注意】:MOVA,#30HMOVA,30H两者的区别。【思考题】:立即数存放在RAM还是ROM中?,返回,立即数寻址的指令长度为2或3个字节。,n,n+1,ROM,累加器A,MOVA,#30H指令执行流程,ROM,DPTR,MOVDPTR,#2000H指令的存储和执行,4.2.4寄存器间接寻址,指令中含有保存操作数地址的寄存器Ri(i=0、1)。MOVA,RiCPU首先从Ri找到操作数地址,再从该地址中找到操作数X。【举例】:MOVR0,#30H;立即数送R0寄存器MOVA,R0;从RAM的H单元取数送累加器A可见,在使用间接寻址指令前,必须先对Ri赋初值。,【注意】MOVA,R0和MOVA,R0指令的区别。间接寻址的指令常用于循环程序中,对“数据块”进行操作的一种非常方便的方式。间接寻址操作过程如下图所示。,30H,R0,00H,累加器A,1,2,3,MOVA,R0指令机器码,使用寄存器间址指令时应注意的三个问题:,1.间址寄存器Ri只能使用R0、R1寄存器(i=0、1)。2.此方式也是访问片外RAM的唯一方法。对于片内RAM使用Ri寄存器,寻址范围为00HFFH;对于片外RAM,使用Ri时寻址范围256,如果使用DPTR做间址寄存器,寻址范围为0000HFFFFH。,3.间址方式的指令不能访问SFR中的单元。如下面的程序是错误的:MOVR1,#80HMOVA,R1(因为80H为SFR的物理地址)对于SFR只能采用直接寻址的方式访问,如:MOVA,80H,MCS-51片内、片外数据存储器示意图,特殊功能寄存器SFR,通用数据存储器,80H7FH,00H,FFH,片内数据存储器片外数据存储器256B个字节64KB个字节,片外数据存储器64KB,0000H,FFFFH,注意:1,访问片内RAM20H存储单元;MOVA,20H2,访问片外RAM存储单元;MOVR0,#20HMOVXA,R03,尽管片内与片外的RAM单元的00H-FFH地址相重叠但由于指令的不同不会发生地址混乱。,返回,4.2.5变址寻址,一种访问程序存储器ROM的寻址方式。指令使用DPTR或PC中的内容作为基地址,与累加器A的偏移量相加,其和作为操作数地址。如:MOVCA,A+PC;PC内容与A的内容相加得操作数地址并将此操作数送AMOVCA,A+DPTR;DPTR内容与A的内容相加得操作数地址并将此操作数送A使用变址指令时,要事先分别为A、DPTR赋值,以便获得操作数得地址。,变址寻址用于对ROM中数据的访问,如查表操作等。【举例】:已知ROM中的0300H-0309H为09的平方表,试编程,求A中数据的平方(设A=02H)。MOVDPTR,#0300H;指针DPTR赋表头地址MOVCA,A+DPTR;从0302H单元取数4送A这里,DPTR提供平方表的基地址,A的内容为偏移量。【思考题】:为什么程序中将一些数据、常数存放在ROM中?这些数据是什么时候放到ROM中?,变址寻址示意图,02H,0300H,ALU,0302H,累加器A,DPTR,0300H(DPTR)+02H(A)0302H,MOVCA,A+DPTR,返回,0300H,ROM,4.2.6相对寻址,转移指令中使用的一种寻址方式。MCS-51单片机的指令系统中,有两类转移指令:相对转移(2个或3个字节);绝对转移(3个字节)。绝对转移指令:直接给出转移的目标地址(16位地址)如:LJMP0100H,将目标地址直接送给PC,从而控制程序转移到ROM的0100H处执行程序;相对转移指令:执行指令时将当前PC值与指令中的8位偏移量rel(补码)进行相加,形成实际转移的目标地址。SJMPrel如:SJMP03H,03H,2002H,ALU,2005H,累加器A,PC,2002H+03H2005H,操作码,偏移量,偏移量rel为带符号位的补码,转移的范围为+127-128。例如:SJMP03H;(机器码80H、03H),2000H,2002H,当前PC值,LOOP,相对寻址使用中应注意的问题,与绝对寻址相比,相对寻址具有很好的“浮动性”,因此是编程人员普遍使用的一种寻址方式。使用时,要注意3点:1.CPU进行地址计算时,PC取值是执行本指令后的地址值。以上面的例子说明:指令本身的首地址是2000H,执行完后变为2002H(既下一条指令的首地址)即PC总是指向下一个要执行的指令。如果使用三字节的相对转移指令,则PC=PC+3。,返回上一页,2.偏移量的计算:rel=目标地址-源地址-2(2字节相对转移指令)或:rel=目标地址-源地址-3(3字节相对转移指令)结果用补码的形式书写。为了减少计算偏移量的计算,汇编程序允许使用“符号地址”的方式代替偏移量。如:SJMPloop1(如图)汇编程序在翻译时,自动计算并将结果替换符号地址。3.如果转移地址的范围超过相对寻址的范围(如:-128+127)时,在编译时提示出错。,【思考题】:在使用rel时,发生转移的偏移量超出-128+127的范围时如何处理?,绝对转移和相对转移的指令(部分),绝对转移:LJMPaddr16如:LJMP2000H;三个字节(OP、addH、addrL)LCALL2100H;子程序长调用相对转移:SJMPrel;无条件短转移DJNZRn,rel;Rn-1Rn,Rn0则转JZrel;A=0则转(二字节)JNZrel;A0则转(二字节)CJNEA,#data,rel;Adata转(三字节),返回,4.2.7位寻址,在位寻址指令(位操作指令)中使用的位地址。在一般的情况下,系统的数据都是按字节(8位)来存放、处理。单片机在控制、检测的应用中,系统的输入、输出数据有很多属于开关量信号。这些开关量信号以bit-“位”的形式进行各种运算、处理和存储的。,MCS-51单片机控制、检测系统,驱动器,电动机,外设1,外设2,状态信号,状态信号,控制信号,在MCS-51单片机不仅在指令系统中设计了“位操作”指令,而且在片内RAM区中还专门开辟了一个“位寻址区”。这样,布尔变量可以向字节数据一样进行存储、寻址。除了位寻址区外,RAM中的大多SFR都可以按位寻址。【举例】:SETB20H;将位地址为20H的位置一SETB90H;将P1口的d0位置一即位操作指令中使用的直接地址都是位地址,这些地址分布在RAM的20H2FH和部分SFR中(参见55页)。,与字节操作中的直接寻址一样,为了增加程序的可读性,凡在SFR中的位地址都可以使用符号地址来替代。如第二例中,完全可以使用下面的指令格式:MOVP1.0;将P0口的d0位置一类似还有:MOVC,ACC.7;将累加器的d7位送PSW的cy这种指令在汇编程序进行翻译时,还是要先将符号地址转换为真正的位地址。,返回,4.3数据传送指令,4.3.0传送指令的特点4.3.1内部数据传送类指令4.3.2外部数据传送类指令4.3.3堆栈操作指令4.3.4数据交换指令,继续,数据传送是编程中使用最多、最主要的操作。功能:将数据在累加器、片内的RAM、SFR及片外ROM、RAM之间进行传送。在指令中,必须指定被传送数据的源地址和目标地址。在传送过程中,源地址的内容不被改变(COPY)。传送类指令除了以累加器A为目标的传送对PSW的P有影响外,其余的传送类指令对PWS一概无影响。,4.3.0传送指令的特点,【举例】:MOVA,R0;将R0寄存器中的数据送累加器A中(注意寻址方式),指令通式:MOV,返回,4.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的地址。,直接寻址指令举例,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,不能根据主观意愿去“创造”指令。例如:要将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或2。【举例】: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,返回,4.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单元地址由A和DPTR或PC内容相加获得。,该指令称为“查表”指令。在第一条指令中:用DPTR作为基地址。使用前,先将数据表的首地址送入DPTR中,累加器A作为偏移量。由两者数据相加得到待查的表中数据地址并取出。第二条指令是以程序计数器PC为基地址。由于PC的内容与该指令在ROM中的位置有关,所以一旦该指令在程序中的位置确定,其PC的值也就确定。,举例:,已知累加器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作基址寄存器: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,使用MOVCA,A+PC指令的特点:程序与数据表在ROM中的位置是可以浮动的。只要MOVC指令与表之间的距离不变,则程序可以在ROM中的任意位置上“浮动”,具有可修改性;与使用MOVCA,A+DPTR指令不同,使用前应当对A中的偏移量加以个“修正值”,修正值的大小为:MOVC指令与表头之间的字节数;,返回,3,外部RAM的字节传送指令,实现外部RAM和累加器A之间的数据传送。只有寄存器间接寻址的指令。MOVXA,Ri使用Ri寄存器间址寻址范围0255hMOVXRi,A在硬件电路中P0口输出8位地址数据。MOVXA,DPTR使用DPTR间址,寻址范围065535hMOVXDPTR,A在硬件电路中,使用P0口输出低8位,P2口输出高8位外部RAM地址。,movx指令的执行特点,访问外部数据存储器RAM必须使用movx指令;只要CPU执行movx指令,就要占用端口P0、P2和部分P3的硬件资源。在执行movx指令时,P0、P2分别作为“数据/低8位地址复用总线”和“高8位地址总线”。在执行读入操作时(MOVXA,DPTR),还要通过P3.7输出/RD信号;在执行写入时(MOVXDPTRi,A),还要通过P3.输出/WR信号;如果使用Ri作间址寄存器,则CPU不占用P2口。,外部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,返回,4.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的值可以根据需要进行修改,以适应具体编程的需要。在确定栈区位置时要考虑对数据区的影响,以避免数据区与栈区冲突。【思考题】:若将R0、R1进栈和出栈,如何编写指令?,使用堆栈指令应注意的问题,堆栈操作指令举例(一),产生延时的子程序delay。org0800hdelay:pushpswpush00hpush01hmovr0,#00hLoop1:movr1,#00hLoop2:djnzr1,loop2djnzr0,loop1pop01hpop00h思考题:为什么R0、R1的poppsw内容要进栈?ret,SP,堆栈操作指令举例(二),堆栈操作指令除了可以在子程序的设计中,对主程序的数据进行保护。还可以根据堆栈操作的特点完成一些特殊的操作。【举例】:设片内RAM的30h单元存有x,40h单元存有y。试将两个单元内容互换。push30h;x进栈push40h;y进栈pop30h;y送30H单元pop40h;x送40H单元,SP=07h,40h,30h,继续,4.3.4数据交换指令,为提供一种方便的累加器和寄存器/RAM之间的数据交换。避免了使用mov指令交换时的不便。格式:xcha,Rn;aRnxcha,direct;a(direct)xcha,Ri;a(Ri)xchda,Ri;a30(Ri)30低四位交换举例:将R0和R1的内容交换。,MOVA,R1;取数据送AXCHA,R0;与R0交换MOVR1,A;送回到R1,数据交换指令举例(一),举例:已知,片外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,继续,4.4算逻运算和移位指令,功能:完成算术运算、逻辑运算和循环移位三大功能。特点:大多指令都要由累加器A来存放一个源操作数,并把操作结果放回累加器A中。,4.4.1:算术运算指令,4.4.2:逻辑运算指令,4.4.3:移位指令,继续,4.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【注意】:除了第一条对PSW的P有影响外,其余对PSW均无影响。【思考题】:能否使用加一(或减一)指令来做数据运算?为什么?,返回本节目录,编程举例,已知M1、M2单元中存有两个16位无符号数X1、X2(低位在前)。试写出X1+X2,并将结果放入M1、M1+1单元(低8位在M1单元)。设两数之和不会超过16位(65535)。,M1,M1+1,M2,M2+1,返回本节目录,【解】:MOVR0,#M1;x1指针赋初值MOVR1,#M2;x2指针赋初值MOVA,R0;取x1低8位送AADDA,R1;x1与x2低8位相加(影响Cy位)MOVR0,a;低8位和送m1单元INCR0INCR1;修改指针MOVA,R0;取x1的高8位送AADDCA,R1;x1与x2的高8位和Cy相加MOVR0,A;结果送M1+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码加、减法指令,只能使用二进制加法指令再通过调整实现BCD码的运算。格式:DAA;若AC=1或A309,则A+06hA;若Cy=1或A749,则A+60hA【注意】:1,DAA指令必须紧跟在加法指令之后;2,DAA指令只适用于加法指令的调整。,十进制调整指令应用举例(一),BCD加法运算:试写出完成85+59的BCD码的加法程序。MOVA,#85HADDA,#59HDAASJMP$85a=10000101B+59dtat=01011001低4位9,所以加06h+00000110B11100100B高4位9,所以加60h01100000B101000100B结果为144h(1包含在Cy)【注意】:144H是用16进制数来表示十进制,既BCD码。,十进制调整指令应用举例(二),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被复位。,举例:,是将内存20H中的无符号二进制数转换为BCD码,结果分别存入M、M+1、M+2单元。,20H,M,M+1,M+1,X100得百位数、余数,余数10得十位数、余数(个位数),解:MOVR0,20HMOVR1,#M;R1指向BCD码百位MOVB,#100MOVR2,#2MOVA,R0LOOP:DIVAB;AB,商在A,余数在BMOVR1,A;商送RAMBCD码单元INCR1;修改BCD码指针DJNZR2,LOOPINCR1MOVA,BMOVR1,A;个位数送M+2单元,算术运算小结,1,指令对标志的影响,不同类型的数据运算后要根据对应的标志进行溢出判断;2,DAA指令只能对加法进行调整,且紧跟其指令,对于BCD码的减法要首先转换为加法模式后再使用DAA调整;3,减法指令都是带Cy位的减法,在使用前必须首先清除Cy位(CLRC)。,返回本节目录,4.4.2:逻辑运算指令,功能:对2个8位二进制数进行逻辑与、或、非和异或操作;特点:除了以累加器A为目标寄存器的指令影响PSW的P位外,其余指令对PSW均无影响。1,逻辑与运算指令(ANL)2,逻辑或运算指令(ORL)3,逻辑异或指令(XRL)逻辑运算特点小结4,累加器清零和取反指令(CLR上电/复位入口地址ORG0003HLJMPINT_0;INT0中断入口地址ORG0013HLJMPTIMER_0;T0溢出中断入口地址:ORG0100HSTART:MOVA,#00H;主程序:ORG0200HINT_0:PUSHPSW;INT0中断服务程序:ORG0300HTIMER_0:PUSHPSW;T0中断服务程序:,返回本小结,绝对转移指令:AJMPaddr11,双字节、双周期指令。将AJMP指令中的11位转移地址替换掉原来PC中16位地址中的低11位地址。指令中的11位地址,确定了地址的转移范围在2K以内,所以AJMP也称“页内转移”指令。,A10A9A8操作码A7A0,AJMP指令,PC程序计数器,1.MCS-15的ROM系统是以2K为一页来划分程序存储器,这样对于4K的片内ROM存储器可以分为2页;片外64K的ROM可以分为32页。2.在执行AJMP指令时,PC中的原高5位决定了ROM中的页地址;低11位地址用来选择页内地址。3.在一般情况下,AJMP指令应当与目标地址在同一页内。更具体的说:目标地址应当与AJMP指令取出后的PC值(PC=PC+2)在同一页内。否则转移将会出现跨页错误。4.11位绝对地址在编程时可以使用符号地址代替。,ROM的64K存储空间的页面示意图,:AAA:MOVA,R0MOVR1,A:AJMPAAA,0100H,07FEH,0000011111111110,PC值(0页),0000100000000000,PC+2值(1页),0000100100000000,AJMP指令中的11位地址0900H,原本AJMP指令要转到本页的0100H单元但是由于PC的高5位页面地址发生了变化使AJMP指令实际转到下一页0900H单元。,最后PC值,发生跨页错误,0000H,ROM的64K存储空间的页面(部分)划分表,AJMP转移指令是用来做页内2K范围的转移,如果使用不当,会发生错误的“跨页”操作。产生跨页的原因是AJMP指令处于每一页的最后两个单元的结果,避免这种现象的方法就是不要在每一页的最后两个单元使用AJMP指令。如果目标地址与AJMP地址不再同一页内,建议使用LJMP指令替代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。,PC,PC+2,0109H,0110H,0116H,长转移LJMP与短转移SJMP在使用中要注意的地方,1,SJMP具有程序可浮动性,而LJMP则没有。为什么?如将某一段程序的首地址START由1000H改为2000H时,原来程序中的LJMP1006H指令失效,而SJMP指令则无影响。,START:(1000H)LOOP1:(1006H),2,LJMP主要用于ROM中6个特殊的单元中的转向用。3,如果在程序的中间使用LJMP时目标地址使用“符号地址”,这样可以解决“浮动”问题(程序最后完成,进行汇编时由汇编程序将符号地址用绝对地址取代)。4,使用SJMP的rel时,其转移范围是-128+127,如果编程时,超出范围就要采取一些方法解决(请思考如何解决)。,返回本小结,变址转移指令,格式:JMPA+DPTR单字节操作码为73H特点:转移地址由累加器A的内容与DPTR相加形成。用途:用来制作一个多分支的转移结构。【举例】:MOVDPTR,#TABLE;指针赋表头地址如2000HJMPA,DPTR;转移地址由A在表中选择TABLE:AJMPROUT0;多分支转移表AJMPROUT1AJMPROUT2AJMPROUT3:,使用JMPA+DPTR实现多分支的程序结构,JMPA+DPTR,ROUT0ROUT1ROUT2ROUT3.ROUTn,返回,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字节)CJNEA,#data,relCJNERn,#data,relCJNEA,direct,relCJNERi,#data,rel这是“比较+转移”的指令,比单纯的比较指令更为方便。【注意】:1,4条指令都是3字节指令,操作为PC+3PC或PC+3+rel。2,指令的执行实际上就是做不回送的减法,通过Cy反映出无符号数的两数的大小:Cy=0则XY;若Cy=1则Xdata时:PC+3+rel,Cy=0A0时,同无符号数相同;b,当x、y均0,yy;d,当x0时,x0?,Y0?,Y0?,Cy=0?,XY,Y,N,Y,Y,Y,N,N,N,举例:,在内存20H40H中又一组无符号数,试寻找并统计大于80H、小于80H和等于80H数据的个数。解:选用R0为数据指针,R2为循环计数器。选用MAX、MIN和EUU三个单元分别存放统计的大于、小于和等于的结果并原始清零。使用CJNEA,#80H,rel指令进行数据的比较。,ORG1000HSTART:MOVR0,#20H;数据指针赋初值MOVR2,#20H;循环计数器赋初值MOVMAX,#00H;单元原始清零MOVMIN,#00HMOVEUU,#00HLOOP1:MOVA,R0CJNEA,#80H,LOOP3LOOP2:INCEUU;A=80H时SJMPLOOP4LOOP3:JCLOOP5;A80H时SJMPLOOP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年特种作业操作证核心考题题库及答案
- 2025年前台接待招聘面试题库及参考答案
- 2025年符合性审查专员招聘面试参考题库及答案
- 铁路集团笔试题库及答案
- 2025年基础护理师招聘面试参考题库及答案
- 盘锦招聘教师考试题库及答案
- 中药医院考试题库及答案
- 2025年营销策略专员招聘面试题库及参考答案
- 2025年新媒体运营经理招聘面试参考题库及答案
- 2025年零售区域经理招聘面试题库及参考答案
- 2025年乡镇畜牧站防疫员招聘面试备考指南及模拟题答案详解
- 低温烤肠多样化口味创新创业项目商业计划书
- 预备党员转正后支部书记谈话记录范文
- 特种文献检索课件
- 大学生创新创业基础课件 第10章 创业核心内容三:市场营销
- 四川省土地开发项目预算定额标准
- 会计凭证填制规范及案例解析
- 新教材2025人教版七年级上册全部单词默写版
- 肺癌术后治疗用药指导
- 学校送医管理办法
- 玉环清港台山100MW沿海滩涂渔光互补项目环评报告
评论
0/150
提交评论