欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载  

    第3章常用伪指令与汇编语言程序设计顺序程序与分支程序.ppt

    • 资源ID:11772852       资源大小:308KB        全文页数:55页
    • 资源格式: PPT        下载积分:8
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要8
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第3章常用伪指令与汇编语言程序设计顺序程序与分支程序.ppt

    GLUT_C 2013-08 J.CB,1,3.3. 程序的基本结构,最基本的程序结构:顺序结构、分支结构、循环结构。,子程序、中断服务程序是一种特殊的程序,它们也是由以上三种基本结构构成的。,GLUT_C 2013-08 J.CB,2,3.3.1 简单程序设计,例:编写程序将字变量W中的无符号数W=65525除以8,将商保存在字变量QOUT中,将余数保存在字节变量REMA中。 算法分析: 可以使用除法指令,也可以使用右移三位实现除以8的运算。 65525 0FFF5H 1111 1111 1111 0101B,(1)右移3位,移出的三位就是余数,剩余的就是商。 余数的保留:可以选择两种方法,GLUT_C 2013-08 J.CB,3,GLUT_C 2013-08 J.CB,4,使用伪指令定义W、QOUT、REMA三个内存单元,W、QOUT为16位,REMA为8位。,这里的结束是结束应用程序,返回操作系统。 可以使用INT 21H的 4CH号功能调用返回操作系统 MOV AH,4CH INT 21H,GLUT_C 2013-08 J.CB,5,DATA SEGMENT DATA WDW 65525 QOUTDW? REMADB? DATA ENDS CODESEGMENT CODE ASSUME CS:CODE, DS:DATA START:MOVAX,DATA;取数据段开始地址 MOVDS,AX;数据段开始地址送数据段基址寄存器 MOVAX,W;从存储器取出DS:WAX MOVBL,0;余数寄存器清0 SARAX,1;算术右移1位,符号不变,W最低位进入C RCRBL,1;带进位循环右移1位,C进入BL最高位 SARAX,1;算术右移1位,符号不变,W次低位进入C RCRBL,1;带进位循环右移1位 SARAX,1;算术右移1位,符号不变,W次低位进入C RCRBL,1;带进位循环右移1位,余数在BL高3位 MOVCL,5,数据段结束,代码段开始,数据段开始,GLUT_C 2013-08 J.CB,6,SARBL,CL;余数右移5位,将其移到BL低3位 MOVQOUT,AX;保存商 MOVREMA,BL;保存余数 MOVAH, 4CH INT21H CODE ENDS END,本程序是返回操作系统,代码段结束,汇编源程序结束,GLUT_C 2013-08 J.CB,7,还有就是: W直接取低3位作为余数 然后W右移3位得到商,开始,定义W、QOUT、REMA,AXW ,REMA 7 REMA REMA AND AL,AX右移3位 QOUT AX,开始,AX右移3位: MOV CL ,3 SAR AX , CL 注意:如果是带符号数,就要用算术右移SAR,不要用逻辑右移SHR 对于无符号数,则可用SAR或SHR 这里选用SAR,GLUT_C 2013-08 J.CB,8, MOVAX,W;从变量W取数据 MOV REMA, 7;余数变量REMAP赋值00000111B ANDREMA,AL;余数是AL的 最低3位, MOV CL,3; SARAX, CL;算术右移3位,符号不变,AX中得到商 MOVQOUT,AX;保存商 MOVAH, 4CH INT21H 该程序结果相同,但程序代码简单了,执行速度也快了,GLUT_C 2013-08 J.CB,9,(2) 使用除法指令 DIV src 注意:对于8086处理器 为了商是字数据, 被除数32位:DXAX(DX0,AXW) 除数16位 BX8 DIV BX 商在AX, 余数在DX,对于本次运算,余数为字节数据,实际上只有DL有效,.DATA W DW 65525 QOUT DW ? REMA DB ? .CODE MOVAX, DATA MOVDS, AX MOV DX,0 MOV AX,W MOV BX,8 DIV BX MOV QOUT, AX MOV REMA, DL MOVAH, 4CH INT 21H END,如果是带符号数,应该使用符号扩展指令CWD和带符号除法指令IDIV 由于题目指定是无符号数,这里可以将高16位扩展为0,用DIV除法指令,GLUT_C 2013-08 J.CB,10,例 将AX中的3位BCD数转换为二进制数存入字节变量SB中(AX中的数大于0,小于255),每位十进制用一个8421编码(自然二进制编码)表示(即每一位十进制数都是用二进制表示) 十进制数的展开表达式,3位BCD码,GLUT_C 2013-08 J.CB,11,主要部分程序流程图,AL=AL+AH,AL=AL*CH,AHBL,AL=百位*10 既执行AL=AL*CH,AL=BL and 0FH AL=AL+BL,因百位*10不会大于255,AH=0,可以使用 AH右移4位,高位补0得到十位数,ALSB,保留各位十位到BL,取百位到AL ALAH,CH 10,CL=4,AH=BL,AH右移4位得到十位,由于题目给出不大于255,因此最后一次乘10加个位也只是一个字节相加,GLUT_C 2013-08 J.CB,12,M0V CH,10 MOV CL,4 MOV BL,AL ;暂存十位和个位到BL, MOV AL,AH ; 百位存入AL中 MUL CH ;百位10AX MOV AH,BL SHR AH,CL ;取十位 ADD AL,AH ;百位10 + 十位AL MUL CH ;(百位10 + 十位)10 AX AND BL,0FH ;取个位 ADD AL,BL ;(百位10 + 十位)10 +个位AL ;约定结果不大于255 MOV SB,AL ; ALSB, 如果没有明确结果不大于255,则需要考虑16位结果,GLUT_C 2013-08 J.CB,13,0999的BCD数转换为二进制,主要部分程序流程图,AL取百位,AX百位*10,AH取十位,百位*10+十位 AL=AL+AH,AX=AL*10,BL=BL and 0FH AX=AX+BX,因百位*10不会大于255,AH=0,可以使用 AH右移4位,高位补0得到十位数,AXSB,SB应该是字操作数(16位),BH要清0,AX为000999之间的BCD数,GLUT_C 2013-08 J.CB,14,M0V CH,10 MOV CL,4 MOV BL,AL ;暂存十位和个位到BL, MOV AL,AH ; 百位存入AL中 MUL CH ;百位10AX MOV AH,BL SHR AH,CL ;取十位 ADD AL,AH ;百位10 + 十位AL MUL CH ;(百位10 + 十位)10 AX AND BL,0FH ;取个位 MOV BX,0 ; BH=0, ADD AX,BX ;(百位10 + 十位)10 +个位SB ;最后结果为16位数,不能简单+低8位 MOV SB,AX ;AXSB,GLUT_C 2013-08 J.CB,15,简单程序设计例,下面再看几个补充的例题。 例 :将存储器单元DAT1中保存的一个组合BCD数转换成两个对应ASCII码值,并存入DAT2开始的两个单元,低位在前,高位在后。,GLUT_C 2013-08 J.CB,16,BCD码转换成ASCII码数据: 非压缩BCD数据在高半字节+3.例如数字5 5:0000 0101 0011 0101,得到的结果是相同的。都是在高半字节加3。,GLUT_C 2013-08 J.CB,17,该问题算法就很简单: 从DAT1取出BCD数据,先将高4位清“0”,与30H相加或进行逻辑或,存入DAT2,再取出数据,将数据逻辑右移4位(高位BCD数移到低4位,高4位变“0”,再与30H相加(或进行逻辑或),存入DAT2+1单元。 程序流程图:,GLUT_C 2013-08 J.CB,18,程序流程图,程序代码,DATA SEGMENT DAT1 DB 34H;待转换的数 DAT2 DB ?,? DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA STARA: MOV AX, DATA MOV DS, AX;送段地址 LEA SI,DAT1 LEA DI,DAT2 MOV AL,SI AND AL, 0FH ADD AL,30H MOV DI,AL MOV AL,SI,显示: MOV DL,AL MOV AH,02H INT 21H,GLUT_C 2013-08 J.CB,19,MOV CL,4 SHR AL,CL ORL AL, 30H MOV DI+1, AL MOV AH,4CH INT 21H CODE ENDS END START,如果要送到屏幕显示,则将转换结果先送DL,02送AH,调用DOS功能。 送ASCII字符显示的系统调用: 功能AH=02H, 需要显示的字符ASCII码DL , 执行 INT 21H,显示: MOV DL,AL MOV AH,02H INT 21H,AH=4CH功能调用。功能是结束本程序,返回DOS,GLUT_C 2013-08 J.CB,20,再看一个顺序程序: 编写一个计算Z=(x2-3y)/2的程序,x,y为单字节正整数,Z用2字节保存。 这是一个算术运算程序,算法设计: 首先计算 X2=X*X, 暂存该结果, 其次计算 3*y, 第三步计算 X2-3*y 第四步计算 (x2-3y)/2。该步使用算术右移实现除2运算,比用除法指令执行速度快。 依据该算法,可以画出程序流程框图。,GLUT_C 2013-08 J.CB,21,X2的计算, 可以分解为,3*Y的计算, 可以分解为,GLUT_C 2013-08 J.CB,22,;数据段定义 DATA SEGMENT XDB 25 YDB 32 ZDW? DATA ENDS ;代码段开始 CODE SEGMENT ASSUME CS:CODE, DS:DATA EXPRE PROC FAR ;过程定义,远过程 START: PUSH DS ;DS:00保存的是一条返回 SUB AX,AX ;DOS 指令。 PUSH AX ;这里,将返回DOS的地址 ;压入堆栈 MOV AX,DATA,操作系统会自动在DS:00处安排一条返回操作系统的指令,故子程序开始处向堆栈中压入 DS:00 执行RET指令,则就是转到DS:00返回DOS,GLUT_C 2013-08 J.CB,23,MOV DS,AX;数据段首地址(基地址) MOV AL , X;取变量X MOV BL,AL MUL BL;X*X=X2 MOV BX,AX MOV AL , Y;取变量Y MOV AH,0;正整数,高字节直接扩展0 MOV CX,AX ADD AX ,CX;2Y ADD AX, CX;3Y XCHG AX, BX SUB AX ,BX ;X2-3Y SHR AX ,1; 右移一位 /2 MOV Z , AX RET;将DS:00弹出到CS:IP EXPRE ENDP ;过程定义结束 CODE ENDS END START,RET 指令,转到DS:00,对于EXE格式程序,它是一条返回DOS的指令。,GLUT_C 2013-08 J.CB,24,;数据段定义 DATA SEGMENT XDB 25 YDB 32 ZDW? DATA ENDS ;代码段开始 CODE SEGMENT ASSUME CS:CODE, DS:DATA MOV AX , DATA MOV DS , AX MOV AL , X MOV BL , AL,可以使用常规返回DOS方法 INT 21H的4CH功能调用,GLUT_C 2013-08 J.CB,25,MUL BL;X*X=X2 MOV BX , AX MOV AL , Y;Y MOV AH , 0 MOV CX , AX ADD AX , CX;2Y ADD AX , CX;3Y XCHG AX , BX SUB AX , BX ;X2-3Y SHR AX ,1; 右移一位 /2 MOV Z , AX MOV AH , 4CH INT 21H EXPRE ENDP ;过程定义结束 CODE ENDS END START,用INT 21 的4CH号功能调用返回DOS。,GLUT_C 2013-08 J.CB,26,例 BCD加法程序,例如:已知字变量W1、W2分别存放两个非压缩的BCD数,编写程序求两数之和,并将结果存入SUM字变量中。 注意:W!,W2为2为字变量(2字节)压缩BCD数,0099,它们的和则可能为3位BCD数,故SUM应该定义3个字节(用DB定义三个字节)。 计算机内部只有二进制运算指令,对于BCD数运算,是十进制数,用二进制运算指令运算,需要进行调整。 加法、减法、乘法在运算后进行调整 除法在运算前先进行调整。 只有字节运算才能进行调整 非压缩BCD数加法调整 AAA(压缩BCD数加法用DAA),GLUT_C 2013-08 J.CB,27,压缩BCD加法后,用DAA调整 非压缩BCD加法后,用AAA调整 压缩BCD减法后,用DAS调整 非压缩BCD加法后,用AAS调整 压缩BCD加法后,用AAM调整 (压缩的BCD乘法,不能调整) 除法指令前用AAD调整(存放在AX中的两位非压缩BCD数),将SUM+2清0,然后进行带进位的循环左移,就可将CY移进SUM+2最低位,其余位=0,GLUT_C 2013-08 J.CB,28,例如:0809+0607=01 05 06,程序段如下:,DATA SEGMENT W1 DW 0809H W2 DW 06078H SUM DB 3 DUP(0) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MOV AX,DATA MOV DS,AX ; MOV AL,BYTE PTR W1 ;取第一个数,AL09H ADD AL,BYTE PTR W2 ; AL09H+07=10h,AF=1 AAA ;AL06H,产生CF=1 MOV SUM,AL ;保存个位,进位信号在CF MOV AL,BYTE PTR W1+1 ;AL08H,GLUT_C 2013-08 J.CB,29,ADC AL,BYTE PTR W2+1 ; AL0FH, CF=0 AAA ;AL05H, CF=1 MOV SUM+1,AL ;存百位和千位 MOV SUM+2,0 ;处理向百位的进位,先将SUM+2 RCL UM+2,1 ;清0,然后用带进位循环左移指 ;令将进位位移到SUM+2最低位 实际上,在SUM定义时,已经初始化为0,程序中可以不清0 定义的变量W1,W2,SUM在汇编语言源程序中可以直接使用,汇编程序在对源程序进行汇编时,可以识别是从变量所存放的存储器中取出数据实际上就是汇编程直接寻址指令 MOV AL,W1, 为了书写简单,我们直接写成 MOV AL,W1.,GLUT_C 2013-08 J.CB,30,以上例子,有一些只给出了实现所要求功能的核心部分分代码,没有给出段定义的完整部分。 有一些则给出了包含段定义的完整代码; 段定义的格式是相似的,可以参照教材上的例子和前面的段定义例子编写。 教材上还有一些顺序程序的例子,由于时间关系,就不一一列举了。,GLUT_C 2013-08 J.CB,31,顺序程序的结构简单,但实际程序设计中,往往需要对某些条件进行判断,依据不同的条件执行不同的分支,这样,顺序程序将不能满足要求。,GLUT_C 2013-08 J.CB,32,3.3.2 分支程序的设计,就是利用CPU的条件转移指令,通过判断某个标志为的状态,控制程序的执行过程。,GLUT_C 2013-08 J.CB,33,二分支结构,分支结构,判断,B,N,Y,ABC1,ABC2,GLUT_C 2013-08 J.CB,34,多分支结构,GLUT_C 2013-08 J.CB,35,也可以按照条件编码实现多分枝转移,例如段内间接转移指令 JMP REG 转移到CS:AX JMP WORD PTR MEM 转移到CS:MEM,K是一个不小于2的整数。,GLUT_C 2013-08 J.CB,36,我们还是通过实例来讨论。 例:内存单元M中有一个16位的带符号数,求它的绝对值,并将结果放回原处。 算法:求一个数的绝对值时,如果是正数,绝对值不变,如果是负数,则求它的机器负数(连同符号位一起每位取反,最低位+1,就是使用NEG指令)。 有了算法,可以画出程序流程图。,GLUT_C 2013-08 J.CB,37,转移目的指令给出标号(符号地址),N_DATA,负数,该标号为了阅读程序方便,判断数据的符号,在X86中就是判断SF标志位,数据传送指令不改变标志位,因此用一条逻辑运算指令 ORL Ax,AX, 它不改变AX的值,但设置标志位SF,GLUT_C 2013-08 J.CB,38,DATA SEGMENT M DW 789AH;可以任意输入一个数 DATA ENDS CODE SEGMENT ASSUME CS:CODE2,DS:DATA2 START: MOV AX,DATA MOV DS,AX LEA SI, M ;MOV SI,OFFSET M MOV AX,SI ORL AX,AX ;AND AX,AX JNS DONE ;符号为SF=0转移到DONE N_DATA: NEG AX ;负数,利用NEG指令求负 DONE: MOV SI,AX MOV AH,4CH INT 21H CODE ENDS END,GLUT_C 2013-08 J.CB,39,多分支程序,对分支程序,可以由这种2分支程序构成。,GLUT_C 2013-08 J.CB,40,计算函数的程序,x是十六位长度字数据,算法分析:取出数据X,判断它的符号,首先判断是否=0,如果不是,则是负数,Y=-1,如果是,还须再次判断是否等于0。 程序流程框图为:,GLUT_C 2013-08 J.CB,41,GLUT_C 2013-08 J.CB,42,DATA SEGMENT X DW -8 Y DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE3, DS:DATA3 START: MOV AX, DATA3 ;设置段基址 MOV DS, AX LEA SI, X;取偏移地址 MOV AX, SI AND AX,AX,GLUT_C 2013-08 J.CB,43,JNS LP1 ;SF=0,转到LP1 LP0:MOV Y,0FFH ;=0,继续判断, ;=0转到LP3 LP2:MOV Y, 01H ;X0时, y=1 LJMP END1 LP3:MOV Y,00H ;X=0时,Y=0 END1: MOV AH,4CH ;返回操作系统 INT 21H CODE ENDS END START,GLUT_C 2013-08 J.CB,44,教材上有一个例子,,算法分析:取出数据X,Y,异或,判断符号, SF=1,表明符号异号Z=0; SF=0,表明符号相同,判断是否X0,是,Z=1,否Z=-1。,GLUT_C 2013-08 J.CB,45,多分支的另一种实现方法,除了用二分支指令实现多分支外,还可以用以下指令实现: JMP REG; JMP WORD PTR MEM 例如,我们要依据AL中的低4位数据(015)不同,分别转移到对应的分支去执行,每个分支约定占用200字节空间。 这类指令应用方法如下:,GLUT_C 2013-08 J.CB,46,ANLAL, 0FH MOV BL,100 MULBL MOVAX, FUN0; JMPAX FUN0:. ORG FUN0+100 FUN1:;FUN1-FUN0=100 ;可以用定位伪指令确定每个 ;分支相距的距离 ORG FUN14+100; 只要保证这段空间能存下 FUN15:; 这段代码。,也可以是一个转移表,利用远转移指令转到各处理程序,这样各功能分值的距离就比较小,而且相距的字节数也相同。,GLUT_C 2013-08 J.CB,47,例3.9 从键盘上键入2位十六进制数将其拼合成一个字节存入字节变量SB中。 DATA SEGMENT IBUF DB 3,0,3 DUP(0) SBDB 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA MOVAX,DATA MOVDS,AX MOV DX, OFFSET IBUF ;键入2位十六进制数 MOV AH, 10 INT 21H MOV AX, WORD PTR IBUF+2 ;键入字符从+2单元开始,取出送AX SUB AX, 3030H ;字符变为十六进制数 CMP AL,0AH JB LNSUB7;09,ASCII-30H就是它对应的HEX值 SUB AL,7;AF,ASCII-37H就是它对应的HEX值,GLUT_C 2013-08 J.CB,48,LNSUB7:CMP AH,0AH JB LNSUB7 SUB AH,7 HNSUB7:MOV CL, 4 ;将AX中的数拼合成一个字节 SHL AL ,CL OR AL, AH MOV SB,AL MOV AH,4CH INT 21H CODE ENDS END,GLUT_C 2013-08 J.CB,49,例3.10 某工厂的产品有8种不同的加工处理程序P0P7,根据键盘输入,做不同的处理,若是07以外的键,则退出加工处理,此例可以用两种方法实现: 一种是用逐一比较判断,逐次比较转移实现二叉分支、整体上实现多分支; 另一种是跳转表法,直接实现多分支.,GLUT_C 2013-08 J.CB,50,方法一逐一比较法.简单,条理清楚,易于实现,但转移范围只能是:128127 DATASEGMENT INPUT DB Input( 07): $ DATA ENDS CODE SEGMENT MOVAX, DATA MOVDS,AX MOV DX , OFFSET INPUT ;显示提示符 MOV AH , 9;09号功能是显示字符串,$是字符串结束符 INT 21H; MOV AH , 1 ;等待键入一个字符到AL, INT 21H CMP AL , 0 ;为0字符则转P0 JE P0 CMP AL , 1 ;为1字符则转P1 JE P1,GLUT_C 2013-08 J.CB,51,CMP AL ,2 JE P2 CMP AL ,3 JE P3 CMP AL ,4 JE P4 CMP AL ,5 JE P5 CMP AL ,6 JE P6 CMP AL ,7 JE P7 JMP DOWN ;不是07则退出程序,GLUT_C 2013-08 J.CB,52,P0: MOV DL , 0 ;键入0则执行P0程序规定的功能 JMP EXIT P1: MOV DL , 1 ;键入1则执行P1程序规定的功能 JMP EXIT P7: MOV DL , 7 ;键入7则执行P7程序规定的功能 JMP EXIT EXIT: MOV AH ,4CH ;分支程序一定要注意汇合到结束处 INT 21H CODE ENDS END,转移到汇集点,汇集点,所有分支在执行完各自的功能后,都无条件转移到汇集点,转移到汇集点,转移到汇集点,GLUT_C 2013-08 J.CB,53,方法二:跳转表法 利用无条件的间接转移指令可实现远距离的多分支(间接跳转至不同分支的入口处) 在数据区造一地址表,存放不同的分支入口地址; 设表的首地址为PTAB,每一个入口地址占一个字单元。P0的入口地址=PTAB,Pi的入口地址PTAB2i 若将2iBX,则 JMP PTAB BX 可转到Pi入口处,GLUT_C 2013-08 J.CB,54,INPUT DB INPUT(07):$ PTAB DW P0,P1,P2,P3,P4,P5,P6,P7 ;定义地址表 LEA DX , INPUT ;显示提示 MOV AH , 9 INT 21H MOV AH , 1 ;等待键入07的数字 INT 21H CMP AL , 0 ;检查输入数据,不是07则退出 JB EXIT CMP AL , 7 JA EXIT AND AX ,07H ; 0-7,最低3位有用 ADD AX ,AX ; i2BX MOV BX ,AX JMP PTABBX ;(PTAB2i)PiIP EXIT:RET,AH=09H功能是显示字符串,字符串以$字符结束,字符串开始地址由DX指定,GLUT_C 2013-08 J.CB,55,P0: MOV DL, 0 ;键入0则显示0以替代P0程序 JMP DOWN P1: MOV DL, 1 ;键入1则显示1以替代P1程序 JMP DOWN P7: MOV DL , 7 DOWN: MOV AH , 2 INT 21H JMP EXIT,键入的ASC码为无符号数, 所以,用JB、JA等指令而不能用JG、JL等.,汇集点,所有分支在执行完各自的功能后,都无条件转移到汇集点,无条件转移返回指令地址,

    注意事项

    本文(第3章常用伪指令与汇编语言程序设计顺序程序与分支程序.ppt)为本站会员(土8路)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开