版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章指令系统与汇编语言程序设计
第一节
指令系统概述
第二节汇编语言程序实例第三节
寻址方式
第四节
指令系统
第五节汇编语言程序设计
第一节指令系统概述
程序设计语言可分为机器语言、汇编语言和高级语言三种。
机器语言是由1和0两个二进制数码组成的,是唯一能直接在计算机上运行的语言。
用一些助记符号来代替用二进制码编写的程序。这种用助记符来描述指令的语言称为汇编语言。用汇编语言写出的程序称为汇编语言程序。汇编语言程序必须翻译为二进制机器语言才能送给计算机执行,这个过程称为汇编。
计算机不能直接执行高级语言,要通过编译或解释程序,将其翻译成为机器语言,才能被执行。常用的高级语言有:C语言、VC、VB等。二、指令和指令系统指令是指挥CPU进行各种操作的命令。一条指令通常由操作码和操作数两部分组成:操作码操作数操作码表示本指令为何种操作。在执行指令时,操作码部分会被送入译码电路进行译码,CPU根据译码结果来控制相应的电子线路完成指令的操作。
三、程序的执行过程程序是完成某一任务的指令的集合。程序中的指令是以机器码的形式存放在存储器中的。在程序的执行过程中这些机器码将按次序被取出,然后被译码、执行。
程序除了可按顺序执行外,还可跳转执行。一些指令如转移指令、子程序调用与返回指令等,都会改变PC的值,从而实现程序的转移。另外,在中断系统中,中断系统的硬件电路也会改变PC的值,从而使CPU转去执行中断服务程序。CPU复位时,PC被清零。
第二节汇编语言程序实例
汇编语言程序的编制与调试的过程
该过程可归纳如下:(1)用文本编辑软件编辑源程序;(2)将源程序汇编成机器码目标程序,然后将目标程序装入到单片机系统中;(3)执行程序,检查CPU现场和有关存储单元的内容。对于不同的单片机开发系统,以上操作过程可能在细节上有所不同,但主要的步骤是基本相同的。例3.1
计算3+5我们可编制出如下程序:
MOVA,30H①
ADDA,31H②MOV32H,A③
该程序存放在程序存储器的什么位置,程序的结束标记等。这些说明是由伪指令来完成的。完整的源程序如下:
ORG4000HMOVA,30H①ADDA,31H②
MOV32H,A③END***条指令为伪指令,表示该指令以下的程序是从程序存储器的4000H单元开始存放的;**条指令也是伪指令,告诉汇编程序汇编到此结束。2.汇编汇编就是将编辑好的汇编语言源程序翻译成机器语言程序。汇编的方法有两种:人工汇编和机器汇编。
3.执行给程序计数器PC赋值为4000H,然后运行程序:①单步或断点(如断点地址设置为4004H)执行程序,检查CPU现场和有关存储单元的内容。②连续执行程序,检查运行结果。
第三节
寻址方式
我们把各种不同类型的操作方式称为寻址方式。
MCS-51系列单片机的寻址方式主要有七种:立即寻址、寄存器寻址、直接寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址。
一、立即寻址在立即寻址中,操作数的数值在指令中写出,一眼就可看出其数值的大小。这种在指令中可以看出数值大小的操作数称为立即数,书写时前面要加“#”。立即数有8位和16位两种。
二、寄存器寻址在寄存器寻址中,操作数存放在寄存器中,指令中给出的是寄存器的名称。
三、直接寻址在直接寻址中,操作数存放在存储器中,指令中给出的是操作数的存放地址。指令执行过程中,地址值被送上地址总线,经译码后选通操作数所在的存储单元,这样就可对操作数进行操作。
四、寄存器间接寻址在寄存器间接寻址中,操作数存放在存储器中,该存储单元的地址又存放在寄存器中,而指令中给出的是寄存器名称。执行这类指令时,CPU将寄存器的值(即操作数的地址)送上地址总线译码,选通操作数所在的存储单元,再对操作数进行操作。书写时,寄存器名称前要加“@”。
MCS-51系列单片机规定,只有工作寄存器R0与R1可用于寄存器间接寻址。
在单片机系统扩展中,片外RAM的地址可以是8位,也可以是16位。若是8位,使用R0、R1间接寻址。若是16位,则用数据指针DPTR间接寻址。在MCS-51系列单片机的51子系列中,间接寻址中的R0和R1取值范围为00H~7FH。五、变址寻址在变址寻址中,操作数存放在程序存储器中,操作数的地址是累加器A与数据指针DPTR或程序计数器PC的值的和。
在MCS-51系列单片机中,还有其它的寻址方式,如相对寻址、位寻址等。第四节
指令系统
MCS-51系列单片机指令系统丰富、完整,共有111条指令。按照它们的操作性质可划分成数据传送、算术操作、逻辑操作、程序转移、位操作等五类。
按照字节数分类,则有49条单字节指令、46条双字节指令和16条三字节指令。
按指令执行时间分类,则有64条单周期指令、45条双周期指令和2条四周期指令。
一、数据传送类指令数据传送就是将数据从一个部件传送到另一个部件,它是单片机最基本、最主要、量最大的操作。
1.以累加器为目的地的指令MOV A,Rn ;A←Rn,n=0~7MOV A,direct ;A←(direct)MOV A,@Ri;A←((Ri))MOV A,#data ;A←data此类指令是将工作寄存器内容或存储单元内容或立即数送给累加器。
2.以Rn为目的地的指令MOV Rn,A ;Rn←AMOV Rn,direct ;Rn←(direct)MOV Rn,#data ;Rn←data此类指令是将累加器内容、存储单元内容或立即数送工作寄存器。
3.以直接地址为目的地的指令MOV dircet,A ;(direct)←AMOV dircet,Rn ;(direct)←RnMOV direct1,direct2 ;(direct1)←(direct2)MOV direct,@Ri ;(direct)←((Ri))MOV driect,#data ;(direct)←data此类指令是把累加器、工作寄存器、存储单元或立即数送片内数据存储器单元中(用直接寻址表示)。
4.以间接地址为目的地的指令MOV @Ri,A ;(Ri)←AMOV @Ri,direct ;(Ri)←direct)MOV @Ri,#data;(Ri)←data此类指令是把累加器、存储单元或立即数送片内数据存储器单元中(用间接寻址表示)。
对数据块操作,一般都采用间接寻址方式。
例将片内RAM中30H~3FH单元的内容复制到50H~5FH单元中。MOV R0,#30H MOV R1,#50H MOV R7,#10H LOOP:MOV A,@R0 MOV @R1,A INC R0 INC R1 DJNZ R7,LOOP 5.以16位数据指针为目的地的指令MOV DPTR,#data16 ;DPTR←data16此条指令是将一个16位的立即数送给数据指针DPTR。其中高8位送DPH,低8位送DPL。6.累加器与片外数据存储器间的传送指令(输入/输出指令)
MOVX A,@Ri ;A←((Ri))MOVX @Ri,A ;((Ri))←A
MOVX A,@DPTR;A←((DPTR))MOVX @DPTR,A;((DPTR))←A在寻址方式中讲过,扩展系统中片外数据存储器的地址有8位和16位两种。
7.程序存储器操作指令(查表指令)程序存储器可读不可写。我们常将表格数据预先存放在程序存储器中,在程序运行中对其进行搜索,将需要的数据取到累加器中,这个过程称为查表。查表指令有两条:MOVC A,@A+DPTR MOVC A,@A+PC DPTR或PC为基址寄存器,存放数据区起始地址(称基地址),累加器A的内容为偏移量,是操作数所在单元与基地址之间的字节数,在执行时先将DPTR或PC的内容与A的内容相加,得到的和作为操作数在数据区中的存放地址,再据此将操作数取出送给累加器A例设从程序存储器0100H开始的10个单元中已存放了字符0~9的编码,如图3-7所示。现要将2的编码5BH取出送累加器。
MOV DPTR,#0100HMOV A,#02H MOVC A,@A+DPTR8.数据交换指令①8位数据交换指令XCH A,Rn ;ARnXCH A,@Ri ;A(Ri)XCH A,direct ;A(direct)②4位数据交换指令XCHD A,@Ri ;A3~0(Ri)3~0SWAP A ;A7~4A3~0此类指令中,交换的双方互为源和目的地,指令执行后,每方的操作数都修改为对方的操作数。9.堆栈操作指令堆栈是在片内RAM中设置一个区域,其有特殊的操作方式:压入和弹出。堆栈指针SP始终指向堆栈顶部。堆栈操作的特点是“先进后出”,即先被放进堆栈中的数据总是后被取出。
堆栈操作指令有两条:PUSH direct ;SP←SP+1,(SP)←dircet)POP direct ;(dircet)←(SP)P←SP-1面用例子介绍堆栈操作指令的功能。设SP=30H,A=01H,B=02H,现执行如下指令:PUSH ACCPUSH BPOP 10H堆栈操作过程示意图
由图可见,后压入堆栈的数02H,在出栈时首先被弹出。打一个比方,堆栈就好象一只桶,里面放了许多盘子,我们每次只能从最上面取盘子,因此总是取出最后放进去的盘子。而SP就象一个游标,始终指示桶中最上面盘子的位置。
例写出指令,将片内RAM中10H和20H单元的内容交换。方法一:用交换指令。
XCH A,10HXCH A,20HXCH A,10H方法二:用“MOV”指令。
MOV A,10HMOV 10H,20HMOV 20H,A方法三:用堆栈。
PUSH 10HPUSH 20HPOP 10HPOP 20H二、算术运算类指令算术运算类指令共有24条,包括加、减、乘、除、加1、减1等。
1.加法指令①不带进位的加法指令ADD A,Rn ADD A,direct ADD A,@Ri ADD A,#data ②带进位的加法指令ADDC A,Rn ADDC A,direct ADDC A,@Ri ADDC A,#data 加法指令的执行结果保存在累加器中。带Cy的加法主要用于多字节加法运算中,低字节运算产生的进位要参与到高字节的运算中。加法指令会对标志寄存器PSW产生影响:若整个字节有进位,则Cy=1,否则为0;若低4位向高4位有进位,则AC=1,否则为0;若最高位和次高位不同时进位,则OV=1,否则为0;若累加器中1的个数为奇数,则P=1,否则为0。
3.加1指令INC A ;A←A+1INC Rn ;Rn←Rn+1INC direct ;(direct)←(direct)+1INC @Ri ;(Ri)←(Ri)+1INC DPTR ;DPTR←DPTR+1加1指令的功能是把操作数指定的单元内容加1。
INCdirect指令中,若direct为I/O端口Pi(i=0,1,2,3)时,可用本指令修改输出口,即进行“读─改─写”操作.4.减1指令DEC A ;A←A-1DEC Rn ;Rn←Rn-1DEC direct ;(direct)←(direct)-1DEC @Ri ;(Ri)←(Ri)-1减1指令的功能是把操作数指定的单元内容减1.5.乘法指令MUL AB ;BA←A×B该指令可完成两个8位数的乘法运算,乘积需用16位来表示。其中A中存放被乘数与积的低8位,B中存放乘数与积的高8位。
6.除法指令DIV AB ;A…B←A÷B该指令可完成两个8位数的除法运算,结果也需用16位来表示。其中A中存放被除数与商,B中存放除数与余数。
7.十进制调整指令DA A这是一条专门用于实现BCD码加法的指令。在前面的学习中我们知道,为了避免总是要将十进制数转换为二进制数后才能送CPU运算,可将十进制数的二进制编码——BCD码直接送CPU。
DAA指令的功能是:在累加器A进行加法运算后,根据PSW中标志位Cy、AC的状态及A的值,将A进行“加6修正(通过加00H、06H、60H或66H到累加器上)”,使其转换成压缩BCD码形式。具体操作为:①若累加器A的低四位大于9(××××1010~××××1111),或者半进位位AC=1,则对A的低四位进行加6调整:A←A+06H。加6调整后,如果低4位向高4位产生进位,且高4位均为1时,进位位Cy=1。②若累加器A的高4位大于9(1010××××~1111××××),或者进位位Cy=1(包括由于低4位调整后导致Cy=1),则对A的高4位进行加6调整:A←A+60H。加6调整后,若最高位产生进位,则Cy=1。
例设A=45H(01000101B),表示十进制数45的BCD码;R0=78H(01111000B),表示十进制数78的BCD码。执行下列指令:ADD A,R0DA A第一条指令执行二进制加法:01000101
+0111100010111101A=10111101B,Cy=0,AC=0第二条指令进行修正:10111101
+01100110100100011A=00100011B,Cy=1结果:A=23H,Cy=1,相当于十进制数123。
三、逻辑运算类指令逻辑运算都是按位进行的,包括与、或、异或、清零、取反、移位等指令。逻辑运算指令共有24条。
1.与运算指令ANL A,Rn ;A←A∧RnANL A,direct ;A←A∧(direct)ANL A,@Ri ;A←A∧((Ri))ANL A,#data ;A←A∧dataANL direct,A ;(direct)←(ditect)∧AANL direct,#data ;(direct)←(direct)∧data2.或运算指令ORL A,Rn ;A←A∨RnORL A,direct ;A←A∨(direct)ORL A,@Ri ;A←A∨((Ri))ORL A,#data ;A←A∨dataORL direct,A ;(direct)←(ditect)∨AORL direct,#data;(direct)←(direct)∨data3.异或运算指令XRL A,Rn ;A←A⊕RnXRL A,direct ;A←A⊕(direct)XRL A,@Ri ;A←A⊕((Ri))XRL A,#data ;A←A⊕dataXRL direct,A ;(direct)←(ditect)⊕AXRL direct,#data;(direct)←(direct)⊕data4.累加器操作指令累加器清零指令CLRA ;A←0
累加器取反指令
CPLA ;A←Ā5.移位指令
循环左移指令RL
A
循环右移指令
RR
A
带C循环左移指令
RLCA
带C循环右移指令
RRCA例将累加器的奇数位由P1口输出,但P1口的偶数位保持不变。
PUSH ACC ANL A,#0AAHANL P1,#55HORL P1,APOP ACC 四、控制转移类指令
此类指令通过改变PC的值,从而改变程序的执行顺序,实现程序的分支、循环、调用和返回。控制转移类指令共有14条,控制CPU空操作的指令有1条。1.无条件转移指令①长转移指令LJMPaddr16;PC←addr16
本指令为三字节指令。指令功能是将16位值送入PC中,CPU转向地址为addr16的单元处取令执行。
②短转移指令AJMP addr11;PC←PC+2,PC10~0←addr10~0
短转移指令为双字节指令。是用指令提供的11位地址替换PC的低11位,所形成的新的PC值作为目的地址.③间接转移指令JMP@A+DPTR;PC←A+DPTR
该指令为1字节指令。目的地址由DPTR与A相加形成。④相对转移指令SJMPrel
;PC←PC+2+rel
本指令为双字节指令。SJMP指令可用来使程序原地踏步:HERE:SJMPHERE或SJMP$($表示PC的当前值)。rel=HERE-HERE-2=FEH,故机器码为80FE。
单片机没有可使CPU停止运行的指令。
2.条件转移指令①判零转移指令JZ rel;PC←PC+2,若A=0,则PC←PC+relJNZ
rel;PC←PC+2,若A≠0,则PC←PC+rel②比较转移指令
CJNE A,direct,rel;PC←PC+3,若A≠(direct),则PC←PC+rel
CJNE A,#data,rel ;PC←PC+3,若A≠data,则PC←PC+rel
CJNE Rn,#data,rel ;PC←PC+3,若Rn≠data,则PC←PC+rel
CJNE @Ri,#data,rel;PC←PC+3,若(Ri)≠data,则PC←PC+rel③循环转移指令
DJNZ
Rn,rel;PC←PC+2,Rn←Rn-1,若Rn≠0,则PC←PC+rel
DJNZdirect,rel ;PC←PC+3,(direct)←(direct)-1,
若(direct)≠0,则PC←PC+rel3.子程序调用和返回指令①子程序调用和返回过程在程序设计时,经常碰到一些相同的处理过程,编出来的程序段完全相同。为了避免重复,节省存储空间,常把这样的程序段独立出来,称作子程序。调用子程序的程序称为主程序。
调用和返回过程如图所示。ACBDABCD②①③④主程序子程序1RET(a)二次调用⑤①②③④子程序3主程序子程序2RETRET(b)嵌套调用②
子程序调用指令
长调用指令
LCALLaddr16
短调用指令
LCALLaddr114.空操作指令NOP该指令经取指、译码后不产生任何操作,CPU转下一条指令执行。NOP指令的执行需消耗一个机器周期,故在程序中常用于延时等待。五、位操作指令到目前我们所学过的指令都是对8位或16位数进行操作,如MOVA,#01H、ADDA,R0等。在单片机硬件结构中还附有一个位处理机,又称布尔处理机,专门用于对一位数码(布尔变量)进行操作,称作位操作。
1.可进行位操作的位及其表示方法MCS-51系列单片机中,片内数据存储器中的位操作区以及SFR中地址可被8整除的专用寄存器可进行位操作。位的表示方法有四种:
①
位地址表示法如00H位表示20H单元的D0位,程序状态字PSW中的软件标志位可表示为D5H。
②
位名称表示法某些专用寄存器的每一位都有名称,可以用名称来表示该位。如进位位可表示为C③
点表示法该表示法说明该位是寄存器或字节地址的哪一位。如进位位可表示为PSW.7,21H.5表示21H单元的D5位。
④标号表示法用户用伪指令将标号定义为某个可进行位操作的位,则在指令中可用标号表示该位。例如使用了伪指令FLAGbitF0后,就可在程序中用FLAG来表示软件标志位F0。
2.位传送指令MOV C,bit ;C←(bit)MOV bit,C ;(bit)←C例写出指令,将00H位的值送01H位。
MOV C,00HMOV 01H,C3.位改指令
CLR C ;C←0SETB C ;C←1CPL C ;C←CLR
bit ;(bit)←0SETB bit ;(bit)←1CPL bit ;(bit)←(/bit)
4.位逻辑运算指令ANL C,bit ;C←C∧(bit)ORL C,bit ;C←C∨(bit)ANL C,/bit ;C←C∧(/bit)ORL C,/bit ;C←C∨(/bit)例3.17
用指令实现下列逻辑电路的功能。
&F0P1.0PP1.1。≥1MOV C,F0ANL C,P1.0ORL C,PCPL CMOV P1.1,C5.位条件转移指令JC
rel;PC←PC+2,若C=1则PC←PC+relJNCrel;PC←PC+2,若C≠1则PC←PC+relJBbit,rel;PC←PC+2,若(bit)=1则PC←PC+relJNB bit,rel;PC←PC+2,若(bit)≠1则PC←PC+relJBC bit,rel;PC←PC+3,若(bit)=1则
PC←PC+rel且(bit)←0
六、伪指令前面所学的指令都会使计算机进行一定的操作,都有与之对应的机器码。除此之外,单片机还提供了一些注释性指令,这些指令,仅在汇编时向汇编程序提供信息,使其准确而顺利地完成汇编任务。这种指令没有相应的机器码,因而不会被CPU所执行,故称为伪指令。
1.赋值指令常量名
EQU表达式
AA EQU 03HBB EQU AA*32.起始指令ORG addr163.结束指令END该指令用于源程序末尾,表示程序的结束。
4.字节定义指令
标号:DB该指令表示以标号为起始地址,依次存放数据表中的字节数据,各数据间用逗号分开
5.字定义指令
标号:DW该指令表示以标号为起始地址,依次存放数据表中的字数据。
6.位定义指令
标号
BIT 位该指令的作用类似EQU指令,不过定义的是位。
第五节
汇编语言程序设计
一、汇编语言源程序格式指令的汇编语言一般用助记符的形式表示,其基本组成分为四个部分:
标号:操作码
操作数
;注释
1.标号标号以英文字母开头的1~8个字母、数字串或下划线组成。为了便于编程、阅读和识别,可在一段程序的起始位置处安排标号。另外,在转移指令的目的地指令前也要有标号。2.操作码与操作数操作码主要由指令系统的助记符组成。操作数的形式也是复杂多样的。它可以是工作寄存器,可以是存储单元地址,可以是专用寄存器,还可以是标号、常数和表达式。
3.注释
注释是对指令的说明,使用注释可增加程序的可读性。注释与指令之间要有分号隔开,汇编程序对注释不作任何处理。
二、数据处理程序1.数据拼拆程序数据的拼装和拆卸,主要利用逻辑运算指令来完成。例将累加器的低4位与P1口的低4位拼装成一个字节,其中A的低4位为新字节数的高4位,然后再送P1口输出。
2000H C4 SWAP A 2001H 54F0 ANL A,#0F0H2003H 53900FANL P1,#0FH 2006H 4590 ORL A,P1 2008H F590 MOV P1,A200AH 80FE SJMP $2.比较数值大小程序比较的方法一般是将两数相减,若为无符号数,则由C的值来判断大小;若为有符号数,则根据OV位及差值的最高位来判断。
例设R6和R7中有两个无符号数,编程将大数送入R0中。分析:减法指令和比较指令都可将两数相减,都会影响Cy。若Cy=0,则被减数大;否则,减数大。
MOVA,R6SUBBA,R7JC JSD MOV A,R6 SJMP CJGJSD: MOV A,R7 CJG: MOV R0,A SJMP $3.数据块处理程序对数据块的操作一般要用间接寻址,片内RAM和8位片外RAM的数据指针用R0和R1,16位片外RAM的数据指针用DPTR。数据指针初值为数据块首地址,每取出一个数据后,修改数据指针,再取下一个数,如此循环下去。例从片外1000H单元开始有100个无符号数,找出其中最大的数,存入2000H单元。
MOV R6,#63H MOV DPTR,#1000H MOVX A,@DPTR MOV R0,A LOOP:INC DPTR MOVX A,@DPTR CLR CSUBB A,R0 JC AJX MOVX A,@DPTR MOV R0,A
AJX:DJNZ R6,LOOP MOV DPTR,#2000HMOV A,R0MOVX @DPTR,A SJMP $二、代码转换程序BCD码转换为二进制数程序一个字节的BCD码最大值是99,转换为二进制数后用一个字节存放即可。转换的方法是:按“权”展开并求和。例已知BCD码存放在A中,编程将其变为二进制数MOV R0,AANL A,#0F0H SWAP AMOV B,#10MUL ABMOV R1,AMOV A,R0
ANL A,#0FH ADD A,R1 SJMP $三、数值运算程序1.取补程序例已知片内RAM中存有若干个字节的有符号数,编程求其补码。(已知R0存放低位字节地址指针,R2存放字节数。)MOV A,R0MOV R1,ASETB CNEXT:MOV A,@R1CPL A ADDC A,#00H MOV @R1,A INC R1DJNZ R2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 淡水珍珠养殖工岗位水平评估考核试卷含答案
- 氧化铝焙烧工创新实践评优考核试卷含答案
- 植物原料水解工风险评估与管理强化考核试卷含答案
- 井下采煤机司机岗前风险评估考核试卷含答案
- 有机介质电容器纸、膜切割工安全行为水平考核试卷含答案
- 糖坯制造工岗中岗位知识考核试卷含答案
- 金属摆件制作工岗前综合评价考核试卷含答案
- 2026年小学三年级数学上册第六单元《长方形和正方形的周长》课时教案
- 2026年西师版小学五年级英语下册Module5《Foods》教案
- 2026年小学成语故事《礼贤下士》传统美德语文公开课教案
- 红火蚁咬伤的诊断与治疗
- 汉服妆造培训
- 地产渠道市场培训课件
- 供暖安装管理制度
- T/CECS 10214-2022钢面镁质复合风管
- 基于室内分布5G多频段定向天线系统的设计
- 餐饮美学基础 课件全套 模块1-4 餐饮美学概论 -餐厅民俗美学
- 海南省民用建筑绿色专篇实施指南(试行)
- 中建二测题库及答案
- 2025年单位保密工作计划
- 口腔科个案护理
评论
0/150
提交评论