




已阅读5页,还剩71页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汇编语言概述,一、概述 1.高级语言与汇编语言比较,高级语言:语句 变量说明/定义 int y,a=25,b=3,c=76; 给变量赋值 y=2(a+b)-c,汇编语言:指令 分配寄存器 分配存储单元 数据传递,2.汇编程序结构 数据段 堆栈段 代码段,;设置数据段 DATA SEGMENT A DB 25 ;数据A B DB 3 ;数据B C DB 76 ;数据C Y DB ? ;存放结果 DATA ENDS ;设置堆栈段 STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS,示例:,y=2(a+b)-c,;设置代码段 COSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1 START: MOV AX , DATA ;装填段寄存器DS MOV DS , AX MOV AL , A ;取数据A ADD AL , B ;计算(A+B) SAL AL , 1 ;计算 2(A+B) SUB AL , C ;计算 2(A+B)-C MOV Y , AL ;存结果 MOV AH,4CH ;结束用户程序,返回操作系统 INT 21H COSEG ENDS END START,示例:,汇编语言: 是汇编格式指令,伪指令的集合及其表示,使用这些指令的一组规则。 机器语言: 用二进制编码的机器指令的集合及一组使用规则,它是CPU能直接识别的唯一语言。 MOV DS,AX 汇编语言 8E D8 机器语言(目标代码),汇编语言与机器语言,汇编语言与目标代码的对应,与机器语言相关 效率高 编写源程序繁琐 调试困难,汇编语言特点,(1)程序执行占用较短的时间,或者占用较小存储容量的场合。 (2)程序与计算机硬件密切相关,程序直接控制硬件的场合。 (3)需提高大型软件性能的场合。 (4)没有合适的高级语言的场合。,汇编语言的主要应用场合:,二、汇编语言语句种类,语句种类 指令语句: 又叫可执行语句,在汇编时产生一个目标代码, 对应机器的一种操作。 伪指令语句:又叫命令语句。用于指示汇编程序如何汇编源程序,没有目标代码与之对应。 宏指令语句:由用户自定义的指令。(指令的扩展),格式: 名字 操作符 操作数 ; 注释 指令语句: 标号: 助记符 操作数,操作数;注释 伪指令语句:名字 定义符 参数,.,参数 ;注释 命名规则: 可以用 ?,_,数字和英文字符。 名字的第一个字符不能是数字。 名字的长度不受限制,但只有前31个字符有效。 不允许用保留字作名字(指令,伪指令,寄存器名等)。,二、汇编语言语句格式,指令语句: 标号:助记符 操作数,操作数;注释,1标号:标号是机器指令语句存放地址的符号表示,代表该指令目标代码的第一个字节地址,后面必须紧跟冒号“:” 。 2指令助记符:指令助记符为语句的核心成分,表示了该语句的操作类型。 “MOV” 3操作数:操作数表示指令助记符的操作对象。 4注释:注释均以分号开始,它可占一行或多行,一般放在一条语句的后面。,伪指令语句:名字 定义符 参数,.,参数;注释,1名字(符号名):伪指令语句的一个可选项,空格表示结束,不得使用冒号。 2定义符(伪指令符):指定汇编程序要完成的具体操作,如数据定义伪指令DB、DW、DD,段定义伪指令SEGMENT,假定伪指令ASSUME等。 3参数(操作数):伪指令后面的操作数可以是常数、字符串、变量、表达式等,其个数由具体的伪指令决定,各个操作数之间必须以“逗号”分隔。 4注释:伪指令的注释必须以“;”开始,其作用同指令语句中的注释部分。,三、符号定义语句,1. 等值语句 格式: 符号 EQU 表达式 表达式:常数或数值表达式 地址表达式 变量或标号 CONST EQU 10 ADR1 EQU DS:BP+14H ADR2 EQU CONST +10 COUN EQU VAR 同一符号不能用EQU重新定义。 汇编时,作为替代符号用,不产生目标代码,不占用存储单元。,2. 等号语句 格式: 符号 = 表达式 CONT=5 NUM=10H NUM=NUM+20H 表达式形式同上,但可多次重新定义同一符号。,三、符号定义语句,例: DATA SEGMENT DA1 DB 9AH DA2 DW 5678H DA3 DD 12345678H DATA ENDS,变量的属性:段属性SEG 偏移属性OFFSET 类型属性TYPE,四、数据定义语句,格式: 变量名 DB/DW/DD 表达式1,表达式2,. 保留存储空间,并可以完成数据的初始化。,格式: 变量名 DB/DW/DD 表达式1,表达式2,. 表达式: (1)数值 (2)字符/字符串 (3)?表达式:分配相应数量的存储单元,但不初始化。 (4)带DUP的表达式:使用重复数据操作符DUP,能方便地定义连续的存储单元。 格式: 变量名 DB/DW/DD 表达式1, DUP(表达式2) 次数 内容 操作符DUP可以嵌套使用: DA_B3 DB 10H DUP(4 DUP(3),8),四、数据定义语句,DA_BYTE1 DB 50H DA_BYTE2 DB 10H,20H,30H,40H DA_WORD1 DW 0A34H DA_WORD2 DW 1234H,5678H,9ABCH DA_DWORD DD 12345678H,9ABCDEFH,数值表达式,STRING1 DB STRING STRING2 DW ST,RI,NG STRING3 DD ST,RI,NG,字符串表达式,DA_BYTE3 DB ?,? DA_WORD3 DW ?,?,?表达式,DA_B1 DB 10H DUP(?) DA_B2 DB 20H DUP(ABCD) DA_W1 DW 10 DUP(4) DA_W2 DW 10 DUP(-1,1),带DUP表达式,格式: 变量名 DB/DW/DD 表达式1, DUP(表达式2) 操作符DUP可以嵌套使用 DB 10H DUP(4 DUP(3),8); 3,3,3, 3, 8重复10H次,次数,内容,数据类型,字节 BYTE 1 字 WORD 2 双字 DWORD 4 四字 QWORD 8 十字节 TBYTE 10,DB DW DD DQ DT,1.常数 数值常数:二、八、十、十六进制 B,O,D,H 字符串常数 2. 变量 用数据定义语句定义并预置初值后,变量代表存储单元的数据,并作为该单元的符号地址。 变量引用: (1)在指令语句的操作数字段中,引用的变量名作为地址表达式的组成部分之一。 地址表达式的值:存放操作数的存储单元偏移量。 地址表达式的类型:同变量名的类型。 (2)在用DW或DD的数据定义语句中,若操作数字段引用了变量名,则在分配的存储单元中,预置被引用的变量名的地址部分 偏移量(DW ;DD,前两个字节) 段基值(DD ,后两个字节),五、汇编语言数据与运算符,3. 标号:一条指令的符号地址。 段属性 偏移属性 类型属性 NEAR/FAR 类型属性设置: (1)隐含方式:NEXT:MOV AX, 3000 (2)用LABEL伪指令设置类型属性: 标号伪指令LABEL格式: 名字 LABEL 类型 与指令语句配合使用: 名字(新标号) LABEL 类型(NEAR/FAR) SUB1_FAR LABEL FAR SUB1: MOV AX,1234H 与数据定义语句配合使用: 名字(新变量名)LABEL 类型(BYTE/WORD/DWORD) DATA _BYTE LABEL BYTE DATA _WORD DW 20H DUP(563H),运算符,+ + * / MOD SHR SHL,运算格式,运算功能,+表达式 表达式 表达式1 + 表达式2 表达式1 表达式2 表达式1 * 表达式2 表达式1 / 表达式2 表达式1 MOD 表达式2 表达式1 SHR 次数 表达式1 SHL 次数,正数(单项运算符) 负数(单项运算符) 加法 减法 乘法 除法(取商) 模除(取余数) 右移 左移,(1)算术运算符,4. 运算符,只有减法运算可以用同一段内的两个变量相减,SHR、SHL不能对某寄存器或存储单元内容进行移位运算。,示例 NUM=11011011B DATA1 DW NUM SHL 3 , NUM SHR 2 . MOV AX , NUM SHL 3 MOV BX , NUM SHR 2 MOV CX , NUM SHL 8 MOV CX , NUM SHL 16 MOV DX , NUM SHR 8 MOV DX , NUM SHR 16 DATA1 DW 6D8H , 36H . MOV AX , 011011011000B MOV BX , 00110110B MOV CX , 1101101100000000B MOV CX , 0 MOV DX , 0 MOV DX , 0,算术运算符,移位运算符不能对寄存器或存储单元进行移位运算 MOV AX,CX SHL 5 MOV DX,DATA1 SHR 3,逻辑运算符只能对一个具体数据进行逻辑运算,不能对一个寄存器操作数或存储器操作数进行逻辑运算。,示例 MOV AL , NOT 0F0H MOV DX , NOT 0F0H MOV BL , 55H OR 0F0H AND BH , 55H AND 0F0H XOR CX , 55H XOR 50H,MOV AL , 0FH MOV DX , 0FF0FH MOV BL , 0F5H AND BH , 50H XOR CX , 5,全1为真,全0为假 比较时,若为常数按无符号数比较;如果是变量,按偏移量比较,示例 DATA SEGMENT ORG 10H NUM1=1234 NUM2=1234H DA_BYTE DB 10H DUP(0) DA_WORD DW 10H DUP(0) DA_VAR1 DW NUM2+DA_BYTE GT NUM1+DA_WORD DA_VAR2 DB NUM1 LE NUM2 DATA ENDS . MOV AX , NUM1 LT NUM2 MOV BL , NUM1 GE NUM2 MOV CX , DA_WORD GT DA_BYTE .,. DA_VAR1 DW 0FFFFH DA_VAR2 DB 0FFH . MOV AX , 0FFFFH MOV BL , 0 MOV CX , 0FFFFH .,可以对两个常数进行比较,不能用常数与偏移量进行比较,格式: 运算对象是存储器操作数,由变量名或标号组成地址表达式 SEG : 返回变量所在的段值 OFFSET:返回变量所在偏移 TYPE:返回变量的类型 LENGTH:返回数组变量的元素个数 SIZE:返回数组变量所占的总字节数 SIZE= TYPE* LENGTH,(4)数值返回运算符,示例 假设DATA的段基址是7A4EH DATA SEGMENT ORG 30H DA1 DB 20H DUP(12H) DA2 DW DA1 . DATA ENDS . MOV AX , SEG DA1 MOV BX , SEG DA2 MOV SI , OFFSET DA1 MOV CX , DA2 MOV DI , OFFSET DA2 MOV DX , OFFSET DA1+4,MOV AX , 7A4EH MOV BX , 7A4EH MOV SI , 30H MOV CX , DA2 MOV DI , 50H MOV DX , 34H,用数字形式表示变量和标号的类型属性,示例 DA_BYTE DB 12H DA_WORD DW 3456H DA_DWORD DD 789AH . MOV AL , TYPE DA_BYTE MOV BL , TYPE DA_WORD MOV CL , TYPE DA_DWORD . MOV AL , 1 MOV BL , 2 MOV CL , 4,LENGTH与SIZE运算符,LENGTH运算符 返回数组变量的元素个数 如果变量用DUP定义,Length为外层DUP的值 如果没有DUP定义,结果为1 SIZE运算符 数组变量所占的总字节数 SIZE是LENGTH和TYPE的乘积,示例 DATA SEGMENT VAR1 DB 10H DUP(0) VAR2 DB 10H, 20H, 30H, 40H VAR3 DW 10H DUP(A, 4 DUP(3) VAR4 DB COMPUTER . DATA ENDS . MOV AL , LENGTH VAR1 ; MOV AH , SIZE VAR1 ; MOV BL , LENGTH VAR2 ; MOV BH , SIZE VAR2 ; MOV CL , LENGTH VAR3 ; MOV CH , SIZE VAR3 ; MOV DL , LENGTH VAR4 ; MOV DH , SIZE VAR4 ;,(AL)=10H (AH)=10H (BL)=1 (BH)=1 (CL)=10H (CH)=20H (DL)=1 (DH)=1,例:求数组ARRAY的各数据项的累加和,从数组最后一个数据项开始进行累加。 ARRAY DW 20H DUP(4) . XOR AX , AX MOV SI , OFFSET ARRAY ADD SI , SIZE ARRAY - TYPE ARRAY MOV CX , LENGTH ARRAY LOP: ADD AX , SI SUB SI , TYPE ARRAY LOOP LOP,(5)属性运算符 PTR: 类型 PTR 地址表达式 类型可以是:BYTE ,WORD,DWORD 或NEAR FAR 仅在当前语句中有效,是一种临时设置。 DA_BYTE DB 20H DUP(0) DA_WORD DW 10H DUP(0) MOV WORD PTR DA_BYTE 10, AX ADD BYTE PTR DA_WORD DI, BL INC BYTE PTR SI SUB WORD PTRBX,30H JMP FAR PTR SUB1,THIS:THIS 类型 THIS常与等值语句EQU一起用,形成新变量名或标号,使它们具有THIS后所指的类型,而段基值和偏移量与紧接的变量名或标号相同。 例: DATA _BYTE EQU THIS BYTE DATA _WORD DW 20H DUP(0) JUMP_FAR EQU THIS FAR JUMP_NEAR : XOR AX, AX,(6)分离字节运算符 HIGH 表达式 LOW 表达式 分离运算对象的高字节和低字节部分 表达式必须具有常量值,如常数、地址表达式的偏移量,不能是存储器操作数或寄存器内容.,示例 DATA SEGMENT ORG 20H CONST EQU 0ABCDH DATA1 DB 10H DUP(?) DATA2 DW 20H DUP(?) . DATA ENDS . MOV AH , HIGH CONST MOV AL , LOW CONST MOV BH , HIGH (OFFSET DATA1) MOV BL , LOW (OFFSET DATA2) MOV CL , LOW (CONST SHL 3),MOV AH , 0ABH MOV AL , 0CDH MOV BH , 0 MOV BL , 30H MOV CL , 68H,错误: MOV CH, HIGH DATA1 MOV CL, LOW DATA1 MOV DH, HIGH BP MOV DL, LOW AX,存储器,寄存器,六、段结构伪指令,1. 段定义伪指令 段名 SEGMENT 定位类型 组合类型 类别名 . 段名 ENDS 定位类型(Align Type): PAGE(页):本段从一个页的边界开始,起始地址能被256整除。 PARA(节):本段从一个节的边界开始,起始地址能被16整除。 WORD(字):本段从偶字节地址开始。 BYTE(字节):本段从任意地址开始。,组合类型(Combine Type): 表示段与段之间的连接: None:本段与其它段无连接关系,是独立的。 PUBLIC:本段与其它同段名同类型的段相连接在一起,然后为所有这些段指定一个共同的段基地址,形成一个新的逻辑段。 COMMON:本段与其它同段名同类型的段设置相同的段基址,共享相同的存储区,段长度由同名段中最大的段确定。(覆盖段),组合类型(Combine Type):,STACK:与PUBLIC段相似,但此段为堆栈段,系统自动对SS寄存器和SP指针初始化。 AT表达式:本段的起始单元可以定位在表达式所示的节边界上。 MEMORY:本段定位在所有其它段的最高地址,有多个段,只把第一个遇到的当作此段。 类别名(Class):用户给定,在链接时把相同的段存储在连续的存储区 。,2. 段寻址伪指令 ASSUME 段寄存器名:段名,段寄存器名:段名,. DS_DATA SEGMENT VAR1 DB 12H DS_DATA ENDS ES_DATA SEGMENT VAR2 DB 34H ES_DATA ENDS CODE SEGMENT VAR3 DB 56H,ASSUME CS:CODE , DS:DS_DATA START: . INC VAR1 INC VAR2 INC VAR3 . CODE ENDS END START,可用关键字NOTHING取消前面的某些设置。 例: ASSUME DS:NOTHING;取消对DS的设置 ASSUME NOTHING; 取消全部4个段R的设置,,ES:ES_DATA,3.段寄存器的装入 DS,ES的装入 DATA_DS SEGMENT DB1 DB 10H DUP(?) DATA_DS ENDS DATA_ES SEGMENT DB2 DB 20H DUP(?) DATA_ES ENDS CODE SEGMENT ASSUME CS:CODE , DS:DATA_DS , ES:DATA_ES START: MOV AX , DATA_DS ;设置DS MOV DS , AX MOV AX , DATA_ES ;设置ES MOV ES , AX . CODE ENDS, SS的装入 (1) STACK1 SEGMENT PARA STACK DW 20H DUP(?) STACK1 ENDS (2) STACK2 SEGMENT DW 30H DUP(?) TOP LABEL WORD STACK2 ENDS . CODE SEGMENT . MOV AX , STACK2 ;设置SS MOV SS , AX MOV SP , OFFSET TOP ;修改SP,自动装入,执行程序 装入, CS的装入 (1) 结束伪指令 . CODE SEGMENT ASSUME CS:CODE , . START: . CODE ENDS END START (2)CALL,RET;JMP;IRET,七、过程定义伪指令 过程名 PROC NEAR/FAR . RET 过程名 ENDP 有三个属性 一个过程内,至少有一条返回指令RET 调用过程使用CALL 过程名 段内返回与段间返回,八、其它伪指令,1. ORG , $ ORG 表达式 将表达式的值赋给位置计数器 $ 存放位置计数器的当前值,DATA SEGMENT ORG 30H ;$=30H DB1 DB 12H , 34H ;$=32H ORG $+20H ;$=52H STRING DB STRING . DATA ENDS -,ORG , $举例,CODE SEGMENT . ORG 50H MOV AX , OFFSET $ MOV BX , OFFSET $ . CODE ENDS,MOV AX , 0050H MOV BX , 0053H,DATA SEGMENT DA1 DB 10H DUP(?) DA2 DB 12H , 34H DA3 DW 56H , $+10H , 78H , $+20H . DATA ENDS,;$=10H,;$=12H,;$=1AH,八、其它伪指令,2. EVEN 伪指令 定位偶地址 3. INCLUDE伪指令 INCLUDE 文件名 INCLUDE 文件名 例:INCLUDE FILE.MAC INCLUDE B:MASMABC.ASM,4. PUBLIC PUBLIC 符号1,符号2, ,PUBLIC NUM1 , STRING , SUB1 , LOOP1 DATA1 SEGMENT NUM1 EQU 1234H . STRING DB CHARACTER STRING . DATA1 ENDS . CODE1 SEGMENT . SUB1 PROC FAR . SUB1 ENDP LOOP1: . . CODE1 ENDS END,5. EXTRN 伪指令 EXTRN 符号 1:类型 ,符号 2: 类型, . . 例:,EXTRN NUM1:ABS , STRING:BYTE EXTRN SUB1:FAR , LOOP1:NEAR : CODE2 SEGMENT : MOV AX , NUM1 LEA BX , STRING : CALL SUB1 : JMP FAR PTR LOOP1 : CODE2 ENDS END,八、其它伪指令,5. TITLE (标题)伪指令,指定一个标题 格式:TITLE 文本 字符不超过80个 例: TITLE EXAMPLE PROGRAM,九、宏指令,例: MULTAX10 MACRO PUSH BX SAL AX,1 MOV BX,AX SAL AX,1 SAL AX,1 ADD AX,BX POP BX ENDM,九、宏指令 1. 宏定义 宏名 MACRO 形参1,形参2,. . ENDM,EXCHANG EMACRO MEM1,MEM2,REG MOV REG,MEM1 XCHG REG,MEM2 MOV MEM1,REG ENDM,2. 宏调用 宏名 实参1,实参2,. EXCHANGE DA_BY1 , DA_BY2 , AL 3. 宏展开,;宏定义 MULTAX10 MACRO PUSH BX SAL AX,1 MOV BX,AX SAL AX,1 SAL AX,1 ADD AX,BX POP BX ENDM ;- EXCHANGE MACRO MEM1,MEM2,REG MOV REG,MEM1 XCHG REG,MEM2 MOV MEM1,REG ENDM,;设置数据段 DATA SEGMENT DA_W01 DW 1234H DA_W02 DW 5678H DATA ENDS ;设置堆栈段 STACK1 SEGMENT PARA STACK DW 20H DUP(?) STACK1 ENDS ;设置代码段 COSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1 START: MOV AX , DATA MOV DS , AX . MULTAX10 ;宏指令语句 + PUSH BX + SAL AX , 1,+ MOV BX , AX + SAL AX , 1 + SAL AX , 1 + ADD AX , BX + POP BX . EXCHANGE DA_W01 , DA_W02 , CX :宏指令语句 + MOV CX , DA_W01 + XCHG CX , DA_W02 + MOV DA_W01 , CX . COSEG ENDS END START,4. 宏操作符 连接操作符 & 定义:SHIFT_VAR MACRO R_M , DIRECT, COUNT MOV CL , COUNT S&DIRECT R_M , CL ENDM 调用:SHIFT_VAR AX,HL,2 SHL AX,CL SHIFT_VAR AX,HR,2 SHR AX,CL,SHIF0 MACRO CNT MOV CL , CNT ENDM SHIF1 MACRO REG , DIRECT , NUM COUNT=NUM SHIF0 %COUNT S宏调用 SHIF1 AX , HL , 2 SHIF1 BL , AR , 3,表达式操作符 % 格式:%表达式;获取表达式的值(出现在宏调用中),;宏展开 SHIF1 AX , HL , 2 + MOV CL , 2 + SHL AX , CL SHIF1 BL , AR , 3 + MOV CL , 3 + SAR BL , CL,文本操作符 EXCHANGE ,AL 宏展开 MOV AL , BYTE PTR DA_WORD1 XCHG AL , BYTE PTR DA_WORD2 MOV BYTE PTR WORD1 , AL 字符操作符 ! 格式: !字符 宏定义:PROMPT MACRO NUM , TEXT PROMP,5. LOCAL伪指令,LOCAL 在汇编过程中,宏定义中的内容会在每一次宏调用处展开。因此当多次调用一个宏时,宏定义中的标号会造成标号重复定义。 在宏定义中使用LOCAL伪指令可以使标号被局部化,从而避免重复定义。 LOCAL伪指令只能用在宏定义中,并且它必须是宏定义中紧跟在MACRO伪指令之后的第一个语句。,用连续相加的办法实现无符号数乘法运算 MULTIP MACRO MULT1 , MULT2 , MULT3 LOCAL LOP , EXIT0 MOV DX , MULT1 MOV CX , MULT2 XOR BX , BX XOR AX , AX JCXZ EXIT0 LOP: ADD BX , DX ADC AX , 0 LOOP LOP EXIT0: MOV MULT3 , BX MOV MULT3+2 , AX ENDM,设数据段有
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工程电气答辩题库及答案
- 农村供水设备采购与安装方案
- 老旧厂区改造建设工程项目环境影响报告书
- 玉米出口贸易代理服务合同范本
- 离婚协议中知识产权分割及补偿协议范本
- 道路危险货物运输合同签订安全评估与应急处理
- 水厂水质升级改造工程技术方案
- 离婚协议书起草及财产分割方案协商合同
- 离婚抚养权分配协议:男方获得孩子抚养权及监护权
- 夫妻协议离婚及出轨方赔偿金支付及财产分割协议
- 高压电缆抢修方案
- 枪械介绍课件
- 八年级数学下册《勾股定理》单元测试卷(带答案解析)
- 名词专项练习-集体名词
- 粉尘清扫清洁记录表
- 溶胶凝胶法制备二氧化钛溶胶
- 四年级上册数学近似数
- 新闻编译NEWSTRANSLATION培训资料课件
- 国家职业标准-农艺工
- 原发性骨质疏松症基层诊疗指南(2023年)
- 医疗诊所应急预案及流程
评论
0/150
提交评论