微机原理与接口技术第四章.ppt_第1页
微机原理与接口技术第四章.ppt_第2页
微机原理与接口技术第四章.ppt_第3页
微机原理与接口技术第四章.ppt_第4页
微机原理与接口技术第四章.ppt_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

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

文档简介

第四章 8086汇编语言程序设计,4.1 汇编语言的源程序 4.1.3 数据项及表达式(运算符) 4.2 8086汇编中的伪指令 4.2.5 过程定义和宏定义伪指令 4.3 DOS功能调用 4.4 汇编语言程序设计基础,源程序的编译程序,汇编程序,汇编语言源程序,机器语言目标程序,汇编源程序需翻译成机器语言,变成可执行文件,机器才能执行,这个翻译过程叫汇编。高级语言中称该过程为“解释”或“编译”。执行翻译的程序称为“汇编程序”。,41 汇编语言的源程序,汇编完成的任务(宏汇编),将汇编语言源程序翻译成机器语言 按照程序要求自动分配储存区; 自动把各种进制数据转化为二进制,并计算表达式; 对源程序检查语法错误。,汇编语言程序设计与执行过程,输入汇编语言源程序 源文件 .ASM 汇编(编译) 目标文件 .OBJ 链接 可执行文件 .EXE 调试 最终程序(.EXE .COM ),4.1.1 汇编语言源程序的结构,汇编语言源程序通常由一个或几个程序模块组成,每个模块一般由三个逻辑段组成: 数据段存放数据、变量 堆栈段堆栈区域 代码段存放程序指令,一个基本的汇编语言程序框架如下: stack SEGMENT PARA stack TOP DB 100 DUP(?) stack ENDS data SEGMENT CR EQU 0DH data ENDS code SEGMENT ASSUME CS:code, DS:data, SS:STACK start: MOV AX, data MOV DS, AX MOV AL, 4CH INT 21H code ENDS END start,堆栈段,数据段,代码段,4.1.2 8086汇编语言的语句,汇编语言由指令性语句和指示性语句组成 一、指令性语句格式 标号: 操作码 操作数1, 操作数2 ;注释 二、指示性语句格式 名字 指示符(伪指令) 表达式,指令性语句汇编时生成机器码;机器指令。 指示性语句汇编时不生成机器码。CPU不执行.它指出汇编程序应如何汇编。为指令。主要是定义语句,语句的构成元素: 标号指令的符号地址,用来代表指令在存储器中的地址。只能出现在指令性语句中,标号后应加上冒号。 名字变量、符号、段、过程的名字,用来代表它们在存储器中的地址。只能出现在指示性语句中,名字后不加冒号。 操作码/指示符8086助记符、伪指令 注释以分号开头,可放在指令后,也可单独一行。 注意注解的写法。要写指令(段)在程序中的作用,而不要写指令的操作。 例如:1)MOV CX,100 ;传送100到CX 2)MOV CX,100 ;循环计数器置初值 显然,第二种写法要比第一种写法要好。,操作数即指令的操作对象 对指令性语句0,1,2个 对指示性语句根据需要而定 操作数可以是:常数、寄存器、存储单元、标号、符号、变量、段、过程、宏、表达式 例如:DI+BX+10,CR,BUFF,DATA等,4.2 8086汇编中的伪指令,一、 符号定义语句 1、等值语句 格式:符号名 EQU 表达式 例: PORT EQU 1234 BUFF EQU PORT58 MEM EQU DS:BP20H COUNT EQU CX ABC EQU AAA,2、等号语句 (局部) 格式: NUM34 NUM341,用EQU定义的符号未清除前,不能重新定义;用”=”定义的符号可在任何时候进行重定义。 二者均不占用存储空间,仅是助记常量,二、变量定义语句 格式: 符号名 DB/DW/DD 表达式,功能:定义一变量,并为其分配一定数量的存储单元,变量的初值由表达式的值指定。在程序执行过程中可以更改。,注:在存放字变量时,低字节在前,高字节在后。,1、定义一组数据,例1: BUFF DW 1234H, 0ABCDH, 8EH DW 79DH, 7B6AH,汇编后的内存分配情况 如右图所示。,12H,CDH,ABH,8EH,00H,63H,F8H,6AH,7BH,34H,BUFF,1234H,0ABCDH,8EH,-79DH,7B6AH,2、定义一串字符 例2: STR DB WELCOM YOU ,注:在存放字符串时,存储的是字符的ASCII码。,注意下面两个定义的不同之处: DB AB ;41H在低字节,42H在高字节 DW AB ;42H在低字节,41H在高字节,3、定义保留存储单元 例3: SUM DW ? ,?,操作数?用来保留存储空间,但不存入数据.,SUM偏移地址开始,4个单元保留,4、复制操作 复制操作符DUP(Duplication)可预置重复的数值 例4: ALL_ZERO DB 0,0,0,0,0 用复制操作可改为: ALL_ZERO DB 5 DUP(0),RSV DW 8 DUP(30H),这两个伪指令总是成对出现,二者前面的段名应一致。SEGMENT说明了一个段的开始,ENDS说明了一个段的结束。,1、 段定义语句格式: 段名 SEGMENT 定位类型组合方式类别 段名 ENDS,三、段定义语句,SEGMENT语句后可以带有可选参数,用以规定逻辑段的其他一些属性。,1) 定位类型 说明如何确定逻辑段的边界。有四种: PARA(Paragraph): 逻辑段从一个节 (16个字节) 的边界开始。即段的起始地址应能被16整除, 或这说段起始物理地址应为0H。默认类型 BYTE : 逻辑段从字节边界开始,即段可以从任何地址开始。 WORD : 逻辑段从字边界开始。即段的起始地址必须是偶数。 PAGE : 逻辑段从页边界开始。256字节称为一页,故段的起始物理地址应为00H。,2) 组合方式 说明不同模块中同名段的组合方式。 NONE: 本段和其它段没有逻辑关系,缺省类型。 PUBLIC 此类型的同段名段汇编组合成一个逻辑段,公用一个段地址,运行时装入同一个物理段。 COMMON : 所有此类型的同段名段具有相同的起始地址(覆盖),共享相同的存储区域。 STACK : 专用于说明堆栈段,组合方式同PUBLIC AT : 按绝对地址定位,段地址就是表达式的值。,3) 类别(类别名) 用单引号括起来的字符串。所有同类别的段,连接时被安排在连续的存储区域中。 如:在模块1中有段定义: seg1 SEGMENT PARA STACK stack seg1 ENDS 在模块2中有段定义: seg2 SEGMENT PARA STACK stack seg2 ENDS 则连接时这两个段被安排在一起形成段组。,2、段假设语句,在代码段中,还必须明确段和段寄存器的关系,这由ASSUME语句来指定。如 ASSUME CS:code, DS:data, SS:stack 语句中的code和data为段名。 这个语句说明: 1. CS将指向名字为code的代码段 2. DS和SS将指向名字为data/stack的段,但要注意,ASSUME伪指令只是告知汇编程序有关段寄存器与段的关系,CPU不执行。故下面的语句 MOV AX,DATA MOV DS,AX 将段基址装入段寄存器。如果程序中用到堆栈段,则SS也需装入实际的初值。 代码段基地址不需要程序员装入CS寄存器,而由OS负责装入。 DS、ES、SS的设置必须通过指令性语句来完成。,3. 段基址装入(段赋值)代码段,4、 END伪指令(代码段结束)代码段,标记汇编源程序的结束,汇编到END停止汇编。其格式为: END 标号名 标号名是该程序第一个可执行程序的标号名。可以省略。多个模块时是主程序的标号名。 CODE SEGMENT START: MOV AX,DATA CODE ENDS END START,stack SEGMENT PARA stack DB 100 DUP(?) stack ENDS data SEGMENT CR EQU 0DH ; data ENDS code SEGMENT ASSUME CS:code, DS:data, SS:STACK start: MOV AX, data MOV DS, AX MOV AX,STACK MOV SS, AX MOV AL, 4CH INT 21H code ENDS END start,堆栈段,数据段,代码段,CMP AL,1BH JE EXIT CMP AL,61H ;AL和a比较 JB ND ;若ALz,则转移到ND SUB AL,20H ;将AL中的字符转换成大写 ND: * ;显示,这两个伪指令总是成对出现,二者前面的段名应一致。 三类段:代码(CS)、数据DS/ES、堆栈SS。一般汇编要求代码段和数据段,也可只代码段。 一般单模块,除堆栈段为STACK组合外,其他缺省 代码段包括段定义、段假设、段赋值、段结束。,4.3 DOS功能调用 P165,1DOS系统功能调用的一般步骤,DOS为磁盘操作系统(Disk Operating System)的简称。DOS提供了极为丰富的子程序,能够实现控制键盘、显示器、读写文件、串行通信等一系列功能。,1、磁盘管理 2、内存管理 3、系统输入/输出 共87个子程序,使用DOS系统功能调用的一般过程:见下图所示。,系统功能调用的方法,调用参数,(1)键盘输入 (1号调用),功能:等待从键盘输入一个字符并将输入字符的ASCII码送入寄存器AL中(出口参数),同时在显示器上显示该字符,碰到CTRL+Break则退出。,2常用DOS系统功能介绍,(3)显示单个字符 (2号调用),功能:将DL中的字符送显示器显示,若为CTRL+Break的ASCII码则退出。,(4) 显示字符串 (9号调用),功能:将当前数据区中以 $结尾的字符串送显示器显示。 若光标回车换行,需在$前加0DH(回车),0AH(换行),(5) 过程终止 (4CH号调用),格式: MOV AH,4CH INT 21H,功能:结束当前程序,返回调用它的程序,DOS/DEBUG。,汇编源程序模板 EXE,stack SEGMENT PARA STACK stack DB 50 DUP (?) stack ENDS data SEGMENT data ENDS code SEGMENT ASSUME CS:code, DS:data, SS:STACK start: MOV AX, data MOV DS, AX MOV AX,STACK MOV SS, AX MOV AL, 4CH INT 21H code ENDS END start,堆栈段,数据段,代码段,第四章 8086汇编语言程序设计,4.1 汇编语言的原程序 4.1.3 数据项及表达式(运算符) 4.2 8086汇编中的伪指令 4.2.5 过程定义和宏定义伪指令 4.3 DOS功能调用 4.4 汇编语言程序设计基础,4.1.3 数据项及表达式(运算符),一、常用运算符,用于数字表达式,例: MOV AX,4*1024 汇编后的形式为: MOV AX,4096 用于地址表达式,例: LEA SI,TAB+3,1、算术运算符 +、-、*、/,MOD,运算对象是常量、变量和标号;寄存器不能参与运算!,count equ $-array,逻辑运算符常用于常量表达式中。 例:MOV CL,36H AND 0FH 经汇编后:MOV CL,06H 注意,不要把逻辑运算符与逻辑运算指令混淆: 例:AND AX, 3FC0H AND 0FF00H 汇编后源操作数被翻译为:3F00H,所以上述指令与AND AX, 3F00H等价。,2、逻辑运算符 AND、OR、XOR、NOT,关系运算的结果是一个逻辑值:真或假 关系为真,结果为全1 关系为假,结果为全0 例:MOV AX,4 EQ 3 ;MOV AX,0 MOV AX,4 NE 3 ;MOV AX,0FFFFH,3、关系运算符EQ、NE、LT、GT、LE、GE,二、 其它操作符 4、分析操作符 1)SEG操作符 例: MOV AX , SEG BUFF 2)OFFSET操作符 例:MOV BX , OFFSET BUFF,注意,以下指令的异同: MOV BX, OFFSET BUFF LEA BX, BUFF OFFSET伪指令,汇编时求出; LEA指令直接由CPU执行。,变量和标号取地址 储存器操作数,5、综合运算符(合成操作符) 功能: 用于指定其后储存器操作数的类型。 1)PTR运算符,格式: PTR 类型BYTE, WORD, DWORD, NEAR, FAR 例:假设VAR定义字变量。 MOV AL,VAR MOV AL, BYTE PTR VAR,6、 ORG伪指令、地址计数器 $ (补充),ORG规定了段内的指令或数据存放的开始地址(偏移地址的初值),其格式为: ORG 表达式的值即为开始地址,从此地址起连续存放程序或数据。 例: ABC SEGMENT ORG 100H begin: ABC ENDS,汇编程序专门设置了一个表示当前位置的计数器,称地址计数器$。正常情况下,汇编程序每扫描一个字节,位置计数器的值便加1。,语句: ARRAY DW 1234H,5678H CONUT EQU $-ARRAY 含义:当前位置计数器的值$减去STACK代表的起始位置的值,8H,语句:JMP $ 含义:程序跳转到本条指令执行。延时。,代码转换,十六进制 ASC码 (输入/输出) 将AL中一位(16)十六进制数转换成ASC码,例4-20 例4-21,CMP AL, 0AH CMP AL,9 JB A1 JBE A2 ADD AL, 07 CMP AL,a A1: ADD AL, 30H JB A1 SUB AL,20H A1:SUB AL,7 A2:SUB AL,30H,LEA BX,TABLE MOV AH,0 MOV AL,DATA ;查表数据在AX ADD BX,AX ;形成表地址 MOV AL,BX ;查表 MOV RESULT AL ;保存结果,例4-15 P.172,MOV CX,5 NEXT: XOR SI,SI MOV DX,CX NEXT1: MOV AX,SI ;取第1个数 CMP AX,SI+2 ;和第2个数比较 JAE NEXT2 ;大于等于则不交换 XCHG SI,WORD PTRSI+2 ;交换 NEXT2: ADD SI,2 ;修改地址 DEC DX ;小循环次数 JNZ NEXT1 DEC CX ;大循环次数 JNZ NEXT ;大循环,例4-18 P.177,排序,汇编源程序模板COM,code SEGMENT ASSUME CS:code ORG 100H Main: JMP Start DATA DW 3,2,6,5,1,4 start: 。 。 。 。 。 MOV AL, 4CH INT 21H code ENDS END Main,段定位,数据定义,代码,第四章 8086汇编语言程序设计,4.1 汇编语言的原程序 4.1.3 数据项及表达式(运算符) 4.2 8086汇编中的伪指令 4.2.5 过程定义和宏定义伪指令(中断) 4.3 DOS功能调用 4.4 汇编语言程序设计基础,4、过程(子程序)调用和返回,过程(子程序) 一段具有特定功能的,供其它程序调用的公用程序。 特点 子程序执行结束后一般均要返回调用程序。 调用子程序时,断点地址:IP(CS)的内容被压入堆栈栈顶。从子程序返回时,栈顶的内容又被弹出到IP(CS)。自动运行。 优点 程序代码短,结构清晰,便于编程、调试、修改和阅读。,(1)4.2.5过程定义语句 p161,过程定义伪指令的格式为 过程名 PROC 类型 RET 过程名 ENDP 注意:PROC和ENDP必须成对出现。,过程的类型有两种: NEAR(缺省使用)表示段内调用 FAR表示段间调用,不明确参数和返回值,(2) 调用 CALL 指令P139,CALL指令完成调用子程序的功能。,CALL指令完成的操作:, 将程序的返回地址 (CALL的下一条指令地址)压入堆栈中保存。断点保护,自动执行。, 将目标的偏移地址IP。若为远调用则再将目标的段地址CS。寻址和JMP相同,指令格式: CALL 目标,如果是近调用,则堆栈中只保存返回地址的偏移地址;若是远调用,则还必须保存返回地址的段地址。,(3) RET n 指令,带参数返回指令。返回地址弹出后,它使SP值在正常返回之后的基础上再加上n (n为偶数)。这是为了丢弃原已压栈的一些参数。,在子程序中 (过程),最后一条指令必须是返回指令RET,它将堆栈中保存的返回地址自动弹出至CS和IP。,掌握以下几点: 断点保护通过调用CALL指令,返回RET指令自动执行。(断点保护,自动运行) 调用前要预先确定子程序中要使用哪些寄存器,并定义入口参数和出口参数。参数传递可利用寄存器、存储单元或堆栈(要用BP寻址)。 进入子程序后首先要保护主程序的运行状态,保护子程序使用的非参数寄存器(包括标志位) (称为保护现场),退出子程序前要恢复现场。(现场保护,手动运行),4.4.5 子程序设计 P178,例1: 二进制数(0-F)转换成ASCII(0-F)的子程序。 BIN2ASC PROC ;要转换的数在AL的低四位 ;转换结果仍在AL中 CMP AL, 0AH JB ASC1 ADD AL, 07 ASC1: ADD AL, 30H RET BIN2ASC ENDP 调用方法:(在主程序中) MOV AL, 0CH CALL BIN2ASC (AL中有0CH的ASCII码43H, C),PUSF,POPF,寄存器传递参数,例2:2位二进制数(0-F)转换成ASCII(0-F)的子程序。 A1 PROC ;要转换的数在AL中 ;转换结果仍在AX中 MOV AH,AL AND AL,0FH CMP AL, 0AH JB ASC1 ADD AL, 07 ASC1: ADD AL, 30H MOV CL,4 SHR AH CMP AH, 0AH JB ASC2 ADD AH, 07 ASC2: ADD AH, 30H RET A1 ENDP,PUSH CX,POP CX,寄存器传递参数,例3:显示字型变量SUM1中的4位十六进制数字,POP CX作用,寄存器传递参数 堆栈传递参数?,mov cx,sum1 A1: mov al,ch Call A1 mov dl,ah mov ah,2 int 21h mov dl,al mov ah,2 int 21h mov ch,cl loop A1,例4:利用子程序调用实现数组的累加求和 (实验6),data segment ary1 db 1,2,3,4,5,6 cc1 equ $-ary1 sum1 dw ? data ends,mov cx,cc1 push cx lea ax,ary1 push ax call sum,调用方法:(在主程序中近调用),寄存器资源有限!,堆栈传递参数,sum proc near mov bp,sp pushf mov cx,bp+10 mov bx,bp+8 xor ax,ax a1: add al,bx adc ah,0 inc bx loop a1 mov bx,ax ret 4 sum endp,push ax push bx push cx,popf pop cx pop bx pop ax,内存泄漏,参数传递一般有两种常用方法: 利用寄存器。这是一种最常见方法,把所需传递的参数直接放在主程序的寄存器中传递给子程序。 利用堆栈。主程序将参数压入堆栈,子程序运行时则从堆栈中取参数。,断点保护:隐含。有远近调用之分;自动执行。 现场保护:明确参数传递,保护相关子程序使用的非参数寄存器(包括标志位)。 难点:理解堆栈(BP寻址)。计算机原理,4.2.6 宏定义伪指令 P162,如果需要多次使用同一个程序段,可以将这个程序段定义为一个”宏指令”,然后在需要时,可简单地用宏指令名来代替这个程序段。,指令的格式为: MACRO 形参表 ENDM,汇编程序展开,例:两个之和的宏定义和宏调用。 宏定义为: DADD MACRO X,Y,Z PUSH AX MOV AX,X ADD AX,Y MOV Z,AX POP AX ENDM,X、Y、Z是形式参数。调用宏DADD时可写为 DADD Data1,Data2,Sum Data1,Data2,Sum是实际参数,由它们替换定义中的X、Y、Z。,宏调用与过程(子程序)调用都是一次定义,多次调用。它们之间的差别是: 执行形式:宏命令伪指令由宏汇编程序在汇编过理中进行处理(展开),而CALL、RET则是由CPU执行的指令。 执行速度:宏命令执行速度较快(因无调用转移,无需断点保护,但须进行现场保护),空间换取时间。 占用内存:宏指令简化了源程序,但不能简化目标程序,并不节省内存单元。 调用方便:用形式参数的方法调用,避免了子程序调用参数参数的麻烦。,5、中断指令和中断返回指令(P141),8086/8088 CPU在程序中允许安排一条中断指令来引起一个中断过程,这种中断叫内部中断,或叫软中断。被中断的指令地址处称为“断点”。有关中断的详细情况将在第六章讨论。 中断指令共有三条: (1)INT n 执行类型n的中断服务程序,N=0255 (2)IRET 从中断服务程序返回调用程序,INT 0INT 4 五种为专用中断,系统定义。(如INT 3)。一般用户不定义。 INT 5INT 31H 备用中断。(如INT 21H) INT 32INT 0FFH,用户可以使用。,0、除法溢出中断,INT n; 1、单步中断 2、NMl; 3、断点 4、溢出中断,(1) INT n,随机产生。,(2) 入口地址,格式: INT n 说明: n4 = 向量地址。该向量地址中的内容即为中断服务程序入口地址(段:偏移),入口地址也称为“中断向量”。,0000 : n4,XXH,XXH,YYH,YYH,中断服务程序入口的偏移地址(IP),中断服务程序入口的段地址(CS),中断类型码 n = 0255,内存,中断向量,中断入口地址表,将FLAGS压入堆栈;(自动部分现场保护) 将INT指令下一条指令的地址压栈(即把CS和IP的内容压栈);(自动断点保护) 取中断服务程序入口地址送入CS和IP。 和子程序段间调用类似 除了断点保护,还进行了部分现场保护(FR) 中断服务程序入口地址固定;而子程序的首地址需要定义分配 中断可能是随机产生的;子程序调用产生。,(3) 中断调用,用于从中断服务程序返回被中断的程序。IRET负责恢复断点(CS和IP)和恢复标志寄存器内容。 任何中断服务程序不管是外部中断引起的,还是内部中断引起的,最后都要用IRET返回。IRET指令执行的操作为: 栈顶内容弹出到IP 栈顶内容弹出到CS 栈顶内容弹出到FLAG,(4)中断返回指IRET,部分常用的 8086 指令,28原则,44汇编语言程序设计,常用的汇编语言程序框架: DATA SEGMENT ;定义数据段 VAL1 DB 12H , 8EH ;定义变量 DATA ENDS ;数据段结束 CODE SEGMENT ;定义代码段 ASSUME DS:DATA , CS: CODE ;段属性说明 START: MOV AX , DATA ;初始化DS MOV DS , AX MOV AX , 4C00H ;返回DOS INT 21H CODE ENDS ;代码段结束 END START ;源程序结束,一、汇编语言程序设计基本步骤 分析问题,确定模型 确定算法 绘制流程图程序结构 编写程序 检查和调试 二、汇编语言程序的基本结构,结构:顺序:4-15 查表 分支:4-17、实验3 循环:4-16、18、实验5 子程序:实验6 算法:代码转化:大小写 实验3 16进制ASC 其它实验 查表 4-15 排序:4-18、习题4-10、实验5 累加:实验 6 ,其它例题和习题,1、顺序结构,例如:内存自TABLE开始的连续16个单元中存放015的平方值,查表求Data中任意数X(0=X=15)的平方值,并将结果存在Result中。 P172例题4-15,2、分支结构,1)IFTHEN结构,程序结构: TEST/CMP Jx 标号 处理体 标号: 其他指令 ,例4-16,将数据区中以BUFFER为首地址的100个字节单元清零。,2)CASE结构,程序结构: TEST/CMP指令(测试条件1) Jx 标号1 ;不满足转标号1 处理体P1 JMP 标号n+1 标号1:TEST/CMP指令(测试条件2) Jx 标号2 ;不满足转标号2 处理体P2 JMP 标号n+1 标号2:TEST/CMP指令(测试条件3) Jx 标号3 ;不满足转标号3 处理体P3 JMP 标号n+1 标号3:TEST/CMP指令(测试条件4) 标号n+1:(公共出口),实验3 例题4-17,例:将键盘输入的健值放在AL中,如果是小写字母(a 61H z 7AH),则转换成大写显示,如果是Esc键则退出。 CMP AL,1BH JE EXIT CMP AL,61H ;AL和a比较 JBE ND ;若ALz,则转移到ND SUB AL,20H ;将AL中的字符转换成大写 ND: * ;显示,3、循环结构,1)DOUNTIL 结构 LOOP 标号.,2) DO WHILE 结构 Jx 和LOOP配合,实验5 例题4-18,例4-16,将数据区中以BUFFER为首地址的100个字节单元清零。,例4-3:内存BLOCK中有一字符串,统计%前字符的个数。 BLOCK DB ANDEPO139%WR COUNT EQU $-BLOCK,LEA SI,BLOCK MOV CX,COUNT LOP MOV AL,

温馨提示

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

评论

0/150

提交评论