《微机原理与接口技术》课件-第4章微机原理与接口技术_第1页
《微机原理与接口技术》课件-第4章微机原理与接口技术_第2页
《微机原理与接口技术》课件-第4章微机原理与接口技术_第3页
《微机原理与接口技术》课件-第4章微机原理与接口技术_第4页
《微机原理与接口技术》课件-第4章微机原理与接口技术_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

1微机原理与接口技术2第四章汇编语言程序设计汇编语言程序格式伪指令语句DOS系统功能调用和BIOS中断调用程序设计方法宏汇编和条件汇编内容提要3计算机程序设计语言一般分为机器语言、汇编语言和高级语言三种。▲汇编语言(AssemblyLanguage)指令的助记符+符号地址+标号是机器语言的符号表示,是较低级的语言。▲高级语言:可读性好,编程简单;

▲汇编语言:实时性能好,程序效率高,节省内存,运行速度快。第四章宏汇编语言程序设计——概述

4.1概述4汇编程序的开发过程操作得到的文件

操作使用的工具

说明:编辑程序连接程序汇编程序文件XXX.ASMLINKASMMASMTASM记事本WPSWORDEDIT文件

XXX.OBJXXX.LSTXXX.CRF文件

XXX.EXEXXX.MAPXXX.LIBDEBUG出错出错出错出错.OBJ:目标文件,.LST:列表文件,.CRF:交叉引用文件.MAP:映像文件,LIB:库文件54.2汇编语言格式DATA SEGMENTSTRING DB ‘HELLOWORLD!’,0DH,0AH,‘$’DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATABEGIN: MOV AX,DATA

MOV DS,AX ;初始化数据段的段地址 MOV AH,09H LEA DX,STRING;输出字符串 INT 21H MOV AH,4CH INT 21H;调用4CH号系统功能返回DOSCODE ENDS END BEGIN数据段代码段一个简单的8086系统下的汇编语言程序:1、汇编语言程序是由若干个段组成,段由若干条语句组成。3、程序以END结束。64.2汇编语言格式语句是汇编语言程序的基本组成单位。汇编语言有3种基本语句类型:指令语句、伪指令语句和宏指令语句。指令语句由CPU执行,可产生机器代码,CPU根据这些代码才能执行相应的操作。伪指令语句由编译器处理,为编译和连接提供控制信息,不产生机器代码。宏指令语句以一个宏名定义的一段指令序列,在汇编中凡是出现宏指令语句的地方,都会有相应的指令语句序列的目标代码插入。74.2汇编语言格式指令语句

[标号:]指令助记符[操作数,操作数][;注释]例如:movcx,8;2操作数指令

s:nop;0操作数指令(nop空操作)loops;1操作数指令伪指令语句

[名字]伪指令助记符参数,参数…[;注释]例如:data1db0,1,2;数据定义伪指令DB,在内存中定义

;3个连续的字节单元,初值是0,1,2;data1表示第一个数据0的偏移地址84.3汇编语言的基本数据汇编语言程序的语句中包含的元素:字符集保留字与标识符常量、变量与标号表达式及运算符9一、字符集允许使用的字符:字母,包括大写字母A~Z和小写字母a~z;数字,包括0~9;特殊字符,包括:+-*/=()[]<>;,‘“.—:?@$&及空格、制表符、回车、换行等。注意:除了字符串,字母都是不区分大小写一系列相连的空格、制表符效果相当于一个空格一系列相连的回车换行相当于一次回车换行分号“;”后一直到行尾的内容都是注释字符“&”若用于某行的开头,则表示该行是上一行的续行10二、保留字与标识符1、保留字 在汇编语言中有特定意义的词,可分为:指令助记符及指令前缀

如:MOV、ADD、REP等寄存器名 如:AX、EBX、CL等伪指令助记符

如:DB、SEGMENT等其他保留字,包括运算符、操作符等 如:EQ、LT、OFFSET、SEG等112、标识符标识符是程序员自己起的名字,如变量名、标号、段名、过程名等标识符的命名规则:标识符必须由字母、数字和几个特殊字符(包括_@$?:)组成,而且第一个字符不能是数字(否则可能与16进制的数字混淆)标识符不能与某个保留字相同,以免混淆。尽量用有意义的英文单词或缩写来命名,以增加程序的可读性12三、常量、变量与标号1、常量数字常量二进制:以B结尾,如10101010B八进制:以Q结尾,如123Q,67Q十进制:以D结尾,“D”可省略,如1234D,5678十六进制:以H结尾,A~F开头的数须在前面加“0”

如:1234H,0FFFFH字符串常量用单引号或双引号引起来的一个或多个ASCII字符每个字符的值等于其ASCII码值例:‘A’=41H一个字节,‘12’=31H、32H两个字节132、变量变量是存放在存储器中的操作数可通过变量的名字来访问变量变量具有三个属性:段属性,即变量所在的段的基地址;偏移量属性,即变量相对于段的起始地址的偏移量;类型属性,包括BYTE(字节)、WORD(字)、DWORD(双字)FWORD(6字节)、QWORD(四字)、TBYTE(10字节)等。143、标号标号是一条指令性语句的起始地址变量具有三个属性:段属性,即变量所在的段的基地址;偏移量属性,即变量相对于段的起始地址的偏移量;类型属性,包括NEAR(近程,即段内)、FAR(远程,即段间)15四、表达式及运算符由常量、变量、标号和一些运算符、操作符构成的式子表达式的值在汇编的过程中就已经被汇编程序计算出来运算符的分类:算术运算符逻辑运算符关系运算符属性运算符数值返回操作符161、算术运算符五种算术运算: 加:+、减:-、乘:*、除:/、模:MOD合法地址表达式:地址-地址(处在同个段中);地址±常数ADDR1-ADDR2(假设两个地址处在同个段中)ADDR1+1ADDR2-2非法地址表达式:地址+地址;地址*地址;地址/地址;常量-地址;地址-地址(处在不同段中)ADDR1+ADDR2ADDR1*ADDR2ADDR1/2100-ADDR1SEG1_A-SEG2_B(假设两个地址处在不同段中)172、逻辑运算符五种算术运算:

与AND、或OR、异或XOR、非NOT、逻辑左移SHL、逻辑右移SHR

只用于数字表达式中例:MOVAL,10101010BAND11001100B;AL←10001000BMOVAL,10001000BOR01000100B;AL←11001100BMOVAX,1000100010001000BXOR1100110011001100B ;AX←0100010001000100BMOVAX,NOT1010101010101010B ;AX←0101010101010101B183、关系运算符六种关系运算符:EQ(Equal,相等)NE(NotEqual,不等)LT(LessThan,小于)LE(LessthanorEqual,小于或等于)GT(GreatThan,大于)GE(GreatthanorEqual,大于或等于)运算结果:关系为真,则运算结果为0FFFFH关系为假,则运算结果为0194、属性运算符(1)型重新指定操作符PTR功能: 临时指定或修改存储器操作数的数据类型属性或地址类型属性格式:类型PTR表达式例:VAR_WDW 1234HMOVAX,VAR_W;AX←1234HMOVAL,BYTEPTRVAR_W;AL←34H20(2)类型指定操作符THIS功能:指定或说明变量或标号的类型例1: DATA_WEQUTHISWORD DATA_BDB 1,2,3,4 MOV AL,DATA_B;AL←1 MOV AX,WORDPTRDATA_B;AL←0201H MOV AX,DATA_W;AL←0201H例2: ADDR_FEQUTHISFAR ADDR_N:MOVAX,1 JMPADDR_F;等价于:JMPFARPTRADDR_N215、数值返回操作符(1)SEG、OFFSET功能:SEG操作符用于求一个标号或变量所在段的基地址OFFSET操作符则用于求标号或变量在段中的地址偏移量例如,对于代码段中的一条指令:2000H:1234HADDR:INCCX;段地址=2000H偏移量=1234H则有:MOVAX,SEGADDR;AX←2000HMOVAX,OFFSETADDR;AX←1234H;与指令“LEAAX,ADDR”等价22(2)TYPE、LENTH、SIZE功能:TYPE:求变量的数值类型属性,即变量具有的字节数BYTE:返回1;WORD:返回2;DWORD:返回4;FWORD:返回6;QWORD:返回8,TBYTE:返回10;NEAR:返回0FFH;FAR:返回0FEHLENGTH:求变量所占用的内存单元数用于由重复操作符DUP()定义的存储器变量对于其他变量,LENGTH的返回值都是1SIZE:计算变量所占存储器的总字节数关系:

SIZE=LENGTH×TYPE23例: DATA1DW1234H DATA2DB‘HELLO’ DATA3DD100DUP(0);表示定义100个值为0的双字 MOVAL,TYPE DATA1 ;AL←2 MOVAL,TYPE DATA2 ;AL←1 MOVAL,TYPE DATA3 ;AL←4 MOVBL,LENGTHDATA1 ;BL←1 MOVBL,LENGTHDATA2 ;BL←1 MOVBL,LENGTHDATA3 ;BL←100 MOVCL,SIZE DATA1 ;CL←2×1=2 MOVCL,SIZE DATA2 ;CL←1×1=1 MOVCL,SIZE DATA3 ;CL←4×100=40024(3)字节分离运算符HIGH、LOW功能:HIGH:分离一个字常量或一个地址表达式的高字节LOW:分离一个字常量或一个地址表达式的低字节例:只能用于常量或结果为常量的表达式ADDR1: MOVAL,HIGH1234H ;AL←12H MOVAL,LOWADDR1 ;AL←上一指令 ;地址偏移量的低8位不能用于变量或寄存器MOVBL,HIGHAX256、运算符的优先级表达式计算顺序:先处理优先级别高的运算符对于优先级相等的运算符,则按从左至右的顺序进行处理优先级顺序:()、[](优先级最高)LENGTH、SIZEPTR、THIS、SEG、OFFSET、TYPEHIGH、LOW*、/、MOD、SHL、SHR+、-EQ、NE、LT、LE、GT、GENOTANDOR、XORSHORT(优先级最低)264.4伪指令一、伪指令(指示性语句)格式([]里的内容可选): [名字]伪指令符操作数,操作数,……[;注释]名字:变量名、段名等,与指令地址无关,后面不能加冒号伪指令符:指定汇编程序要完成的具体操作操作数:常量、变量或表达式等注释:说明、解释当前语句的作用27常用伪指令:处理器选择伪指令数据定义伪指令,包括DB、DW、DD、DF、DQ、DT符号定义伪指令,包括EQU、“=”段定义伪指令SEGMENT、ENDS假定伪指令ASSUME地址对准伪指令ORG过程定义伪指令PROC、ENDP源程序结束伪指令END282、数据定义伪指令功能:为变量分配存储空间格式: [变量名]伪指令符操作数,操作数,……[;注释]六种数据定义伪指令:DB(字节定义):每个操作数占1个字节DW(字定义):每个操作数占1个字,即2个字节DD(双字定义):每个操作数的长度为双字,即4个字节DF(6字节定义):每个操作数的长度为6个字节DQ(四字定义):每个操作数的长度为四字,即8个字节DT(10字节定义):每个操作数的长度为10个字节29例:可同时定义多个数据:NUMDW12H,-1;定义2个字STRINGDB‘HELLO’,0DH,0AH;定义字符串省略变量名:BUFDB1,10,100 DB1;省略变量名 ;但该数据仍可通过“BUF+3”访问无初始化数据定义:用问号“?”代替操作数BUFFERDB2,?,?,?;定义4个字节 ;其中后3个字节不初始化30DUP操作符:格式: 重复的次数DUP(重复的内容)例: ARRAY DB 3DUP(1,2) ;等价于:ARRAYDB1,2,1,2,1,2 BUF_W DW 100DUP(?) ;定义100个字,但不初始化DUP的嵌套使用: ARRAY2 DB 2DUP(1,3DUP(0)) ;等价于:ARRAY2DB1,0,0,0,1,0,0,031地址表达式作为操作数:只能用DW、DD定义DW:变量/标号的偏移量DD:变量/标号的段地址和偏移量例: DATA1 DW ADDR1+1 ;把ADDR1偏移量加1后存放到DATA1对应的存储单元中 DATA2 DD DATA1 ;把DATA1的偏移量和段地址存放到DATA2对应的存储单 元中,其中偏移量放低地址,段地址放高地址。32地址计数器“$” “$”:表示到目前为止该段已经使用的地址空间例1:

设VAR1地址偏移量为1000H,则:

VAR1 DB 100HDUP(?) 之后,$=1100H,因此: ADDR1 DW $ 等价于“ADDR1DW1100H”,也等价于“ADDR1DWADDR1”例2: STRINGDB‘ABC’ LEN DW$-STRING;LEN的值为STRING的长度

数据段中首个变量的偏移量默认为0.33例如:DATASEGMENTADB0,?,3BDW100,1200H,-5CDB‘A’,‘XY’DDW‘XY’EDW3,4466H,2DUP(1,0)DW1123H,0015HFDWCDATAENDS

343、符号定义伪指令(1)等价伪指令EQU格式: 符号名 EQU表达式功能: 为常量、表达式及其他各种符号定义一个别名例: NUM EQU12 ;给数值定义符号名 NUM2 EQUNUM+10 ;给12+10=22定义符号名 ADDR EQUDS:[BX+SI] ;给寻址表达式定义符号名 COUNT EQUCX ;给寄存器CX定义符号名 CLEAR EQUXORAX,AX ;给指令定义符号名35(2)解除伪指令PURGE格式: PURGE 符号名,符号名,……作用: EQU伪指令不能直接对一个符号名重定义,必须先用PURGE解除例: COUNT EQU CX PURGE COUNT

COUNT EQU CL

36(3)等号“=”伪指令格式: 符号名 = 表达式功能: 为常量、表达式及其他各种符号定义一个等价的符号名 允许对符号名多次重复定义,且以最后一次定义的值为准例: CONST =1 ;给数值1定义符号名CONST ADDR =[BP+DI] ;给寻址表达式定义符号名ADDR CONST =0 ;重定义CONST374、段定义伪指令SEGMENT、ENDS格式:段名

segment[定位][组合][段字][‘类别’]….

段名ends

段的起始地址PAGEPARA(默认)WORDBYTE段间关系NONE(默认)PUBLICSTACK多个’类别’连续存放STACKCODEDATA38385、假定伪指令ASSUME格式:ASSUME 段寄存器:段名[,段寄存器:段名,……]功能:告诉汇编程序段与段寄存器的对应关系例:DATA SEGMENTVAR1 DB ?DATA ENDSCODE SEGMENT

ASSUME CS:CODE,DS:DATABEGIN: ……ASSUME指令:假定CS为代码段,DS为数据段39段寄存器的装入伪指令assumecs:code,ds:data,ss:stack只是将cs、ds、ss和code、data、stack相连,并没有给cs、ds、ss赋相应的段地址CS的装入

源程序结束定义伪指令:END标号 每个源程序都必须以END伪指令结束例如:start:…endstartend后面的标号start说明了程序的入口,cpu的cs:ip将被设置指向这个入口。40段寄存器的装入DS与ES的装入①用ASSUME将DS/ES与相应的段建立联系②用数据传送指令mov装入段地址

MOV AX,段名

MOV DS/ES,AXSS的装入(两种办法)第⑴种:在定义段时,用组合类型STACK说明

STACK1 SEGMENTPARASTACK DW20HDUP(0) STACK1 ENDS CODE SEGEMNT ASSUMECS:CODE,SS:STACK1 ……41段寄存器的装入第(2)种:SS的装入(类似于DS/ES的方法) STACK1SEGMENT DW40HDUP(0)

TOP LABELWORD STACK1ENDS …… CODE SEGEMNT ASSUMECS:CODE,SS:STACK1 ……

MOVAX,STACK1 MOVSS,AX

MOVSP,OFFSETTOP ;SP=80H …… 427、地址对准伪指令(1)ORG格式:ORG 数值表达式功能:用于指定下一个指令或数据在段内的起始地址例:LAB1: PUSH AX ORG 2000HLAB2: MOV AL,34则LAB2的地址偏移量为2000H。439、过程定义伪指令PROC、ENDP功能:定义一个过程格式: 过程名 PROC [过程属性] ……

返回指令RET 过程名 ENDP过程属性:NEAR:缺省属性,表示段内调用/返回FAR:表示段间调用/返回4444§4-5汇编语言程序设计▲一个好的程序应该具备的特点:⑴程序结构模块化,程序易读,易调试及维护。⑵执行速度快。⑶占用内存空间小。概述4545▲常用四种程序结构:顺序结构,分支结构,循环结构,子程序结构。▲设计汇编语言源程序的基本步骤:⑴分析问题:抽象数学模型,确定实现算法。⑵绘制程序流程图粗框图

细框图。图例如图4-1所示。⑶分配存储空间、工作单元:分配数据段、堆栈段、程序段的位置,确定寄存器主要作用。⑷编写程序⑸静态检查,上机调试⑹程序运行,结果分析。464.5.1顺序程序设计顺序程序是指程序的结构从开始到结尾一直是顺序执行,中途没有分支。顺序程序的流程图如图4-4所示。47例4-10试编写程序计算表达式Z=(3X+Y-5)/2,设X、Y的值放在字变量VARX、VARY中,结果存放在VARZ中。算法分析:乘2n和除2n可以使用算术左移和右移实现;其它非2n的乘除运算可以用移位和加减组合运算来实现,如3X可以分解成2X+X。算法实现:DATASEGMENTVARXDW5VARYDW10VARZDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,VARXSHLAX,1;2*XADDAX,VARX;3*XADDAX,VARY;3X+YSUBAX,5;3*X+Y-5SARAX,1;(3*X+Y-5)/2MOVVARZ,AX;存结果

MOVAH,4CHINT21HCODEENDSENDSTART484.5.2分支程序设计分支程序结构是指程序的执行顺序将根据某些指令的执行结果,选择某些指令执行或不执行。分支程序的实现主要是由转移指令完成。如图4-5所示,分支程序结构有两种形式:一种是二分支结构;另一种是多分支结构。49(1)用比较/测试指令+条件转移指令实现分支算法分析:依次比较相邻两数的大小,将较大的送入AL中;每次比较后,较大数存放在AL中,相当于较大的数往下传;比较一共要做7次。比较结束后,AL中存放的就是最大数。例4-11数据段的ARY数组中存放有8个无符号数,试找出其中最大者送入MAX单元。50算法实现:DATASEGMENTARYDB18,15,40,0,60,10,30,70MAXDB?DATAENDSSTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETARY;SI指向ARY的第一个元素

MOVCX,7;CX作次数计数器

MOVAL,[SI];取第一个元素到ALLOP:INCSI;SI指向后一个元素

CMPAL,[SI];比较两个数

JAEBIGER;前元素≥后元素转移

MOVAL,[SI];取较大数到ALBIGER:DECCX;减1计数

JNZLOP;未比较完转回去,否则顺序执行

MOVMAX,AL;存最大数

MOVAH,4CHINT21HCODEENDSENDSTART514.5.3循环程序设计

在实际工作中,有时需要对某一问题进行多次重复处理,该类计算过程具有循环特征,循环程序设计恰是解决这类问题行之有效的方法。⑴循环程序的构成循环程序一般主要包括以下四个部分:①初始化部分主要用于建立循环的初始状态,即循环次数计数器、地址指针以及其他循环参数的初始设定。②循环体循环体是程序中重复执行的程序段,包括工作部分和修改部分。工作部分是完成循环程序任务的主要程序段;修改部分则是为循环的重复执行,完成某些参数的修改。③循环控制部分主要判断循环条件是否成立。判断方法主要有两种:用计数控制循环和用条件控制循环。④结束处理部分处理循环结束后的结果,如存储结果等。52(2)循环程序的结构类型依照问题的不同,循环体的结构一般可分为两类:先执行后判断和先判断后执行,如图4-8所示。图4-8(a)先执行后判断图4-8(b)先判断后执行53⑶控制循环次数的方法①用计数控制循环适用于循环次数已知的,或是在进入循环前可由某变量确定循环次数的情况。常选用CX作计数器,可选用LOOP、LOOPE或LOOPNE等循环控制指令。例4-13把以BUFFER为首址的6个字节单元中的二进制数据累加,求得的和存放到RES字单元中。54DATASEGMENTBUFFERDB1,9,21,12,23,13RESDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXXORAX,AX;AL清0MOVCX,06H;置计数器初值

MOVBX,OFFSETBUFFER;置地址指针L1:ADDAL,[BX];取一个数累加到AL上

ADCAH,0INCBX;地址加1LOOPL1;不为0,循环

MOVRES,AX;传送结果

MOVAH,4CHINT21HCODEENDSENDSSTART

55②用条件控制循环适用于某些循环次数未知的,或循环次数可变的情况,可以由问题给出的条件控制循环结束。例4-14调用单字符输出的DOS功能,向屏幕输出以“#”结束的字符串。a.明确任务,确定算法。设字符串存放在以D1开始的存储区中,字符串以“#”结束。虽然字符串长度未知,但可利用条件中的已知特征“#”来结束循环。显然,可以用条件控制法。b.算法思想:初始化:将D1的首地址送入SI。循环:(a)将SI指向的存储单元数据送到DL中;(b)判断:如果DL中的字符不是“#”,则显示

该字符,并修改SI的值即让SI指向下一个存储

单元,然后返回(a);否则执行(c)。(c)结束。56c.编写程序DATASEGMENTD1DB‘HOWAREYOU?#’DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,D1LP:MOVDL,[SI]

CMPDL,‘#’JZENDOUTMOVAH,2;显示单个字符

INT21H

INCSI;指向下一个数据

JMPLPENDOUT:INT20HCODEENDSENDSTART574.5.4子程序设计子程序或过程是汇编语言中多次使用的一个相对独立的程序段。⑴子程序的定义每一个子程序在被使用前必须先定义,子程序的定义格式就是过程的定义格式,完成子程序功能的程序段就包括在过程定义语句PROC。。。ENDP的中间。(2)子程序的调用和返回主程序通过使用CALL指令实现对子程序的调用,子程序通过使用RET指令实现返回主程序。如果在子程序中没有保护与恢复现场,则应该在主程序调用子程序之前保护现场、在子程序返回主程序后恢复现场。58例4-16已知数组由50个字数据组成,试求出该数组元素之和。算法分析:假设数组已经存放在以ARY开始的存储区中,其各个元素之和存放在以SUM开始的存储区中。用子程序结构进行编程。DATASEGMENTARYDW50DUP(?)SUMDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXCALLRADDMOVAH,4CHINT21H60求和子程序RADDPROCNEARPUSHAXPUSHBXPUSHCXPUSHDXLEABX,ARYMOVCX,100MOVAX,0MOVDX,AXCL1:ADDAX,[BX]JNCCL2INCDX61CL2:ADDBX,2LOOPCL1MOVSUM,AXMOVSUM+2,DXPOPDXPOPCXPOPBXPOPAXRETRADDENDPCODEENDSENDSTART624.6DOS及BIOS功能调用

DOS是磁盘操作系统,它为程序设计人员提供了可以直接调用的功能子程序。DOS功能调用就是指对这些子程序的调用,也称系统功能调用。子程序的顺序编号称为功能调用号。IBMPC系列机在只读存储器ROM中固化有一组外部设备驱动与管理软件,占用系统板上8K字节的ROM区,组成PC机基本输入输出系统(BasicI/OSystem),它处于系统软件的最低层,又称ROMBIOS。63BIOS/DOS的每个功能子程序都对应着一个子程序文件,因此BIOS/DOS功

温馨提示

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

评论

0/150

提交评论