微机原理课件第9讲.pptx

上传人:莉*** 文档编号:72538466 上传时间:2023-02-12 格式:PPTX 页数:67 大小:399.45KB
返回 下载 相关 举报
微机原理课件第9讲.pptx_第1页
第1页 / 共67页
微机原理课件第9讲.pptx_第2页
第2页 / 共67页
点击查看更多>>
资源描述

《微机原理课件第9讲.pptx》由会员分享,可在线阅读,更多相关《微机原理课件第9讲.pptx(67页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、1上节内容回顾汇编程序的基本结构汇编语言中的表达式第1页/共67页2实验一【实验题目】熟悉实验环境和程序设计实验【实验目的】熟悉并掌握ADEK教学平台使用方法。熟悉并了解汇编语言程序设计方法。【实验内容】教材P122,10、14题,要求将已知条件编入程序,按标号书写各语句。分析各语句的功能并记录运行结果与预期是否相符。第2页/共67页3实验一CODE SEGMENTASSUME CS:CODESTART:MOV AX,2508H MOV BX,0F36H MOV CX,0004H MOV DX,1864H;you codeCODE ENDSEND STARTAND AH,CL要求逐条指令执行记

2、录目的操作数的结果 CF的值怎么看?第3页/共67页4实验一(1)AND AH,CL(2)OR BL,30H(3)NOT AX(4)XOR CX,0FFF0H(5)TEST DH,0FH(6)CMP CX,00H(7)SHR DX,CL(8)SAR AL,1 第4页/共67页5实验一(9)SHL BH,CL(10)SAL AX,1(11)RCL BX,1(12)ROR DX,CL第5页/共67页6实验一2、在下列程序段的括号中分别填写如下指令(1)LOOP NEXT(2)LOOPE NEXT(3)LOOPNE NEXT说明在这三种情况下,程序段执行完后,AX,BX,CX,DX寄存器的内容分别是

3、什么。START:MOV AX,01H MOV BX,02H MOV DX,03H MOV CX,04HNEXT:INC AX ADD BX,AX SHR DX,1 (YOU CODE)CODE SEGMENTASSUME CS:CODECODE ENDSEND START第6页/共67页7第四章 汇编语言程序设计4.1 汇编语言的程序结构和语句格式4.2 伪指令语句4.3 汇编语言程序设计基础第7页/共67页84.2 伪 指 令 语 句【伪指令语句】在汇编期间进行处理,主要完成变 量定义,存储器分配,指示程序开 始和结束,段定义,段分配等。伪指令没有对应的机器代码,不像指令语句那样由CPU来

4、执行,它是由汇编程序在汇编期间进行处理。伪指令则不产生与之相应的目标代码。第8页/共67页9伪指令语句分类数据定义语句,如DB,DW,DD等标号赋值语句,如EQU,=等段定义语句,如SEGMENTENDS段分配语句,如ASSUME过程定义语句,如PROCENDP程序开始结束语句,如ORG,END第9页/共67页10数据定义伪指令【格式1】变量名 助记符 操作数1,操作数n ;注释【格式2】变量名 助记符 n DUP(操作数1,操作数n);注释 功能:将操作数存入变量名指定的存储单元中,或者 只分配存储空间不存入数据。变量名:用符号表示,可以省略,后面不跟冒号。汇编时将变量助记符后的第一个字节的

5、偏移地址作为它的符号地址。助记符:所用伪指令助记符主要有 DB,DW,DD,DQ,DT。第10页/共67页11数据定义伪指令操作数:操作数可以是常数,字符串,变量,标号,表达式等。多个操作数之间必须用逗号分开;格式2中,n必须是正整数。注释:说明伪指令的功能,可以省略,注释前必须带分号“;”,如果注释在一行中注释写不下,换行写时,前面必须加上分号。第11页/共67页12数据定义伪指令【例】操作数是常数和表达式DA1 DB 10H,52HDA2 DW 1122H,34HDA3 DD 5*20H,0FFEEH 汇编后数据在存储器中存放格式如图所示:105222113400DA1DA21122H34

6、HA0000000DA3EEFF000000A0H0FFEEH第12页/共67页13数据定义伪指令【例】操作数是字符串FIRST DB HELLOSE DW OK DW在定义字符串时,只能定义两个,若要定义多个字符,只能用DB。汇编后数据在存储器中存放格式如图所示:48454C4CFIRSTHELLO 4B4FSEKO 4F第13页/共67页14DB与DW在存放上的区别NUM1 DB 12H,34H NUM2 DW 1234HCHAR1 DB OK CHAR1 DW OK1234NUM13412NUM24F4BCHAR1OK4B4FCHAR2KO第14页/共67页15数据定义伪指令【例】操作数

7、用DUP定义重复变量。ONE DB 5 DUP(0)TWO DW 10 DUP(?)THR DB 4 DUP(1,2 DUP(20H)00ONE?TWO00?012020THR0120205 个20 个4 个第15页/共67页16数据定义伪指令【例】用地址表达式定义变量。ONE DW PAR1TWO DW ADR2THR DD ADR3 此表达式中,分别将PAR1,ADR2的偏移地址赋给字变量ONE和TWO,以及将ADR3的偏移地址和段基址赋给双字变量THR。设CS=2000H,偏移地址分别为0100H,0200H,0300H,汇编后存储情况如图所示。00ONE00TWO01020003002

8、0THRPAR1偏移地址ADR2偏移地址ADR3偏移地址段基址第16页/共67页17数据定义伪指令【例】变量的类型属性可以通过属性操作符PTR来指定。OPER1 DB 1,23HOPER2 DW 6677H,1234H 观察以下指令:MOV AX,OPER1+1 MOV AL,OPRE2正确的指令如下:MOV AX,WORD PTR OPER1+1;AX=7723HMOV AL,BYTE PTR OPER2;AL=77H01OPER177OPER223663412第17页/共67页18下列变量各占多少字节?A1DW23H,5876HA2DB3 DUP(?),0AH,0DH,$A3DD5 DUP

9、(1234H,567890H)A4DB4 DUP(3 DUP(1,2,ABC)A1:2*2=4 A2:3+3=6 A3=5*(4+4)=40 A4:4*(3*5)=60课堂练习第18页/共67页19表达式赋值语句 表达式赋值语句有两种,赋值语句EQU和等号语句=,两者均不占用内存。【EQU语句格式】符号名 EQU 表达式【功能】给变量、标号、常数、指令、表达式等定义一 个符号名,一经定义在同一个程序模块中不能 重新定义。第19页/共67页20EQU赋值语句【举例】EQU 表达式COUNT EQU 100;常数值赋给符号名COUNTDATA EQU COUNT 2;表达式值赋给符号名DATAA1

10、 EQU DXSI;变址寻址存储单元内容赋给A1B1 EQU OFFSET A1;偏移地址值赋给符号名B1C1 EQU ADD;加法指令赋给符号名C1 PURGE语句可以解除对某一个标号的赋值,使它在后面可以重新定义。PURGE C1;C1不再代替ADD 在EQU语句右边表达式中的变量或标号,必须预先定义,上例中,若无COUNT EQU 100的定义,汇编时对第2条语句会报错。第20页/共67页21等号语句=【=语句格式】符号名=表达式【功能】给变量、标号、常数、指令、表达式等定义一 个符号名,允许重复定义。【举例】等号语句=COUNT=100 COUNT=COUNT+10 A1=BX+SI

11、MOV AX,A1;BX+SI内容送AX A1=BX第21页/共67页22有符号定义语句如下:BUF DB3,4,5,123ABUF DB0L EQU ABUF-BUF求L的值为多少?答案:L=6课堂练习第22页/共67页23段定义语句【段定义语句】SEGMENTENDS【常见格式】段名 SEGMENT 逻辑段内容 段名 ENDS 我们在学习时,可以忽略其它因素,会识别,使用常用格式即可。第23页/共67页24段分配语句【段分配语句】ASSUME【格式】ASSUME CS:段名,DS:段名,SS:段名,ES:段名段名必须是前面段定义语句SEGMENTENDS中定义的段名。代码段和数据段的定义是

12、必须的。段程序开始时,需要将数据段(除代码段)的段基址装入相应的段寄存器中。数据段段基地址DS,堆栈段段基地址SS,扩展段段基地址ES,第24页/共67页25【例例】两个两个16位无符号二进制数相乘位无符号二进制数相乘DATA SEGMENTD1DW 1234HD2DW 5678HP1DW?P2DW?DATA ENDSSTACK SEGMENT STACK STACKSTTDB 100 DUP(?)TOPEQULENGTH STTSTACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:;程序部分 CODE ENDSEND STAR

13、T数据段堆栈代码段第25页/共67页26程序部分程序部分 MOV AX,STACK;初始化SS,SPMOV SS,AXMOV SP,TOP;栈顶偏移地址送堆栈指示器SP中。MOV AX,DATA;初始化DS,必须先送AX,再转存MOV DS,AXL1:MOV AX,D1;D1*D2,积的高位在DX,低位在AXMUL D2MOV BX,OFFSET P1;积送P2和P1 指向的存储单元MOV BX,AXMOV BX+2,DXMOV AH,4CHINT 21H;可参阅教材P140,返回DOS方式不一样。第26页/共67页27过程定义语句过程也程为子过程,可以节省存储空间,模块化设计【格式】过程名

14、PROC 属性 ;过程内容 RET N 过程名 ENDP【功能】定义一个过程,主程序可以用CALL指令调用过程名:过程的名字,不可缺省,为子程序的入口地址具有三个属性:段属性、偏移地址属性、距离属性。第27页/共67页28过程定义语句PROCENDP:过程定义伪指令助记符,成对出现,不可缺省。二者前面有相同的过程名。RET N:过程内部的返回指令。q过程内部至少有一条RET指令,可以在过程的任何位置,使过程返回到主程序。q过程内部可以有多个RET,表示此过程具有多个返回出口(在不同条件下,从不同出口返回)。qN为弹出值,N必须为正偶数,可以缺省。过程调用允许嵌套和递归调用。嵌套与递归的深度由堆

15、栈段的容量决定。第28页/共67页29【例例】用过程调用的方法,将内存中用过程调用的方法,将内存中4个十六进制数进行个十六进制数进行相加相加DATA SEGMENTONE DB 22H,33H,44H,55HTWO DB 55H,66H,77H,88HSUM DB 20 DUP(?);总和DATA ENDSSTACK SEGMENT STACK STACKSTT DB 100 DUP(?)TOP EQU LENGTH STTSTACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:;程序部分CODE ENDSEND START数据段

16、堆栈代码段第29页/共67页30主程序部分主程序部分MOV AX,STACK;初始化SS,SPMOV SS,AXMOV SP,TOP;栈顶偏移地址送堆栈指示器SP中MOV AX,DATAMOV DS,AX;初始化DS,必须先送AX,再转存MOV SI,OFFSET ONE;ONE偏移地址送SIMOV DI,OFFSET TWO;TWO偏移地址送DIMOV BX,OFFSET SUM;和的偏移地址送BXCLC ;清除进位位MOV CX,4L1:CALL ABCLOOP L1MOV AH,4CHINT 21HABC PROCMOV AL,SIADC AL,DIMOV BX,ALINC SIINC

17、DIINC BXRETABC ENDP第30页/共67页31程序结束语句END【格式】END 标号名【功能】标记汇编源程序结束。END伪指令助记符,不可缺省,放在源程序的最后一行,每个模块只有一个END,汇编程序遇到END语句即停止汇编。标号名是该程序中第一条可执行语句的编号,可以缺省,若一个程序包含多个模块,END后面带的标号为主程序模块中的标号名称。第31页/共67页32系统功能调用系统功能调用是微机的磁盘操作系统DOS为用户提供的一组例行子程序,因而又称为DOS系统功能调用。这些子程序可分为以下四个主要方面:(1)磁盘的读/写及控制管理;(2)内存管理;(3)基本I/O管理(如键盘、打印

18、机、显示器等);(4)其他管理(如时间、日期等)。常用系统功能调用和BIOS中断调用第32页/共67页33键盘和显示器的DOS调用调用号调用号功能功能入口参数入口参数出口参数出口参数1键入并显示一个字符键入字符的ASCII码放在AL中2显示器显示一个字符DL中输出字符的ASCII码5打印机打印一个字符DL中输出字符的ASCII码8键盘输入一个字符,无回显键入字符的ASCII码放在AL中9显示器显示一个字符串DS:DX置字符串的首地址,字符串以$结束0A键入并显示一个字符串DS:DX置字符串的首地址,第一单元置允许键入的字符数键入的字符从第3单元开始存放4C带返回码结束AL中置返回码第33页/共

19、67页34对于所有的功能调用(包括设备管理、文件读写等子程序),使用时一般需要经过以下三个步骤:子程序的入口参数送相应的寄存器(有些子程序调用不需要入口参数,此步可略)。子程序编号送AH。发出中断请求:INT 21H(系统功能调用指令)。DOS调用的步骤第34页/共67页35【调用格式】MOV AH,1INT 21H系统执行该功能时将扫描键盘,等待键入。一旦有键按下,就将键值(相应字符的ASCII码值)读入,先检查是否是Ctrl-Break,若是,则退出命令执行;否则将键值送入AL寄存器,同时将这个字符显示在屏幕上。1号功能调用8号调用与其类似,区别在于在显示器上不回显第35页/共67页36【

20、调用格式】MOV DL,待显示字符的ASCII码 MOV AH,2 INT 21H 本调用执行后,显示器显示其ASCII码值放入DL中的字符。2号功能调用5号调用与其类似,打印机打印DL中的字符第36页/共67页37【调用格式】MOV DX,待显示字符串首字符的偏移地址MOV AH,9 INT21H 本调用执行后,显示器显示待显示的字符串。调用时,要求DS:DX必须指向内存中一个以“$”作为结束标志的字符串。9号功能调用第37页/共67页38 DATASEGMENT BUF DB HOW DO YOU DO?$DATAENDS CODE SEGMENTASSUME CS:CODE,DS:DAT

21、A START:MOV AX,DATAMOV DS,AXMOV DX,OFFSET BUFMOVAH,9INT 21H 9号功能调用举例屏幕上显示HOW DO YOU DO?第38页/共67页39【调用格式】MOV DX,数据区的首偏移地址 MOV AH,10 INT 21H 能从键盘接收字符串到内存的输入缓冲区,要求预先定义一个输入缓冲区,缓冲区的第一个字节指出能容纳的最大字符个数,由用户指出;第二个字节存放实际输入的字符个数,由系统写入;从第三个字节开始存放从键盘接受的数据直到回车键。10(0AH)号功能调用第39页/共67页40 BUF DB 100;用户定义存放用户定义存放100字节的

22、缓冲区字节的缓冲区 DB?;?;系统填入实际输入字符字节数系统填入实际输入字符字节数 DB 100 DUP(?);存放输入字符的存放输入字符的ASCII码值码值 MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUF MOV AH,0AH INT 21H MOV BX,DX MOV CL,BX+1;取输入字符数送取输入字符数送CL ADD DX,2;使指针指向第一个字符。使指针指向第一个字符。10(0A)号功能调用举例第40页/共67页41汇编语言程序设计基础 好程序的标准:模块化设计,易读、易调试、易维护。执行速度快。占用内存空间小。第41页/共67页42设计汇编语言

23、源程序的基本步骤分析问题绘制流程图 分配存储空间和工作单元 编写程序 上机调试程序运行,分析结果 抽象出问题的数学模型,确定实现算法。形式化描述算法。绘制时,从粗到细。分配数据段、堆栈段、程序段的位置,确定寄存器主要作用按流程图设计来编写程序,实现功能。检查程序的语法错误和逻辑错误。运行程序测试数据是否符合预期。第42页/共67页43顺序结构 分支结构 循环结构 子程序结构四种程序结构第43页/共67页44顺序结构【特点】顺序执行,程序通常简单;无分支、无循环、无转移 图中无判断框;开始语句1 1语句n结束第44页/共67页45【例例】内存从内存从Table开始存放开始存放0-9的平方值,通过

24、人机对话,的平方值,通过人机对话,当给定一个数当给定一个数X(0-9),),查表得出查表得出X得平方值,放入得平方值,放入AL中。中。分析问题:首先在内存中开辟区域存放Table内容,利用01功能调用从键盘上输入一个数据,利用XLAT查表即可获得数据置入AL即可。流程图:如图所示。开始提示输入数据查表 结果送AL结束接收数据第45页/共67页46Table0149162536496481 Step 1:Step 2:查表;9号功能调用,提示用户输入数据MOV AH,01HINT 21H;1号功能调用,键值存入AL中MOV BX,OFFSET TableXLAT;表交换指令【例例】内存从内存从T

25、able开始存放开始存放0-9的平方值,通过人机对话,的平方值,通过人机对话,当给定一个数当给定一个数X(0-9),),查表得出查表得出X得平方值,放入得平方值,放入AL中。中。第46页/共67页47【例例】内存从内存从Table开始存放开始存放0-9的平方值,通过人机对话,的平方值,通过人机对话,当给定一个数当给定一个数X(0-9),),查表得出查表得出X得平方值,放入得平方值,放入AL中。中。DATA SEGMENTTable DB 0,1,4,9,16,25,36,49,64,81BUF DB input number:,0DH,0AH,$DATA ENDSCODE SEGMENT AS

26、SUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUF MOV AH,09H;0D,0A代表回车换行,9号功能调用 INT 21H MOV AH,1;1号调用,数据送AL INT 21H AND AL,0FH MOV BX,OFFSET TABLE XLAT CODE ENDSEND START第47页/共67页48分支结构【分支结构】程序根据不同条件选择不同的处理方法。图中可以有一个到多个判断条件。语段2 2语段3 3判断条件2语段1 1判断条件1语段4 4N NYY第48页/共67页49【例例】存储器中有一字符串首

27、地址为存储器中有一字符串首地址为BUF,字符串长度小于,字符串长度小于256,要求分别计算出数字,要求分别计算出数字0-9,字母,字母A-Z和其它和其它字符的个数,并分别将它们的个数存放到此字符串的下面三个字符的个数,并分别将它们的个数存放到此字符串的下面三个单元中。单元中。分析问题:对于BUF中的字符串,取出一个字符,将字符的ASCII码和数字09(30H39H)及字母AZ(41H5AH)进行比较并计数,最后存入内存单元中。流程图:如图所示。开始取字符数入CXDL=DL+1结束取字符CX=0?DH=DH+1N为数字09?NYY为字母AZ?YN第49页/共67页50【例】存储器中有一字符串首地

28、址为BUF,字符串长度小于256,要求分别计算出数字0-9,字母A-Z和其它字符的个数,并分别将它们的个数存放到此字符串的下面三个单元中。DATA SEGMENT BUF DB N DB 01H,38H,47H,90H,33H,09H,76H NUM DB 3 DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX LEA BX,BUF MOV CX,BX;取字符数N放入CX中 MOV DX,0;计数DH,DL清零 INC BX;指向首字符第50页/共67页51【例】存储器中有一字符串首地址为B

29、UF,字符串长度小于256,要求分别计算出数字0-9,字母A-Z和其它字符的个数,并分别将它们的个数存放到此字符串的下面三个单元中。LP:MOV AL,BX CMP AL,0 JL NEXT;指向下一个字符 CMP AL,9 JG ABC;是否为字符 INC DH JMP NEXT ABC:CMP AL,A JL NEXT CMP AL,Z JG NEXT INC DL;判断字符范围 NEXT:INC BX LOOP LP ;CX不为零,循环 LEA BX,NUMMOV BX,DHMOV BX+1,DLMOV AL,BUFSUB AL,DHSUB AL,DLMOV BX+2,AL CODE E

30、NDS END START第51页/共67页52循环结构【循环结构】程序根据需要重复执行某段语句以完成某特定功能。一般可以分成两种结构形式:先执行,后判断:进入循环后至少要执行一次循环体,再判断循环是否结束。适合于循环次数固定的程序。先判断,后执行:进入循环后,先判断循环结束条件,再决定是否执行循环体,可能循环体一次也不执行。适合于循环次数不固定的程序。第52页/共67页53先执行,后判断初始化部分入口循环体修改参数循环控制出口初始化部分入口循环体修改参数循环控制出口先判断,后执行循环结构第53页/共67页54循环结构【循环结构四部分】初始化:设置循环计数值,设置变量初值。循环体:循环部分的核

31、心:循环的全部执行指令。修改参数:修改操作数地址,为下次循环作准备。循环控制:修改计数器值,判断循环控制条件,决定是 否跳出循环。第54页/共67页55【例】AX寄存器中有一个16位二进制数,编程统计其中1的个数,结果放到CL寄存器。MOV CL,0;初始化 L1:AND AX,AX;控制循环 JZ STOP SAL AX,1;循环体 JNC L2 INC CL L2:JMP L1STOP:HLT两个问题:如何判断某位为1?循环次数如何控制?第55页/共67页56多重循环 有些循环结构比较复杂,需要多重循环完成。【例】存储器数据段从BUF开始存放一个字数组,数组中第一个字中存放该数组的长度N,

32、编制一个程序将此数组中的数据按照从小到大的次序排列。用冒泡排序完成。第56页/共67页5776HA768H1256HA768H3412HA768H15A768H3786003412H1256H76H15428563786001333046941183412H A768H1256H76H378600153412H A768H76H8600371256H153412H A768H1256H86003776H153412H A768H1256H86003776H153412H A768H1256H86003776H15冒泡排序过程第57页/共67页58DATA SEGMENTBUF DW N,15,

33、37,8600,0A768H,3412H,1256H,76HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXSTOP:MOV AH,4CHINT 21HCODE ENDSEND START程序主要部分程序主要部分第58页/共67页59MOV BX,0MOV CX,BUFBX;循环次数放CX中DEC CXL1:MOV DX,CX;保存CX,外循环次数L2:ADD BX,2MOV AX,BUFBXCMP AX,BUFBX+2;相邻两数比较 JBE NEXT;小于等于,比较下一对XCHG AX,BUFBX+2;

34、大于则交换MOV BUFBX,AX;写入内存NEXT:LOOP L2;内循环MOV CX,DXMOV BX,0LOOP L1;外循环如何优化?标志BH=0MOV BH,0修改标志MOV BH,1CMP BH,0JE STOP第59页/共67页60子程序结构 多次使用的程序段可以写成一个相对独立的程序段,将它定义为“过程”或“子程序”,需要执行这段程序时,就进行“过程”调用,执行完毕后再返回原来调用它的程序。子过程定义:SUBPROC PROC RETSUBPROC ENDP第60页/共67页61DATA SEGMENTARY1 DW 100 DUP(?)SUM1 DW?ARY2 DW 100

35、DUP(?)SUM2 DW?DATA ENDSCODE SEGMENTASSUME CS:CODE DS:DATASTART:MOV AX,DATAMOV DS,AX;主程序部分;主程序部分 CODE ENDS END START数据段定义两个数组,编程实现数组分别求和(不计溢出)第61页/共67页62LEA SI,ARY1MOV CX,LENGTH ARY1CALL SUMLEA SI,ARY2MOV CX,LENGTH ARY2CALL SUMMOV AH,4CHINT 21HSUM PROC XOR AX,AXL1:ADD AX,WORD PTRSIADD SI,2LOOP L1MOV WORD PTRSI,AX RETSUM ENDP子程序主程序数据段定义两个数组,编程实现数组分别求和(不计溢出)第62页/共67页63子程序嵌套l 子程序本身又调用其它子程序,称为子程序嵌套。l 嵌套的层数本身不限,受堆栈空间限制。第63页/共67页64主程序Call A子程序ACall B子程序BRETRET子程序嵌套继续执行主程序第64页/共67页65小结伪指令语句的分类与功能DOS功能调用的介绍程序设计的结构及应用第65页/共67页66本节作业【P199】6【P199】8第66页/共67页感谢您的观看!第67页/共67页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > PPT文档

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com