第三章 MCS-51汇编语言指令教材_第1页
第三章 MCS-51汇编语言指令教材_第2页
第三章 MCS-51汇编语言指令教材_第3页
第三章 MCS-51汇编语言指令教材_第4页
第三章 MCS-51汇编语言指令教材_第5页
已阅读5页,还剩193页未读 继续免费阅读

下载本文档

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

文档简介

第3章MCS-51汇编语言指令寻址方式 汇编语言程序设计基础数据传送类指令 逻辑操作类指令算术运算类指令 位操作指令控制转移类指令 程序设计举例MCS-51系列单片机为8位机,可识别28

=256种数据及代码。从指令的执行时间看,12个振荡器周期的指令64条,24个振荡器周期的指令45条,48个振荡器周期的指令2条(MUL及DIV)。分别对应单机器周期、双机器周期和四机器周期。在系统时钟为12MHz时,对应用时1

S、2S、4S。

不论何种汇编语言,其助记符都包括操作码和操作数两部分。操作码指明了本条指令的功能,操作数代表了指令的操作对象。操作数指定了参与运算的数据或数据所在单元的地址。如何得到这个地址称为寻址方式。3.1寻址方式3.1.1立即寻址指令中跟在操作码后面的数据就是实际参与运算的操作数,称为立即数。其指令码形式为:PCPC+1操作码立即数一般为一字节一字节或二字节如:MOVA,#20H;(A)←20H即把20H这个数据送入累加器A中,即送入特殊功能寄存器中地址为E0H的单元。PC分析0111010000100000操作码立即数……PC执行PCACC(0E0H)00100000MOVA,#20H执行示意图3.1.2寄存器寻址把指定的某一可寻址的工作寄存器R0~R7的内容作为操作数。指令操作码的低3位指示所用寄存器。如:INCR3;(R3)←(R3)+1PC…RS1RS0…000**01100001011……ROM1……01000001……片内RAMALU取指PC010000103.1.3直接寻址指令中包含了操作数的地址,该地址直接给出了参加运算或传送的单元的地址。直接寻址可访问三种地址空间:⑴特殊功能寄存器SFR(又叫做专用寄存器):直接寻址是唯一的方式。⑵内部数据存储器RAM中的128个字节。⑶221个位地址空间。如:MOVA,70H;(A)←(70H)PC分析PC执行PC1110010101110000操作码直接地址……ROM……01100110……SFR70H……ACC011001103.1.4寄存器间接寻址指令指定的某一寄存器的内容作为操作数地址。可用来间接寻址的寄存器有R0、R1、堆栈指针SP和数据指针DPTR。前面加@表示间接寻址。可访问内部数据存储器或外部数据存储器。如:MOVA,@R0;(A)←(R0)11101110……ROMPC取指PC…RS1RS0…000**00000110110……00110110片内RAM……01100000…………R060HACC3.1.5基址寄存器加变址寄存器间接寻址(又叫变址寻址)基址寄存器(DPTR或PC)的内容与变址寄存器(A)的内容的和为可寻址单元的地址。该类寻址方式用于访问程序存储器,对查表访问特别有用。注意:A中内容为无符号数。如:MOVCA,

A+PC;(A)←((A)+(PC))设(A)=80H,(PC)=8019HPC取指PC10000011……ROM10001010……80A8HALU100010001000000000100000执行8020+88=80A8H10001010ALEPC3.1.6相对寻址把指令中给定的地址偏移量与本指令所在单元地址(PC内容)相加得到真正有效的操作数地址。该偏移量有正、负号,即在机器中必须以补码形式给出,所转移的范围为相当于当前PC值的+127~-128之间。如:JC80H若C=0,则PC值不改变;若C=1,则以现行的PC值为基址加上80H得到所转向的地址。假设该指令放在1005H单元中,C=1。PC取指PC0100000010000000ROM…………1005HALU0001000000000111执行1007+FF80=0F87H1006H1007HPC……0F87H00001111100011113.1.7寻址方式小结方式利用的变量使用的空间寄存器寻址R0~R7、A、Cy、DPTR直接寻址内部RAM和SFR及位空间寄存器间接寻址@R0、@R1、SP内部数据存储器@R0、@R1、@DPTR外部数据存储器立即寻址程序存储器变址寻址DPTR+A、PC+A程序存储器相对寻址PC+偏移量程序存储器3.2MCS-51汇编语言程序设计基础3.2.1MCS-51单片机的助记符语言学会硬件联接和掌握程序编制是两个重要的环节。只有硬件联接无误和程序编制正确,计算机才有可能按设计者的要求去完成各种各样的任务。机器指令代码常用在实时控制场合。这是由于由机器指令代码编写的程序比较简练,可不经编译立即被机器所执行。各类机器的机器指令用助记符代替。这样以来,了解和熟悉指令系统,就归结为了解和熟悉指令系统的助记符。助记符一般是由操作码和操作数两部分组成。操作码反映了指令的功能,操作数代表了指令的操作对象。㈠操作码:操作码是指令功能的英文缩写。MCS-51与IBM汇编语言常用操作码对照表MCS-51IBM汇编语言MCS-51IBM汇编语言MCS-51IBM汇编语言MOVMOVRETIIRETDECDECMOVXOUTRETNANLANDINJZJZORLORMOVCJNZJNZXRLXORPUSHPUSHJCJCRLROLPOPPOPJBRLCRLCACALLCALLDJNZRRRORLCALLCALLADDADDRRCRCRAJMPJMPADDCADCCPLNOTLJMPJMPINCINCCLRCLccSJMPJMPDADAAJNCJNCRETRETSUBBSBBJNBSETBSTddNOPNOP㈡操作数操作数是一条指令操作的对象。⒈当操作数是指令中给出的数据时,则被称为立即数,有8位和16位二进制数两种。在助记符的数字前加"#"来标记其是立即数。不同功能的指令,操作形式不同。操作数可以是数据,也可以是地址,且地址更常见。⒉操作数是存放数据的地址,这些地址通常是:⑴所选定工作寄存器区的工作寄存器R0~R7、A、B、C(位)、DPTR等可编址的寄存器。⑵片内数据存储器中的低128字节、特殊功能寄存器SFR及可位寻址的221位。⑶片外数据存储器空间。⑷程序存储器空间。3.2.2指令格式了解和熟悉指令,主要是对指令助记符了解和掌握。这种用助记符描述机器指令的语言称为汇编语言。MCS-51指令系统的指令格式如下:[标号]:操作码助记符[第一操作数][,第二操作数][;注释]标号是表示该指令所在的符号地址,一般是由字母打头的字母数字串表示。操作码助记符表示了指令的操作性质。注释部分是用户为了方便阅读程序所加的说明,可有可无。第一、第二操作数表示操作的对象。指令的操作码部分必不可少,操作数部分有的指令没有,或只有一个操作数。MCS-51单片机采用变字长存储机器指令的方式,指令字长有单字节、双字节和三字节三种。其格式如下:单字节指令双字节指令三字节指令操作码操作码操作码操作数第一操作数第二操作数指令字节越多,占用的内存单元越多。但是指令的执行时间长短并不和所占用的字节数的多少成比例。如乘、除法为单字节指令,但执行时间最长。3.2.3指令分类MCS-51单片机的111条指令按功能分为以下五大类:⑴数据传送类:29条⑵逻辑操作类:24条⑶算术操作类:24条⑷位操作类:17条⑸控制转移类:17条3.2.4符号说明在分类介绍指令之前,把描述指令的一些符号意义首先作一简单的介绍:Rn:当前选中的寄存器区的8个工作寄存器R0~R7。Ri:当前选中的寄存器区中可作间接寻址寄存器的2个工作寄存器R0、R1。direct:8位的内部数据存储器单元的地址。可以是内部RAM单元的地址及SFR的地址。#data:包含在指令中的8位常数。#data16:包含在指令中的16位常数。addr16:16位目的地址。用于LCALL和LJMP指令中。范围是64KB程序存储器空间。addr11:11位目的地址。用于ACALL和AJMP指令中。目的地址必须与下一条指令的第一字节在同一个2KB程序存储器区地址空间之内。rel:8位的带符号的偏移地址。用于SJMP和所有的条件转移指令中。DPTR:数据指针。可用作16位的地址寄存器。bit:内部RAM或SFR中的直接寻址位。A:累加器。B:特殊功能寄存器。用于MUL和DIV指令中。C:进位标志或进位位,或布尔处理机中的运算器。@:间接寄存器或基址寄存器的前缀。如@Ri。/:位操作数的前缀。表示对该位操作数求反。如/bit。(×):×中的内容。((×)):由×寻址的单元中的内容。←:箭头左边的内容被箭头右边的内容所代替。3.2.5MCS-51汇编语言程序设计的基本方法对于一个设计题目,一般按照:分析题目并确定算法、设计程序结构、编写程序、编译调试。分析题目即明确题目的要求,搞清楚所给定的原始条件及应得到的结果,以及对运算精度和速度的要求等。该步骤是整个程序设计工作的基础。确定算法即选择合适的求解问题的方法。算法不是唯一的,但是不同的算法在计算精度、占用的内存及编程工作量等方面有所差别,需比较并选择最合适的算法。程序结构设计根据分析的结果和确定的算法,采用自顶向下的方法对设计题目进行细化,分解为更能准确表达算法的功能模块及程序结构。编写程序代码是在程序结构设计完成后,根据程序结构设计所提供的具体要求,规划好寄存器和存储器的使用,转化为程序代码。编程要力争做到层次清晰、占用内存少、运行时间短。编译即将源代码进行汇编,形成可执行的代码。调试即将编译通过的可执行代码进行模拟运行,输入给定的数据,检查运行结果是否正确。3.2.6MCS-51伪指令伪指令是供汇编用的特殊指令,只是在汇编过程中产生某种控制,或者对标号进行赋值。伪指令在汇编时不产生机器语言指令,仅提供汇编控制信息。⒈设置起始地址伪指令ORG(Origin)格式:ORG NNNN功能:指定目标程序或数据块在存储器中存放的起始地址。其中NNNN为十进制或十六进制地址。ORG伪指令总是出现在每段源程序或数据块的开始位置。源程序的开始,一般都要设置一条ORG伪指令来指定该程序在存储器中的起始位置,若省略则默认为0。可多次使用ORG指令来规定不同程序段的起始地址,但是不允许和前面指定的地址重叠,即不同的程序段之间不能有重叠。⒉定义字节伪指令DB(DefineByte)格式:[标号:]DB字节数据表功能:把字节数据表中的数据依次存放在由标号指定的连续地址单元中。字节数据表中的数据多于一个时用逗号分隔。如:DATA1: DB 48H,9EH,’1’,80假设DATA1的地址为1020H,则(1020H)=48H,(1021H)=9EH,(1022H)=31H,(1023H)=50H⒊定义字伪指令DW(DefineWord)格式:[标号:]DW字数据表功能:把字数据表中的数据依次存放在由标号指定的连续地址单元中。字数据的高位字节(高8位数据)存放在低地址单元,低位字节(低8位数据)存放在高地址单元如:DATA2: DW 1234H,56H假设DATA2的地址为1040H,则(1040H)=12H,(1041H)=34H,(1042H)=00H,(1043H)=56H⒋定义空单元伪指令DS(DefineStorage)格式:[标号:]DS常数表达式功能:从标号指定的起始地址开始预留由常数表达式指定个数的单元,以备源程序使用。此时标号可在源程序中代替地址,类似于高级语言中的变量名称。如: HIGH: DS 4 LOW: DS 2假设起始地址为30H,则30H~33H单元给HIGH,34H及35H给LOW。HIGH即30H,HIGH+1即31H,HIGH+2即32H,HIGH+2即33H,LOW即34H,LOW+1即35H。⒌赋值伪指令EQU(Equate)格式:符号名EQU表达式功能:将表达式的值赋予符号名,故称为等值语句。表达式可以是一个数或者特定的汇编符号。如: V10 EQU 10 REG EQU R0 MEM EQU 30H⒍数据地址赋值伪指令DATA格式:符号名DATA表达式功能:将表达式的值赋予符号名。与EQU类似,但有几点不同:①DATA伪指令中的符号名可以先使用、后定义;②DATA伪指令后只能是表达式或数据,不能是汇编符号;③DATA定义的字符名可以出现在其他表达式中;④DATA常用来定义数据地址。⒎位地址赋值伪指令BIT格式:符号名BIT位地址功能:将位地址赋予符号名,之后符号名就可在程序中使用,来代替位地址。⒏汇编结束伪指令END格式:[标号:]END功能:告诉编译程序,该程序段已经结束。END语句应放在整个程序段后,否则其后的语句将不会得到编译处理。⒐位定义段标志BSE该指令用于定义位地址时,把所有的位定义放在一起,单成一段。⒑数据定义段标志DSEG该指令用于定义内存变量时,把所有定义的内存变量单独作为一段。⒒代码段定义标志CSEG该指令的作用是把程序代码单道作为一段。⒓标号定义标志XSEG该指令的作用是将定义的地址和标号单独作为一段。⒔段结束标志ENDS该指令的作用是作为段的结束。3.2.7程序结构在汇编语言程序设计中,常用的程序结构有:顺序结构、分支结构、循环结构和子程序结构。⒈顺序结构顺序结构是最普遍的结构,程序按照指令的顺序逐条执行。顺序结构是程序设计的基本结构⒉分支结构根据条件,对其不同的情况进行分析、判断,以选择执行不同的程序段,即分支结构。分支结构就是根据某种条件的判断结果,决定程序的不同走向。分为简单分支和散转两类。通过执行条件转移指令来实现,MCS-51指令系统中的条件转移指令有:判断累加器A是否为零转移指令JZ、JNZ;比较条件转移指令CJNE;判断进位及位转移指令JC、JNC、JB、JNB。条件满足?a)一般分支分支1分支2是否b)散转分支(R)=?分支1分支2分支N=0=1=N…分支程序结构:⒊循环结构循环程序是指当满足某条件时,能够重复执行某段程序的程序结构。因为在实际应用中,常常会要执行同样的操作,即重复执行同样的动作,此时采用循环结构,可减少指令及书写时间、节省程序存储器空间。但是需要注意的是,循环结构不会节省CPU的执行时间。循环结构的程序由四部分组成:①初始化部分初始化部分是循环程序的准备部分,完成循环变量的初始化、工作单元清零及循环计数器的初始化。②循环体循环体是循环结构程序的执行部分,即重复执行的程序段,是循环程序的实体。③修改部分每执行一次循环体后,修改有关变量、地址指针或循环结束条件。④控制部分根据循环计数器的值或其他循环条件,判断循环是否继续执行。如果循环次数未到或循环条件满足,继续循环;否则退出循环。常用于循环控制的指令有:DJNZ、CJNE、JC、JNC、JB、JNB等。开始初始化循环体循环修改继续循环?结束a)直到型循环开始初始化循环体循环修改继续循环?结束b)当型循环当型循环即先判断循环条件再执行循环体的循环结构,循环体可能一次都不执行;直到型循环即先执行循环体再判断循环条件的循环结构,循环体至少执行一次。可以通过这两种基本循环构成多重循环,即循环嵌套,但是不允许循环交叉。⒋子程序结构在程序的编制过程中,经常会进行一些相同的计算或操作。每次都编写相同的程序,不仅麻烦且浪费存储器空间。因此,对于常用的程序段,可将其从程序中独立出来,供其他程序调用。这种独立功能的程序段称为子程序。主程序调用子程序时,通过子程序调用指令ACALL或LCALL实现。子程序执行完毕,通过执行子程序末尾的子程序返回指令RET实现。子程序在执行过程中还可以调用其他子程序,这称为子程序嵌套。子程序结构符合结构化程序设计,可读性强。在设计子程序时,应注意以下问题:①子程序的入口及出口条件子程序的入口条件就是子程序执行所需要的参数或者数据。为了使子程序能够正确执行并得到所需结果,调用该子程序的程序根据子程序的要求,负责把其所需数据放在指定的寄存器或单元,即把参数传递给子程序。另外,还可以通过堆栈进行参数传递。子程序的出口条件就是子程序执行的结果返回给调用程序。②保护现场和恢复现场子程序在被调用时,MCS-51系统只是对断点进行了保护,即把调用指令的下一条指令压入了堆栈,但并未对其他寄存器内容进行保护。子程序执行需要使用一些寄存器,为了保证子程序执行不破坏调用程序的这部分寄存器的内容,需要对这些寄存器进行保护,这个工作称为保护现场。保护现场的工作一般在子程序的开始部分进行,采用的方法是把这些寄存器内容压入堆栈。在执行完子程序之后返回主程序继续原工作之前,必须把保护现场时所压栈的寄存器内容进行出栈,以保证主程序执行所需要的内容正确,这称为恢复现场。3.3数据传送类指令传送类指令是指令系统中使用最多的一类指令,主要用于数据的保存及交换等场合。按操作方式把传送类指令分为三种:⑴数据传送;⑵数据交换;⑶栈操作。数据传送类指令一般的操作是把源操作数传送到目的操作数。指令执行后,源操作数不变,目的操作数修改为源操作数。若要求数据传送时,不丢失目的操作数,则可以用交换型的传送指令。㈠数据传送类指令的一些特点⑴除了用POP或MOV指令将数据传送到程序状态字外,数据传送指令一般不影响标志位(C、AC、OV),不包括P(奇偶校验)。因为,一则MOVA类指令会影响P,二则P不影响执行顺序。⑵对特殊功能寄存器SFR的操作必须用直接寻址,而直接寻址也是访问SFR的唯一方式。源操作数可用寄存器寻址、间接寻址、直接寻址、立即寻址、变址寻址五种寻址方式。目的操作数可用寄存器寻址、间接寻址、直接寻址三种方式。数据传送类指令用到的助记符有:MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP。传送类指令功能操作码助记符操作数备注数据传送内部数据传送MOVdirect,Rn,@Ri,A←#dataRn表示R0~R7Ri表示R0或R1

表示源地址和目的地址可互换DPTR←#data16A

Rn,@Ri,directdirect

Rn,@Ri,direct外部数据存储器

MOVXA

@Ri,@DPTR程序存储器传送

MOVCA←@A+DPTR,@A+PC数据交换字节交换

XCHA

Rn,@Ri,direct

表示内容可互换半字节交换

XCHDSWAPA低4位

@Ri低4位A高4位

A低4位栈操作压入堆栈

PUSH(SP)←direct写指令时(SP)不出现弹出堆栈

POP(SP)→direct㈡数据传送的路径累加器A寄存器间址@R1@R0(外部数据0~255)寄存器间址@DPTR(外部数据0~64K)a)外部数据存储器传送操作变址@PC+A,@DPTR+A寄存器间址@R0,@R1,@DPTR累加器A寄存器R0~R7直接地址direct立即数#data寄存器间址(SP)寄存器C直接地址direct寄存器DPTR11c)数据传送的所有可能路径累加器A基寄存器加变址寄存器@PC+A(程序存储器0~64K)基寄存器加变址寄存器@DPTR+A(程序存储器0~64K)b)程序存储器传送操作⒈数据传送又可分为:①内部数据存储器各部分间,以及内部数据存储器各部分与累加器A之间的数据传送;②片外数据存储器与累加器A之间的数据传送;③程序存储器送数到累加器A的传送。所用的操作码分别为:MOV、MOVX、MOVC⑴MOV的作用区间主要是内部数据存储器,寄存器寻址、间接寻址及直接寻址使得传送指令允许在工作寄存器R0~R7、片内数据存储器、累加器A和特殊功能寄存器任意两个之间传送一个字节的数据。特别是直接地址到直接地址之间的数据传送,能把一个并行I/O口中的数据直接传送到内部数据存储器RAM中,而不必经过任何工作寄存器(R0~R7)或累加器A,提高了传送速度。此外利用MOV指令可把16位的立即数据直接送入数据指针DPTR中。⑵MOVX指令用于累加器A与片外扩展数据存储器或扩展的I/O口间进行数据传送。在MCS-51中对片外数据存储器和扩展I/O口的操作是一样看待的,采取统一编址,即I/O口也作为一个单元对待。这种传送只有一种寻址方式──寄存器间接寻址。⑶MOVC指令用于程序存储器送数到累加器A,是一种查表指令。这种指令只有两条,采用变址寻址的方式,以PC或DPTR作为基址寄存器,以A作为变址寄存器,基址寄存器与变址寄存器内容相加得到程序存储器单元的地址。⒉数据交换操作完成的是累加器A与选定的工作寄存器、片内RAM中的寄存器间接寻址字节、片内RAM或SFR的一个直接寻址字节间交换数据,操作码为XCH;XCHD完成的是A低4位与片内RAM某单元字节的低4位交换数据;SWAP完成的是累加器A的高低4位的交换。数据交换图示:寄存器R7~R0直接地址

direct累加器A寄存器间址

@R1、@R04低半字节⒊栈操作指令也完成数据传送的功能,栈区设在内部RAM中。但是在置栈指针前,必须估计一下栈区的深度,然后才可利用SP间接寻址执行数据压入或弹出的操作。3.3.1通用传送指令操作码助记符:MOV格式:MOV<目的字节>,<源字节>功能:传送字节变量。(目的字节)←(源字节),传送结束后,源字节内容不变,且不影响标志位。说明:把第二字节操作数指定的字节变量传送到由第一操作数指定的单元中,不影响源字节,不影响任何别的寄存器或标志。允许15种源和目的寻址方式组合。操作数可能的组合关系:Direct(直接地址)@Ri(间接寻址)A(累加器)Rn(寄存器)#data(立即数)⒈立即数送累加器A和内部数据存储器(Rn,内部RAM,SFR)⑴MOVA,#data ;(A)←#data,即立即数送A代码:01110100 ;74H立即数说明:代码的第二字节为立即数,与操作码一起放在程序存储器中;执行指令时与操作码一起取到CPU中。⑵MOVdirect,#data ;(direct)←#data

代码:01110101 ;75H

直接地址 立即数功能:立即数送内部数据存储器或SFR,直接寻址。说明:代码的第二字节为直接地址,第三字节为立即数,在指令执行时,与操作码一起从ROM中取入CPU中。⑶MOV@Ri,#data ;((Ri))←#data

代码:0111011i ;76H~77H,i=0,1

立即数功能:立即数送内部数据存储器,寄存器间接寻址。说明:Ri在内部数据存储器中的地址由PSW的RS1、RS0确定。可访问内部数据存储器的低128个单元。⑷MOVRn,#data ;(Rn)←#data,n=0~7代码:01111rrr ;78H~7FH

立即数功能:立即数送工作寄存器,寄存器寻址。说明:Rn在内部数据存储器中的地址由PSW的RS1、RS0确定。可访问内部数据存储器的00H~1FH单元。例3-1:MOV@R0,#data,设(R0)=20H,则指令的执行过程如下:000000RS1RS0PSW01110110#dataROM0010000020HR0内部RAM形成8位地址②③④①①PC→PC→PC→#data例3-2:利用直接寻址可把立即数送入片内数据RAM任一单元或SFR中任一寄存器,而用寄存器间接寻址需用两条,如:MOV 20H,#data等价于:MOV R0,#20HMOV @R0,#data

⒉内部数据存储器(Rn,内部RAM,SFR)与A传送数据⑴内部RAM或SFR内容送AMOVA,direct ;(A)←(direct)代码:11100101 ;E5H

直接地址功能:直接寻址单元内容送累加器A说明:代码的第二字节为直接地址,可指向SFR及内部RAM(0~127单元)。⑵内部RAM内容送AMOVA,@Ri ;(A)←((Ri)),i=0,1代码:1110011i ;E6H~E7H⑶工作寄存器内容送AMOVA,Rn ;(A)←(Rn),n=0~7代码:11101rrr ;E8H~EFH⑷累加器A内容送内部RAM或SFRMOVdirect,A ;(direct)←(A)代码:11110101 ;F5Hdirect⑸A内容送内部RAMMOV@Ri,A ;((Ri))←(A)代码:1111011i ;F6H~F7H⑹A内容送工作寄存器MOVRn,A ;(Rn)←(A)代码:11111rrr ;F8H~FFH注意:寄存器间接寻址@Ri是以Ri的内容作为地址进行寻址,由于Ri为八位寄存器,其寻址范围可为0~255。但由于SFR只能被直接寻址,且在SFR中很多单元又未定义(51系列),对这些未定义的单元读写,将得到不确定的值,写入的数据也将被丢失。所以,寄存器间接寻址的真正作用范围实际上只有128(0~127)个单元。例如指令序列 MOV R1,#82H ;82H=130 MOV A,R1

表面上看起来符合MCS-51的指令形式,实际上是不正确的。因为82H是SFR块中的DPL的地址,对SFR块来说,这种间接寻址无效。所以欲从DPL取数据到A,必须用直接寻址方式。MOVA,82H或写为:MOVA,DPL执行后A中的内容就是DPL中的值⒊内部数据存储器中的Rn、SFR和片内数据RAM之间的数据传送⑴内部RAM或SFR间的直接传送:三字节指令MOVdirect2,direct1 ;(dircet2)←(direct1)说明:代码的第二功能、第三字节分别为源操作数和目的操作数的绝对地址。该指令的功能很强,能实现内部RAM间、SFR间及SFR与内部RAM之间的直接数据传送。注意:在把指令编译成代码时,其它的指令都是:操作码、目的字节、源字节的格式,而MOVdirect2,direct1的代码是:操作码、源字节、目的字节。代码:10000101 ;85H direct1 direct2⑵内部RAM内容送内部RAM或SFRMOVdirect,@Ri ;(direct)←((Ri))代码:1000011i ;86H或87Hdirect⑶工作寄存器内容送内部RAM或SFR:二字节指令MOVdirect,Rn ;(direct)←(Rn)代码:10001rrr ;88H~8FH

dircet

⑸内部RAM或SFR内容送Rn

MOVRn,direct ;(Rn)←(direct)代码:10101rrr ;A8H~AFH direct⑷内部RAM或SFR内容送RAM:二字节指令MOV@Ri,dircet ;((Ri))←(direct)代码:1010011i ;A6H或A7H direct例3-3:指令MOVP3,P1,指令执行后,把口1的内容送到口3输出,不必经累加器A中转。例3-4:若RS1=1,RS0=1,则选中第三组工作寄存器区MOV direct,R0等价于MOVdirect,18H例3-5:MOV 20H,#25H MOV 25H,#10H MOV P1,#0CAH执行后,(20H)=25H,(25H)=10H,(P1)=0CAHMOV R0,#20HMOV A,@R0MOV R1,AMOV B,@R1MOV @R1,P1MOV P3,P1执行后:(R0)=20H,(A)=25H,(R1)=25H,(B)=10H,(25H)=CAH,(P3)=CAH⒋目标地址传送:16位立即数送数据指针DPTR。MOVDPTR,#data16 ;(DPH)←#data15~#data8;(DPL)←#data7~#data0说明:这是整个指令系统中唯一的一条16位数据的传送指令,用来设置地址指针。如:MOVDPTR,#2003H;执行后,(DPH)=20H,(DPL)=03H。代码:10011000 ;90H #data15~8 #data7~0

3.3.2外部数据存储器(或外扩I/O口)与A传送指令操作码助记符:MOVX格式:MOVX<目的字节>,<源字节>功能:外部数据存储器或外部I/O口与A之间的数据传送。⒈外部数据存储器单元内容送累加器AMOVXA,@DPTR ;(A)←((DPTR))代码:11100000 ;E0H说明:指令执行时,P3.7引脚上输出RD有效信号,用作外部数据存储器的读选通信号。DPTR所包含的16位地址信息由P0、P2输出,选中单元的数据由P0口输入到累加器A。

⒉外部数据存储器单元内容送累加器AMOVXA,@Ri ;(A)←((Ri))代码:1110001i ;E2H,E3H说明:指令执行时,P3.7引脚上输出RD有效信号,用作外部数据存储器的读选通信号。P0口上分时输出由Ri指定的8位地址信息及输入该单元的数据内容。⒊累加器A内容送外部数据存储器MOVX

@DPTR,A ;((DPTR))←(A)代码:11110000 ;F0H说明:指令执行时,由P3.6引脚输出WR有效信号,用作外部数据存储器的写选通信号。DPTR所包含的16位地址信息由P0、P2输出,累加器A的内容由P0口输出,P0口作分时复用的地址、数据口。⒋累加器A内容送外部数据存储器MOVX@Ri,A ;((Ri))←(A)代码:1111001i F2H或F3H说明:指令执行时,由P3.6引脚输出WR有效信号,用作外部数据存储器的写选通信号。P0口上分时输出由Ri指定的8位地址信息及输出到该单元的数据内容。例3-6:设外部数据存储器(2030H)=2AH,(5DH)=88H,累加器(A)=0F8H,工作寄存器(R0)=5DH,数据指针(DPTR)=2030H。则执行如下指令时的结果为:MOVA,@DPTR ;(A)=2AHMOVA,@R0 ;(A)=88HMOV@DPTR,A ;(2030H)=F8HMOV@R0,A ;(5DH)=F8H3.3.3程序存储器向累加器A传送指令操作码助记符:MOVC格式:MOVCA,<源字节>⒈MOVCA,@A+PC ;(PC)←(PC)+1,(A)←((A)+(PC))代码:10000011 83H说明:指令首先将PC值修正为下一条指令的地址上,然后执行16位无符号数的加法操作,获得基址与变址之和。低八位相加产生进位时,直接加到高位,并不影响标志位。⒉MOVCA,@A+DPTR ;(A)←((A)+(DPTR))代码:10010011 93H这两条指令主要用于查表,就是完成从程序存储器读取数据的功能。但是由于MOVCA,@A+PC以PC作为基址寄存器,在CPU执行取完该指令操作码时,PC值会自动加1,指向下一条指令的第一个字节,这时PC中的值已经不是该指令所在单元的值,而是PC+1。因为A中的内容为8位无符号整数,这使得查表范围受到限制,只能在以PC当前值开始后的256个字节范围内。编程时还需进行偏移量的计算,计算公式为:偏移量=表首地址-(该指令所在地址+1)而MOVCA,@A+DPTR以DPTR作为基址寄存器,由于DPTR的内容可以通过赋值改变,从而使得这条指令的应用范围更为广泛,表格常数可以设置在64KB程序存储器的任何地址空间,而不必象MOVCA,@A+PC指令那样只能把表格常数只设在PC指针以下的256个单元中。缺点是在DPTR已经有别的用途时,在赋表首地址值之前,必须保护现场,执行完查表指令后再对DPTR予以恢复。例3-7、若要根据累加器A的内容找出由伪指令DB所定义的四个值中的一个。可用下列程序:ppqq: ADD A,#01Hppqq+2: MOVC A,@A+PCppqq+3: RETppqq+4:STAR: DB 66H,77H,88H,99H在这个程序中,第一条指令把A的内容加1,是为了能够根据A的内容找到相应的数据值。这是因为当MOVCA,@A+PC执行后,PC值已经是ppqq+3,而不是ppqq+4,即不是DB所定义的四个值的区域开始处。例3-8:试编制根据累加器A中的数(0~9)查其平方表的子程序。COUNT:PUSHDPH ;保护DPTR内容PUSHDPLMOVDPTR,#TABLE;赋表首址→DPTRMOVCA,@A+DPTR ;据A中内容查表POPDPL ;恢复DPTR原内容POPDPHRET ;返回主程序TABLE:DB00,01,04,09,16,25,DB36,49,64,813.3.4数据交换指令⒈字节交换指令⑴XCHA,direct ;(A)

(direct)

代码:10000101;85H⑵XCHA,@Ri ;(A)

((Ri))

代码:1100011i;C6H或C7H⑶XCHA,Rn ;(A)

(Rn)

代码:11001rrr;C8H~CFH上述指令把A中的内容与第二操作数所指定的单元(寄存器寻址、直接寻址和寄存器间接寻址单元)的内容互相交换。⒉半字节交换指令⑴XCHDA,@Ri ;(A3~0)

((Ri)3~0)代码:1101011i ;D6H或D7H⑵SWAPA ;(A3~0)

(A7~4)代码:11000100 ;C4说明:交换累加器A的高半字节与低半字节。例3-9:设(A)=57H,(20H)=68H,(R0)=30H,(30H)=39H则执行时:代码结果①XCHA,20H ;(A)=68H,(20H)=57H②XCHA,@R0 ;(A)=39H,(30H)=57H③XCHA,R0 ;(A)=30H,(R0)=57H④XCHDA,@R0;(A)=59H,(30H)=37H⑤SWAPA ;(A)=75H3.3.5栈操作指令⒈压栈操作:PUSHdirect代码:11000000 ;C0H直接地址操作:(SP)←(SP)+1((SP))←(direct)说明:指令执行后不影响标志位。⒉出栈操作:POPdirect代码:11010000 ;D0H

直接地址

操作:(direct)←((SP))(SP)←(SP)-1说明:一般说来,执行此指令后不影响标志位。若目标操作数为PSW,则有可能使一些标志改变,这也是通过指令修改标志的一种方法。PUSH和POP指令是两条逆传送指令,常被用于保护现场和恢复现场的程序中,使程序执行时方便、迅速。堆栈中的数据是以“先进后出”(FirstInLastOut)的方式处理的,由堆栈指针SP控制。在应用中要特别注意堆栈操作的这一特点。例3-10:PUSHDPL ;保护DPL内容PUSHDPH ;保护DPH内容PUSHPSW ;保护PSW内容PUSHACC ;保护累加器内容… ;执行服务程序POPACC ;恢复累加器内容POPPSW ;恢复PSW内容POPDPH ;恢复DPH内容POPDPL ;恢复DPL内容则DPTR、PSW、A中的内容能够正确恢复。若出栈时按如下操作:POPDPLPOPDPHPOPPSWPOPACC则DPTR、PSW、A中的内容不能正确恢复,使得程序执行混乱,执行情况不可预测。例3-11:设(SP)=2FH,(A)=3EH,则执行PUSHACC前后,堆栈内容如下。30H2FHSP←执行前内部RAM30H2FHSP←3EH执行后内部RAM3.4逻辑操作类指令逻辑操作类指令包括与、或、异或、清除、求反、左右移位等逻辑操作。按操作数情况可分为单操作数和双操作数两种。该类指令的操作数都是8位。单操作数是专门对累加器A进行的逻辑操作,这些操作包括:清0、求反、左右移位等,结果仍保存在累加器A中。双操作数指令主要是累加器A与第二操作数之间执行逻辑与、或和异或操作,第二操作数可以是立即数、工作寄存器、内部RAM单元、SFR。其对应的寻址方式是:寄存器寻址、寄存器间接寻址、直接寻址。逻辑操作的结果仍保存在累加器A中;也可将直接寻址单元作为第一操作数,和立即数、累加器A执行逻辑与、或、异或操作,结果仍保存在直接寻址单元中。寄存器R7~R0寄存器间址@R1@R0累加器A(ANL,ORL,XRL)直接direct(ANL,ORL,XOR)立即数#data功能操作码助记符操作数备注单操作数:清零取反循环左移带进位左移循环右移带进位右移CLRCPLRLRLCRRRRC

A

→A

表示某种运算"→"表示送到目的地址双操作数:与或异或ANLORLXRL3.4.1对累加器A进行的逻辑操作(单操作数指令)⒈对累加器A清0:CLRA ;(A)←0代码:11100100 ;E4H⒉累加器A内容求反:CPLA ;(A)←A代码:11110100 F4H说明:把累加器A内容求反后送入A中。不影响标志位。⒊累加器A左右移位RLA①累加器A内容循环左移:代码:00100011 23H操作:(An+1)←(An);n=0~6(A0)←(A7)RLACA7A0②累加器A内容连同进位标志C一起循环左移RLCA代码:00110011 ;33H操作:(An+1)←(An);n=0~6(A0)←(C)(C)←(A7)RLCACA7A0③累加器A内容循环右移RRA

代码:00000011 ;03H操作:(An)←(An+1);n=0~6(A7)←(A0)RRACA7A0④累加器A内容连同进位标志C一起循环右移RRCA代码:00010011 ;13H操作:(An)←(An+1);n=0~6(C)←(A0)(A7)←(C)RRCACYA7A0左右移位指令,左移一位相当于乘2,右移一位相当于除2。由于左右移位指令的这一特点,当一个数要乘/除2的倍数时,而且这个倍数不大(如2、4、8、16),并且移位后结果不溢出的情况下,用左右移位指令要比乘/除法指令执行的速度快。带进位位的移位可用于检查一个字节中的各位的状态,或用于逐位输出的情况。例3-12:8031的P2口中的P2.3~P2.6与译码器输入端连接如下图,欲使累加器A中的数送译码器,可编程如下(设最低位由P2.6输出):8031P2.6P2.5P2.4P2.3A0A1A2A3译码器OUTP2: RRCA MOVP2.6,C RRCA MOVP2.5,C RRCA MOVP2.4,C RRCA MOVP2.3,C RET

3.4.2双操作数指令⒈累加器A与立即数、内部RAM间的逻辑操作逻辑与、或、异或三种操作指令的格式和寻址方式都是一样的,放在一起介绍。这些指令的执行不影响标志位。例3-13:P1口中的P1.2,P1.3,P1.7位清0,其余位不变。ANLP1,#01110011B或ANLP1,#73H例3-14:选通用寄存器区0区作为工作区(PSW中的RS1,RS0)。

ANLPSW,#11100111B或ANLPSW,#0E7H例3-15:P1口中的P1.1、P1.4、P1.5置1。ORLP1,#00110010B或ANLP1,#32H例3-16:要求P1口中的0~4位受A中0~4位控制。ANLA,#00011111B ;屏蔽A7~5位ANLP1,#11100000B ;清P1.4~0位ORLP1,A ;按A4~0设P1.4~0例3-17:对内部RAM中78H单元的1,3,5,7位求反。MOVA,#0AAH ;10101010BXRL78H,AWhy?⒉直接地址单元(内部RAM,SFR)与累加器A、立即数间的逻辑操作说明:①当direct为第二操作数时,若direct为端口P0~P3,数据来自端口的锁存器;②当direct为第一操作数时、A为第二操作数时,若direct为端口P0~P3,在程序运行时用该指令可根据A的内容动态地修改输出口的内容,是一条“读→修改→写”指令。③当direct为第一操作数、立即数为第二操作数时,若direct为端口P0~P3,是一条“读→修改→写”指令。例3-18:设两位用ASCII码表示的数分别保存在40H、41H单元中,把其转换成两位BCD数据,并以压缩形式存入40H单元中。ANL40H,#0FH ;40H的ASCII码变为BCD码MOVA,41HANLA,#0FH ;41H的ASCII码变为BCD码SWAPAORL40H,A ;结果存入40H单元中3.5算术运算类指令算术运算类指令包括4种基本的算术操作指令,即加减乘除。这4种指令能对8位的无符号数进行直接的运算。借助于溢出标志,可对带符号数进行补码运算。借助于进位标志,可以实现多精度的加、减和环移。借助于辅助进位标志,可以进行BCD码调整。算术运算指令执行的结果将使进位CY、辅助进位AC、溢出OV三种标志置位或复位,但是加1或减1指令不影响这些标志位。算术运算类指令用到的助记符有ADD、ADDC、INC、DA、DEC、SUBB、MUL和DIV八种。影响标志的指令

指令助记符影响标志

COVAC指令助记符影响标志COVAC

ADD

XXX

CLRC

0

ADDC

XXX

CPLC

X

SUBB

XXX

ANLC,bit

X

MUL

0X

ANLC,/bit

X

DIV

0X

ORLC,bit

X

DA

X

ORLC,/bit

X

RRC

X

MOVC,bit

X

RLC

X

CJNE

X

SETBC

1

算术运算类指令功能操作码助记符操作数备注加带进位加带进位减ADDADDCSUBB

表示做某种运算乘除MULDIV

ABA

B积高字节在B,低字节在AA/B商在A,余数在B增量减量INCDECA,direct,@Ri,Rn,DPTRA,direct,@Ri,Rn不影响标志位二-十进制调整DAA

→ADA必须跟在加法指令后3.5.1加减运算指令加减运算中,以累加器A为第一操作数,并存放操作后的中间结果,第二操作数可以是立即数、工作寄存器内容、寄存器间接寻址或直接寻址字节。运算结果将影响PSW中的OV、C、AC及奇偶标志P。源操作数寻址方式为:寄存器寻址、直接寻址、间接寻址和立即数寻址四种。⒈加法指令①ADDA,#data ;(A)←(A)+data

代码:00100100 ;24H立即数②ADDA,direct ;(A)←(A)+(direct)代码:00100101 ;25Hdirect③ADDA,@Ri ;(A)←(A)+((Ri))代码:0010011i ;26H,27H④ADDA,Rn ;(A)←(A)+(Rn)代码:00101rrr 28H~2FH说明:这四条指令把源字节变量与A相加,结果仍存放在A中,并影响标志位C、AC、OV、P。相加过程中若位3向位4有进位,则辅助进位标志AC将置位,否则就复位;若位7有进位,则进位标志C将置位,否则就复位。对于无符号数相加时,若C置位,说明结果溢出(即大于255)。当位6和位7不同时有进位时,溢出标志OV将置位。利用OV可以判断带符号数相加时,和数是否溢出(即大于127或小于-128)。对于加法,溢出只能发生在两个加数符号相同时。如120与100之和为220,大于127,此时位6有进位而位7无进位。符号位(位7)由0变1,结果变负,实际上它成为和数的最高位,符号位移入进位标志。

011110000110010010011011+120100220例3-19: MOVA,#0C3H ADDA,#0AAH

1100001110101010101OV1CYAC10110110+0运算后,CY=1,OV=1,AC=0,(PSW)=85H,(A)=6DH,P=1若加数为负数,则结果为正溢出。若加数是正数,则不需判断OV。例3-20: MOVA,#54H ADDA,#27H运算后,CY=0,OV=0,AC=0,(PSW)=00H,(A)=7BH,P=0

0101010000100111000OV0CYAC11011110+0⒉带进位加法指令①ADDCA,#data ;(A)←(A)+data+(C)代码:00110100 ;34H立即数②ADDCA,direct ;(A)←(A)+(direct)+(C)代码:00110101 ;35Hdirect③ADDCA,@Ri ;(A)←(A)+((Ri))+(C)代码:0011011i ;36H,37H④ADDCA,Rn ;(A)←(A)+(Rn)+(C)代码:00111rrr ;38H~3FH这一组命令,除了运算时应考虑进位位外,其它与一般加法指令相同。当进位位C为0时,则带进位加法指令与不带进位加法指令结果相同。利用带进位加法指令可以进行多字节加法运算。例3-21:设双字节加法中,被加数放在20H、21H单元,加数放在30H、31H单元,和存放在40H、41H单元。若高字节相加有进位则转OVER处理。编程如下:ADD2:MOVA,20H ;取被加数低字节ADDA,30H ;低字节相加MOV40H,A ;结果送40H单元MOVA,21H ;取被加数高字节ADDCA,31H;加高字节和低位来的进位MOV41H,A ;结果送41H单元JCOVER ;有进位去OVER处处理RETOVER:…⒊带借位减法指令⑴SUBBA,#data ;(A)←(A)-data-(C)代码:10010100 ;94H

立即数⑵SUBBA,direct ;(A)←(A)-(direct)-(C)代码:10010101 ;95H direct⑶SUBBA,@Ri ;(A)←(A)-((Ri))-(C)代码:1001011i ;96H、97H⑷SUBBA,Rn ;(A)←(A)-(Rn)-(C)代码:10011rrr ;98H~9FH减法指令寻址方式、执行过程与加法指令类似。SUBB指令从累加器的内容中减去指定的一个字节和进位标志。够减时,进位标志(表示借位)复位,不够减时,发生借位,进位标志置位。当位3发生借位时,AC置位,否则AC复位。当位6及位7不同时发生借位时,OV置位,否则OV复位。OV置位表示发生了正数减去负数差为负,或者是发生了负数减去正数差为正的情况。①当运算的两个数为无符号数时,检测是否溢出只用进位标志CY就可判别,OV表明带符号数运算时是否有溢出。②由于减法只有带进位减指令,所以在单字节相减时,必须先清除进位标志CY。③利用SUBB指令,借助进位CY标志,可以实现多精度(也即多字节)减法。例3-22.两字节数相减。被减数存放在20H、21H单元中,减数放在30H、31H单元中,差存放在40H、41H单元中。若高字节有借位转OVER做相应处理。编程如下:SUB2:MOVA,20H ;被减数送ACLRC ;低字节减无借位,CY清0SUBBA,30H ;低字节相减MOV40H,A ;结果送40H单元MOVA,21H ;被减数高字节送ASUBBA,31H ;高字节相减MOV41H,A ;结果送41H单元JCOVER ;有借位转OVER处理RETOVER:…3.5.2乘除运算指令⒈乘法指令:MULAB ;(B7~0)(A7~0)←(A)*(B)代码:10100100 ;A4H实现8位无符号数的乘法操作,2个乘数分别放在累加器A和寄存器B中,乘积为16位,低8位放在A中,高8位放在B中。若积大于255,则溢出标志位置1,否则清0,进位标志总是清0。例3-23.设(A)=80H,(B)=32H执行MULAB后,积为1900H,(A)=00H,(B)=19H,(OV)=1,(CY)=0例3-24.利用MUL指令可进行多字节乘法运算。如两个双精度数相乘,可把被乘数(cd)和乘数(ef)分别表示为(cz+zd)和(ez+zf),c,d,e,f都是8位数,z表示8位0。则积为:(cz+zd)(ez+zf)=cezz+zcfz+zdez+zzdf,其中ce,cf,de,df为相应的2个8位数相乘,占16位,可用4次乘法指令求出。若把16位的数表示为:ceH,ceL,cfH,cfL,deH,deL,dfH,dfL,以H为后缀的是高八位、以L为后缀的为低八位。则积为:ceH

ceL

cfH

cfL

deH

deL+dfH

dfL按列求和,用3次8位数加法和3次带进位加法即得到积。编程如下:(R7R6)=被乘数(cd)(R5R4)=乘数(ef)(R0)=乘积的高位字节地址指针(R3R2)=部分积(R1)=进位位暂存单元MULI:MOVA,R6;zzdf

MOVB,R4MULABMOV@R0,A;存dfL

MOVR3,B;暂存dfH

MOVA,R4;zcfz

MOVB,R7MULABADDA,R3;dfH+cfL

MOVR3,AMOVA,BADDCA,#00HMOVR2,A;暂存cfH

MOVA,R6;zdez

MOVB,R5MULABADDA,R3;dfH+cfL+deL

INCR0MOV@R0,A;存dfH+cfL+deL

MOVR1,#0MOVA,R2ADDCA,B;deH+cfH

MOVR2,A;暂存deH+cfH

JNCLAST;无进位INCR1;置进位LAST:MOVA,R7;cezz

MOVB,R5MULABADDA,R2;ceL+cfH+deH

INCR0MOV@R0,A;存ceL+cfH+deH

MOVA,BADDCA,R1;ceH+进位INCR0MOV@R0,A;存ceH+进位RET⒉除法指令:DIVAB ;(A)←(A)/(B)的商;(B)←(A)/(B)的余数代码:10000100;84H;(C)←0,(OV)←0DIV实现8位无符号数除法,被除数放在A中,除数放在B中;指令执行后,商放在A中,余数放在B中;当除数为0时,执行后结果为不定值,OV=1表明除法溢出;指令的执行时间是四个机器周期,是MCS-51指令系统中执行时间最长的二条指令之一。例3-25.编写把A中的二进制数转换为3位BCD码数的子程序。其中百位数放在21H单元中,十位、个位放在20H单元中。编程如下:BINBCD:MOVB,#100 ;被除数送BDIVAB;得到百位数MOV21H,AMOVA,#10XCHA,BDIVAB;得到十位数和个位数SWAPAADDA,B;组成压缩的BCD码MOV20H,ARET3.5.3增量、减量指令⒈增量指令代码:00000100 ;04H⑴INCA ;(A)←(A)+1⑵INCdirect ;(direct)←(direct)+1代码:00000101 ;05H direct⑶INC@Ri ;((Ri))←((Ri))+1代码:0000011i ;06H、07H⑷INCRn ;(Rn)←(Rn)+1代码:00001rrr ;08H~0FH⑸INCDPTR ;(DPTR)←(DPTR)+1代码:10100011 ;A3HINC指令共使用3种寻址方式,即寄存器寻址、直接寻址和寄存器间接寻址。INC指令把所指定的变量加1,结果仍送回原地址单元,原来若为0FFH,加1后将变为00H。运算结果不影响任何标志位。用本组指令使端口P0~P3内容加1时,指令执行过程中,首先读入端口的内容,然后在CPU中加1,继而输出到端口。应注意的是:读入内容来自端口的锁存器,而不是端口的引脚。该类指令具有“读→修改→写”的功能。INCDPTR是16位数加1指令,按216取模。指令首先对低8位指针DPL的内容执行加1的操作,当产生溢出时,就对DPH的内容进行加1操作。例3-26.设R0的内容为7EH,内部RAM7EH及

温馨提示

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

评论

0/150

提交评论