第3章 MCS-51 的指令系统与汇编语言程序设计_第1页
第3章 MCS-51 的指令系统与汇编语言程序设计_第2页
第3章 MCS-51 的指令系统与汇编语言程序设计_第3页
第3章 MCS-51 的指令系统与汇编语言程序设计_第4页
第3章 MCS-51 的指令系统与汇编语言程序设计_第5页
已阅读5页,还剩131页未读 继续免费阅读

下载本文档

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

文档简介

第3章MCS-51的指令系统与汇编语言程序设计

【学习目标】掌握单片机的指令系统,熟悉指令功能、指令格式以及指令的寻址方式;理解汇编语言的特点以及与机器语言之间的区别和联系;掌握汇编语言程序设计的步骤、汇编语言程序的结构;熟练掌握汇编语言应用程序的开发

【例3.11】有一数据块存放起始地址为DATA1的片外RAM区,数据块以“0”为结束标志,要求将其传送到DATA2为起始地址的片内RAM区。编写程序如下:

MOVDPTR,#DATA1 ;设置片外RAM数据块地址指针MOVR0,#DATA2 ;设置片内RAM数据块地址指针LOOP:MOVXA,@DPTR ;取数JZENDO ;检测是否为0?为0,转ENDOMOV@R0,A ;不为0,传送INCDPTR ;修改地址指针INCR0AJMPLOOPENDO:SJMP $3.1MCS-51单片机指令系统概述1.指令的概念

指令是由CPU解释执行,用于控制功能部件完成某种指定操作的命令。由于CPU只能识别二进制数,所以计算机的指令均由二进制代码组成,通常把这样的指令称为机器指令。一般的计算机都有几十甚至上百条机器指令,这些指令就构成了计算机的指令系统。不同类型的CPU具有不同的指令系统。2.指令系统说明MCS-51的基本指令共111条:

每条指令在程序存储器ROM中占据一定的空间,以字节为单位。按指令所占的字节来分:

(1)单字节指令49条;

(2)双字节指令45条;

(3)三字节指令17条。每条指令在执行时要花去一定的时间,以机器周期为单位。按指令的执行时间来分:

(1)1个机器周期(12个时钟振荡周期)指令64条

(2)2个机器周期(24个时钟振荡周期)指令45条

(3)4个机器周期(48个时钟振荡周期)只有乘、除两条指令的执行时间。

12MHz晶振:机器周期为1s。按指令的功能分类,可分为5大类:

数据传送类(29条);算术运算类(24条)

逻辑运算及移位类(24);控制转移类(17条)

位操作类(17条)【例3.3】设片内RAM30H、31H和32H、33H分别存放两个16位无符号数,要求将两个数的和存入30H、31H(低位在前,高位在后)。程序如下: 【例3.3】设片内RAM30H、31H和32H、33H分别存放两个16位无符号数,要求将两个数的和存入30H、31H(低位在前,高位在后)。程序如下: MOVR0,#30H ;

设置第一个数地址指针 MOV R1,#32H ;

设置第二个数地址指针 MOVA,@R0 ;

取低位 ADDA,@R1 ;

两数低位相加 MOV @R0,A ;

存“和”的低位 INC R0 INC R1 MOV A,@R0 ;

取高位 ADDCA,@R1 ;

两数高位相加 MOV @R0,A ;

存“和”的高位 SJMP $【例3.11】有一数据块存放起始地址为DATA1的片外RAM区,数据块以“0”为结束标志,要求将其传送到DATA2为起始地址的片内RAM区。编写程序如下:

MOVDPTR,#DATA1 ;设置片外RAM数据块地址指针MOVR0,#DATA2 ;设置片内RAM数据块地址指针LOOP:MOVXA,@DPTR ;取数JZENDO ;检测是否为0?为0,转ENDOMOV@R0,A ;不为0,传送INCDPTR ;修改地址指针INCR0AJMPLOOPENDO:SJMP $例1、LED的控制

使用89C5l的Port1连接8个LED,以产生跑马灯的效果。连接好电路并且完成程序之后,您将可以看到8个LED依次轮流闪烁。在这次练习中,您将学会如何使用I/OPort输出数据,以及如何使用循环实现时间延迟。

电路图#include<REGX51.H>voiddelay(void)

/*delay函数*/{unsignedchari,j;/*这个函数执行时间的延迟*/for(i=0;i<255;i++)for(j=0;j<255;j++) ;}voidmain(void)

{unsignedcharj=0XFE;/*声明变量j,11111110*/while(1) /*无穷循环*/{/*依次让LED0,1,2,3,4,5,6,7闪烁*/ j=(j<<1)|0x01; if(j==0XFF)j=0XFE;P1=j;/*将数值输出到Port1,控制LED亮或灭*/delay();/*调用delay函数*/}}标号:操作码操作数;注释

指令格式

两部分组成,即操作码和操作数。

操作码:规定指令进行什么操作

操作数:指令操作的对象方括符[]表示可选项标号代表指令所在地址,1-8个字母/数字,“:”结尾[标号:]操作码[目的操作数][,源操作数][;注释]START:MOVA,#30H;将立即数30H传送至A中MOVDPTR,#5678H;将立即数5678H传送至DPTR⑴标号:指令的符号地址。

用于一段功能程序的识别标记或控制转移地址。

指令前的标号代表该指令的地址,是用符号表示的地址。

一般用英文字母和数字组成。标号必须用冒号“:”与操作码分隔。

⑵操作码:表示指令的操作功能。

操作码用助记符表示,它代表了指令的操作功能。

操作码是指令的必需部分,是指令的核心,不可缺少。START:MOVA,#30H;将立即数30H传送至A中MOVDPTR,#5678H;将立即数5678H传送至DPTR⑶操作数:参加操作的数据或数据地址。⑤操作数与操作码之间用空格分隔,操作数与 操作数之间用逗号“,”分隔。①操作数可以是数据,也可以是数据的地址、数据地址的地址或操作数的其他信息。②操作数可分为目的操作数和源操作数。③操作数可用二进制数、十进制数或十六进制 数表示。④操作数的个数可以是0~3个。⑷注释:指令功能说明。①注释属于非必需项,是为便于阅读, 对指令功能作的说明和注解。②注释必须以“;”开始。3.指令系统中的特殊符号1)Rn:选定当前寄存器区的寄存器R0~R7。2)@:间接寻址方式中,表示间址寄存器的符号。如@Ri,表示当前选中的工作寄存器组中可作为地址指针的两个工作寄存器R0和R1。3)#data:8位常数,即包含在指令中的8位常数。4)#data16:16位常数,即包含在指令中的16位常数。5)direct:8位片内RAM单元(包括SFR)的直接地址。6)addr11:11位目的地址,用于ACALL和AJMP指令中。目的地址必须放在与下一条指令第一个字节同一个2KB程序存储地址空间之内。7)addr16:16位目的地址,用于LCALL和LJMP指令中。目的地址范围在64KB程序存储器地址空间。8)rel:补码形式的8位地址偏移量,用于相对转移指令中。偏移量以下一条指令第一字节地址为基值,偏移范围为-128~+127。9)bit:片内RAM或特殊功能寄存器的直接寻址位地址。MOVDPTR,#5678HMOVR1,#32HMOVA,@R03.2指令系统的寻址方式寻址方式就是在指令中说明操作数所在地址的方法。共7种寻址方式。立即寻址直接寻址寄存器寻址寄存器间接寻址变址寻址(基址寄存器+变址寄存器间接寻址)相对寻址位寻址1.立即寻址方式指令的操作数是要参与运算的数,所以又叫立即数,用“#”号表示。立即数就是存放在程序存储器中的常数。例如:ADDA,#34H

把立即数34H与累加器A中内容相加,结果送A中。在MCS-51的指令系统中,仅有一条指令的操作数是16位的立即数,其功能是向地址指针DPTR传送16位的地址,即把立即数的高8位送入DPH,低8位送入DPL。例如:MOVDPTR,#3FA6H表示把16位二进制表示的地址送给DPTR寄存器。2.直接寻址方式

直接寻址方式是指操作数给出的是参与运算的数的地址。在MCS-51单片机中,直接地址只能用来表示特殊功能寄存器、内部数据存储器以及位地址空间。其中,特殊功能寄存器和位地址空间只能用直接寻址方式来访问。例如:MOVA,3AH

表示把内部RAM的3AH单元的内容传送到A。寻址范围:(1)内部RAM的128个单元 (2)特殊功能寄存器。除了以单元地址的形式外,还可用寄存器符号的形式给出。例如:

MOVA,80H与MOVA,P0是等价的。直接寻址是给出操作数的直接地址。3.寄存器寻址方式操作数在寄存器中

MOVA,Rn;(Rn)→A,n=0~7

表示把寄存器Rn的内容传送给累加器A寻址范围:(1)4组通用工作寄存区共32个工作寄存器。(2)部分特殊功能寄存器,例如A、B以及数据指针寄存器DPTR等。MOVA,R0;将R0中的数据传送至A中INCAMULAB【例】这些被寻址寄存器中的内容就是操作数4.寄存器间接寻址方式

寄存器中存放的是操作数的地址,在寄存器前加前缀标志“@”。访问内部RAM或外部RAM的低256个字节时,只能采用R0或R1作为间址寄存器。例如:

MOVA,@Ri;i=0或1

其中Ri中的内容为40H,把内部RAM40H单元内容送A。寻址范围:(1)访问内部RAM低128个单元,其通用形式为@Ri(2)对外部内部RAM的64K字节的间接寻址,例如: MOVXA,@DPTR(3)片外数据存储器的低256字节例如:MOVXA,@Ri(4)堆栈区堆栈操作指令PUSH(压栈)和POP(出栈)使用堆栈指针(SP)作间址寄存器5.基址寄存器加变址寄存器间址寻址方式以16位寄存器DPTR(或PC)作为基址寄存器,累加器作为变址寄存器。变址时,把两者的内容相加,得到的结果作为操作数的地址。这种方式常用于查表操作。例如:1)以程序计数器当前值为基址格式:MOVCA,@A+PC

2)以数据指针DPTR为基址格式:MOVCA,@A+DPTR

如:其中A的原有内容为05H,DPTR的内容为0400H,该指令执行的结果是把程序存储器0405H单元的内容传送给A。说明:(1)本寻址方式是专门针对程序存储器的寻址方式,寻址范围可达到64KB。(2)本寻址方式的指令只有3条:

MOVCA,@A+DPTR MOVCA,@A+PC JMP@A+DPTR6.相对寻址方式

在相对寻址的转移指令中,给出了地址偏移量,以“rel”表示,即把PC的当前值加上偏移量就构成了程序转移的目的地址:目的地址=转移指令所在的地址+转移指令的字节数+rel

偏移量rel是一带符号的8位二进制数补码数。范围是:–128~+127向地址增加方向最大可转移(127+转移指令字节)个单元地址,向地址减少方向最大可转移(128-转移指令字节)个单元地址。

注意:1)“当前PC值”指程序中下一条指令所在的首地址,是一个16位数;2)符号“rel”表示“偏移量”,是一个带符号的单字节数,范围是:-128~+127(80H~7FH)在实际编程中,“rel”通常用标号代替例:2000H:SJMP08H;在实际编程中,“rel”通常用标号代替例:SJMPLOOP1例:2000H:SJMP08H;原PC值为2000H;执行这条指令后的当前PC值为2002H,rel为08H。2002H+08H=200AH,转移目的地址为200AH,程序就跳转至200AH去执行了。右图为SJMP08H相对寻址示意图。;将位地址07H(字节地址20H中最高位)中的数据传送至进位位Cy。

7.位寻址方式位寻址是对内RAM和特殊功能寄存器中的可寻址位进行操作的寻址方式。指令中直接给出了操作数所在的位地址。例:CLRP1.0;(P1.0)←0SETBACC.7;(ACC.7)←1CPLC;(C)←NOT(C)MOVC,07H

注意:1)位地址里的数据只可能是一个0或12)有的位地址十分明确,如P1.0,ACC.7等,有的位地址则“不太明确”,如:MOVA,17H;(A)←(17H),17H是字节地址MOVACC.0,17H;(ACC.0)←(17H),这里ACC.0是位地址所以该指令中的17H是22H单元的第7位3.3MCS-51单片机指令系统

111条指令,按功能分类,可分为下面5大类:(1)数据传送类(29条)(2)算术操作类(24条(3)逻辑运算类(24条)(4)控制转移类(17条)(5)位操作类(17条)这5大类指令,基本实现单片机无所不能的功能!指令中符号的意义:Rn当前寄存器区的8个工作寄存器R0~R7(n=0~7)。Ri当前寄存器区中可作间接寻址寄存器的2个寄存器R0、R1(i=0,1)。Direct

直接地址,即8位的内部RAM或特殊功能寄存器的字节地址。#data

包含在指令中的8位立即数。#data16包含在指令中的16位立即数。rel相对转移指令中的偏移量,为8位的带符号补码数。DPTR

数据指针,可用作16位的数据地址寄存器。bit内部RAM或特殊功能寄存器中的直接寻址位。C(或Cy)进位标志位或位处理机中的累加器。addr11

11位目的地址addr16

16位目的地址@间接寻址寄存器前缀,如@Ri,@A+DPTR(X)

X中的内容。((X))由X寻址的单元中的内容。→箭头右边的内容被箭头左边的内容所取代。3.3.1数据传送类指令

使用最频繁的一类指令,通用格式:

MOV<目的操作数>,<源操作数>属“复制”,而不是“搬家”数据传送类指令不影响标志位:Cy、Ac和OV,影响奇偶标志位P。1.以累加器为目的操作数的指令 MOVA,#data;#data→(A) MOVA,Rn;(Rn)→(A),n=0~7 MOVA,@Ri;((Ri))→(A),i=0,1 MOVA,direct;(direct)→(A)例如:

MOVA,#0F5H;

立即数F5H→(A) MOVA,R5;(R5)→(A) MOVA,@R0;((R0))→(A) MOVA,30H;((30H))→(A)2.以Rn为目的操作数的指令

MOVRn,A;(A)→Rn,n=0~7 MOVRn,direct;(direct)→Rn,n=0~7MOVRn,#dat;#data→Rn,n=0~7功能:是把源操作数的内容送入当前一组工作寄存器区的R0~R7中的某一个寄存器。3.以直接地址为目的操作数的指令

MOVdirect,A ;(A)→directMOVdirect,Rn ;(Rn)→direct,n=0~7MOVdirect1,direct2 ; MOVdirect,@Ri ;((Ri))→direct MOVdirect,#data ;#data→direct功能:把源操作数送入直接地址指出的存储单元。direct指的是内部RAM或SFR的地址。4.以间接操作地址为目的操作数的指令

MOV@Ri,A;A→(Ri),i=0,1MOV@Ri,direct;(direct)→(Ri)MOV@Ri,#data;#data→(Ri)5.16位数目标地址传送指令

MOVDPTR,#data16;#data16→DPTR唯一的16位数据的传送指令,立即数的高8位送入DPH,立即数的低8位送入DPL。6.堆栈操作指令MCS-51内部RAM中可以设定一个后进先出(LIFO-LastInFirstOut)的区域称作堆栈.堆栈指针SP指出堆栈的栈顶位置。(1)进栈指令

PUSHdirect其功能是首先将堆栈指针SP的内容加1,指向空单元;然后将直接寻址单元中的数据压入到SP所指示的单元中,此时,SP的内容就是新的栈顶。(2)出栈指令

POPdirect其功能与PUSH的相反,即首先将栈顶SP所指示的单元内容弹出到直接寻址单元中,然后将SP的内容减1,此时SP指向新的栈顶。

例如,设SP=30H,(50H)=8FH,指令如下: PUSH50H ;SP+1→SP,(50H)→(31H) POP40H ;(31H)→(40H),SP-1→SP例如,设片内RAM(30H)=X,(40H)=Y,通过堆栈操作实现两单元内容互相交换,程序如下: MOVSP,#1FH PUSH30H PUSH40H POP30H POP40H 程序执行结果:(30H)=Y,(40H)=X。7.查表指令

共两条,用于读程序存储器中的数据表格的指令,均采用基址寄存器加变址寄存器间接寻址方式。

(1)MOVCA,@A+PC;;PC+1→PC,(A+PC)→A以PC作基址寄存器,A的内容作为无符号整数和PC中的内容(下一条指令的起始地址)相加后得到一个16位的地址,该地址指出的程序存储单元的内容送到累加器A。注意:PSEN*信号有效。例如:(A)=30H,执行地址1000H处的指令

1000H:MOVCA,@A+PC本指令占用一个字节,执行结果将程序存储器中1031H的内容送入A。优点:不改变特殊功能寄存器及PC的状态,根据A的内容就可以取出表格中的常数。缺点:表格只能存放在该条查表指令后面的256个单元之内,表格的大小受到限制,且表格只能被一段程序所利用。(2)MOVCA,@A+DPTR;;(A+DPTR)→A以DPTR作为基址寄存器,A的内容作为无符号数和DPTR的内容相加得到一个16位的地址,把由该地址指出的程序存储器单元的内容送到累加器A.例如:(DPTR)=8100H(A)=40H执行指令

MOVCA,@A+DPTR本指令的执行结果只和指针DPTR及累加器A的内容有关,与该指令存放的地址及常数表格存放的地址无关,因此表格的大小和位置可以在64K程序存储器中任意安排,一个表格可为各个程序块公用。两条指令是在MOV的后面加C,“C”是CODE的第一个字母,即代码的意思。【例】已知ROM中存有0~9的平方表,首地址为2000H,试根据累加器A中的数值查找对应的平方值,存入内RAM30H。(设A=3)

解:若用DPTR作为基址寄存器,可编程如下:1000H:MOVDPTR,#2000H;置ROM平方表首地址MOVCA,@A+DPTR;A+2000H=2003H(设A=3),;A=(2003H)=09HMOV30H,A ;平方值存入内RAM30H中 …………2000H:00H ;平方表:02=02001H:01H ;12=12002H:04H ;22=42003H:09H ;32=92004H:10H ;42=16,16=10H…………2009H:51H ;92=81,81=51H8.累加器A与外部数据存储器传送指令

MOVXA,@DPTR ;((DPTR))→A,读外部RAM/IOMOVXA,@Ri ;((Ri))→A,读外部RAM/IOMOVX@DPTR,A ;(A)→((DPTR)),写外部RAM/IOMOVX@Ri,A ;(A)→((Ri)),写外部RAM/IO功能:读外部RAM存储器或I/O中的一个字节,或把A中一个字节的数据写到外部RAM存储器或I/O中。

注意:伴随着RD*或WR*信号有效。采用DPTR间接寻址,高8位地址(DPH)由P2口输出,低8位地址(DPL)由P0口输出。采用Ri(i=0,1)间接寻址,可寻址片外RAM的256个单元。Ri内容由P0口输出。MOV后“X”表示单片机访问的是片外RAM存储器或I/O。内RAM(包括特殊功能寄存器):用MOV指令传送;外RAM:用MOVX指令传送;ROM:用MOVC指令传送。三个不同的存储空间用三种不同的指令传送:【例】按下列要求传送数据:设ROM(2000H)=ABH(1)ROM2000H单元数据送内RAM10H单元;(2)R0M2000H单元数据送外RAM80H单元;(3)ROM2000H单元数据送外RAM1000H单元;解(1):MOVDPTR,#2000H;置基址2000H,DPTR=2000H MOVA,#00H;置变址0,A=00H MOVCA,@A+DPTR;读ROM2000H,A=ABH MOV10H,A;存内RAM10H单元,(10H)=ABH解(2):MOVDPTR,#1FFFH;置基址1FFFH,DPTR=1FFFH MOVA,#01H;置变址01H,A=01H MOVCA,@A+DPTR;读ROM2000H,A=ABH NOVR0,#80H;置外RAM间址,R0=80H MOVX@R0,A;写外RAM80H,外RAM(80H)=ABH解(3):MOVDPTR,#2000H;置基址2000H,DPTR=2000H MOVA,#00H;置变址0,A=00H MOVCA,@A+DPTR;读ROM2000H,A=ABH MOVDPH,1OH;修改外RAM地址,DPTR=1000H MOVX@DPTR,A;写外RAM1000H,外RAM(1000H)=ABH9.交换指令(1)字节交换指令

XCHA,Rn XCHA,direct XCHA,@Ri例如,已知R0=15H,A=46H,(15H)=50H,执行指令XCHA,@R0程序执行的结果:A=50H, (15H)=46H。执行下列指令:

XCHA,R7;(A)与(R7)互换XCHA,40H;(A)与(40H)互换XCHA,@R0;(A)与((R0))互换(2)半字节交换指令

XCHDA,@Ri累加器的低4位与内部RAM低4位交换。例如:例如,已知R0=20H,A=5AH,片内RAM(20H)=46H,执行指令XCHDA,@R0程序执行结果:A=56H,(20H)=4AH。(3)累加器A的高4位与低4位内容互换指令SWAP A ;A.3~A.0A.7~A.4该指令的功能是,将A的高、低两个半字节相互交换3.3.2算术操作类指令

单字节的加、减、乘、除法指令,都是针对8位二进制无符号数。执行的结果对Cy、Ac、OV三种标志位有影响。但增1和减1指令不影响上述标志。1.加法指令,(不带Cy加法指令)(4条)ADDA,Rn;A+(Rn)→A,n=0~7ADDA,direct;A+(direct)→AADDA,@Ri;A+((Ri))→A,i=0,1

ADDA,#data;A+#data→A

一个加数总是来自累加器A,而另一个加数可由不同的寻址方式得到。结果总是放在A中。使用加法指令时,要注意累加器A中的运算结果对各个标志位的影响:(1)如果位7有进位,则置“1”进位标志Cy,否则清“0”Cy(2)如果位3有进位,置“1”辅助进位标志Ac,否则清“0”Ac(Ac为PSW寄存器中的一位)(3)如果位6有进位,而位7没有进位,或者位7有进位,而位6没有,则溢出标志位OV置“1”,否则OV清“0”。溢出标志位OV的状态,只有在带符号数加法运算时才有意义。当两个带符号数相加时,OV=1,表示加法运算超出了累加器A所能表示的带符号数的有效范围。例

(A)=53H,(R0)=FCH,执行指令

ADDA,R0结果:(A)=4FH,Cy=1,Ac=0,OV=0,P=1注意:上面的运算中,由于位6和位7同时有进位,所以标志位OV=0。例(A)=85H,(R0)=20H,(20H)=AFH,执行指令:

ADDA,@R0

结果:(A)=34H,Cy=1,Ac=1,OV=1,P=1注意:由于位7有进位,而位6无进位,所以标志位OV=1

2.带进位加法指令标志位Cy参加运算,因此是三个数相加。共4条:

ADDCA,Rn ;A+(Rn)+Cy→A,n=0~7ADDCA,direct ;A+(direct)+Cy→AADDCA,@Ri ;A+(Ri)+Cy→A,i=0,1 ADDCA,#data ;A+#data+Cy→A

例(A)=85H,(20H)=FFH,Cy=1,执行指令:

ADDCA,20H结果为:(A)=85H,Cy=1,Ac=1,OV=0,P=1(A中1的位数为奇数)3.增1指令

5条增1指令:

INCA INCRn;n=0~7 INCdirect INC@Ri;i=0,1 INCDPTR不影响PSW中的任何标志。第5条指令INCDPTR,是16位数增1指令。指令首先对低8位指针DPL的内容执行加1的操作,当产生溢出时,就对DPH的内容进行加1操作,并不影响标志Cy的状态。【例3.3】设片内RAM30H、31H和32H、33H分别存放两个16位无符号数,要求将两个数的和存入30H、31H(低位在前,高位在后)。程序如下: MOVR0,#30H ;

设置第一个数地址指针 MOV R1,#32H ;

设置第二个数地址指针 MOVA,@R0 ;

取低位 ADDA,@R1 ;

两数低位相加 MOV @R0,A ;

存“和”的低位 INC R0 INC R1 MOV A,@R0 ;

取高位 ADDCA,@R1 ;

两数高位相加 MOV @R0,A ;

存“和”的高位 SJMP $4.十进制调整指令用于对BCD码十进制数加法运算结果的内容修正。

指令格式:DAA两个BCD码按二进制相加之后,必须经本指令的调整才能得到正确的压缩BCD码的和数。(1)十进制调整问题二进制数的加法运算原则并不能适用于十进制数的加法运算,有时会产生错误结果。例如:(a)3+6=90011+0101=1001运算结果正确(b)7+8=150111+1000=1111运算结果不正确(c)9+8=171001+1000=00001C=1结果不正确二进制数加法指令不能完全适用于BCD码十进制数的加法运算,对结果作有条件的修正——十进制调整(2)出错原因和调整方法BCD码只用了了其中的10个,6个没用到的编码。(1010,1011,1100,1101,1110,1111)为无效码凡结果进入或者跳过无效码编码区时,其结果就是错误的。调整的方法是把结果加6调整,即所谓十进制调整修正。修正方法应是:(a)累加器低4位大于9或辅助进位位Ac=1,则进行低4位加6修正。(b)累加器高4位大于9或进位位Cy=1,则进行高4位加6修正。(c)累加器高4位为9,低4位大于9,则高4位和低4位分别加6修正。是否加6是通过执行指令:DAA来自动实现的。例(A)=56H,(R5)=67H,把它们看作为两个压缩的BCD数,进行BCD数的加法。执行指令:

ADDA,R5DAA由于高、低4位分别大于9,所以要分别加6进行十进制调整对结果进行修正。结果为:(A)=23H,Cy=1可见,56+67=123,结果是正确的。若(A)3~09或(AC)=1则(A)3~0(A)3~0+6;若(A)7~49或(CY)=1则(A)7~4(A)7~4+6;例:两个十进制数“65”与“58”相加,根据常识,显然其和应当为“123”。MOVA,#65HADDA,#58HDAA结果:(A)=23H(CY)=1指令“DAA”完成的操作:

65011001015801011000

+13181926601100110若(A)3~09或(AC)=1则(A)3~0(A)3~0+6;若(A)7~49或(CY)=1则(A)7~4(A)7~4+6;又如:两个十进制数“39”与“58”相加,根据常识,显然其和应当为“97”。MOVA,#39HADDA,#58HDAA结果:(A)=97H(CY)=0

39001110015801011000

+0723960110指令“DAA”完成的操作:5.带借位的减法指令

4条指令:SUBBA,Rn ;A-(Rn)-Cy→A,n=0~7SUBBA,direct;A-(direct)-Cy→ASUBBA,@Ri ;A-((Ri))-Cy→A,i=0,1SUBBA,#data;A-#data-Cy→A从累加器A中的内容减去指定的变量和进位标志Cy的值,结果存在累加器A中。如果位7需借位则置“1”Cy,否则清“0”Cy;如果位3需借位则置“1”Ac,否则清“0”Ac;如果位6需借位而位7不需要借位,或者位7需借位,位6不需借位,则置“1”溢出标志位OV,否则清“0”OV。例(A)=C9H,(R2)=54H,Cy=1,执行指令:SUBBA,R2

结果:(A)=74H,Cy=0,Ac=0,OV=1(位6向位7借位)6.减1指令 4条指令:

DECA DECRn DECdirect DEC@Ri ;((Ri))-1→(Ri),i=0,1 减1指令不影响标志位。例(A)=0FH,(R7)=19H,(30H)=00H,(R1)=40H,(40H)=0FFH,执行指令

DEC A DEC R7 DEC 30H DEC @R1

结果为

(A)=0EH,(R7)=18H,(30H)=0FFH,(40H)=0FEH,P=1,不影响其他标志7.乘法指令

MULAB;A×B→BA 如果积大于255,则置“1”溢出标志位OV例如,设A=39H,B=5AH,执行指令MULAB结果:A=0AH,B=14H,乘积是140AH,OV=1

8.除法指令

DIVAB;A/B→A(商),余数→B如果B的内容为“0”(即除数为“0”),则存放结果的A、B中的内容不定,并置“1”溢出标志位OV。例如,设A=E6H,B=1BH,执行指令:DIV AB结果:A=8H(商),B=0EH(余数)。1.逻辑与指令

ANLA,Rn ANLA,direct ANLA,@Ri ANLA,#data ANLdirect,A ANLdirect,#data

例(A)=07H,(R0)=0FDH,执行指令:

ANLA,R0结果:(A)=05H3.3.3逻辑运算类指令这类指令主要用于对8位二进制数进行逻辑运算,包括逻辑与、逻辑或、逻辑异或、取反、清零以及循环移位指令,共有24条指令。2.逻辑或指令

ORLA,Rn ORLA,direct ORLA,@Ri ORLA,#data ORLdirect,A ORLdirect,#data

例(P1)=05H,(A)=33H,执行指令

ORLP1,A 结果:(P1)=37H

3.逻辑异或指令

XRLA,Rn;A⊕Rn→A XRLA,direct;A⊕(direct)→A XRLA,@Ri;A⊕(Ri)→A,i=0,1 XRLA,#data;A⊕#data→A XRLdirect,A;(direct)⊕A→direct XRLdirect,#data;(direct)⊕data→direct

例(A)=90H,(R3)=73H执行指令:

XRLA,R3结果:(A)=E3H4.累加器A清零指令 CLR A;0→A这条指令的功能是将累加器A的内容清零。5.累加器A取反指令 CPL A以上指令的功能是将累加器A的内容逐位取反。6.累加器A循环移位指令 RL A ;

左循环移位指令 RR A ;

右循环移位指令 RLC A ;

带进位左循环移位指令 RRC A ;

带进位右循环移位指令 1.左环移指令

RLA功能是累加器A的8位向左循环移位,位7循环移入位0,不影响标志。2.带进位左环移指令

RLCA功能:将累加器A的内容和进位标志位Cy一起向左环移一位,Acc.7移入进位位Cy,Cy移入Acc.0,不影响其它标志。3.右环移指令

RRA功能是累加器A的内容向右环移一位,Acc.0移入Acc.7,不影响其它标志。4.带进位环移指令

RRCA功能:累加器A的内容和进位标志Cy一起向右环移一位,Acc.0进入Cy,Cy移入Acc.7。①循环左移:RLA②带Cy循环左移:RLCA

③循环右移:RRA

④带Cy循环右移:RRCA

3.3.4控制转移类指令控制转移类指令的功能是改变程序执行的方向,或调用子程序,或从子程序返回。这些都是通过改变程序计数器PC中的内容来实现的。这类指令可分为转移类指令、调用子程序及返回指令、空操作指令。1.转移类指令(1)无条件转移指令 LJMPaddr16;addr16→PC AJMPaddr11;PC+2→PC,addr11→PC.10~PC.0 JMP @A+DPTR;A+DPTR→PC SJMPrel ;PC+rel→PC1)LJMP为长转移指令LJMPaddr16;addr15~0→PC

它的功能是把转移地址addr16送入程序计数器PC,CPU无条件转移到addr16处执行程序。因为addr16是16位二进制数,因此,程序可转移到64KB范围的任何地址单元去执行。该指令转移范围大,为三字节指令。2)AJMP为绝对转移指令由于指令中只提供了低11位地址,所以程序只能转移到下一条指令开始的2KB范围内执行。 AJMPaddrll;PC+2→PC,addr10~0→PC10~0,PC15~11不变2K字节范围内的无条件跳转指令,64K程序存储器空间分为32个区,每区2K字节,转移的目标地址必须与AJMP下一条指令的地址的高5位地址码A15-A11相同。执行指令时,先PC加2,然后把addrll送入PC.10~PC.0,PC.15~PC.11保持不变,程序转移到目标地址。3)JMP@A+DPTR为变址寻址转移指令是单字节无条件转移指令。在指令执行前,应预先把目标转移地址的基地址送入DPTR,目标转移地址对基地址的偏移量放在累加器A中,在执行指令时,CPU把DPTR中的基地址和累加器A中的地址偏移量相加,形成目标转移地址送入程序计数器PC。例如,设累加器A中的内容为0~6的偶数,程序存储器中存放着标号为JMPTBL的转移表。执行下面程序,将根据A的内容转到相应的分支处理程序。

MOV DPTR,#JMPTBL JMP@A+DPTR ;单字节无条件转移指令JMPTBL:AJMPLABEL0 ;转LABEL0分支程序

AJMPLABEL1 ;转LABEL1分支程序

AJMPLABEL2 ;转LABEL2分支程序

AJMPLABEL3 ;转LABEL3分支程序4)SJMP为短转移指令是无条件相对转移指令,为两字节指令,指令的操作数是相对地址。该指令执行后,程序便转移到PC当前值与rel值之和所指示的地址单元,rel是一个单字节的带符号8位二进制补码数,所以它所能实现的程序转移是双向的。rel如为正,则向地址增大的方向转移;如rel为负,则向地址减小的方向转移。

SJMPrel;PC+2→PC,PC+rel→PC实现的程序转移是双向的。在编写程序时,直接写上要转向的目标地址标号就可以。例如:

LOOP: MOVA,R6

SJMPLOOP ┇程序在汇编时,由汇编程序自动计算和填入偏移量。手工汇编时,偏移量rel的值则需程序设计人员计算。 例如,HERE:SJMPHERE 或 SJMP$LJMP、AJMP、SJMP三条无条件转移指令的区别:①转移范围不一样。

LJMP转移范围是64KB;AJMP转移范围是与当前PC值同一2KB;SJMP转移范围是当前PC-128B~+127B。使用AJMP和SJMP指令应注意转移目标地址是否在转移范围内,若超出范围,程序将出错。②指令字节不一样。

LJMP是3字节指令;AJMP、SJMP是2字节指令。(2)条件转移指令 条件转移指令根据给定的条件进行检测,规定的条件满足,则进行转移,条件不满足则顺序执行下一条指令。当条件满足时,把PC装入下一条指令的第一个字节地址,再把带符号的相对偏移量rel加到PC上,计算出目标地址。 根据条件的不同,条件转移指令可分为以下四种指令:1)判0转移指令如下: JZrel ;如果累加器为“0”,则转移 JNZrel ;如果累加器非“0”,则转移【例3.11】有一数据块存放起始地址为DATA1的片外RAM区,数据块以“0”为结束标志,要求将其传送到DATA2为起始地址的片内RAM区。编写程序如下:

MOVDPTR,#DATA1 ;设置片外RAM数据块地址指针MOVR0,#DATA2 ;设置片内RAM数据块地址指针LOOP:MOVXA,@DPTR ;取数

JZENDO ;检测是否为0?为0,转ENDOMOV@R0,A ;不为0,传送INCDPTR ;修改地址指针INCR0AJMPLOOPENDO:SJMP $2)判Cy转移指令如下:

JC rel JNC rel以上两条指令是以PSW中进位标志Cy作为检测条件,根据Cy标志的情况来决定程序是否转移。JCrel和JNCrel指令执行过程如图3.2所示。图3.2JCrel和JNCrel指令执行过程Cy也是位(布尔)处理器的累加器,所以也可以作为位处理器Cy转移指令,用于控制程序转移。3)比较转移指令如下:

CJNEA,direct,rel CJNEA,#data,rel CJNERn,#data,rel CJNE@Ri,#data,rel比较前面两个操作数的大小,如果它们的值不相等则转移。如果第一操作数(无符号整数)小于第二操作数(无符号整数),则置“1”Cy,否则清“0”Cy。 MOV DPTR,#3000H ;置缓冲区地址指针 MOV R0,#20H ;置正数区地址指针 MOV R1,#30H ;置负数区地址指针NEXT: MOVX A,@DPTR ;取数

CJNE A,#0DH,COMP SJMP DONECOMP: JB ACC.7,LOOP ;为负数,则转LOOP MOV @R0,A ;为整数,送正数区 INC R0 INC DPTR SJMPNEXTLOOP: MOV @R1,A ;送负数 INC R1 INC DPTR SJMPNEXTDONE: SJMP$4)循环转移指令

减1不为0转移指令,是一组把减1与条件转移两种功能结合在一起的指令。共两条指令:

DJNZRn,rel ;n=0~7 DJNZdirect,rel将源操作数(Rn或direct)减1,结果回送到Rn寄存器或direct中去。如果结果不为0则转移。允许程序员把寄存器Rn或内部RAM的direct单元用作程序循环计数器。主要用于控制程序循环。以减1后是否为“0”作为转移条件,即可实现按次数控制循环。程序如下: ORG 0000H MOV R7,#32H ;循环次数送R7 MOV R1,#30H ;R1指向内部RAM30H单元处 MOV DPTR,#2000H;DPTR指向外部RAM2000H单元处LOOP: MOVX A,@DPTR;外部RAM内容送A MOV @R1,A;A送内部RAM INC DPTR;指向外部RAM的指针增1 INC R1 ;指向内部RAM的指针增1

DJNZ R7,

LOOP;修改循环次数,循环是否结束?未结束转去继续送数

SJMP $ ;循环结束,停止

END2.调用子程序及返回指令(1)调用子程序指令

LCALLaddr16 ACALLaddr11

在程序设计时,为了避免重复性的编程,通常需要把一些重复的操作或运算编成子程序独立出来以供调用。子程序执行完后,需要返回主程序原断口地址处(或返回地址)继续执行主程序,这一操作过程是通过子程序返回指令来实现的。LCALL指令执行步骤:①产生当前PC:PC+3→PC, (PC+3是因为该指令为三字节指令)②断口地址低8位保存到堆栈中: SP+1→SP,(PC)0~7→(SP)③断口地址高8位保存到堆栈中: SP+1→SP,(PC)8~15→(SP)

④形成转移目标地址:addr16→PCLCALLaddr16;PC+3→PC,SP+1→SP,(PC)0~7→(SP) ;SP+1→SP,(PC)8~15→(SP);addr16→PC长调用指令ACALL指令执行步骤:①产生当前PC:PC+2→PC, (PC+2是因为该指令为双字节指令)②断口地址低8位保存到堆栈中: SP+1→SP,(PC)0~7→(SP)③断口地址高8位保存到堆栈中: SP+1→SP,(PC)8~15→(SP)④形成转移目标地址:addr11→PC0~10,PC11~15不变短调用指令ACALLaddr11;PC+2→PC,SP+1→SP,(PC)0~7→(SP);SP+1→SP,(PC)8~15→(SP);addr0~10→PC0~10,PC11~15不变

(2)返回指令

RET RETI

RET指令是子程序返回指令。该指令的功能是将堆栈内的断口地址弹出送入PC,使CPU返回到原断口地址处,继续执行原程序。

RETI指令是中断返回指令。该指令除了执行RET指令的功能外,还清除内部相应的中断状态寄存器(该寄存器由CPU响应中断时置位)的内容。它只能用于中断服务程序,RETI与RET不能互换使用。。3.空操作指令

NOP

;PC+1→PCNOP为单机周指令,在时间上占用一个机器周期,常用于时间“微调”。

3.3.5位操作类指令在汇编语言中,位操作类指令共有17条,位地址的表示方法有以下几种:1)直接用位地址表示,如1FH。2)用点操作符号表示。点操作符(“.

”)的前面部分是字节地址或是可位寻址的专用寄存器,其后面部分的数字表示它们的位。如(D0H).4,PSW.4。3)寄存器的位定义名称。如RS1,OV。4)用户定义的位符号地址。如Bit1BITPSW.4 ,即将PSW.4定义为符号地址Bit1,经定义以后,允许在指令中使用Bit1代替PSW.4。

1.位数据传送指令

MOVC,bit MOVbit,C例MOVC,06H;(20H).6→Cy 06H是内部RAM20H字节位6的位地址。

MOVP1.0,C;Cy→P1.02.位状态修改指令

CLRC ;清“0”Cy CLRbit ;清“0”bit位 CPLC ;Cy求反 CPLbit ;bit位求反 SETBC ;置“1”Cy SETBbit ;置“1”bit位例:

CLRC ;0→Cy CLR27H ;0→(24H).7位 CPL08H ;(21H).0求反→(21H).0位 SETBP1.7 ;1→P1.7位3.位逻辑运算指令 ANLC,bit;bit∧Cy→Cy ANLC,/bit;;/bit∧Cy→Cy

ORLC,bit ORLC,/bit4.位条件转移指令

JCrel;如果进位位Cy=1,则转移 JNCrel;如果进位位Cy=0,则转移 JBbit,rel;如果直接寻址位=1,则转移 JNBbit,rel;如果直接寻址位=0,则转移 JBCbit,rel;如果直接寻址位=1, 则转移,并清0直接寻址位

【例3.12】已知片外RAM3000H单元为起始的一个数据缓冲区,以回车符(0DH)为结束标志,试编写程序把正负数分别送入片内RAM20H和30H开始的存储区。【例3.12】已知片外RAM3000H单元为起始的一个数据缓冲区,以回车符(0DH)为结束标志,试编写程序把正负数分别送入片内RAM20H和30H开始的存储区。 MOV DPTR,#3000H ;置缓冲区地址指针 MOV R0,#20H ;置正数区地址指针 MOV R1,#30H ;置负数区地址指针NEXT: MOVX A,@DPTR ;取数

CJNE A,#0DH,COMP SJMP DONECOMP: JB ACC.7,LOOP ;为负数,则转LOOP MOV @R0,A ;为整数,送正数区 INC R0 INC DPTR SJMPNEXTLOOP: MOV @R1,A ;送负数 INC R1 INC DPTR SJMPNEXTDONE: SJMP$小结:MCS-51指令集(五大类功能)数据传送类指令(29条)算术运算类指令(24条)逻辑运算及移位类指令(24条)控制转移类指令(17条)位操作(布尔操作)类指令(17条)内部存储器间传送:(MOV——16条)外部数据存储器RAM与累加器间传送:(MOVX——4条)程序存储器ROM向累加器传送:(MOVC——2条)数据交换:(XCH,XCHD,SWAP——5条)堆栈操作:(PUSH,POP——2条)(一)数据传送类指令(5种/29条)(二)算术运算类指令(6种/24条)加法运算(ADD——4条)带进位加法运算(ADDC——4条)带借位减法运算(SUBB——4条)加1/减1操作(INC,DEC——9条)单字节乘/除法运算(MUL,DIV——2条)十进制调整(DAA——1条)(三)逻辑运算及移位指令(5种/24条)逻辑与运算:(ANL——6条)逻辑或运算:(ORL——6条)逻辑异或运算:(XRL——6条)累加器清零/取反:(CLR,CPL——2条)累加器移位操作:(RL,RLC,RR,RRC—4条)(四)控制转移类指令(4种/17条)无条件转移:(LJMP,AJMP,SJMP,JMP——4条)条件转移(判断跳转):(JZ,JNZ,CJNE,DJNZ——8条)子程序调用及返回:(LCALL,ACALL,RET,RETI——4条)空操作:(NOP——1条)

(五)位操作类指令(4种17条)位传送:(MOV——2条)位清零/置位:(CLR,SETB——4条)位逻辑与/或/非运算:(ANL,ORL,CPL——6条)位条件转移:(JC,JNC,JB,JNB,JBC——5条)3.4MCS-51汇编语言程序设计汇编语言是面向机器硬件的语言,汇编语言程序设计是开发单片机应用系统软件的关键。要求程序设计者对89C51单片机具有很好的“软、硬结合”的功底。

本节着重介绍MCS-51单片机汇编语言及其程序设计的一些基本方法,并列举一些典型的汇编语言程序实例。3.4.1汇编语言程序设计概述程序是若干指令的有序集合,单片机的运行就是执行这一指令序列的过程,编写这一指令序列的过程称为程序设计。

用于程序设计的语言基本上分为3种:机器语言、汇编语言和高级语言。

1.机器语言

二进制代码表示的指令、数字和符号简称为机器语言不易懂,难记忆,易出错。2.汇编语言英文助记符表示的指令称为符号语言或汇编语言将汇编语言程序转换成为二进制代码表示的机器语言程序称为汇编程序经汇编程序“汇编(翻译)”得到的机器语言程序称为目标程序,原来的汇编语言程序称为源程序。汇编语言特点:指令容易理解、记忆,用汇编语言编写的程序可读性好。汇编语言指令与机器语言指令一一对应,用它编写的程序能最有效地利用存储空间。指令直接访问CPU的寄存器、存储单元和I/O端口,可以充分发挥CPU的功能,满足实时控制的要求。汇编语言是面向机器的语言,对使用者来说,必须对机器的硬件结构、指令系统都要熟悉,所以掌握起来不太容易。此外,汇编语言程序的通用性差,程序不能移植。汇编语言和机器语言都脱离不开具体机器的硬件,均是面向“机器”的语言,缺乏通用性。3.高级语言高级语言是以接近人的常用语言形式编写程序的语言总称,它是一种面向过程而独立于机器的通用语言。用高级语言编写程序与人们通常解题的步骤比较接近,而且不依赖于计算机的结构和指令系统。用高级语言编写的源程序,必须经编译程序或解释程序进行翻译生成目标程序,计算机才能执行。高级语言的特点是简单、易学、易懂,编程快,具有通用性,便于移植到不同机型。C语言和汇编语言混合编程

在很多需要直接控制硬件的应用场合,则更是非用汇编语言不可。使用汇编语言编程,是单片机程序设计的基本功之一3.4.2汇编语言语句和格式两种基本类型:指令性语句和指示性语句(伪指令)(1)指令性语句每一条指令语句在汇编时都产生一个指令代码——机器代码(2)指示性语句(伪指令)是为汇编服务的。在汇编时没有机器代码与之对应。

MCS-51的汇编语言的四分段格式如下:

标号:操作码字段操作数字段注释字段如START: MOV A,#20H ;20H→A规则:(1)标号字段和操作字码段之间要有冒号“:”相隔;(2)操作码字段和操作数字段间的分界符是空格;(3)双操作数之间用逗号相隔;(4)操作数字段和注释字段之间的分界符用分号“;”相隔。操作码字段为必选项,其余各段为任选项。

基本语法规则:(1)标号是语句所在地址的标志符号(1)标号后边必须跟以冒号“:”(2)由1-8个ASCII字符组成(3)同一标号在一个程序中只能定义一次(4)不能使用汇编语言已经定义的符号作为标号(2)操作码

是汇编语言指令中唯一不能空缺的部分。汇编程序就是根据这一字段来生成机器代码的。(3)操作数

操作数是指令操作码的操作对象,它是参加操作的数或是操作数据所在的地址。通常有单操作数、双操作数和无操作数三种情况。如果是双操作数,则操作数之间,要以逗号隔开。MCS-51单片机指令的操作数有三种类型的信息:立即数(8位或16位)、寄存器和地址。十六进制的操作数以字符A-F中的某个开头时,则需在它前面加一个“0”,以便在汇编时把它和字符A~F区别开来。工作寄存器和特殊功能寄存器的表示采用工作寄存器和特殊功能寄存器的代号来表示,也可用其地址来表示。例如,累加器可用A(或Acc)表示。也可用0E0H来表示,0E0H为累加器A的地址。美元符号$的使用用于表示该转移指令操作码所在的地址。例如,如下指令:

JNBF0,$与如下指令是等价的:

HERE:JNBF0,HERE

再如:

HERE:SJMPHERE可写为:

SJMP$(4)注释字段

必须以分号“;”开头,换行书写,但必须注意也要以分号“;”开头。汇编时,注释字段不会产生机器代码。伪指令伪指令是非执行指令,它只是在对源程序进行汇编的过程中起某些控制作用。例如,设置目标程序或数据存储区的起始地址,给程序分配一定的存储单元、定义符号,判断程序是否结束等。伪指令汇编后不产生目标代码,它不影响程序执行。所以“伪”体现在汇编时,伪指令没有相应的机器代码产生。常用的伪指令:

(1)ORG(ORiGin)汇编起始地址命令ORG用来设定程序或数据存储区的起始地址。它的格式如下: ORG 16位地址例如, ORG 2000H START: MOVA,#40H上例说明程序的起始地址是2000H,第一条指令就从2000H开始存放。在一个源程序中,可多次使用ORG指令,来规定不同的程序段的起始地址。但是,地址必须由小到大排列,地址不能交叉、重叠。例如:

ORG4000HTAB:DB73H,45,“A”,“2”TAB1:DB101B以上指令经汇编后,将对4000H开始的若干内存单元赋值。(4000H)=73H,(4001H):2DH(注:45的16进制数),

ORG 0000H LJMP MAIN

ORG 001BH LJMP INTT1

ORG 0100HMAIN:MOV SP,#60H;主程序入口,设堆栈指针 MOV R3,#100;置5ms计数循环初值 MOV TMOD,#00H;设定时器1为方式0 MOV TH1,#63H;置定时器初值 MOV TL1,#18H CLR P1.0 SETB EA;开中断 SETB ET1 SETB TR1 ;启动T1

SJMP $INTT1:MOV TH1,#63H;重新置定时器初值

MOV TL1,#18H DJNZ R3,LOOP1;未到500ms继续循环

CPL P1.0;500ms到,对P1.0输出求反

MOV R3,#100;恢复5ms计数循环初值LOOP1:RETI ;返回主程序

END(2)END(ENDofassembly)汇编终止命令END是汇编语言源程序结束的伪指令,表示源程序结束。在END以后所写的指令,汇编程序都不予处理。一个源程序只能有一个END指令,放在程序的末尾。(3)EQU赋值(或等值)指令它的作用是把操作数段中的地址或数据赋值给字符名称。经赋值后的字符名称,其值在整个程序中不改变,且可多次使用。它的格式如下:

字符名称EQU

温馨提示

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

评论

0/150

提交评论