单片机原理及应用(C51版)第3章MCS-51指令系统.ppt

上传人:小飞机 文档编号:5937859 上传时间:2023-09-06 格式:PPT 页数:53 大小:859KB
返回 下载 相关 举报
单片机原理及应用(C51版)第3章MCS-51指令系统.ppt_第1页
第1页 / 共53页
单片机原理及应用(C51版)第3章MCS-51指令系统.ppt_第2页
第2页 / 共53页
单片机原理及应用(C51版)第3章MCS-51指令系统.ppt_第3页
第3页 / 共53页
单片机原理及应用(C51版)第3章MCS-51指令系统.ppt_第4页
第4页 / 共53页
单片机原理及应用(C51版)第3章MCS-51指令系统.ppt_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《单片机原理及应用(C51版)第3章MCS-51指令系统.ppt》由会员分享,可在线阅读,更多相关《单片机原理及应用(C51版)第3章MCS-51指令系统.ppt(53页珍藏版)》请在三一办公上搜索。

1、第3章 MCS-51指令系统 及汇编语言程序设计3.1 指令系统简介及寻址方式3.2 指令系统及应用举例3.3 汇编语言程序设计3.4 实训项目3,3.1 指令系统简介及寻址方式 指令系统是一种CPU所能直接执行的所有命令的集合,CPU的主要功能是由它的指令系统来体现的。MCS-51系列单片机指令系统共有111条指令,其中有49条单字节指令、45条双字节指令和17条三字节指令。MCS-51的指令系统中有64条指令的执行时间为一个机器周期(12个振荡周期),45条指令的执行时间为两个机器周期。,3.1.1 指令分类 按指令实现的功能可分为五大类:1)数据传送指令:完成数据交换、存储。包括片内RA

2、M、片外RAM、程序存储器的传送指令,交换及堆栈指令。2)算术运算类:完成各种算术运算,包括加法、带进位加、减、乘、除、加1、减1指令。3)逻辑运算类:完成逻辑运算,包括逻辑与、或、异或、测试及移位指令。4)布尔变量操作类:完成单独一位的操作,分为位数据传送、位与、位或、位转移指令。5)控制程序转移类:实现各种有条件和无条件的转移等,包括无条件转移、条件转移、子程序调用返回、中断返回及空操作指令,3.1.2 指令格式 MCS-51指令系统中的每一条指令都有两级指令格式:CPU可直接识别并执行的机器语言指令。汇编语言指令(简称汇编指令)。机器语言指令由二进制数“0”和“1”编码而成,也称目标代码

3、,执行速度最快。汇编语言指令是在机器语言指令的基础上,用英文单词或英文单词缩写表示机器语言指令的操作码(助记符),用符号表示操作数或操作数的地址。汇编语言指令实际上是符号化的机器语言,MCS-51汇编语言指令格式由以下几个部分组成:标号:操作码 目的操作数,源操作数;注释其中:中的项表示为可选项;标号:又称为指令地址符号,一般是由16个字符 组成,以字母开头的字母数字串,与操作码之间用冒号分开;操作码:是由助记符所表示的指令的操作功能;操作数:是指参加操作的数据或数据的地址;注释:是为该条指令作的说明,以便于阅读。操作码是指令的核心,不可缺少,其他几项根据不同指令为可选项。,3.1.3 寻址方

4、式 所谓寻址方式就是寻找或获得操作数的方式。MCS-51指令系统的寻址方式有以下7种:1.立即寻址 在立即寻址方式中,操作数直接出现在指令中。操作数前加“#”号表示,也称立即数。指令的操作数可以是8位或16位数。例如:MOV A,#26H;A26H 指令执行结果:(A)=26H,即把立即数26H直接送到A中。,2.直接寻址 在直接寻址方式中,操作数的单元地址直接出现在指令中,这一寻址方式可进行内部存储单元的访问。它包括:(1)特殊功能寄存器地址空间。这也是惟一可寻址特殊功能寄存器(SFR)的寻址方式。例如:MOV TCON,ACC 指令执行结果:累加器A的内容传送给寄存器TCON。(ACC在汇

5、编后的机器码为字节地址E0H,因而为直接寻址。而A表示对累加器的寄存器寻址。)(2)内部RAM的低128字节 例如:MOV A,76H 指令执行结果:内部RAM地址为76H单元的内容传送给A。,3.寄存器寻址在寄存器寻址方式中,寄存器中的内容就是操作数。例如:MOV A,R1;A(R1)指令执行结果:把寄存器R1中的内容送到累加器A中。,4.寄存器间接寻址 在寄存器间接寻址方式中,指定寄存器中的内容是操作数的地址,该地址对应存储单元的内容才是操作数。(1)访问内部数据存储器时,用当前工作寄存器R0和R1作间址,即R0、R1,例如:MOV A,R0 该指令的功能是将R0所指存储单元中内容送A中。

6、(2)访问外部存储器,16位数据指针DPTR作为间址寄存器。例如:MOVX A,R1 MOVX DPTR,A(3)在堆栈操作中则用堆栈指针SP作间址。,5.变址寻址 变址寻址方式是以程序指针PC或数据指针DPTR为基址寄存器,以累加器A作为变址寄存器,两者内容相加(即基地址+偏移量)形成16位的操作数地址,变址寻址方式主要用于访问固化在程序存储器中的某个字节。变址寻址方式有两类:(1)用程序指针PC作基地址,A作变址,形成操作数地址:A+PC。(2)用数据指针DPTR作基地址,A作变址,形成操作数地址:A+DPTR。6.相对寻址 相对寻址是以程序计数器PC的当前值作为基地址,与指令中的第二字节

7、给出的相对偏移量rel进行相加,所得和为程序的转移地址。,7.位寻址 MCS-51系列单片机中有独立的性能优越的布尔处理器,包括位变量操作运算器、位累加器和位存储器,可对位地址空间的每个位进行位变量传送、状态控制、逻辑运算等操作。位地址包括:内部RAM地址空间的可进行位寻址的128位;SFR地址空间的可位寻址的11个8位寄存器的88位。位寻址给出的是直接地址。,3.1.4 寻址空间 MCS-51的7种操作数的寻址方式与所涉及到的存储器空间的关系如下:立即寻址:立即数在程序存储器ROM。直接寻址:操作数的地址在指令中,操作数在片内RAM低128B和专用寄存器SFR。寄存器寻址:操作数在工作寄存器

8、R0R7,A,B,Cy,DPTR。寄存器间接寻址:操作数的地址在指令中,操作数在片内RAM低128B(以R0、R1、SP(仅对PUSH、POP指令)形式寻址);片外RAM(以R0、R1、DPTR形式寻址)。基址加变址寻址:操作数在程序存储器ROM。相对寻址:操作数在程序存储器-128+127B范围内。位寻址:操作数为片内RAM的20H2FH字节地址中的所有位(位地址为00H7FH)和部分SFR的位。,3.2 指令系统及应用举例3.2.1 数据传送指令(1)片内数据传送指令 MOV A,Rn;A(Rn)源操作数为寄存器寻址 MOV A,Ri;A(Ri)为寄存器间接寻址;(i=0或1,下同)MOV

9、 A,direct;A(直接地址direct);源操作数为直接寻址 MOV A,#data;A立即数data,下同;源操作数为立即寻址 MOV Rn,A;Rn(A)(Rn为R0R7,下同)MOV Rn,direct;Rn(direct)MOV Rn,#data;Rndata,MOV direct,A MOV direct,Rn MOV direct,direct MOV direct,Ri MOV direct,#data MOV Ri,A MOV Ri,direct MOV Ri,#data 16位数据传送指令有以下惟一形式:MOV DPTR,#data16 该指令的功能:把16位立即数传送

10、至16位数据指针寄存器DPTR。,(2)片外数据存储器传送指令片外数据存储器传送指令有以下形式:MOVX A,Ri;A(Ri),为寄存器间接寻址 MOVX A,DPTR;A(DPTR),为寄存器间接寻址 MOVX R,A;(Ri)(A)MOVX DPTR,A;(DPTR)(A)单片机内部与片外数据存储器是通过累加器A进行数据传送的。(3)程序存储器数据传送指令程序存储器数据传送指令有以下两种形式:MOVC A,A+PC MOVC A,A+DPTR,(4)数据交换指令数据交换指令有以下形式:1)字节交换指令:XCH A,Rn;A的内容与Rn的内容交换XCH A,Ri;A的内容与(Ri)的内容交换

11、XCH A,direct;A的内容与(direct)的内容交换2)低半字节交换指令:XCHD A,Ri;A的低四位与(Ri)的低四位交换3)累加器A的高、低半字节交换指令:SWAP A;A的低四位与高四位互换,(5)堆栈操作指令堆栈操作指令有以下形式:PUSH direct;SP(SP)+1(先指针加1);(SP)(direct)(再压栈)POP direct;(SP)(direct)(先弹出);SP(SP)-1(再指针减1)PUSH指令是入栈(或称压栈或进栈)指令,其功能是先将堆栈指针SP的内容加1,然后将直接寻址direct单元中的数压入到SP所指示的单元中。POP是出栈(或称弹出)指令,

12、其功能是先将堆栈指针SP所指示的单元内容弹出到直接寻址direct单元中,然后将SP的内容减1,SP始终指向栈顶。,3.3.2 算术运算指令 算术运算类指令共有24条,包括加法、带进位加法、带借位减法、乘、除、加1、减1和十进制调整指令,其指令助记符分别为:ADD、ADDC、SUBB、MUL、DIV、INC、DEC、和DA等。1.加减运算不带进位的加法指令:ADD A,#data;A(A)+dataADD A,direct;A(A)+(direct)ADD A,Rn;A(A)+(Rn)ADD A,Ri;A(A)+(Ri)带进位加法指令:ADDCA,Rn;A(A)+(Rn)+CyADDCA,#d

13、ata;A(A)+#data+Cy,带借位减法指令有以下形式:SUBBA,Rn;A(A)-(Rn)-CySUBBA,Ri;A(A)-(Ri)-CySUBBA,direct;A(A)-(direct)-CySUBBA,#data;A(A)-data-Cy利用加减法指令的可实现的主要功能:1)对8位无符号二进制数进行加减运算。2)借助溢出标志对有符号的二进制整数进行加减运算。3)借助进位标志,可以实现多字节的加减运算。,2.乘法指令乘法指令有以下惟一形式:MUL AB;AAB低字节,;BAB高字节该指令的功能:把累加器A和寄存器B中的两个8位无符号数相乘,乘积又送回A、B内,A中存放低位字节,B中

14、存放高位字节。除法指令有以下惟一形式:DIVAB;A(A)/(B)(商);B(A)/(B)(余数)该指令的功能:把A中的8位无符号数除以B中的8位无符号数,商存放在A中,余数存放在B中。Cy和OV均清0。若除数为0,执行该指令后结果不定,并将OV置1。,3.加1、减1指令加1指令有以下形式:INCA;A(A)+1INCRn;Rn(Rn)+1INCdirect;(direct)(direct)+1INCRi;(Ri)(Ri)+1INCDPTR;DPTR(DPTR)+1减1指令有以下形式:DEC A;A(A)-1DEC Rn;Rn(Rn)-1DEC Ri;(Ri)(Ri)-1DEC direct;

15、(direct)(direct)-1加1、减1指令主要用于调整寻址单元的数据进行加1、减1操作,其结果仍存放在原数据单元。该指令常用于循环程序中对循环次数的控制。,4.十进制调整指令DAA;A(A)(BCD码调整)指令的功能:将存放于A中的两个BCD码(十进制数)的和进行十进制调整,使A中的结果为正确的BCD码数。,3.3.3 逻辑运算类指令逻辑操作指令均对8位二进制数按位进行逻辑运算。逻辑运算类指令无进位,一般不影响标志位。1.双操作数的逻辑运算指令(与、或、异或)(1)逻辑“与”指令ANLA,Rn;A(A)(Rn)ANLA,#data;A(A)dataANLdirect,A;(direct

16、)(direct)(A)与运算规则是:与“0”相与,本位为“0”(即屏蔽);与“1”相与,本位不变。(2)逻辑“或”指令ORL A,Rn;A(A)(Rn)ORL A,Ri;A(A)(Ri)或运算规则是:与“1”相或,本位为“1”;与“0”相或,本位不变。,(3)逻辑“异或”指令XRL A,Rn;A(A)(Rn)XRL A,#data;A(A)data 将源操作数和目的操作数按对应位进行逻辑“异或”运算,并将结果存入目的地址。异或运算的运算规则是:与“1”异或,本位为非(即求反);与“0”异或,本位不变。,2.单操作数的逻辑运算指令(取反、清零)单操作数逻辑运算指令有以下形式:(1)累加器A清0

17、指令CLRA;A0(2)累加器A求反指令CPLA;A()3.循环移位指令(1)累加器A循环移位指令累加器A循环移位指令有以下形式:RL A;A的各位依次左移一位,A.0A.7RR A;A的各位依次右移一位,A.7A.0该组指令不影响标志位。当A的最高位(D7)为0时,执行一次RL指令相当于对A进行一次乘2操作。,当A的最低位(D0)为0时,执行一次RR指令相当于对A进行一次除2操作。(2)带进位位Cy的累加器A循环移位指令带进位位Cy的累加器A循环移位指令有以下形式:RLC A;A的各位依次左移一位,CyA.7,A.0CyRRC A;A的各位依次右移一位,CyA.0,A.7Cy3.2.4 位操

18、作类指令 位操作指令共17条,所有的位操作指令均采用位(直接)寻址方式,在进行位操作时,MCS-51汇编语言中的位地址可用以下四种方式表示:(1)直接位地址方式。(2)点操作符表示方式。(3)位名称方式。(4)用户定义名方式。,1.位传送指令位传送指令有以下形式:MOV C,bit;Cy(bit)MOV bit,C;(bit)(Cy)指令中其中一个操作数必须是进位标志C,bit可表示任何直接位地址。2.位修改指令(1)位置位指令有以下形式:SETBC;Cy1 SETBbit;(bit)1(2)位清0指令有以下形式:CLRC;Cy0 CLRbit;(bit)0 采用这类指令可以对C和指定位置1或

19、清零。,(3)位逻辑“非”指令有以下形式:CPLC CPLbit 该组指令的功能是:对进位标志Cy或直接寻址位bit的布尔值进行位逻辑“非”运算,结果送入Cy或bit。3.位逻辑运算指令位逻辑“与”指令位逻辑“与”指令有以下形式:ANLC,bit;C(C)(bit)ANLC,/bit;C(C)()该组指令的功能是:进位标志Cy与直接寻址位的布尔值进行位逻辑“与”运算,结果送入Cy。注意:bit前的斜杠表示对(bit)求反,求反后再与Cy的内容进行逻辑操作,但并不改变bit原来的值。,位逻辑“或”指令位逻辑“或”指令有以下形式:ORLC,bit;C(C)(bit)ORLC,/bit;C(C)()

20、该组指令的功能是:进位标志Cy与直接寻址位的布尔值进行位逻辑“或”运算,结果送入Cy。,3.2.5 控制转移类指令 控制转移指令可分为三类:无条件转移指令、条件转移指令及子程序调用与返回指令。1.无条件转移指令 不受任何条件限制的转移指令称为无条件转移指令。MCS-51无条件转移指令有以下类型:(1)长转移指令长转移指令有以下惟一形式:LJMPaddrl6;PC(PC)+2;PCaddr16该指令功能:把16位地址(addr16)送给PC,从而实现程序转移。允许转移的目标地址在整个程序存储器空间。,(2)绝对转移指令 绝对转移指令有以下惟一形式:AJMPaddr11;PC(PC)+2;PC10

21、0addr100,PC1511不变 该指令功能:把PC当前值(加2修改后的值)的高5位与指令中的11位地址拼接在一起,共同形成16位目标地址送给PC,从而使程序转移。(3)相对转移指令(亦称短转移指令)相对转移指令有以下惟一形式:SJMPrel;PC(PC)+2+rel 该指令的功能:根据指令中给出的相对偏移量rel(相对于当前PC=(PC)+2),计算出程序将要转移的目标地址(PC)+2+rel,把该目标地址送给PC。,(4)间接长转移指令(相对长转移指令)间接长转移指令有以下惟一形式:JMPA+DPTR;PC(A)+(DPTR)该指令也称散转指令,其功能是把累加器A中8位无符号数与数据指针

22、DPTR的16位数相加,结果作为下一条指令地址送入PC,指令执行后不改变A和DPTR中的内容,也不影响标志位。,2.条件转移指令所谓条件转移指令是指根据指令中给定的判断条件决定程序是否转移。当条件满足时,就按指令给定的相对偏移量进行转移;否则,程序顺序执行。(1)累加器判零转移指令累加器判零转移指令有以下形式:JZrel JNZrel 这两条指令均为双字节指令,以累加器A的内容是否为0作为转移的条件。本指令执行前,累加器A应有确定的值。,(2)比较不相等转移指令例如:CJNEA,#data,rel该指令的功能:若Adata,则PC(PC)+3+rel,且Cy=0(满足条件相对转移)。若(A)d

23、ata,则PC(PC)+3+rel,且Cy=1(满足条件相对转移)。否则,PC(PC)+3且Cy=0(顺序执行),(3)减1不为0转移指令减1不为0转移指令有以下形式:DJNZRn,rel DJNZdirect,rel该组指令中第一条指令为两字节指令,第二条指令为三字节指令。,3.子程序调用与返回指令 在程序设计时,常常有一些程序段被多次反复执行。为了缩短程序,节省存储空间,把具有多处使用的且逻辑上相对独立的某些程序段编写成子程序。当某个程序(可以是主程序或子程序)需要引用该子程序时,可通过子程序调用指令转向该子程序执行,当子程序执行完毕,可通过子程序返回指令返回到子程序调用指令的下一条指令继

24、续执行原来程序。子程序绝对调用指令:ACALL addrl1子程序调用返回指令格式:RET中断子程序返回指令格式:RETI,空操作指令有以下惟一形式:NOP;PC(PC)+1 空操作指令是惟一的一条不使CPU产生任何操作控制的指令,NOP指令的功能是使程序计数器PC加1,在执行时间上消耗12个时钟周期。,3.3 汇编语言程序设计基础3.3.1 伪指令 汇编语言源程序是由汇编语句组成的,一般情况下,汇编语言语句可分为:指令性语句(即汇编指令)和指示性语句(即伪指令)。1.指令性语句 指令性语句(可简称指令)是进行汇编语言程序设计的可执行语句,每条指令都产生相应的机器语言的目标代码。源程序的主要功

25、能是由指令性语句去完成的。2.指示性语句 指示性语句(伪指令)又称汇编控制指令。它是控制汇编(翻译)过程的一些命令,程序员通过伪指令要求汇编程序在进行汇编时的一些操作。因此,伪指令不产生机器语言的目标代码,是汇编语言程序中的不可执行语句。伪指令主要用于指定源程序存放的起始地址、定义符号、指定暂存数据的存储区以及将数据存入存储器、结束汇编等。,3.4.2 伪指令MCS-51单片机汇编语言中常用的伪指令如下:1.ORG(汇编起始地址)格式:ORG 16位地址功能:规定紧跟在该伪指令后的源程序经汇编后产生的目标程序在程序存储器中存放的起始地址。2.END(结束汇编)格式:END或END 标号功能:汇

26、编语言源程序的结束标志,即通知汇编程序不再继续往下汇编。,3.EQU(等值)格式:标识符 EQU 数或汇编符号功能:把数或汇编符号赋给标识符,且只能赋值一次。4.DB(定义字节)格式:标号:DB 项或项表功能:将项或项表中的字节(8位)数据依次存入标号所指示的存储单元中。5.DW(定义字)格式:标号:DW 项或项表功能:将项或项表中的字(16位)数据依次存入标号所指示的存储单元中。6.DS(定义存储单元)格式:标号:DS 数字功能:从标号所指示的单元开始,根据数字的值保留一定数量的字节存储单元,留给以后存储数据用。,7.BIT(地址符号命令)格式:标识符 BIT 位地址功能:将位地址赋以标识符

27、(注意,不是标号)。8.定义存储单元伪指令DS格式:标号:DS 数字功能:从标号所指示的单元开始,根据数字的值保留一定数量的字节存储单元,留给以后存储数据用。,3.3.2 汇编语言程序结构及应用1.程序设计步骤 汇编语言程序设计一般经过以下几个步骤:(1)分析问题,明确任务要求,对于复杂的问题,还要将要解决的问题抽象成数学模型。(2)确定算法,即根据实际问题和指令系统的特点确定完成这一任务需经历的步骤。(3)根据所选择的算法,确定内存单元的分配;使用哪些存储器单元;使用哪些寄存器;程序运行中的中间数据及结果存放在哪些单元,以利于提高程序的效率和运行速度。(4)根据流程图,编写源程序。(5)上机

28、对源程序进行汇编、调试。,2.程序设计技术 在进行汇编语言程序设计时,对于同一个问题,会有不同的编程方式,但应按照结构化程序设计的要求,即程序的基本结构应采用顺序、选择和循环三种基本结构,而实现基本结构的指令语句也会有多种不同的形式,因而在执行速度、所占内存空间、易读性和可维护性等方面就有所不同。用汇编语言编写程序,对于初学者来说是会遇到困难的,程序设计者只有通过实践,不断积累经验,才能编写出较高质量的程序。,3.几种常见汇编语言程序设计结构(1)顺序程序结构示例 拼字:将外部数据存储器3000H和3001H的低4位取出拼成一个字,送3002H单元中。程序如下:ORG 2000HMOV DPT

29、R,#3000H;DPTR外部数据存储器地址MOVX A,DPTR;取3000H单元数据送AANL A,#0FH;屏蔽高4位SWAP A;将A的低4位与高4位交换MOV R1,A;暂存于R1INC DPTR;指向下一单元,MOVX A,DPTR;3001H单元数据送AANL A,#0FH;屏蔽高4位ORL A,R1;拼成一个字节INC DPTR;指向下一单元MOVX DPTR,A;拼字结果送3002H单元SJMP$END说明:1)本例中最后一条指令原地踏步指令SJMP$。2)凡访问外部数据存储器,必须先建立外部数据存储器地址指针(一般使用DPTR)。访问外部数据存储器的指令为MOVX。,(2)

30、分支程序示例 把片外RAM的首地址为10H开始存放的数据块,传送给片内RAM首地址为20H开始的数据块中去,如果数据为“0”,就停止传送。程序如下:ORG 2000H MOV R0,#10H MOV R1,#20HLOOP:MOVX A,R0;A片外RAM数据HERE:JZ HERE;程序原地踏步 MOV R1,A;片内RAMA INC R0 INC R1 SJMP LOOP;循环传送 END,(3)循环程序示例 在程序执行过程中,当需要多次反复执行某段程序时,可采用循环程序。循环程序一般由三部分组成:1)初始化。2)循环体。3)循环控制。有20个数存放在内部RAM从41H开始的连续单元中,试

31、求其和并将结果存放在40H单元(和数是一个8位二进制数,不考虑进位问题)。,程序如下:ORG 2000H MOV A,#00H;清累加器A MOV R7,#14H;建立循环计数器R7初值 MOV R0,#41H;建立内存数据指针LOOP:ADD A,R0;累加 INCR0;指向下一个内存单元 DJNZ R7,LOOP;修改循环计数器 MOV 40H,A;存累加结果于40H SJMP$END,(4)子程序设计 编写一子程序,将累加器A中的ASCII码转换为十六进制数。程序代码如下:ASCH:CLR CSUBB A,#30HCJNE A,#0AH,NEXTNEXT:JC DONESUBB A,#0

32、7HDONE:RET,(5)查表程序 查表是程序设计中使用的基本方法。只要适当地组织表格,就可以十分方便地利用表格进行多种代码转换和算术运算等。利用表格计算内部RAM的40H单元中一位BCD数的平方值,并将结果存入41H单元。首先组织平方表,且把它作为程序的一部分。程序如下:ORG 2000HMOV A,40HMOV DPTR,#SQTABMOVC A,A+DPTRMOV 41H,ASJMP$SQTAB:DB 0,1,4,9,16,25,36,49,64,81,(6)运算程序 编写一子程序,实现多字节加法。两个多字节数分别存放在起始地址为FIRST和SECOND的连续单元中(从低位字节开始存放),两个数的字节数存放在NUMBER单元中,最后求得的和存放在FIRST开始的区域中。SUBAD:MOV R0,#FIRSTMOV R1,#SECOND;置起始地址MOV R2,NUMBER;置计数初值CLRC;清CyLOOP:MOV A,R0ADDCA,R1;进行一次加法运算MOV R0,A;存结果INCR0 INC R1;修改地址指针DJNZR2,LOOP;计数及循环控制RET,本章小结:练习及思考题:实训项目三:予习:谢谢大家!,本章结束 谢谢使用,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号