微机原理课件-第4章.ppt_第1页
微机原理课件-第4章.ppt_第2页
微机原理课件-第4章.ppt_第3页
微机原理课件-第4章.ppt_第4页
微机原理课件-第4章.ppt_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

1、第四章汇编语言程序设计,用汇编语言编写的程序称为汇编语言源程序,将汇编语言源程序翻译成机器语言的系统程序称为汇编程序assembler,翻译的过程叫做汇编assemble。汇编程序有两种:ASM小汇编程序, MASM宏汇编程序。,2,汇编语言指令到机器指令的示意图,3,4.1.1 汇编语言源程序的结构,数据段名 SEGMENT 数据段名 ENDS 附加数据段名 SEGMENT 附加数据段名 ENDS 堆栈段名 SEGMENT 堆栈段名 ENDS 代码段名 SEGMENT 代码段名 ENDS END,每段以SEGMENT 语句开始,整个程序以END 语句结束,以ENDS 语句结束,下面举例来加以

2、说明:,这是一个两个字相加的程序 DSEG SEGMENT ;定义数据段 DATA1 DW 0F865H ;定义被加数 DATA2 DW 360CH ;定义加数 DSEG ENDS ;数据段结束 ESEG SEGMENT ;定义附加段 SUM DW 2 DUP(?) ;定义存放结果区 ESEG ENDS ;附加段结束,CSEG SEGMENT ;定义代码段 ASSUME CS:CSEG,DS:DSEG,ES:ESEG START: MOV AX,DSEG MOV DS,AX ;初始化DS MOV AX,ESEG MOV ES,AX ;初始化ES LEA SI,SUM ;存放结果的偏移地址送SI

3、 MOV AX,DATA1 ;取被加数 ADD AX,DATA2 ;两数相加 MOV ES:SI,AX ;和送附加段的SUM单元中 HLT CSEG ENDS ;代码段结束 END START ;源程序结束,6,总结:,1、标号域 语句中的标号是一个标示符,表示一条指令所在的存储单元的地址,或叫符号地址。 2、操作码域:所有指令的助记符、伪指令等都在操作码域。 3、操作数域:操作数以逗号间隔。操作数可以是常数、寄存器、标号、变量、表达式。 4、注释域:说明。 标号和操作码之间用冒号,或空格;操作码和操作数之间用空格;操作数和注释之间用分号。,7,4.1.2 汇编语言语句类型,语句类型:指令性语

4、句、指示性语句 指令性语句由指令组成、CPU可以执行; 指示性语句用来告诉编译程序MASM如何对源程序进行汇编,它不生成目标代码,不由CPU执行,所以常称为伪操作指令; 例如:START: MOV AX,DATA DATA DB 11H,12H,13H 区别:START是指令性语句的标号,它是指令的符号地址,后边通常加上“:”; DATA是指示性语句的名字,名字通常表示变量名、段名和过程名,后边不加“:”指示性语句中的操作数可以有多个,相互之间用逗号分开;,8,4.1.3 数据项及表达式,操作数可以是寄存器、存储器单元或数据项。存储器可以按字节、字、双字Double Word、四字Quad W

5、ord、十字节操作。而数据项又可以是常量、标号、变量或表达式。 1、常量:分为数字常数和字符串常数。 B:二进制 D:十进制,可以省略 H:十六进制(以字母开始的16进制数,要在前面加一个0) 字符串常数用单引号括起来,编译程序将其翻译成ASCII码。,9,2、标号Label 指令的标号由程序员确定: 不能与指令助记符或伪指令重名; 不允许由数字打头; 字符个数不超过31个; 标号代表存放一条指令的存储单元的地址; 标号可以作为程序转移、过程调用、循环控制等指令的操作数; 标号有三种属性:段、偏移量、类型 偏移量是一个16位的无符号数; 类型有两种:近过程属性NEAR(2字节)和远过程属性FA

6、R(4字节);,10,DELAY PROC PUSH BX PUSH CX MOV BL,2 NEXT:MOV CX,2801H W20ms:LOOP W20ms DEC BL JNZ NEXT POP CX POP BX RET DELAYENDP,11,3、变量Variable 变量是存储器中某个数据区的首地址,在指令中可以作为存储器操作数使用;变量也具有三种属性:段、偏移量、类型 段值:一般在DS或ES寄存器; 变量的类型:有BYTE、WORD、DWORD、QWORD、TBYTE; 常用数据类型伪指令DB、DW、DD、DQ、DT来定义。 例如:NUM DB 11H,22H,33H DAT

7、A2 DW 100H,200H,长度LENGTH:变量的个数。 大小SIZE:分配给同一变量名的所有 变量的总字节数。,变量名与标号名的区别: 变量名是变量的符号地址,标号是指令的符号地址。例如: MOV AX,VAR1 MOV BL,VAR2 JMP DONE DONE:ADD AL,5,13,4、表达式 表达式由常数、标号、变量、寄存器和运算符组成。表达式不是指令,本身不能执行。 表达式中的运算是在汇编时完成的,而不是在指令执行时完成的。 表达式常用运算符有: 算术运算符: +、-、*、/和MOD(取余数) 逻辑运算符: AND、OR、XOR、NOT 关系运算符:EQ(等于)、NE(不等于

8、)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于) 取值运算符:OFFSET、SEG 属性运算符:PTR 其他运算符: 、:,14,表达式中的运算符,1、算术运算符:+、-、*、/、求余(MOD)、它们运算的结果都取整数。 MOV AL,8+5 MOV AX,NUM+82 2、逻辑运算符 与AND、或OR、异或XOR、非NOT四种,逻辑运算符只能用于数值表达式,结果也是数值,不能用于地址表达式中。 例:AND AL,0ADH AND 0CCH 注意:逻辑运算符与逻辑运算指令在形式上相同,但是逻辑运算指令出现在指令码段,逻辑运算符出现在操作数段。,15,3、关系运算符 相等EQ、

9、不相等NE、小于LT、大于GT、小于等于LE、大于等于GE 例: MOV AX, 4 EQ 3 MOV AX, 4 NE 3 关系运算符可对两个性质相同的数据进行关系运算,这两个数据可以是数字,也可以是同一个段区域中的两个存储器地址。如果表达式成立,则运算结果为真TRUE,输出结果为全1;若表达式不成立,则表示结果为假FALSE,输出为全0。 汇编之后: MOV AX, 0 MOV AX, 0FFFFH,16,4、取值运算符和类型运算符 SEG、OFFSET又称为数值返回运算符,用以获取变量或标号的属性。 例: MOV AX,SEG BUFFER MOV AX,OFFSET BUFFER PT

10、R是类型运算符: CALL DWORD PTRBX MOV AL,BYTE PTRSI,17,4.2伪指令,伪指令由编译程序执行,不参与程序的运行;功能:定义数据、存储区分配、定义段、定义过程等。 常用的伪操作指令: 数据定义伪指令 符号定义伪指令 设定段寄存器伪指令 过程定义伪指令 宏命令伪指令 模块定义与连接伪指令,18,4.2.1 数据定义伪指令,数据定义伪指令用来定义一个变量,说明变量的类型,给变量分配存储空间,并赋初值。一般格式为: 变量名 伪操作助记符 操作数1 ,操作数2, 操作数可以是常数、字符或字符串、表达式、? 常用的数据定义伪操作有5种: DB: 定义字节类型的变量 如:

11、DELY1DB 11H,22H,33H,44H DELY2DBHELLO DATA1DB?,? DW:定义字类型的变量 DATA2DW100H,200H NUM DW 1005+88,DELY1,DELY2,19,DD:定义双字类型的变量 如:DATA3DD35F87123H DQ:定义四字类型的变量 DT:定义十字节类型的变量,每个操作数 为10个字节的压缩BCD码; SUM DQ 0011223344556677H 如果一个变量的操作数有多个,而且都一样; 可以使用重复操作符DUP 来定义: DATA1 DB 20 DUP(?) DATA2 DB 20 DUP(30),DATA3,SUM,

12、20,2、符号定义伪指令,符号定义伪指令EQU用于给一个表达式赋予一个名字; 指令格式:符号名 EQU 表达式 表达式可以是常数、符号、数值表达式、地址表达式、甚至是一个指令助记符。 例如:DATA EQU0DH COUNTEQUTHERE*2+1024 ADDREQUALPHABP+SI+5 注意:若表达式中有变量,则应在EQU命令前定义。,21,例如:XYZEQUCX LOADEQUMOV P8 EQUDS:BP+5 注意:1、不能重复定义同一个符号。 2、如果对表达式进行修改,则下面重复出现的符号名自动修改。 = 可以对一个符号重复定义: FACTOR=10H FACTOR=25H,22

13、,3、段定义伪指令,segment 和ends段定义伪指令,定义源程序中的逻辑段; 指令格式: 段名 SEGMENT 定位类型组合类型类别 段名 ENDS 定位类型:说明该段对起始地址的要求;有四种选择PARA, BYTE, WORD, PAGE PARA表示段必须从能被16整除的地址开始; 组合类型:在具有多个模块的程序中,它指示在汇编后进行连接时,该段是否和其它的段进行组合,如果一个程序不需要和其他程序组合,也可省略该项。 类别:用单引号扩起来的字符串。STACK, CODE, DATA具有相同类别的逻辑段装入连续的内存区;,23,stacksegmentpara stack stack

14、Stackends 该段是堆栈段,段名为stack;segment指明堆栈段开始;para说明该段必须从能被16整除的地址边界开始;stack指明组合类型;stack指明类别是堆栈类。 注意:同一个段的起始和结束必须是同一个标号名。,24,4.2.4 设定段寄存器的伪指令,该伪指令的一般格式为: ASSUME CS:CODE,DS:DATA,ES:EDATA,SS:STACK ASSUME伪指令说明用SEGMENT伪指令定义的段的段基址要放在那个段寄存器中;但是段基址装入段寄存器的操作必须由程序实现。,25,Code segment para public code assume cs:cod

15、e,ds:data,es:edata,ss:stack Begin: mov ax,data mov ds,ax mov ax,edata mov es,ax mov ax,stack movss, ax 该段程序没有给CS赋值,汇编后以浮动地址形式给出。,26,4.2.5 过程定义伪指令,过程也叫子程序,过程名就是子程序的名字,也是子程序入口的符号地址,过程由PROC开始,至ENDP结束。 PROC和ENDP之间的部分是过程体,过程体内至少要有一条返回指令RET,以便在过程调用结束后返回主程序。过程定义伪指令一般格式: NAME1 PROC FAR(NEAR) RET NAME1 ENDP

16、过程可以嵌套也可以递归;,27,例:编写一个20ms的延时子程序,DELAY PROC PUSH BX PUSH CX MOV BL,2 NEXT:MOV CX,2801H W20ms:LOOP W20ms DEC BL JNZ NEXT POP CX POP BX RET DELAYENDP,28,4.2.6宏命令伪指令,宏命令名MACRO 形式参数, ENDM 宏定义和过程定义类似,但宏定义结束符ENDM前不加宏命令名; 例如:DADD MARCO X,Y,Z MOV AX,X ADD AX,Y MOV Z,AX ENDM 在源程序中调用: DADD DATA1,DATA2,SUM,形式参

17、数,29,宏调用与过程的区别:,宏命令由宏汇编程序MASM在汇编过程中处理, MASM在每个宏调用处,都用其对应的宏定义体替换; 宏定义简化了源程序,但不能简化目标程序;不节省内存单元; 宏指令执行速度快;,30,例:求从TABLE开始的10个无符号数的和,结果放在SUM单元中; DATASEGMENT TABLEDB 12H,23H,34H,45H,56H DB 67H,78H,89H,9AH,0FDH SUMDW ? DATA ENDS STACK SEGMENT DW 50 DUP(?) TOPDW ? STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:

18、DATA,ES:DATA,SS:STACK,31,START:MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX LEA AX,TOP MOV SP,AX LEA SI,TABLE MOV CX,10 XOR AX,AX NEXT:ADD AL,SI ADC AH,0 INC SI LOOP NEXT MOV SUM,AX,32,MOV AH,4CH INT 21H CODEENDS END START,33,ORG程序起点伪指令,格式:ORG 表达式 说明程序段或数据区的开始地址,程序或数据从该单元开始存放,直到遇到一个新的ORG伪指

19、令。 汇编结束伪指令 格式:END标号 例如: ENDSTART ;源程序结束,程序从START ;处开始执行,34,4.3 系统功能调用,微机的操作系统中提供的功能调用有两种,一种叫高级调用;另一种称为BIOS功能调用,也叫低级调用; DOS功能调用都是利用软中断指令INT 21H来实现的, INT 21H包含了90多个子功能 ,包括:设备管理、目录管理、文件管理和其他功能,用户可以直接使用。 DOS操作系统将所有子功能顺序编号,从0057H。,35,DOS功能调用,DOS系统功能调用的方法如下: MOV AH ,功能号 在其它寄存器中放人该功能所要求的入口叁数; INT 21H 分析出口参

20、数。,36,1号功能:,系统扫描键盘,等待从键盘输入一个字符,将字符送入寄存器AL,不需要入口参数。如果输入的是CTRL+BREAK,则退出调用;否则将输入的字符存入AL。 MOV AH,1 INT 21H 功能号1、7、8,37,例4-8 从键盘输入一个“Y”或“N”字符。 KEY: MOV AH,1 ;有回显的键盘输人。功能号1送 (AH) INT 21H ;当按下键后,返回(AL)=字符的ASCII码 CMP AL,Y ;比较键人的是否是Y JZ YES ; 键入字符“Y”则转至Yes语句处 CMP AL,N ; 比较健人的是否是N JZ NOT ; 键人字符“N”则转至NOT语句处 J

21、MP KEY ;键入其他字符,转至KEY语句 处,继续等待键人 YES: NOT:,38,0A号功能:输入字符串,此功能要求用户指定一个键入缓冲区来存放输入的字符串,缓冲区起始偏移地址预置入DX寄存器。缓冲区结构如图,其中第一字节为用户定义的缓冲区长度,第二个字节为实际键入的字符数(不包括回车符),它由0A号功能自动填入;从第三个字节开始存放键入的字符; 若实际键入的字符数(包括回 车符)大于用户定义的缓冲区长度, 则喇叭会嘟嘟响;,DX,保存输入的字符,39,例49 从键盘上输入字符串HELLO,并在串尾 加结束标志$。 DATA SEGMENT STRING DB 10,0,10 DUP(

22、?) ;定义缓冲区 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX LEA DX,STRING MOV AH ,0AH ;功能号送AH INT 21H MOV CL,STRING+l ;实际键入的 XOR CH,CH ;字符个数送CL,STRING,40,ADD DX,2 ADD DX,CX ;得到字符串尾地址 MOV BX,DX MOV BYTE PTRBX,$ ;插入串结束符 MOV AH,4CH INT 21H CODE ENDS END START 2、显示器输出(2、6、9) 用2

23、号功能显示一个字符: MOV DL, MOV AH,2 INT 21H ,41,用6号功能显示一个字符: MOV DL, MOV AH,6 INT 21H 用9号功能显示一个字符串: 该功能要求被显示的字符串必须以“$”结束;如果希望光标能自动换行,则应在字符串结束前加上回车及换行的ASCII码0DH和0AH; MOV DX,OFFSET CHARS;字符串起始地址送DX MOV AH,09H ;字符串显示功能 INT 21H ;,42,3退回到DOS 为了能使程序正常退出并返回DOS,可使用DOS系统功能调用的4CH号功能。用4CH号功能返回DOS的程序段如下: MOV AH,4CH ;功能

24、号送AH INT 21H ;返回DOS,MOV AX, 4C00H INT 21H,43,8086/8088汇编语言程序设计,一、程序设计的基本步骤: 分析问题 确定算法 画程序流程图 为数据和程序代码分配内存单元和寄存器 编写源程序 汇编、调试与修改,44,二、汇编语言源程序基本设计方法,1、顺序程序设计 2、分支程序设计 3、循环程序设计 4、子程序设计 程序设计应尽量采用结构化、模块化的设计方法。将程序按功能划分成一个个独立的模块,每个模块进行独立的编辑和汇编,生成自己的源文件和目标文件,然后通过链接形成一个完整的可执行文件。,45,4.4.2 顺序程序,没有分支、没有循环、没有转移 例

25、4-11 对于三个8位无符号数86H、34H和21H,编写S=86H34H-21H的程序。,取被乘数,求乘积,取乘数,取第三个数作操作数,做减法,结果送指定处,46,结束,初始化,取被乘数,求乘积,取乘数,取第三个数作操作数,做减法,结果送指定处,NUM DB 86H,34H,21H RESULT DW ? SI作为数据区的指针; DI作为结果指针;,47,DATA SEGMENT NUM DB 86H,34H,21H ;定义源操作数 RESULT DW ? ;定义结果存放单元 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS: DATA START: MOV

26、AX,DATA MOV DS,AX LEA SI, NUM,48,LEA DI, RESULT MOV AL, SI MOV BL,SI+ 1 MUL BL ;求乘积 MOV BL,SI+2 ;取第三个数作操作数 MOV BH ,0 SUB AX, BX MOV DI, AX ;结果送RESULT MOV AH,4CH ;返回DOS INT 21H CODE ENDS END START,49,例412 内存自TABLE开始的连续16个单元中存放着015的平方值(称平方表),查表求DATA中任意数X(0X15)的平方值,并将结果放在RESULT中. DSEG SEGMENT TABLE DB

27、0,1,4,9,16,25,36, 49,64,81,100,121, 144,169,196,225 ;定义平方表 DATA DB ? RESULT DB ? ;定义结果存放单元 DSEG ENDS SSEG SEGMENT STACK STACK STA DW 100 DUP(?) ;定义堆栈空间 TOP EQU LENGTH STA SSEG ENDS,TABLE,BX,50,CSEG SEGMENT ASSUME CS:CSEG, DS:DSEG, SS:SSEG BEGIN: MOV AX,DSEG ;初始化数据段 MOV DS,AX MOV AX,SSEG ;初始化堆栈 MOV S

28、S,AX MOV SP,TOP;置堆栈指针 LEA BX,TABLE ;置数据指针 MOV AH,0 MOV AL,DATA ;取待查数 ADD BX,AX ;查表 MOV AL,BX MOV RESULT,AL;平方数存RESULT MOV AH,4CH INT 21H CSEG ENDS END BEGIN,51,4.4.3 分支程序设计,条件1成立?,条件2成立?,条件n成立?,Pn+1,Pn,P2,P1,Y,Y,Y,N,N,N,判定条件,P1,P2,Y,N,分支程序的基本结构,(a),(b),52,例4-13 编写程序,将数据区中以字节变量BUFFER为首地址的100个单元清零。 DA

29、TA SEGMENT BUFFER DB 100 DUP(?) COUNT DB 100 ;定义数据缓冲区长度 DATA ENDS STACK SEGMENT STACK DW 32 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX ;初始化数据段,53,MOV AX,STACK MOV SS,AX ;初始化堆栈段 MOVCL,COUNT ;置单元长度 MOV CH,0 LEA BX,BUFFER AGAIN:MOV BX,0 ;实现100个单元清零 INC B

30、X INC CH CMP CH,CL JB AGAIN;CHCL则转移 MOV AH,4CH INT 21H CODE ENDS END START,54,DATA SEGMENT BUFFER DB 100 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,100 ;置缓冲区长度 LEA BX,BUFFER AGAIN: MOV BX,0 INC BX LOOP AGAIN MOV AH,4CH INT 21H CODE ENDS END START,55,3、循环

31、程序设计,1、循环程序设计结构,初始化部分,工作部分,修改部分,循环结束?,结束部分,初始化部分,循环结束?,工作部分,修改部分,结束部分,先执行后判断,先判断后执行,56,例4-14 在数据段DATA1开始的80个连续的存储单元中,存放80位同学某门课程的考试成绩(0100)。编写程序统计成绩90分的人数,8089分的人数,7079分的人数,6069分以及60分的人数。将结果存放到DATA2开始的存储单元中。 DATA SEGMENT DATA1 DB 80 DUP(?) ;假定学生成绩已放入这80个单元中 DATA2 DB 5 DUP(0) ;统计结果的存放单元 DATA ENDS COD

32、E SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX,57,MOV CX,80 ;统计80个学生的成绩 LEA SI,DATA1 LEA DI,DATA2 AGAIN: MOV AL,SI CMP AL,90 ;与90比较 JC NEXT1 ;小于90分,转NEXT1 INC BYTE PTR DI ;否则90分以上的人数加1 JMP STO ;转循环控制处理 NEXT1: CMP AL,80 ;与80比较 JC NEXT2;小于80分,转NEXT2 INC BYTE PTRDI+1 ;否则80分以上的人数加1 JMP ST

33、O NEXT2: CMP AL,70 ;与70比较 JC NEXT3 ;小于70分,转NEXT3 INC BYTE PTR DI+2 ;否则70分以上的人数加1,58,JMP STO NEXT3: CMP AL,60 ;与60比较 JC NEXT4 ;小于60分,转NEXT4 INC BYTE PTR DI+3 ;否则60分以上的人数加1 JMP STO ;转循环控制处理 NEXT4 NEXT4: INC BYTE PTR DI+4 ;60分以下的人数加1 STO: INC SI ;指向下一个学生成绩 LOOP AGAIN ;循环,直到所有成绩都统计完 MOV AH,4CH ;返回DOS IN

34、T 21H CODE ENDS END START,例4-15 把从MEM单元开始的l00个16位无符号数按从大到小的顺序排列。,60,DSEG SEGMENT MEM DW l00 DUP(?) ;假定要排序的数已 DSEG ENDS ;存入这200个单元中 CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG START: MOV AX,DSEG MOV DS,AX LEA DI,MEM ;DI指向MEM的首址 MOV BL,99 ;外循环只需99次即可,;外循环体从此开始 NEXT1: MOV SI,DI ;SI指向当前要比较的数 MOV CL,BL ;CL为内循环计数

35、器,循环次数每次减l ;以下为内循环 NEXT2: MOV AX,SI ;取第一个数Ni ADD SI, 2 ;指向下一个数Nj, CMP AX,SI ;比较Ni 和Nj JNC NEXT3 ;若Ni 大于Nj ,则不交换 MOV DX,SI ;否则,交换Ni和Nj MOV SI-2,DX MOV SI,AX NEXT3: DEC CL ;内循环结束? JNZ NEXT2 ;若未结束,则继续 ;内循环到此结束,DEC BL ;外循环结束? JNZ NEXT1 ;若未结束,则继续 ;外循环体结束 MOV AX,4C00H ;返回DOS INT 21H CSEG ENDS END START,63

36、,例如4-21 两个多字节二进制数求和程序; DATA SEGMENT BUFF1DB 4FH,0B6H,7CH,34H,56H,1FH BUFF2DB 13H,24H,57H,68H,0FDH,9AH SUM DB 6 DUP(?) COUNT DB 3 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI, OFFSET BUFF1 MOV DI ,OFFSET BUFF2 MOV BX,OFFSET SUM,64,MOV CL,COUNT;初始化计数器 MOV CH,0 CLC;CF=0 GOON: MOV AX,SI ADC AX,DI INC SI INC

温馨提示

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

评论

0/150

提交评论