汇编语言程序设计li课件_第1页
汇编语言程序设计li课件_第2页
汇编语言程序设计li课件_第3页
汇编语言程序设计li课件_第4页
汇编语言程序设计li课件_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

14.2.4过程定义伪指令PROC、ENDP过程就是子程序。一个过程可以被其它程序所调用(用CALL指令),过程的最后一条指令一般是返回指令(RET)。过程定义伪指令的格式为<过程名>PROC[类型]

RET<过程名>ENDP注意:PROC和ENDP必须成对出现。14.2.4过程定义伪指令PROC、ENDP过程就是子2过程的类型有两种:

NEAR——(默认类型)表示段内调用

FAR——表示段间调用

调用一个过程的格式为:

CALL

<过程名>2过程的类型有两种:3过程调用和返回指令过程(子程序)一段具有特定功能的,供其它程序调用的公用程序。特点调用子程序时,IP(CS)的内容被压入堆栈栈顶。从子程序返回时,栈顶的内容又被弹出到IP(CS)。子程序执行结束后一般均要返回调用程序。一次定义,多次调用;可带参数调用,以完成不同的功能。优点程序代码短,结构清晰,便于编程、调试、修改和阅读。两条相关指令:子程序调用指令CALL子程序返回指令RET3过程调用和返回指令过程(子程序)4一般格式:CALLsub

;sub为子程序的入口根据子程序入口的寻址方式,子程序调用有四类。①段内直接调用子程序的偏移地址直接由CALL指令给出。格式:CALLnear_proc

CALL执行时,它首先将IP内容压栈,然后把指令中给出的位移量加到IP上。

注:汇编以后的调用地址是相对于CALL的下一条指令的位移量。例:CALL0120H;子程序偏移地址由指令给出(1)调用指令CALL4一般格式:CALLsub;sub为子程序的入口(5位移量由汇编程序在汇编时进行计算,如下例:CS:0102 CALL0120H ;3字节

CS:0105……

则位移量为:0120-0105H=001BH于是CALL 0120H的机器码为E81B00CS:0102 E8CS:0103 1BCALL0120HCS:0104 00CS:0105……

5位移量由汇编程序在汇编时进行计算,如下例:6子程序的偏移地址在寄存器或存储器中。格式:CALLmem16/reg16CALL执行时,它首先将IP内容压栈,然后把指定的寄存器/存储器的内容送入IP。例:CALL BX;子程序地址由BX给出CALL WORDPTR[SI];子程序地址在存储器中②段内间接调用6子程序的偏移地址在寄存器或存储器中。②段内间接调用7CALL

IPHIPL代码段数据段CALLWORDPTR[SI]指令的操作图示:假定:(DS)

=

8000H,(SI)

=

1200H81200H81201H7CALLIPHIPL代码段数据段CALL8子程序的段地址和偏移地址直接由CALL指令给出。

格式:CALLfar_proc;far_proc为远过程的地址指令的操作为:

CS内容压栈

IP内容压栈

CS←段地址

IP←偏移地址例:CALL2000H:1000HCALLTIMER;TIMER为远过程③段间直接调用8子程序的段地址和偏移地址直接由CALL指令给出。③段间直9子程序的段和偏移地址为存储器的连续4个单元中的内容。

格式:CALLmem32指令的操作为:

SP←(SP)-2((SP)+1,(SP))←(CS);CS压栈CS←(mem32+2)

SP←(SP)-2((SP)+1,(SP))←(IP);IP压栈IP←(mem32)例:CALLDWORD

PTR[DI]

调用地址在[DI],[DI]+1,[DI]+2,[DI]+3四个存储单元中。低字内容为偏移地址,高字内容为段地址。④段间间接调用9子程序的段和偏移地址为存储器的连续4个单元中的内容。④段10CALL代码段数据段

IPHIPL

CSHCSL[DI][DI]+1[DI]+2[DI]+3段间间接调用示意图CALLDWORD

PTR[DI]

10CALL代码段数据段IPHIPLCSH11段内返回指令RET的操作为:恢复子程序执行前IP的内容。段间返回指令RET的操作为:恢复子程序执行前IP和CS的内容。

(2)返回指令RET11段内返回指令RET的操作为:(2)返回指令RET124.2.5宏定义伪指令如果需要多次使用同一个程序段,可以将这个程序段定义为一个”宏指令”,然后在需要时,可简单地用宏指令名来代替这个程序段。指令的格式为:<宏指令名>MACRO

[形参表]

<宏定义体>

ENDM124.2.5宏定义伪指令如果需要多次使用同一个程序段,可13例:两个数之和的宏定义和宏调用。宏定义为:DADDMACROX,Y,ZMOVAX,XADDAX,YMOVZ,AX

ENDMX、Y、Z是形式参数。调用宏DADD时可写为:

DADD

DATA1,DATA2,SUMDATA1,DATA2,SUM是实际参数,由它们替换定义中的X、Y、Z。13例:两个数之和的宏定义和宏调用。X、Y、Z是形式参数。调14宏调用与过程(子程序)调用都是一次定义,多次调用。它们之间的差别是:①执行形式:宏命令伪指令由宏汇编程序在汇编过理中进行处理,而CALL、RET则是由CPU执行的指令。②汇编结果:宏命令伪指令汇编后被展开。③执行速度:宏命令执行速度较快(因无调用转移)④

占用内存:宏指令简化了源程序,但不能简化目标程序,并不节省内存单元。使用过程可以节省代码占用的内存空间。14宏调用与过程(子程序)调用都是一次定义,多次调用。它们之15宏展开:汇编程序会把宏调用按宏定义展开。例如:宏定义为:DisplayMACROstringLEADX,stringMOVAH,9INT21HENDM程序中宏调用:……DISPLAYERROR_MESSAGEDISPLAYEXIT_MESSAGE……汇编后的结果:(带有+号的指令为宏展开后的结果)……+LEADX,ERROR_MESSAGE+MOVAH,9+INT21H+LEADX,EXIT_MESSAGE+MOV AH,9+INT21H……15宏展开:汇编程序会把宏调用按宏定义展开。164.2.6汇编结束伪指令END汇编语言源程序的最后,要加汇编结束伪指令END,以使汇编程序结束汇编。格式:END[表达式]END后跟的表达式通常就是程序第一条指令的标号,指示程序的启动地址(要执行的第一条指令的地址)。164.2.6汇编结束伪指令END汇编语言源程序的最后,要174.3功能调用系统功能调用——由OS提供的一组实现特殊功能的子程序供程序员在程序中调用,以减轻编程工作量。系统功能调用有两种,一种称为DOS功能调用,另一种称为BIOS功能调用。用户程序在调用这些系统服务程序时,不是用CALL命令,而是采用软中断指令INTn来实现。174.3功能调用系统功能调用——由OS提供的一组实现特殊18INT2lH功能大致可以分为四个方面:设备管理、目录管理、文件管理和其它。D0S系统功能调用的使用方法如下:① AH←功能号;② 设置该功能所要求的其他入口参数;③ 执行INTH指令;分析出口参数。18INT2lH功能大致可以分为四个方面:D0S系统功能调19INTN指令功能: ①当前标志寄存器的内容压栈,保存TF ②TF←0,IF←0 ③当前断点的CS值压栈,当前IP值压栈 ④IP,CS←向量表中第N项的4字节内容中断向量分配情况如下:0~1FH,80H~F0H是ROMBIOS的中断向量号;20H~3FH是DOS的中断向量号;40H~7FH是用户备用的中断向量号。1920当中断服务子程序返回时,要执行IRET指令,其功能是: ①栈顶弹出一个字到IP ②栈顶弹出一个字到CS ③栈顶弹出一个字到标志寄存器20当中断服务子程序返回时,要执行IRET指令,其功能是:211DOS功能调用(1)返回DOS向量号21H功能号4CHMOVAH,4CH

INT21H(2)从键盘输入一个字符(功能号=1)

MOVAH,1INT21H<AL中有键入的字符>

211DOS功能调用(1)返回DOS22例:程序中有时需要用户对提示做出应答。GET_KEY:MOVAH,1

;等待键入字符

INT21H

;结果在AL中

CMPAL,’Y’ ;是’Y’?JZYES ;是,转YESCMPAL,’N’ ;是’N’?JZNO ;是,转NOJMPGET_KEY ;否则继续等待输入YES: …

NO: …22例:程序中有时需要用户对提示做出应答。23(3)在显示器上显示一个字符(功能号=2)

MOVAH,2

MOVDL,<要显示的字符>INT21H例:在显示器上显示一个字符‘A’MOVAH,2MOVDL,’A’;或MOVDL,

41HINT21H23(3)在显示器上显示一个字符(功能号=2)24

MOVAH,9LEADX,<字符串>

INT21H注意:被显示的字符串必须以’$’结束。(4)显示字符串(功能号=9)24MOVAH,9(4)显示字符串(功能号=9)25例:在屏幕上显示:’HELLO,WORLD!’;在数据段定义字符串:DATASEGMENTSTR1DB‘HELLO,WORLD!$’DATAENDS;在代码段中进行显示输出

MOVAH,9LEADX,STR1INT21H25例:在屏幕上显示:’HELLO,WORLD!’26例:在显示器上显示“HOW

ARE

YOU?”,然后读一个字符,但不显示此字符。若读入字符是“Y”,则显示“OK”。DSEGMENTD1DB`HOWAREYOU?`,0DH,0AH,`$`D2DB`OK`,0DH,0AH,`$`DENDSCSEGMENT ASSUMECS:C,DS:D ;说明代码段、数据段26例:在显示器上显示“HOWAREYOU?”,然后读27BG:MOVAX,D MOVDS,AX ;给DS赋段值

MOVDX,OFFSETD1MOVAH,9INT21H ;显示“HOWAREYOU?”MOVAH,8 INT21H ;不显示方式读一字符到ALCMPAL,`Y` JNENEXT ;不等则转

LEADX,D2 MOVAH,9 INT21HNEXT:MOVAH,4CH INT21HCENDS ENDBG27BG:MOVAX,D28(5)输入字符串(功能号=0AH)此功能调用从键盘输入一串字符并把它存入用户指定的缓冲区中。

MOVAH,

0AH

LEADX,<字符串缓冲区首地址>

INT21H

(预留的N1个字节的存储单元)

0DHN2N1N1:缓冲区长度(最大键入字符数)N2:实际键入的字符数(不包括回车符)

0DH:回车用户定义的输入字符串的缓冲区格式28(5)输入字符串(功能号=0AH)(预留的N1个字节的29若用户键入的字符数(包括回车)≥定义的N1,本功能调用将不再接收新的键入,且光标不再向右移动。例:设在数据段定义键盘缓冲区如下:

STR1DB10,?,10DUP(?)调用DOS功能的0AH号功能的程序段为:

LEADX,STR1MOVAH,0AHINT21H此程序段最多从键盘接收10个按键(包括回车)。29若用户键入的字符数(包括回车)≥定义的N1,本功能调30例:屏幕显示“PASSWORD?”,随后从键盘读入字符串,并比较这个字符串与程序内部设定的字符串。若二者相同则显示“OK”,否则不作任何显示(0DH是回车的ASCII码,0AH是换行的ASCII码)。30例:屏幕显示“PASSWORD?”,随后从键盘读入字符串31D SEGMENTPASS1DB`12AB`N EQU$-PASS1D1 DB`PASSWORD?`,0DH,0AH,`$`PASS2DB20 DB? DB20DUP(?)D2 DB0DH,0AH,`OK$`D ENDSC SEGMENT ASSUMECS:C,DS:D,ES:D;

BG: MOVAX,D MOVDS,AX ;给DS赋段值

MOVES,AX ;给ES赋段值31D SEGMENT32

LEADX,D1 ;将D1表示的相对地址送DX MOVAH,9 INT21H ;显示“PASSWORD?”并回车换行LEADX,PASS2 MOVAH,0AH INT21H ;输入字符串

LEASI,PASS1 LEADI,PASS2 CMPBYTEPTR[DI+1],N JNELAST MOVCX,N LEADI,PASS2+2 CLD REPZCMPSB ;重复比较

JZDISOK3233LAST:MOVAH,4CH INT21HDISOK:LEADX,D2 MOVAH,9 INT21H ;显示“OK” JMPLASTC ENDS ENDBG33LAST:MOVAH,4CH342BIOS功能调用BIOS:基本输入输出系统,是固化在EPROM中的一组实现基本输入输出功能的子程序。BIOS调用通过多个软中断提供,调用方法为:

MOVAH,<功能号> <设置入口参数,一般将参数放在寄存器中> INT <中断类型>

BIOS中的几个主要中断类型如下:

INT10H——屏幕显示

INT13H——磁盘操作

INT14H——串行口操作

INT16H——键盘操作 INT17H——打印机操作 每类中断由包含许多子功能,调用时通过功能号指定。

342BIOS功能调用BIOS:基本输入输出系统,是固化在354.4汇编语言程序设计基础4.4.1概述1.程序质量(自学)2.汇编语言程序设计的步骤:1-根据实际问题抽象出数学模型,确定算法2-画出程序框图(流程图)

3-分配内存工作单元和寄存器

4-根据框图编写源程序,存成.ASM文件

5-对源程序汇编,生成.OBJ目标文件

6-把.OBJ文件连接成.EXE执行文件

7-运行、调试3.源程序的基本结构:顺序、分支、循环、过程

354.4汇编语言程序设计基础4.4.1概述36汇编语言上机过程YYYNNN有错?有错?有错?结束汇编输入(修改)源程序连接运行查错开始用EDIT,NOTEPAD等任何文本编辑器。源程序存为.ASM文件用MASM宏汇编程序进行汇编。汇编后生成.OBJ目标文件。命令格式:MASM<源文件名.ASM>;用LINK连接程序进行连接。连接后生成.EXE可执行文件。命令格式:LINK<目标文件名.OBJ>;用TD、DEBUG等调试程序进行调试。命令格式:TD<可执行文件名.EXE>36汇编语言上机过程YYYNNN有错?有错?有错?结束374.58086/8088汇编语言程序设计基本方法

4.5.1顺序结构程序4.5.2分支结构程序4.5.3循环结构程序4.5.4DOS及BIOS中断调用返回374.58086/8088汇编语言程序设计基本方法4.384.5.1顺序结构程序

例:对两个8字节无符号数求和,这两个数分别用变量D1及D2表示。将两数之和的最高位进位放在AL中,两数之和的其他位按从高到低顺序依次放在SI,BX,CX,DX中。D SEGMENTD1DB12H,34H,56H,78H,9AH,0ABH,0BCH,0CDHD2DB0CDH,0BCH,0ABH,9AH,78H,56H,34H,12HD ENDSC SEGMENT ASSUMECS:C,DS:D ;说明代码段、数据段384.5.1顺序结构程序例:对两个8字节无符号数求和,39BG:MOVAX,D MOVDS,AX ;给DS赋段值

LEADI,D1 ;将D1表示的偏移地址送DI MOVDX,[DI] ;取第1操作数到寄存器中

MOVCX,[DI+2] MOVBX,[DI+4] MOVSI,[DI+6] LEADI,D2 ;将D2表示的偏移地址送DI

39BG:MOVAX,D40顺序结构程序(续1)

ADDDX,[DI] ADCCX,[DI+2] ADCBX,[DI+4] ADCSI,[DI+6] MOVAL,0 ADCAL,0 MOVAH,4CH INT21HC ENDS ENDBG40顺序结构程序(续1) ADDDX,[DI]41顺序结构程序(续2)例:试编写计算f=(w-(x﹡y+z-5000))/x的程序。其中,w、x、y、z均为有符号16位二进制数,并假设w、x、y、z的值分别为5000、200、-250、20000。程序运行后,将计算结果存入变量F,而余数存入变量F+2中。分析:输入数据为w、x、y、z;输出数据为f。由f算式可知,它是一个双字操作数除以字操作数所得的商,故f占一个字。由于中间结果x﹡y是双字操作数,所以,w、z均应将符号扩展成双字操作数之后再进行加减运算。计算的所有中间结果也都应按32位带符号二进制数处理。41顺序结构程序(续2)例:试编写计算f=(w-(x﹡y+z42现设定存储单元分配为:字变量W、X、Y、Z分别存放w、x、y、z的值;字变量F、F+2中分别用来存放除法运算所得的商、余数。寄存器CX、BX用来存放运算的32位中间结果。则计算f值的步骤如下:42现设定存储单元分配为:字变量W、X、Y、Z分别存放w、x43顺序结构程序(续4)①x﹡y→CX、BX;②将z变量扩展成双字→DX、AX;③(CX、BX)+(DX、AX)→CX、BX;④(CX、BX)-5000→CX、BX;⑤将w扩展成双字→DX、AX⑥(DX、AX)-(CX、BX)→DX、AX⑦(DX、AX)/x,其商→F,余数→F+243顺序结构程序(续4)①x﹡y→CX、BX;44计算程序如下:STACKSEGBENTACK DB200DUP(0)STACKEDNSDATA SEGMENTW DW5000X DW200Y DW-250Z DW20000F DW2DUP(?)44计算程序如下:45顺序结构程序(续5)DATA ENDSCODESEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATA MOVDS,AX ;为DS赋值

MOVAX,X IMULY;x*y→DX,AX MOVCX,DX MOVBX,AX ;x*y→CX,BX

45顺序结构程序(续5)DATA ENDS46MOVAX,ZCWD ;将z扩展成双字→DX,AXADDBX,AXADCCX,DX;(CX,BX)+(DX,AX)→(CX,BX),(x*y+z→CX,BX)SUBBX,5000SBBCX,0;(CX,BX)-5000→CX,BX,(x*y+z-500→CX,BX)MOVAX,WCWD ;将w扩展成双字→DX,AXSUBAX,BXSBBDX,CX;(DX,AX)-(CX,BX)→DX,AX,((w-(x*y+z-500))→DX,,AX)46MOVAX,Z47顺序结构程序(续5)IDIVX;(w-(x*y+z-500))/x→AX,(w-(x*y+z-500))%x→DXMOVF,AXMOVF+2,DX ;(DX,AX)/x,商→F,余数→F+2MOVAH,4CHINT21H ;退出用户程序,返回DOS状态CODEENDBEGIN程序运行后,在变量F中存入了200对应的十六进制数00C8H,而余数0送入变量F+2中。返回47顺序结构程序(续5)IDIV48程序结构:TEST/CMP指令Jx标号1

处理体P1JMP标号2标号1:

处理体P2标号2:其他指令…条件满足?处理P1处理P2标号1:标号2:条件1条件24.5.2分支结构程序IF…THEN…ELSE结构48程序结构:条件满足处理P1处理P2标号1:标号2:条件149标号1:条件1成立?P1NYCASE结构程序结构:…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:(公共出口)条件2成立?条件n成立?…Pn+1标号2:标号n:标号n+1:P2PnNNYY49标号1:条件1成立P1NYCASE结构程序结构:条件2成504.5.2分支结构程序

例:比较以存储变量D1和D2表示的两个有符号字数据的大小,将其中较大数据放在BX寄存器中,程序如下:

DATASEGMENT D1DW-123H ;补码为FF85H D2DW-120H ;补码为FF88H DATAENDS CODESEGMENT ASSUMECS:CODE,DS:DATA;说明代码段、数据段BEGIN:MOVAX,DATA MOVDS,AX ;给DS赋段值

MOVBX,D1 CMPBX,D2 JGENEXT;若D1≥D2,则不交换,转NEXT MOVBX,D2 ;若D1<D2,则交换504.5.2分支结构程序例:比较以存储变量D1和D2表51NEXT:MOVAH,4CH INT21HCODEENDSENDBEGIN51NEXT:MOVAH,4CH524.5.2分支结构程序(续1)例:试编制计算下列函数值的程序(设x、y为带符号8位二进制数):

1(当x≥0,y≥0时) a= -1(当x<0,y<0时) 0(当x、y异号时)DATA SEGMENTX DB–12Y DB9A DB?DATAENDS524.5.2分支结构程序(续1)例:试编制计算下列函数值53STACKSEGMENTSTACKDB200DUP(0)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AX ;为DS赋值DATA CMPX,0 ;判x是否为负

JSL1;若x<0,则转L1 CMPY,0 ;判y是否小于零

JLL2;若x≥0、y<0,则转L2 MOVA,1 JMPEXIT ;若x≥0,y≥0时,则1→A,无条件转EXIT返回53STACKSEGMENTSTACK返回54L1: CMPY,0 JGEL2 ;若x<0,y≥0时,则转L2 MOVA,-1 JMPEXIT ;若x<0,y<0时,则-1→A且无条件转EXITL2: MOVA,0 ;若x与y异号时,则0→AEXIT: MOVAH,4CHINT21HCODEENDS ENDBEGIN54L1: CMPY,0554.5.3循环结构程序

例:找出从无符号字节数据存储变量VAR开始存放的N个数中的最大数放在BH中,程序如下:DSEG SEGMENTVAR DB5,7,19H,23H,0A0HN EQU$-VARDSEG ENDSCSEG SEGMENT ASSUMECS:CSEG,DS:DSEG ;说明代码段、数据段BG: MOVAX,DSEG MOVDS,AX ;给DS赋段值

MOVCX,N-1 ;置循环控制数

MOVSI,0 MOVBH,VAR[SI] ;取第1字节数到BH JCXZLAST ;如果CX=0则转554.5.3循环结构程序例:找出从无符号字节数据存56循环结构程序(续1)AGIN:INCSI CMPBH,VAR[SI] JAENEXT MOVBH,VAR[SI]NEXT:LOOPAGIN ;CX←CX-1,若CX不等于0则转LAST:MOVAH,4CH INT21HCSEGENDS ENDBG56循环结构程序(续1)AGIN:INCSI57循环结构程序(续2)例:将一组有符号存储字节数据按从小到大的顺序排序。设数组变量为VAR,数组元素个数为N设计思想是:反复对相邻的数作两两比较,并使相邻的两数按从小到大顺序排列,直到数组中任意两个相邻的数都是从小到大时,则排序结束。为简单起见,不仿设该组数是-1,8,-5,-8等4个数。 排序前数据顺序为:

VAR〔1〕=-1VAR〔2〕=8VAR〔3〕=-5VAR〔4〕=-8第1轮比较:从第1个元素开始进行第1轮比较,需要作3次两两相邻的数据比较,且每对相邻的两数57循环结构程序(续2)例:将一组有符号存储字节数据按从小到58比较后,保证前一个数据比后一个数据小。因此,3次比较并作交换后,这一组数中的最大数“8”就被排在最后,即:

VAR〔1〕=-1VAR〔2〕=-5VAR〔3〕=-8VAR〔4〕=858比较后,保证前一个数据比后一个数据小。因此,3次比较并作59循环结构程序(续3)第2轮比较:经第1轮比较交换后,已经将最大数“沉入”最底,因此这一遍比较只需考虑前3个元素的排序,即进行2次比较。这一轮比较及交换后,数据的排列顺序为:

VAR〔1〕=-5VAR〔2〕=-8VAR〔3〕=-1VAR〔4〕=8第3轮比较:经第2轮比较交换后,最大的两个数已排好序,剩下只有两个较小数待排序,即比较1次,最后得到排序结果为:VAR〔1〕=-8 VAR〔2〕=-5 VAR〔3〕=-1 VAR〔4〕=859循环结构程序(续3)第2轮比较:经第1轮比较交换后,已经60经上

温馨提示

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

评论

0/150

提交评论