微机原理与接口

微机原理与接口

ID:43974835

大小:599.00 KB

页数:59页

时间:2019-10-17

上传者:U-3730
微机原理与接口_第1页
微机原理与接口_第2页
微机原理与接口_第3页
微机原理与接口_第4页
微机原理与接口_第5页
资源描述:

《微机原理与接口》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

第四章汇编语言程序设计4.1汇编语言的语句格式4.2MASM中的表达式4.3伪指令语句4.4常用DOS系统功能调用和BIOS中断调用4.5程序设计方法 第四章汇编语言程序设计汇编语言:用指令的助记符、标号、伪指令等书写程序的语言。汇编语言源程序:用汇编语言书写的程序。汇编:把汇编语言源程序翻译成在机器上能执行的机器语言程序(称目标程序)的过程。汇编程序:完成汇编过程的程序。汇编语言是面向计算机硬件的语言,和机器密切相关,采用不同CPU的计算机,通常有不同的汇编语言。 第四章汇编语言程序设计一个汇编语言实例:DATASEGMENTBLOCKDB43H,0ABH,…PDATADB20DUP(?)NDATADB20DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVES,AXLEASI,BLOCKLEADI,PDATALEABX,NDATACLDMOVCX,PDATA-BLOCKGOON:LODSBTESTAL,80HJNZMINUSSTOSBJMPAGAINMINUS:XCHGBX,DISTOSBXCHGBX,DIAGAIN:LOOPGOONCODEENDSENDSTART 4.1汇编语言的语句格式[名字]操作码/伪指令[操作数][;注释]各部分之间至少要用一个空格作为间隔,其中名字是一个符号,它可以是标号或变量,由英文字母、数字及专用字符组成,最大长度不能超过31个,且不能由数字打头,不能用保留字(如寄存器名,指令助记符,伪指令)。操作码:是一个助记符,它可以是指令、伪指令(又叫伪操作)或宏指令。操作数:参加本指令运算的数据。可以是常数、变量、标号(统称数据项P127)、寄存器名、表达式。 4.1汇编语言的语句格式[名字]操作码/伪指令[操作数][;注释]汇编语言源程序中的语句主要有两种类型:指令性语句(P127):其格式为指示性语句(P127),又叫伪指令,其格式为:指令性语句是计算机可执行的。而指示性语句不能执行,只用来定义变量,分配存储单元,指示程序开始和结束等,为计算机提供必要的信息。这两种语句的差别:汇编时能否形成对应的机器码。[标号:][前缀]指令助记符[操作数][;注释]变量伪指令指示符操作数[,,];注释 表达式是常数、寄存器、标号、变量与一些运算符组合的序列。4.2MASM中的表达式汇编时按一定的优先规则对表达式进行计算后可得到一个数值或一个地址。算术运算符(ArithmeticOperators)逻辑运算符(LogicalOperators)关系运算符(RelationalOperators)数值返回运算符(Value-ReturningOperators)修改属性运算符(ModifingattributeOperators)其它运算符(OtherOperators)教材P129表4-1给出了MASM中可采用的运算符号。 一、算术运算符有+、-、*、/,MOD,SHL、SHR。其中MOD表示除法运算后得到的余数。例:19/7的商是2;19MOD7则结果为5(余数)算术运算符可以用于数字表达式。例:MOVAL,2*7汇编后为B0H,0EH算术运算符也可以用于地址表达式,但对地址运算的结果应有明确的物理意义。例如,两个地址的乘或除无意义,而加或减则可以。例:LEASI,SUM+3表示变量SUM的地址加上3得到的和作为新的存储器地址。 AND、OR、XOR和NOT,它们只能用于数字表达式中。二、逻辑运算符例:MOVCL,36HAND0FH经汇编后结果等同于:MOVCL,06H这些逻辑运算符也是8086/8088的指令助记符,但不会造成混乱,前者在汇编时进行,而后者在指令执行时进行的。例:ANDDX,PORT_VARAND0FEH后一个逻辑运算符AND在汇编时进行,若PORT_VAR为81H,则汇编后表达式算出为80H.执行前一个指令助记符AND时,将(DX)与80H相与,结果在DX中。 共有6个:EQ、NE、LT、LE、GT、GE。三、关系运算符关系运算符的两个操作数必须都是数字或者是同一段内的两个存储器地址。例:MOVBX,PORT_VALGE5若PORT_VAL的值大于等于5,则汇编后结果等效为:MOVBX,0FFFFH若PORT_VAL的值小于5,则汇编后结果等效为:MOVBX,0关系为真,结果为0FFFFH,或0FFH关系为假,结果为0 它可以把存储器一些特征作为数值送回。四、数值返回运算符(分析运算符)OFFSET、SEG、TYPE、LENGTH、SIZE。1.OFFSET注意与MOVSI,STRI1的差别。但它与LEASI,STRI1类似。SEG运算符用来取存储单元的段值。例:MOVAX,SEGSTRI1;将变量STRI1所在段MOVDS,AX;值取到DS中。例:MOVSI,OFFSETSTRI1;将变量STRI1处的地址偏移量取到SI中格式:OFFSET变量或标号2.SEG格式:SEG变量或标号 3.TYPE例:若BUFFER1存储区是用如下伪指令定义的:BUFFER1DB100DUP(?)则TYPEBUFFER1等于1类型返回值变量DB1DW2DD4DQ8标号NEAR-1[FFH]FAR-2[FEH]TYPE操作符用来取存储器的单元类型,各单元类型对应值如下表:格式:TYPE变量或标号 4.LENGTH例:若ABC被定义为:ABCDW4,5,6则LENGTHABC等于1若ABC被定义为:ABCDW100DUP(?)则LENGTHABC等于100LENGTH操作符用来计算一个用复制操作符DUP()来定义的存储区的数据(数据可以是字节,字或双字)的数目。如果不是用DUP定义的存储区则返回值为1.格式:LENGTH变量 5.SIZE操作符SIZE用来计算一个存储区有多少个字节。格式:SIZE变量例:若BUFFER2存储区是用如下伪指令定义的:BUFFER2DW200DUP(0)则:TYPEBUFFER2等于2LENGTHBUFFER2等于200SIZEBUFFER2等于400 五、修改属性运算符段操作符、PTR、THIS、HIGH、LOW、SHORT。用来对存储单元规定类型,通常和伪指令BYTE、WORD等连起来使用。格式:段前缀:变量或地址表达式1.段操作符例:MOVAX,ES:[BX]2.PTR格式:类型/距离PTR变量或标号例:MOVBYTEPTR[DI],0MOVWORDPTR[DI],0而MOV[DI],0;类型不定 五、修改属性运算符用来说明转移类指令中转向的目标地址与本指令之间的距离在-127~+128之间。(P134例)格式:变量/标号EQUTHIS类型/距离3.THIS将EQUTHIS右边的类型/距离属性,赋给左边的变量/标号。(P134例)4.SHORT格式:SHORT标号5.HIGH和LOW格式:HIGH/LOW变量或标号字节分离运算符。HIGH从字中分离出高位字节;LOW从字中分离出低位字节。(P134例)六、其它运算符:()、[]、<>、․、MASK、WIDTH七、优先级:见教材P136表4-3 4.3伪指令语句常用的伪指令有:数据定义语句符号赋值语句段定义语句段分配语句过程定义语句程序开始结束语句 一、数据定义语句变量是内存中数据区的名字,故这类伪指令又可叫变量定义伪指令。这类伪指令格式为:变量名伪指令助记符操作数;注释其中变量名用符号地址表示,后面不能跟冒号,它可有可无。助记符有:DB、DW、DD、DQ、DT、nDUP()DB用来定义字节DW用来定义字DD用来定义双字DQ用来定义四个字DT用来定义十个字节 数据定义语句例1:DA1DB10,5,10HDA2DW10H,100,-4DA3DD2*30,0FFFBHDA1DA3DA210510H10H100-4600FFFBH汇编后如图所示:(内存分配) 例2:操作数可以是字符串LIDB‘HELLO’LI‘H’‘E’‘L’‘L’‘O’注意下面的不同:DB’AB’DW’AB’41H‘A’42H‘B’42H‘B’41H‘A’48454C4C4F汇编后如图: 操作数?用来保留存储空间,但不存入数据。ABCLPI01?????54例3:ABCDB0,1,?,?,?LPIDW?,54,?汇编后如下图示: 操作数字段还可以用复制操作符DUP来缩写。如前面ABC亦可写成:ABCDB0,1,3DUP(?)又如:DAODB2DUP(0,1,2,?)与DAODB0,1,2,?,0,1,2,?等价。在伪指令的操作数中若使用$,则表示的是地址计数器的当前值。例:BUFFERDW3,4,$+3设BUFFER的偏移地址为0088H,则汇编后如图所示:BUFFER0088H008CH030004008FH00$+3008CH+3=008FH008AH0089H008BH 二、表达式赋值语句EQU、=、PURGE1.赋值语句EQU格式为:符号名EQU表达式或:符号名2EQU符号名例:CONSTANTEQU100NEW_PORTEQUPORT_VAL+1EQU伪指令在未解除前,不能重新定义。例:┇EMP=7;值为7┇EMP=EMP+1;值为82.等号语句=:与EQU类似,但允许重新定义 3.解除伪指令PURGE已用EQU定义的符号,可用PURGE解除,再重新定义。例:PURGENEW_PORTNEW_PORTEQUPOTR_VAL+8 三、段定义语句因8086/8088CPU的存储器是分段的,这就需要有段定义语句。与段有关的伪指令有:SEGMENT、ENDS、ASSUME、ORG段定义伪指令的格式如下:段名SEGMENT[定位类型][组合类型][‘类别’]┇段名ENDS功能:用此伪指令可以把模块分为若干个逻辑段,每一对SEGMENT和ENDS可定义一个逻辑段。这两个伪指令总是成对出现,二者前面的段名一致。二者之间的部分,对DS、ES、SS来说,一般是符号、变量定义等伪指令。对于CS则是指令及伪指令。 说明:此外,还必须明确段和段寄存器的关系,这可由段分配语句ASSUME语句来实现。其格式为:①SEGMENT与ENDS共同定义一个逻辑段。它们必须成对使用,每段应有一个段名,具有段基址和偏移量两个属性。②功能:向汇编程序指示当前各段所用的段寄存器其中段寄存器名必须是CS、DS、ES或SS中的一个,而段名则是由SEGMENT及ENDS定义的段名。ASSUMECS:SEGNAME[,…] 需指出的一点,ASSUME伪指令只是告知汇编程序有关段寄存器与段的关系,除了代码段CS,其他几段并没有给段寄存器赋予实际的初值。如果程序用到了DS、SS、ES,则需要程序员在代码段的开始时对DS、SS、ES赋值。如下语句:MOVAX,DATAMOVDS,AX例:教材P142,例4-29 四、过程定义语句过程也称子程序。过程定义伪指令的格式如下:过程名PROC属性┇;过程内容RET[N]过程名ENDP功能:定义一个过程,主程序可以用CALL指令调用它。过程调用的距离属性有NEAR、FAR。若定义NEAR属性(默认),则允许过程在段内调用。若定义FAR属性,则允许过程跨段调用。例:教材P143~145,例4-30、31、32。 五、程序开始和结束语句NAME、OEG、END格式:NAME程序名功能:为源程序目标模块赋名。位置:放在程序开始。2.ORG1.NAME表达式:给定的偏移地址值,表达式的值(必须是正整数)即为段内的起始地址或偏移地址,从此地址起连续存放程序或数据。格式:ORG表达式功能:为目标程序设置位置指针,指定下面语句的起始偏移地址。 五、程序开始和结束语句格式:END标号名功能:标记汇编源程序结束。位置:放在源程序的最后一行。3.END标号名:该程序第一条可执行语句的标号名。 4.4常用DOS系统功能调用和BIOSDOS系统调用MSDOS使用中断号21H作为系统说明,为程序员提供了上百种系统服务功能。(P516附录F)对这些功能的调用步骤如下:(1)由AH给出功能号;(2)根据相应功能的要求,设置入口参数。入口参数是子程序运行所需要的数据,DOS系统功能调用的入口参数通常是放在指定的内部寄存器器中,少数功能调用也可以没有入口参数;(3)执行中断指令INT21H;(4)分析和使用出口参数。 4.4常用DOS系统功能调用和BIOS例:字符与字符串的输入/输出的调用方法(1)键盘读入一个字符并回显功能号:01H。入口参数:无。出口参数:AL=输入字符的ASCII码。功能:等待从键盘读入一个字符,将其ASCII码送入AL,同时将字符显示在屏幕上。调用方法:MOVAH,1INT21H说明:输入一个字符后,不需要回车。若只输入回车,则AL=0DH。 (2)显示一个字符功能号:02H。入口参数:DL=要显示字符的ASCII码。出口参数:无。4.4常用DOS系统功能调用和BIOS功能:在当前光标位置显示DL中的字符,光标右移。调用方法示例:MOVDL,‘A’;显示字符’A’MOVAH,2INT21H (3)显示一个字符串功能号:09H。入口参数:DS:DX=欲显示字符串在内存的首地址,且字符串必须以‘$’(24H)作为结束符。出口参数:无。4.4常用DOS系统功能调用和BIOS功能:在当前光标位置,显示由DS:DX所指的、以‘$’结尾的字符串,且光标右移。其中,‘$’不算在显示的字符串之内。 (4)从键盘读入一个字符串功能号:0AH。入口参数:DS:DX=输入缓冲区首地址。出口参数:无。功能:从键盘读入一个字符串,存放到DS:DX所指的缓冲区。4.4常用DOS系统功能调用和BIOS (5)异步通讯功能号:03H、04H。入口参数:03H无;04H为输出的8位数据在DL中。出口参数:03H为输入的8位数据在AL中;04H无。4.4常用DOS系统功能调用和BIOS03H:从标准异步通讯端口输入一个字符,并将该字符放入AL寄存器。功能:04H:将DL寄存器中的一个字符输出到标准异步通讯端口。例:输入MOVAH,3INT21H输出MOVDL,’A’MOVAH,4INT21H BIOS中断调用4.4常用DOS系统功能调用和BIOS1.INT16H:键盘输入BIOS提供了访问主要I/O设备的服务程序。①功能号AH=0:从键盘读一键。出口参数:AL=ASCII码,AH=扫描码。功能:从键盘读入一个键后返回,按键不显示在屏幕上。对于无相应ASCII码的键,如功能键等,AL返回0。扫描码是表示按键所在位置的代码。②AH=1:判断是否有键可读。出口参数:若ZF=0,则有键可读,AL=ASCII码,AH=扫描码;否则,无键可读。③AH=2:返回特殊功能键的当前状态。出口参数:AL=特殊功能键的状态。 4.4常用DOS系统功能调用和BIOS2.INT10H:显示器输出(P163、164)INT10H包含了与显示器有关的功能,可用来设置显示方式,设置光标大小和位置,显示字符等。(功能号放在寄存器AH中,共16个功能号,见P166表4-13)例:①AH=0AH:显示字符入口参数:AL=欲显示字符的ASCII码。②AH=0EH:显示字符入口参数:AL=欲显示字符的ASCII码。功能:类似于0AH功能,但显示字符后,光标随之移动,并可解释回车,换行和退格等控制符。 4.4常用DOS系统功能调用和BIOS5.INT14H:串行通讯功能调用(P169)功能:调用了驻留在ROM中的串行通讯程序。例1:AH=0:初始化串行通讯接口入口参数:AL=初始化参数(P166图4-12)。DX=通讯口号(0=COM1;1=COM2)出口参数:AH=通讯口状态。AL=调制解调器状态。功能号放在寄存器AH中,共4个功能号,见P169表4-16)P169例4-63 例:读键盘输入,显示其中的ASCII字符,按回车键退出,源程序如下。CSEGSEGMENTASSUMECS:CSEGSTART:READNEXT:MOVAH,0;读一键INT16HCMPAL,0DHJZEXITMOVAH,0EH;如非回车键,显示INT10HJMPREADNEXTEXIT:MOVAH,4CHINT21HCSEGENDSENDSTART 汇编语言源程序结构1.源程序结构源程序通常由一个或几个程序模块组成,每个模块包括数据段、堆栈段和若干代码段。代码段可有若干个过程, 1.源程序结构NAMEMAIN_PROGMODULE数据段名SEGMENT变量定义数据空间预置数据段名ENDS堆栈段名SEGMENT;STACK定义堆栈段堆栈段空间预置堆栈段名ENDS代码段名SEGMENTASSUME段寄存器地址说明START:段地址装填主程序体 1.源程序结构过程名1PROC类型说明过程体1过程名1ENDP过程名2PROC类型说明过程体2过程名2ENDP…过程名NPROC类型说明过程体N过程名NENDP代码段名ENDSENDSTART 1.源程序结构对于以上汇编语言源程序的结构中的具体内容,前面已经作过介绍,这里应指出的是:任何一个汇编语言源程序至少应该含有一个代码段,必须用END伪指令告诉汇编程序,汇编到此结束。堆栈段和数据段视需要而定。如果使用堆栈操作,用户最好自己设置堆栈,若不设置用户专用堆栈空间,将自动使用系统的堆栈空间。当有变量定义或预置数据空间时,应在数据段/附加段中进行定义。 1.源程序结构例:DATASEGMENTADW2357BDW7684CDB0A5HDDB34HEDW?GDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,A;3257AXADDAX,B;A+BMOVE,AX; 1.源程序结构例:MOVAL,CADDAL,DMOVBYTEPTRG,ALMOVAH,4CH;返回操作系统INT21HCODEENDSENDSTART以上程序的功能是将存储字变量A和B相加,结果送至存储器字变量E中;将存储器字节变量C和D相加,结果送字节变量G中。 1.源程序结构例2:NAMESIMPLE_EXAMPLEDATASEGMENTSTR1DB'ThisisMyFirstProgram$'DATAENDSCODESEGMENTASSUMECS∶CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDX,STR1MOVAH,09HINT21H;DOS功能调用MOVAH,4CHINT21HFIRST_CODEENDSENDSTART屏幕上显示一行字符 2.对汇编源程序中的几个问题的说明1)程序的分段定义及段寄存器的装填整个程序是由若干个逻辑段组成的,至少应有一个代码段被定义。段定义的伪指令为SEGMENT和ENDS。ASSUME伪指令指出各逻辑段所应该装填的地址,但并没有将段基址装入相应的段寄存器中。ASSUME指出了各段寄存器与当前被使用的逻辑段的对应关系。CS是系统在加载程序后由系统自动装填的,即由操作系统的任务(进程)管理程序自动完成装填的。CS装填不需要用户管理。 2.几个问题的说明1)程序的分段定义及段寄存器的装填堆栈段SS也可以不用用户装填,可由系统自动装填,此时必须在定义堆栈段伪指令中,把参数写全。其形式如下:STACKSEGMENTPARASTACK‘STACK’当程序装入内存时,系统会自动地把堆栈段地址和栈指针置入SS和SP中,但如果没有给出必要的参数,则还应由用户装填SS和SP寄存器值。DS、ES、SS的装填可以使用实例中的两条指令:MOVAX,DATAMOVDS,AX 2.几个问题的说明2)MS-DOS环境下正确返回DOS的问题汇编语言程序可以在DOS环境下直接运行,例如经过汇编后生成带后缀.COM或.EXE可执行文件的形式,也可以由.EXE文件再转换成.BIN二进制文件的形式被其它高级语言调用。但汇编语言通常都以.EXE文件进行调试,所以,应解决程序执行后正常返回DOS系统的问题,否则往往以死机结束。通常,可以用以下三个方法之一返回DOS:(1)用功能调用4CH一般在主程序的代码段结束前插入下面两条指令:MOVAH,4CHINT21H 2.几个问题的说明2)MS-DOS环境下正确返回DOS的问题执行以上两条指令后,将由系统结束程序并返回到DOS状态下,给出DOS提示符,等待新的命令键入。这是最常用的一种返回DOS的方法。(2)用中断INT20H系统把中断号20H作为结束任务返回DOS的服务功能使用。故在用户程序结束时,可插入一条INT20H指令。(3)在装填DS之前用下面三个语句:PUSHDSMOVAX,0PUSHAX 4.5程序设计方法和上机调试一、汇编语言应用程序的开发过程开发8086/8088汇编语言源程序的过程如下:①用文本编辑程序建立和修改源程序。(PWB、EDLINT、WS、EDIT)②调用宏汇编程序(MASM)对源程序进行汇编。③利用连接程序(LINK)把汇编后生成的目标文件连接装配成为可执行的文件。④利用调试程序(DEBUG)对可执行文件进行调试(扩展名为.EXE或.COM的可执行文件)。⑤在DOS下运行可执行的文件 一、汇编语言应用程序的开发过程1、源文件的建立和汇编1)用EDLIN.COM程序建立、编辑源程序文件假定:符号表示键入回车符,DOS操作系统,当前磁盘是D盘,设计的程序保存在D磁盘上的MASM子目录中。例:设计一个名为OUTCHAR.ASM的源程序。D:MASM>EDIT[D:]OUTCHAR.ASMOUTPUTCHARACTER0-9STACKSEGMENTPARASTACK′STACK′…… 汇编语言应用程序 的开发过程1、源文件的建立和汇编通过以上操作,建立了一个名为OUTCHAR.ASM的汇编语言源程序。ENDSTART+XD:MASM> 汇编语言应用程序 的开发过程1、源文件的建立和汇编在DOS下,可以用TYPED:OUTCHAR.ASM命令,将D盘上存放的该文件的内容送至屏幕显示出来。若发现有错误,可继续调用程序对该文件进行修改,直至没有错误为止。 汇编语言应用程序 的开发过程1、源文件的建立和汇编2)调用宏汇编程序MASM对源程序进行汇编D:MASM>MASMD:OUTCHARMicrosoft(R)MacroAssemblerVersion5.00Copyright(C)MicrosoftCrop1981-1985,1987,Allrightsreserved.Sourcefilename[.ASM]:outcharObjectfilename[outchar.OBJ]:(如不修改则)Sourcelisling[NUL.LST]:[D:outchar]Crossreference[NUL.CRF]:[D:outchar]0WarningErrors0SevereErrors 1、源文件的建立和汇编2)调用宏汇编程序MASM对源程序进行汇编其中Objectfilename为目标文件名,可以采用方括号内的文件名,也可以重新输入一个文件名。Sourcelisting要求输入源列表文件名,当不要求产生.LST文件时,可用回车回答,也可输入一个列表文件名。Cross-Reference要求输入索引文件名。回答方法类似于源列表文件名情况。但.CRF文件不是文本文件,不能用TYPE命令列出。 汇编语言应用程序 的开发过程2、链接利用LINK程序将.OBJ文件连接成可执行的文件(.EXE)D:MASM>LINK[C:][OUTCHAR]Microsoft(R)OverlayLinkerVersion3.60Copyright(C)MicrosoftCorp1983-1987,AllrightsreservedObjectModules[.OBJ]:RunFile[outchar.EXE]:[D:OUTCHAR]ListFile[NUL.MAP]:[D:]OUTCHARLibraries[.LIB]:[Warning:NoStackSegment][ThereWas1ErrorDetected] 汇编语言应用程序 的开发过程3、调试利用DEBUG程序调试OUTCHAR程序一般情况下,经过一次汇编就能顺利通过的应用程序往往是较少的。对一个大的程序,往往被划分为若干个模块,并对它们分别进行编写、汇编和连接,然后利用DEBUG程序分别对各个模块进行调试。调试成功后,再进行最后的连接、调试,直至程序能正常运行为止。因此,利用DEBUG程序对汇编连接后的程序进行调试是重要的手段之一。 补充DOS命令任何命令可以使用帮助列出功能和格式,方法如下:d:commandName/?常见的DOS命令:命令名称功能type文件名显示文本文件的内容copy源文件,目的文件复制文件cd..进入上一级目录cd进入根目录cd子目录名进入该子目录分区名:进入另一个分区其中的文件名应该包括路径,如果文件在当前目录则可以省略路径

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭