[计算机硬件及网络]汇编语言程序设计实验.doc

上传人:sccc 文档编号:4561413 上传时间:2023-04-27 格式:DOC 页数:65 大小:1.39MB
返回 下载 相关 举报
[计算机硬件及网络]汇编语言程序设计实验.doc_第1页
第1页 / 共65页
[计算机硬件及网络]汇编语言程序设计实验.doc_第2页
第2页 / 共65页
[计算机硬件及网络]汇编语言程序设计实验.doc_第3页
第3页 / 共65页
[计算机硬件及网络]汇编语言程序设计实验.doc_第4页
第4页 / 共65页
[计算机硬件及网络]汇编语言程序设计实验.doc_第5页
第5页 / 共65页
点击查看更多>>
资源描述

《[计算机硬件及网络]汇编语言程序设计实验.doc》由会员分享,可在线阅读,更多相关《[计算机硬件及网络]汇编语言程序设计实验.doc(65页珍藏版)》请在三一办公上搜索。

1、汇编语言程序设计实验指导 实验一:字符串的显示及回车换行一实验目的a)熟悉、掌握汇编语言的框架b)实现字符串的显示与回车换行二、实验重难点a)重点:需要运用mov指令实现数据的传送,操作结束须退出指令退出操作。1.mov指令格式: Mov dest,src ;dest为目的操作数,src为源操作数 Mov指令是双目操作,其中dest可为寄存器(R)、储存器(M.M),src可为R、M.M、立即数(IMM)。2.退出指令: Mov ah,4ch Int 21hb)难点:汇编语言不提供显示输出指令,也不提供回车换行指令,需借用DOS中的显示功能以及其中显示一个字符的功能。如:回车符的ASSII码是

2、0dh(13),换行符的ASSII码是0ah(10)。1.借用dos显示输出:Mov dx,offset strMov ah,9Int 21h2.回车换行的实现:Mov dl,0dhMov ah,2 回车Int 21hMov dl,0ahMov ah,2 换行Int 21h三程序代码a)字符串hello的显示:Data segment ;数据段开始Str1 db “hello$” ;$为结束符Data ends ;数据段结束Code segment ;代码段开始Assume cs:code,ds:dataStart:mov ax,data Mov ds,ax取数据 Mov dx,offset

3、str1 Mov ah,9 Int 21h Mov ah,4ch Int 21hCode ends ;代码段结束 End start四、实验结果b)实现hello world的回车换行显示:数据段添加:Str2 db “world$”代码段添加:Mov dl,0dhMov ah,2Int 21hMov dl,0ahMov ah,2Int 21h运行结果:实验二:减法运算及混合运算一 实验目的a)熟悉、掌握汇编语言的框架b)熟悉、掌握加法指令、减法指令c)实现加减法运算及其混合运算d)熟悉、掌握使用Debug命令方法及步骤二、实验重难点a)重点:在进行加减运算及其混合运算须用到加法指令、减法指令

4、,需熟练掌握各条指令格式及功能。1.加法指令1)加法指令 ADD指令格式:ADD dest,src ;destdest+src,dest为被加数src为加数 ADD指令为双目操作,其中dest可为R、M.M,src可为R、M.M、IMM,但不可同为M.M。2)带进位加法指令 ADC指令格式:ADC dest,src ;destdest+src+CF,CF是进位2、减法指令1)减法指令SUB指令格式:SUB dest,src ;destdest-src,dest为被减数,src为减数 SUB指令为双目操作,其中dest可为R、M.M,src可为R、M.M、IMM,但不可同为M.M。2)带借位减法

5、指令SBB指令格式:SBB dest,src ;destdest-src-CF,CF为借位b)难点:运算结果不能直接显示,需要借用debug命令调用exe文件进行显示。指令格式:Debug.exe 1.exe ;调用文件1-t ;单步执行命令-d ds:0000 ;显示指定范围内存储单元内容-q ;结束Debug的运行,返回DOS三、程序代码实现不带进位w=x+y,其中x=25,y=30:Data segment ;数据段开始x db 25y db 30w db (?)data ends ;数据段结束code segment ;代码段开始assume cs: code,ds:datastart

6、:mov ax,data mov ds,ax mov al,x add al,y mov w,al mov ah,4ch int 21hcode ends ;代码段结束 end start四、实验结果实验三:乘、除法运算及其混合运算一、 实验目的a)熟练掌握汇编语言的框架b)熟悉、掌握乘法、除法指令c)熟练掌握使用Debug命令查看实验结果d)实现乘、除法运算及其混合运算二、实验重难点a)重点:在进行乘除法及其混合运算时,需用到乘法指令、除法指令,须熟悉、掌握各条指令的格式及功能;乘除法运算结果也不能直接显示,须借用Debug命令查看结果。1、乘法指令1)无符号数乘法指令 MUL指令格式: M

7、UL 是单目操作MUL src ; src中存放的是乘数,且存放在R、M.M中 若src是8位,被乘数存在AL中积存AX Src是16位,被乘数存在AX,积存DX:AX功能:8位时(AX)(AL)*src;16位时(DX)(AX)(AX)*src2)带符号数乘法指令 IMUL指令格式:IMUL src ;同乘法指令;可完成两个带符号数相乘2、除法指令1)无符号数除法指令 DIV指令格式: DIV 为单目操作 Src 中存放是是除数,且存放在R、M.M中DIV src ; 8位,被除数定为16位存AX,商存AL,余存AH Src 16位,被除数为32位存DX:AX,商存AX,余存DX功能:8位,

8、(AL)(AX)/src,(AH)(AX) MOD src 16位,(AX)(DX)(AX)/src,(DX)(DX)(AX) MOD src2)带符号数除法指令 IDIV指令格式:IDIV src ;同除法指令;可完成带符号数的除法b)、难点:因为被乘数必须存在AL或AX中,被除数必须存在AX或DX:AX中,所以两数相乘除前须存放在相应的寄存器中;又乘除混合运算过程会位数的不匹配,应在两数相乘除前或后进行字节或字的扩展;存储结果应注意其相应的存储地址。如:两个八位数x*y,结果存入z中Mov al,xMul yMov z,alMov z+1,ah1)字节扩展指令指令格式:CBW ;CWB为无

9、目操作,将al扩成ax2)字扩展指令指令格式:CWD ;CWD 为无目操作,将ax扩成dx:ax三、 程序代码a)实现x*y,其中x=4,y=3,x、y都是8位的,结果存在ax中Data segmentx db 4y db 3data endscode segmentassume cs:code,ds:datastart:mov ax,data mov ds,ax mov al, x mul y mov ah,4ch int 21hcode ends end start四、实验结果b)在实验a)的基础上完成x*y/z的混合运算,其中z=5,且z是16位的,将其商存在ax中,余数存在dx中。数据

10、段添加:z dw 5代码段添加:CwdDiv z实验结果实验四:堆栈操作指令的运用一、 实验目的a)熟悉、掌握堆栈操作指令push和popb)实现数据的压入和弹出c)掌握使用Debug命令方法及步骤二、实验重难点 a)重点在进行堆栈操作时,须用到push指令和pop指令,需熟悉、掌握其指令的格式及功能。1.压入操作指令push指令格式:Push src ;push是单目操作,且src为16位操作数2.弹出操作指令pop指令格式:Pop dest ;pop是单目操作,且dest为16位操作数b)难点:push和pop指令必须成对出现;当数据段给出的数据为8位时,须将其转为16位数,此时须对高位进

11、行清零处理;又堆栈操作是先进后出原则,所以其内存情况须了解。1. Push srcPop dest 成对出现2.高位清零指令如:mov ah,0 或 xor ah,ah ;异或方式3.出入栈操作示意图三、 程序代码利用堆栈操作a=2移入b中Data segmenta db 2b db (?)data endscode segmentassume cs:code,ds:datastart:mov ax,data mov ds,ax mov ah,0 mov al,a push ax pop ax mov b,al mov ah,4ch int 21hcode ends end start四、 实

12、验结果实验五:多个数据的转移一、实验目的a)熟悉、掌握数据转移的操作方法b)熟悉、掌握加法指令中的加一指令c)熟悉、掌握循环指令d)实现数据在寄存器之间的转移二、实验重难点a)重点:进行数据转移时,要用到运用到加一指令,要熟悉该指令的格式;也要熟悉数据转移的操作方法。1.数据转移的方法Mov si,offset str1Mov di,offset str2Mov al,siMov di,al2.加一指令指令格式:INC src ;srcsrc+1,INC为单目操作,src可为R、M.Mb)难点:在这个实验中需要用到循环指令,所以要熟悉、掌握该指令的格式。指令格式:Mov cx,N ;N代表循环

13、次数L1:(循环内容)Loop L1三、程序代码实现str1中的2个a转移到str2中,其中str1,str2都在数据段中。Data segmentStr1 db 2 dup(a)Str2 db 2 dup(?)Data endsCode segmentAssume cs:code,ds:dataStart:mov ax,data Mov ds,ax Mov si, offset str1 Mov di, offset str2 Mov cx,2 L1:mov al,si Mov di,al Inc si Inc di Loop L1 Mov ah,4ch Int 21hCode ends E

14、nd start四、实验结果实验六:BCD码的加减法及其混合运算一、 实验目的a)熟悉、掌握十进制调整指令(BCD码)b)实现BCD码的加减及其混合运算二、实验重难点a)重点:进行BCD码加减法运算时,需要利用十进制调整指令,所以要熟悉其指令格式。1.DAA指令指令格式:DAA ;DAA为无目操作,用以完成对BCD码加运算校正用法:(al)把al中的和调整到BCD码格式2.DAS指令指令格式:DAS ;DAS为无目操作,用以完成对BCD码相减校正用法类似DAAb)难点:调整指令随时无目操作,但隐含操作数必须存在al中,所以做加减运算时,被加、减数必须先存入al中。如:x+yMov al,xAd

15、d al,yDAA三程序代码实现1834+2798的bcd码运算Data segmentBcd1 db 00110100b,00011000bBcd2 db 10011000b,00100111bBcd3 db 2 dup(?)Data endsCode segmentAssume cs:code,ds:dataStart:mov ax,data Mov ds,ax Mov al,bcd1 Add al, bcd2 Daa Mov bcd3,al Mov al,bcd1+1 Adc al,bcd2+1 Daa Mov bcd3+1,al Mov ah,4ch Int 21hCode ends

16、End start四、实验结果实验七:非BCD码的加减及其混合运算二、 实验目的a) 熟悉、掌握十进制调整指令(非BCD码)b) 熟悉掌握非BCD码数据段数据的定义c)实现非BCD码的加减及其混合运算二、实验重难点a)重点:进行非BCD码加减法运算时,需要利用十进制调整指令,所以要熟悉其指令格式。1.AAA指令指令格式:AAA ;AAA为无目操作,用以完成对非BCD码加运算校正用法:(al)把al中的和调整到非BCD码格式 (ah)(ah)+调整产生的进位2.AAS指令指令格式:AAS ;AAS为无目操作,用以完成对非BCD码相减校正用法类似AAA3.高位清零Mov ah,0 或 xor ah

17、,ahb)难点:调整指令随时无目操作,但隐含操作数必须存在al中,所以做加减运算时,被加、减数必须先存入al中;由于调整会产生进位,所以要对al中的每次使用该指令之前高四位清零。如:x+yXor ah,ahMov al,xAdd al,yDAA三程序代码实现24+18的bcd码运算Data segmentBcd1 db 00000100b,00000010b ;Bcd2 db 00001000b,00000001bBcd3 db 2 dup(?)Data endsCode segmentAssume cs:code,ds:dataStart:mov ax,data Mov ds,ax Xor

18、ah,ah Mov al,bcd1 Add al, bcd2 aaa Mov bcd3,al Xor ah,ah Mov al,bcd1+1 Adc al,bcd2+1 aaa Mov bcd3+1,al Mov ah,4ch Int 21hCode ends End start四、实验结果实验八:模块化设计一、 实验目的a)熟悉、掌握模块化设计的结构b)学会使用call调用子程序二、实验重难点a)重点:在模块化程序中,需要调用子程序,须用到call。调用格式:Call init ;调用初始化init的程序b)难点:模块设计需掌握其模块化设计的结构模块结构如:初始化模块Init procMov

19、 ax,dataMov ds,axRetInit endp三、 程序代码利用模块化设计实现“hello”的显示Data segmentStr1 db “hello$”Data segmentCode segmentAssume cs:code,ds:dataStart:call init Mov dx,offset str1Call displayCall exitInit procMov ax,dataMov ds,axRetInit endpEixt procMov ah,4chInt 21hRetExit endpCode ends End start四、 实验结果实验九:非BCD码的乘

20、除及其混合运算一、 实验目的a) 熟悉、掌握非BCD码乘除的十进制调整指令b) 掌握非BCD码乘除数据在数据段的定义方式c) 实现非BCD码的乘除及其混合运算二、 实验重难点a) 重点:在进行非BCD码的乘除法时需要用到十进制调整指令,须了解、掌握该指令的格式及功能。非BCD码乘除时,数据的定义须注意。1. AAM指令指令格式:AAM ;把AL中的积调整为非BCD码格式送到AX中2. AAD指令指令格式:AAD ;(al)10*(ah)+(al),(ah)0,进行DIV之前调整3. 数据的定义如定义A=8和B=56:A db 08h或A db 00001000BB db 06h,05h ;中间

21、需用逗号隔开,低位在前高位在后b)难点:虽然各条调整指令都是无目操作,但都隐含在AL中进行调整,所以在调整前先得把数据放进AL中。在进行非BCD码乘除时,其内存状况很重要,特别是进行两位数的非BCD码乘法,需要进行加法运算。有时还需进行字与字节之间的转换。1.内存示意图例34*562.字与字节之间的转换Mov al,AMul BAAMMov word ptr C0,ax ;字节转换成字三、 程序代码a) 实现8*9DATA SEGMENTBCD1 DB 00001000BBCD2 DB 00001001BDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAST

22、ART:MOV AX, DATA MOV DS, AX MOV AL, BCD1 MUL BCD2 AAM MOV AH, 4CH INT 21HCODE ENDS END START四、 实验结果:b) 在上个实验的基础上完成72/5,商存在寄存器C中,余存在寄存器R中。在数据段添加BCD3 DB 05HC DB 2DUP(?)R DB 2DUP(?)代码段添加MOV BX,AXMOV AH,0MOV AL,BHAAD ;进行十进制调整DIV BCD3MOV C+1,ALMOV AL,BLAAD DIV BCD3MOV C,ALMOV R,AH实验结果实验十:键盘输入的算术运算 一、 实验目

23、的a) 熟悉、掌握各类逻辑类指令格式及功能b) 学会选择适合的逻辑类指令c) 熟悉、掌握键盘输入、显示单个字符的指令d) 实现键盘输入的算术运算二、 实验重难点a) 重点:试验中要用到不少逻辑类指令,所以要熟悉、掌握各类逻辑类指令的格式及功能;试验中还需用到键盘输入和显示单个字符的指令,所以要熟悉掌握这些指令的格式。1、 逻辑运算指令1) 逻辑与运算指令AND指令格式:AND dest,src ;(dest)(dest)(src),双目操作规则:00=0,01=0,10=0,11=1其中dest可为R、M.M,src可为R、M.M、IMM功能:对某些位清零2) 逻辑或运算指令OR指令格式:OR

24、 dest,src ;(dest)(dest)(src),双目操作规则:00=0,01=1,10=1,11=1其中dest可为R、M.M,src可为R、M.M、IMM功能:对特定位取1,或进行字或字节的“或”运算3) 逻辑非运算指令NOT指令格式:NOT dest ;(dest)(dest),单目操作规则:0=1,1=0其中dest可为R、M.M,不能为立即数。功能:按位取反4) 逻辑异或运算指令XOR指令格式:XOR dest,src ;(dest)(dest) (src)规则:0 0=0,0 1=1,1 0=1,1 1=0功能:使对应位变反5) 测试指令TEST指令格式:TEST dest

25、,src ;(dest)(src)两个操作数相与的结果不保存,只根据其特征置条件码。目的操作数(dest)不改变。功能:测试操作数的某位是否为0或12.逻辑移位指令1)逻辑左移指令SHL(shift logical left)指令格式:SHL dest,src ;dest中存放被移数据,src中存放移动次数其中dest可为R、M.M,src为1或cl。2)算数左移指令 SAL(shift arithmetic left)指令格式:SAL dest,src ;同左移指令3)逻辑右移指令 SHR(shift logical right)指令格式:SHR dest,src ;同左移指令4)算数右移指

26、令 SAR(shift arithmetic right)指令格式:SAL dest,src ;同左移指令5)循环左移指令ROL(Rotate left)指令格式:ROL dest, src ;同左移指令6) 循环右移指令 ROR(Rotate right)指令格式:ROL dest,src ;同左移指令7) 带进位循环左移指令RCL(Rotate left through carry )指令格式:RCL dest,src ;同左移指令8) 带进位循环右移指令 RCR(Rotate right through carry)指令格式:RCR dest,src ;同左移指令这八种指令可以分为两组:

27、前四种为位移指令,后四种为循环位移指令。循环位移指令可以改变操作数中所有位的位置,在程序中很有用。位移指令常常用来做乘以2或除以2的操作。其中左移用来乘以2,右移用来除以2,算数位移指令用于带符号数运算,逻辑位移指令用于无符号数运算。其中逻辑位移指令也常用来实现无符号数的高位、低位的分离。b) 难点:各类指令的选取是至关重要,可以决定程序的可行性和效率;为了是程序更简洁需要用到一些模块化的子程序。逻辑指令中源操作数的选取决定操作的成败,所以源操作数的立即数的非常重要。逻辑位移指令的执行的操作要清楚。1. 逻辑指令的选取及相应的源操作数的立即数的选取实例1) 要求屏蔽0、1两位。可用AND指令并

28、设置常数0FCH,指令如下:MOV AL,0BFHAND AL,OFCH这两条指令执行的结果使(AL)=0BCH2) 要求第5位置1可选用OR指令,立即数设置为20H,指令如下:MOV AL,43HOR AL,20H这两条指令执行后,(AL)=63H2. 逻辑位移指令的隐含条件1) 移位次数在逻辑位移指令中的源操作数只能为1或cl,当移位次数大于1只能是cl。例如:MOV CL,2SHL AL,CL这两条指令表示对AL中的数据左移两次2) 移位中的CF标志位因为逻辑移位指令在其操作过程中每一次被移动的数(0或1)都缓存在CF中,所以常常可以通过判断CF中是0还是1作为选择条件。例如:SHL A

29、L ,1JNC L1这两条指令可执行当CF中的数为0时跳转到L1处执行以下指令3) 逻辑移位指令实现高低分离MOV AL,15HMOV CL,4SHR AL,CL这三条指令执行后(AL)=01H,3. 键盘输入单个字符及单个字符的显示1) 键盘输入单个字符指令格式:MOV AH,1INT 21H这两条指令可实现键盘输入单个字符并回显MOV AH,7INT 21H或MOV AH,8INT 21H这两种指令可实现键盘输入单个字符不回显2) 单个字符的显示指令格式:MOV DL,ASIIC码 MOV AH,2INT 21HMOV DL,ASIIC码;这条指令的源操作数可以是寄存器或存储器,但其中数据

30、必须是要显示字符对应的ASIIC码。三程序代码实现由键盘输入的加法运算data segmentstr1 db input from the keyboard off addition operation!$str2 db please input the two nunber between 0 to 9:$str3 db result of the operation:$x db ?y db ?data endscode segmentassume cs:code,ds:datastart:mov ax,data mov ds,ax mov dx,offset str1 call displ

31、ay ;调用显示字符串的子程序 call crlf ;调用回车换行的子程序 lea dx,str2 call display ;显示提示语句 call crlf call input ;调用键盘输入的子程序 and al,0fh ;高位清零 mov x,al ;将al中的数据保存在x中 call crlf call input and al,0fh add al,x ;进行加法运算 daa ;进行十进制调整 mov y,al ;将al中的数据保存在y中 call crlf lea dx,str3 call display mov al,y mov cl,4 shr al,cl ;对al中的数据

32、进行移位实现高四位分离 or al,30h ;将al中的数据变成对应的ASIIC码 call show ;调用显示单个字符的子程序,显示高位 mov al,y and al,0fh ;清零高位,实现低四位分离 or al,30h call show ;显示低位 mov ah,4ch int 21hdisplay proc mov ah,9 int 21h retdisplay endp ;显示字符串的子程序crlf proc mov dl,0dh mov ah,02h int 21h mov dl,0ah mov ah,02h int 21h retcrlf endp ;实现回车换行的子程序i

33、nput proc mov ah,1 int 21h retinput endp ;键盘输入单个字符的子程序show proc mov dl,al mov ah,02h int 21h ret show endp ;显示单个字符的子程序code ends end start四实验结果实验十一:控制转移指令一、 实验目的a) 熟悉、掌握各种控制转移指令格式及其功能b) 学会使用控制转移指令来控制程序的执行流程二、 实验重难点a) 重点:实验中要用到不少控制转移指令,因此要熟悉、掌握各类控制转移指令的指令格式及其功能。1. 无条件转移指令 JMP指令格式:JMP 标号 ;跳转到执行从标号地址开始的

34、指令JMP指令必须指定转移的目标地址,转移可分为两类:段内转移和段间转移。2. 条件转移指令条件转移指令种类比较多,需要熟悉掌握常用的几种。1) 比较两个无符号数,并根据比较的结果转移JA(JB) ;大于(小于)指令格式:JA (JB) 标号 ;大于(小于)转到执行从标号处开始的指令JE ;等于指令格式:JE 标号 ;等于转到执行从标号处开始的指令JAE(JBE) ;大于等于(小于等于)指令格式:JAE(JBE) 标号;大于等于(小于等于)转移到从标号处开始的指令2) 比较两个带符号数,并根据比较结果转移JL(JG) ;小于(大于)JE ;等于JLE(JGE) ;小于等于(大于等于)指令格式与

35、前面三种相通。3) 根据单个条件标志的设置情况转移JC(JNC) ;根据CF标志位的设置情况转移指令格式:JC(JNC) 标号测试条件:CF=1(CF=0)JZ(JNZ) ;根据ZF标志位的设置情况转移指令格式:JZ(JNZ) 标号测试条件:ZF=1(ZF=0)JO(JNO) ;根据OF标志位的设置情况转移JO 溢出转移, JNO 不溢出转移指令格式:JO(JNO) 标号测试条件:OF=1(OF=0)b) 难点:转移指令的选取决定着程序的优劣及可行性,合理的选择转移指令可以避免程序陷入死循环或少循环,同样可以节省程序运行的时间,提高效率;而根据比较结果转移的条件转移指令前都有一条CMP指令,运

36、用时须注意。三、 程序代码实现求寄存器al中给定数据中的“1”的个数code segmentassume cs:codestart:mov bl,0 ;对bl清零 mov al,15h ;向al中给定一个数据l1 :cmp al,0 ;循环终止条件 je display ;al中的数据为零时跳转到显示 shl al,1 jnc l1 ;cf中不为1,跳转到l1处继续循环 inc bl ;cf中为1,bl加一 jmp l1 ;强制跳转到l1处,保证程序的正常运行display:mov al,bl or al,30h mov dl,al mov ah,2 int 21h ;显示al中给定数据“1”

37、的个数 mov ah,4ch int 21h code ends end start四、 实验结果实验十二:循环和分支程序设计及子程序结构一、 实验目的a) 熟悉、掌握循环、分支和子程序设计的方法及其结构b) 学会灵活使用这三种程序并能够综合运用这三种程序c) 利用这三种程序解决实际问题二、 实验重难点a) 重点:这三种程序设计的程序结构要区分和熟悉掌握。1. 循环程序设计的两种基本程序结构循环结构有两种基本结构形式:DO_WHILE结构形式和DO_UNTIL结构形式。两种结构形式的示意图如下图所示:两种循环结构形式的不同点由图中可以看出,DO_WHILE结构形式先判断循环控制条件,满足条件则

38、执行循环体,不满足则退出;DO_UNTIL结构形式则先执行循环体,不满足循环条件则继续执行循环操作,满足条件则退出循环。2. 分支程序设计的程序的结构形式分支程序的结构形式也有两种形式,分别相当高级语言中的IF_THEN_ELSE语句和CASE语句。两种结构形式的示意图如下图所示:由分支程序的结构形式示意图可以看出,IF_THEN_ELSE结构只有两个分支,CASE结构有两个以上的分支。3. 子程序结构1.过程定义伪操作过程定义伪操作用在子程序的前后,使整个过程形成清晰的,具有特定功能的代码块。格式:过程名 PROC 类型属性 过程 RET过程名 ENDP调用给子程序的格式:CALL 过程名其中类型属性可为NEAR或FAR2)类型属性的确定主程序和子程序在同一代码段中则用NEAR属性,主程序和子程序在不同代

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

当前位置:首页 > 教育教学 > 成人教育


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号