1、1 3.4 汇编语言程序设计基础汇编语言程序设计基础 程序编辑程序编辑:源程序的编写要依据汇编语言的基本规则,可用文本:源程序的编写要依据汇编语言的基本规则,可用文本编辑软件进行编辑。编辑软件进行编辑。编辑好的源程序应以编辑好的源程序应以“ . ASM”扩展名存盘扩展名存盘(了解)。(了解)。 程序汇编程序汇编:将汇编语言源程序转换为单片机能执行的机器码形式:将汇编语言源程序转换为单片机能执行的机器码形式的目标程序的过程叫汇编。常用的方法有两种:的目标程序的过程叫汇编。常用的方法有两种:手工汇编和机器手工汇编和机器汇编(了解)汇编(了解) 3.4.1 汇编语言程序的组成汇编语言程序的组成 汇编
2、语言语句可分为:指令性语句(即汇编指令)和指示性语句(即伪指令)。 指令性语句:指令性语句:指令性语句(可简称指令)是进行汇编语言程序设计的可执行语句,每条指令都产生相应的机器语言的目标代码。 指示性语句:指示性语句:指示性语句(伪指令)又称汇编控制指令。它是控制汇编(翻译)过程的一些命令,程序员通过伪指令要求汇编程序在进行汇编时的一些操作。因此,伪指令不产生机器语言的目标代码,是汇编语言程序中的不可执行语句。伪指令主要用于指定源程序存放的起始地址、定义符号、指定暂存数据的存储区以及将数据存入存储器、结束汇编等。 23.4.2 3.4.2 伪指令伪指令起始地址设定伪指令起始地址设定伪指令 OR
3、G格式:格式:ORG 表达式表达式 功能功能:向汇编程序说明下面紧接的程序段或数据段存放:向汇编程序说明下面紧接的程序段或数据段存放的起始地址。表达式通常为的起始地址。表达式通常为16进制地址,也可以是已定进制地址,也可以是已定义的标号地址。义的标号地址。 ORG 8000HSTART:MOV A,#30H 此时规定该段程序的机器码从地址此时规定该段程序的机器码从地址8000H单元单元开始存放。开始存放。3 注意:在每一个汇编语言源程序的开始,注意:在每一个汇编语言源程序的开始,都要设置一都要设置一条条ORG伪指令来指定该程序在存储器中存放的起始位置。伪指令来指定该程序在存储器中存放的起始位置
4、。若省略若省略ORG伪指令,则该程序段从伪指令,则该程序段从0000H单元开始存放。单元开始存放。在一个源程序中,在一个源程序中,可以多次使用可以多次使用ORG伪指令规定不同程伪指令规定不同程序段或数据段存放的起始地址,但序段或数据段存放的起始地址,但要求地址值由小到大要求地址值由小到大依序排列依序排列,不允许空间重叠。,不允许空间重叠。END 汇编结束伪指令汇编结束伪指令 格式:格式:END 该指令的功能是结束汇编。该指令的功能是结束汇编。 汇编程序遇到汇编程序遇到END伪指令后即结束汇编。处于伪指令后即结束汇编。处于END之后的程序,汇编程序将不处理。之后的程序,汇编程序将不处理。4“标号
5、标号”(插入的内容)(插入的内容) 标号:标号: 操作码操作码 操作数操作数 ;注释;注释 如:如:LOOPLOOP:MOV AMOV A,# 7FH # 7FH ;A7FHA7FH 标号标号是语句地址的标志符号是语句地址的标志符号,有关标号的规定有关标号的规定为:为:由由18个个ASCII字符组成。字符组成。第一个字符必须是字母第一个字符必须是字母,其余字,其余字符可以是字母、数字或其他特定字符;符可以是字母、数字或其他特定字符; 不能使用已经定义了的符号作为标号。如指令助记符、寄不能使用已经定义了的符号作为标号。如指令助记符、寄存器符号名称等;存器符号名称等;后边必须跟冒号。后边必须跟冒号
6、。5字节数据定义伪指令字节数据定义伪指令 DB 格式:格式: 标号:标号: DB 字节数据表字节数据表 功能:功能:从标号指定的地址开始,在从标号指定的地址开始,在ROM中定义字中定义字节数据。该伪指令将字节数据表中的数据根据从左节数据。该伪指令将字节数据表中的数据根据从左到右的顺序依次存放在指定的存储单元中。一个数到右的顺序依次存放在指定的存储单元中。一个数据占一个存储单元。例如:据占一个存储单元。例如:DB “how are you?”把字符串中的字符以把字符串中的字符以ASCII码的码的形式存放在连续的形式存放在连续的ROM单元中单元中。6字数据定义伪指令字数据定义伪指令 DW格式:格式
7、:标号:标号: DW 字数据表字数据表功能:功能:是从标号指定的地址单元开始,在程序存储是从标号指定的地址单元开始,在程序存储器中定义字数据。该伪指令将字或字表中的数据根器中定义字数据。该伪指令将字或字表中的数据根据从左到右的顺序依次存放在指定的存储单元中。据从左到右的顺序依次存放在指定的存储单元中。应特别注意:应特别注意:16位的二进制数,高位的二进制数,高8位存放在低地址位存放在低地址单元,低单元,低8位存放在高地址单元。例如:位存放在高地址单元。例如: ORG 1400HDATA:DW 324AH,3CH 汇编后,(汇编后,(1400H)=32H,(,(1401H)= 4AH,(1402
8、H)=00H,(,(1403H)=3CH。7空间定义伪指令空间定义伪指令 DS格式:格式: 标号:标号: DS 表达式表达式 功能:功能:从标号指定的地址单元开始,在程序存储器从标号指定的地址单元开始,在程序存储器中保留由表达式所指定的个数的存储单元作为备用中保留由表达式所指定的个数的存储单元作为备用的空间,并都填以零值。例如:的空间,并都填以零值。例如: ORG 3000HBUF:DS 50 汇编后,从地址汇编后,从地址3000H开始保留开始保留50个存储个存储单元作为备用单元单元作为备用单元。 8赋值伪指令赋值伪指令 EQU格式:符号名格式:符号名 EQU 表达式表达式 功能:功能:将表达
9、式的值或特定的某个汇编符号定义为一将表达式的值或特定的某个汇编符号定义为一个指定的符号名。例如:个指定的符号名。例如: LEN EQU 10 SUM EQU 21H BLOCK EQU 22H CLR A MOV R7,LEN MOV R0,BLOCK LOOP:ADD A,R0 INC R0 DJNZ R7,LOOP MOV SUM,A END 该程序的功能是,把该程序的功能是,把BLOCK单元开始存放的单元开始存放的10个无符号个无符号数进行求和,并将结果存入数进行求和,并将结果存入SUM单元中。单元中。9位地址符号定义伪指令位地址符号定义伪指令 BIT格式:符号名格式:符号名 BIT 位
10、地址表达式位地址表达式 功能功能:将位地址赋给指定的符号名。其中,位:将位地址赋给指定的符号名。其中,位地址表达式可以是绝对地址,也可以是符号地地址表达式可以是绝对地址,也可以是符号地址。址。例如:例如: ST BIT P1.0将将P1.0的位地址赋给符号名的位地址赋给符号名ST,在其后的编,在其后的编程中就可以用程中就可以用ST来代替来代替P1.0。10 3.4.3 程序设计步骤及技术程序设计步骤及技术 1. 程序设计步骤程序设计步骤 汇编语言程序设计一般经过以下几个步骤: (1) 分析问题,明确任务要求,对于复杂的问题,还要将要解决的问题抽象成数学模型。 (2) 确定算法,即根据实际问题和
11、指令系统的特点确定完成这一任务需经历的步骤。 (3) 根据所选择的算法,确定内存单元的分配;使用哪些存储器单元;使用哪些寄存器;程序运行中的中间数据及结果存放在哪些单元,以利于提高程序的效率和运行速度。 (4) 根据流程图,编写源程序。 (5) 上机对源程序进行汇编、调试。 112 2 程序设计技术(了解)程序设计技术(了解)(1)确定)确定程序的结构程序的结构,画流程图画流程图(2)采用模块化(子程序)程序设计方法;)采用模块化(子程序)程序设计方法;应用系统的程序由包含多个模块的主程序和各种子应用系统的程序由包含多个模块的主程序和各种子程序组成。各程序模块都要完成一个明确的任务,程序组成。
12、各程序模块都要完成一个明确的任务,实现某个具体的功能,如:发送、接收、延时、打实现某个具体的功能,如:发送、接收、延时、打印和显示等。模块化有利于程序的设计和调试,有印和显示等。模块化有利于程序的设计和调试,有利于程序的优化和分工,提高了程序的阅读性和可利于程序的优化和分工,提高了程序的阅读性和可靠性,使程序的结构层次一目了然。靠性,使程序的结构层次一目了然。(3)尽量采用循环结构;)尽量采用循环结构;(4)能用)能用8位表示的数据不要用位表示的数据不要用16位数据表示位数据表示(5)考虑)考虑资源的分配资源的分配。书上其他内容了解书上其他内容了解12绘制流程图常用的符号绘制流程图常用的符号有
13、:开始和结束符号、有:开始和结束符号、工作任务符号、判断分支符号、程序连接符工作任务符号、判断分支符号、程序连接符号、程序流向符号等号、程序流向符号等 开始或结束符号判断分支符号程序流向符号程序流向符号133.5 程序设计实例程序设计实例顺序程序(简单程序)顺序程序(简单程序) 顺序程序是指无分支、无循环结构的程序。其执行流程是顺序程序是指无分支、无循环结构的程序。其执行流程是依指令在存储器中的存放顺序进行的。依指令在存储器中的存放顺序进行的。例例 内部内部RAM的的2AH2EH单元中存储的数据如图所示。试单元中存储的数据如图所示。试编写程序实现图示的数据传送结果。编写程序实现图示的数据传送结
14、果。14方法一:方法一:MOV A,2EH ;2字节,字节,1个机器周期个机器周期MOV 2EH,2DH ;3字节,字节,2个机器周期个机器周期MOV 2DH,2CH ;3字节,字节,2个机器周期个机器周期MOV 2CH,2BH ;3字节,字节,2个机器周期个机器周期MOV 2BH,#00H ;3字节,字节,2个机器周期个机器周期15方法二:方法二:CLR A ;1字节,字节,1个机器周期个机器周期XCH A,2BH ;2字节,字节,1个机器周期个机器周期XCH A,2CH ;2字节,字节,1个机器周期个机器周期XCH A,2DH ;2字节,字节,1个机器周期个机器周期XCH A,2EH ;2
15、字节,字节,1个机器周期个机器周期 以上两种方法均可以实现所要求的传送任务。以上两种方法均可以实现所要求的传送任务。方法一使用方法一使用14个字节的指令代码,执行时间为个字节的指令代码,执行时间为9个机个机器周期;方法二仅用了器周期;方法二仅用了9个字节的代码,执行时间也个字节的代码,执行时间也减少到了减少到了5个机器周期。实际应用中应尽量采用指令个机器周期。实际应用中应尽量采用指令代码字节数少、执行时间短的高效率程序,即代码字节数少、执行时间短的高效率程序,即注意注意程序的优化程序的优化。16 由于由于80C51指令系统中只有单字节加法指令,因指令系统中只有单字节加法指令,因此对于多字节的相
16、加运算必须从低位字节开始分字此对于多字节的相加运算必须从低位字节开始分字节进行。除最低字节可以使用节进行。除最低字节可以使用ADD指令外,其他指令外,其他字节相加时要把低字节的进位考虑进去,这时就应字节相加时要把低字节的进位考虑进去,这时就应该使用该使用ADDC指令。指令。例例 双字节无符号数加法。双字节无符号数加法。 设被加数存放在内部设被加数存放在内部RAM的的51H、50H单元,加单元,加数存放在内部数存放在内部RAM的的61H、60H单元,相加的结果单元,相加的结果存放在内部存放在内部RAM的的51H、50H单元,进位存放在位单元,进位存放在位寻址区的寻址区的00H位中。位中。 17
17、程序段如下:程序段如下:MOV R0,50H ;被加数的低字节地址;被加数的低字节地址MOV R1,60H ;加数的低字节地址;加数的低字节地址MOV A,R0 ;取被加数低字节;取被加数低字节ADD A,R1 ;加上加数低字节;加上加数低字节MOV R0,A ;保存低字节相加结果;保存低字节相加结果INC R0 ;指向被加数高字节;指向被加数高字节INC R1 ;指向加数高字节;指向加数高字节MOV A,R0 ;取被加数高字节;取被加数高字节ADDC A,R1 ;加上加数高字节(带进位加);加上加数高字节(带进位加)MOV R0,A ;存高字节相加结果;存高字节相加结果MOV 00H,C ;
18、保存进位;保存进位 。 51H50H61H60H51H50H18 例例 将两个半字节数合并成一个一字节数。 设内部RAM 40H#, 41H单元中分别存放着 8 位二进制数, 要求取出两个单元中的低半字节, 并成一个字节后, 存入 50H单元中。 程序如下: START: MOV R1, 40H ; 设置R1为数据指针MOV A, R1 ; 取出第一个单元中的内容ANL A, 0FH ; 取第一个数的低半字节SWAP A ; 移至高半字节INC R1 ; 修改数据指针XCH A, R1 ; 取第二个单元中的内容,交换A与R1 中内容ANL A, 0FH ; 取第二个数的低半字节ORL A, R
19、1 ; 拼字MOV 50H, A ; 存放结果RET 19 分支程序分支程序 分支结构可以分成单分支、双分支和多分支分支结构可以分成单分支、双分支和多分支几种情况几种情况 :20单分支单分支:x, y均为8位二进制数, 设 x存入R0, y存入R1, 求解: 011y000 xxx程序如下: START: CJNE R0, 00H, SUL1; R0中的数与00比较不等转移 MOV R1, 00H; 相等, R1 0 SJMP SUL2 SUL1: JC NEG ; 两数不等, 若(R0)0, 则 R101H SJMP SUL2 NEG: MOV R1, 0FFH ; (R0)0, 则 R10
20、FFH(-1的补码) SUL2: RET21双分支程序双分支程序例例 设变量设变量 x 以补码的形式存放在片内以补码的形式存放在片内RAM的的30H单元,变量单元,变量 y 与与 x 的关系是:当的关系是:当 x 大于大于0时,时,y 不变;当不变;当 x =0时,时,y =20H;当;当 x 小小于于0时,时,y =x+5。编制程序,根据。编制程序,根据 x 的大小求的大小求y并送回原单元。程序段并送回原单元。程序段如下:如下:START:MOV A,30H JZ NEXT ANL A,#80H ;判断符号位;判断符号位 JZ LP MOV A,#05H ADD A,30H MOV 30H,
21、A SJMP LP NEXT:MOV 30H,#20H LP:SJMP $ 22散转程序设计散转程序设计-多分支程序多分支程序 根据运算结果或输入数据将程序转入不同的分支。 指令JMP A+DPTR, 此指令的特点在于, 转移的目标地址不是在编程或汇编时预先确定的, 而是在程序运行过程中动态地确定的。 目标地址是以数据指针 DPTR的内容为起始的 256 字节范围内的指定地址, 即由 DPTR的内容决定分支转移程序的首地址, 由累加器 A的内容来动态选择其中的某一个分支转移程序。 23程序如下: LP0: MOV DPTR, TAB ; 取表头地址 MOV A, R0 ADD A, R0 ;
22、R0内容乘以2,由于由于AJMPAJMP指令是指令是2 2字节指令字节指令 JNC LP1 ; 无进位转移 INC DPH ; 加进位位LP1: JMP A+DPTR; 跳至散转表中相应位置 TAB: AJMP PR0 AJMP PR1 AJMP PRN 例例 根据工作寄存器R0 内容的不同, 使程序转入相应的分支。(R0)=0对应的分支程序标号为PR0; (R0)=1 对应的分支程序标号为PR1; (R0)=N 对应的分支程序标号为PRN。 24循环程序循环程序按某种控制规律重复执行的程序称为循环程序。循环程序按某种控制规律重复执行的程序称为循环程序。循环程序有有先执行后判断先执行后判断和和
23、先判断后执行先判断后执行两种基本结构两种基本结构 :初始化部分: 为循环程序做准备, 如规定循环次数、 给各变量和地址指针预置初值。25先执行后判断先执行后判断例例 50ms延时程序。延时程序。 若晶振频率为若晶振频率为12MHz,则一个机器周期为,则一个机器周期为1s。执行一。执行一条条DJNZ指令需要指令需要2个机器周期,即个机器周期,即 2s。采用循环计数法。采用循环计数法实现延时,循环次数可以通过计算获得,并选择先执行后实现延时,循环次数可以通过计算获得,并选择先执行后判断的循环结构。程序段如下:判断的循环结构。程序段如下:DEL:MOV R7,#200 ;1 sDEL1:MOV R6
24、,#123 ;1 s NOP ;1 sDEL2:DJNZ R6,DEL2 ;2s,计(,计(2123)s DJNZ R7,DEL1 ;2s, RET 共计共计 (21231+1 2)200+1 s,即,即50.001ms26先判断后执行先判断后执行 例例 将内部将内部RAM中起始地址为中起始地址为data的数据串传送到外部的数据串传送到外部RAM中起始地址为中起始地址为buffer的存储区域内,直到发现的存储区域内,直到发现$ 字字符停止传送。符停止传送。 由于循环次数事先不知道,但循环条件可以测试到。由于循环次数事先不知道,但循环条件可以测试到。所以,采用先判断后执行的结构比较适宜。程序段如
25、下所以,采用先判断后执行的结构比较适宜。程序段如下: MOV R0,#data MOV DPTR,#bufferLOOP0:MOV A,R0 CJNE A,#24H,LOOP1 ;判断是否为;判断是否为 $ 字符字符 SJMP LOOP2 ;是;是 $ 字符,转结束字符,转结束LOOP1:MOVX DPTR,A ;不是;不是 $ 字符,执行传送字符,执行传送 INC R0 INC DPTR SJMP LOOP0 ;传送下一数据;传送下一数据 LOOP2: 27例:工作单元清零。 在应用系统程序设计时, 有时经常需要将存储器中各部分地址单元作为工作单元, 存放程序执行的中间值或执行结果, 工作单
26、元清零工作常常放在程序的初始化部分中。 设有50个工作单元, 其首址为外部存储器8000H单元, 则其工作单元清零程序如下: 28例题:设在内部 RAM的BLOCK单元开始处有长度为 LEN个的无符号数据块, 试编一个求和程序, 并将和存入内部 RAM的 SUM单元(设和不超过 8 位)。 BLOCK EQU 20H LEN EQU 30H SUM EQU 40HSTART: CLR A ; 清累加器A MOV R2, LEN; 数据块长度送R2 MOV R1, BLOCK ; 数据块首址送R1 LOOP: ADD A, R1 ; 循环加法 INC R1; 修改地址指针 DJNZ R2, LO
27、OP ; 修改计数器并判断 MOV SUM, A; 存和 RET 29 多重循环:即在一个循环体中又包含了其它的循环程序多重循环:即在一个循环体中又包含了其它的循环程序, 这这种方式是实现延时程序的常用方法。种方式是实现延时程序的常用方法。 例例 7 10 秒延时程序。 延时程序与 MCS - 51 执行指令的时间有关, 如果使用 6 MHz晶振, 一个机器周期为 2 s, 计算出一条指令以至一个循环所需要的执行时间, 给出相应的循环次数, 便能达到延时的目的。10 秒延时程序如下: DELAY: MOV R5, 100 DEL0: MOV R6, 200 DEL1: MOV R7, 248
28、DEL2: DJNZ R7, DEL2 DJNZ R6, DEL1 DJNZ R5, DEL0 RET 30 使用多重循环时, 必须注意: (1) 循环嵌套, 必须层次分明, 不允许产生内外层循环交叉。 (2) 外循环可以一层层向内循环进入, 结束时由里往外一层层退出。 (3) 内循环可以直接转入外循环, 实现一个循环由多个条件控制的循环结构方式。 31查表程序设计查表程序设计 查表程序是一种常用程序, 它广泛使用于 LED显示控制、 打印机打印控制、数据补偿、数值计算、转换等功能程序中, 这类程序具有简单、执行速度快等特点。 所谓查表法, 就是预先将满足一定精度要求的表示变量与函数值之间关系
29、的一张表求出, 然后把这张表存于单片机的程序存储器中, 这时自变量值为单元地址, 相应的函数值为该地址单元中的内容。查表, 就是根据变量 X在表格中查找对应的函数值 Y, 使 Y=f(X)。 MOVC A, A+PCMOVC A, A+DPTR 32 MOVC A, A+PC查表(查查表(查09平方表)平方表) ORG 1000H1000 C083 TA: ADD A, #01H ; # 01H 为偏移量1002 83 MOVC A, A+PC1003 22 RET 1004 00 DB 00H, 01H, 04H, 09H1005 01 END1006 041007 09偏移量表首地址(查表
30、指令下一条指令地址)偏移量表首地址(查表指令下一条指令地址) 1004H 1003H 01H33 例例 13 一个十六进制数存放在内部 RAM 的 HEX单元的低 4 位中, 将其转换成ASCII码并送回 HEX单元。 十六进制 09的ASCII码为 30H39H, AF的ASCII码为41H46H, ASCII码表格的首地址为ASCTAB。编程如下: ORG 1000H HEXASC: MOV A, HEX ANL A, 0FH;取低四位 ADD A, 3; 修改指针 MOVC A, A+PC MOV HEX, A(2字节) RET (1字节)ASCTAB: DB 30H, 31H, 32H
31、, 33H, 34H DB 35H, 36H, 37H, 38H, 39H DB 41H, 42H, 43H, 44H, 45H DB 46H 在这个程序中, 查表指令MOVC A, A+PC到表格首地址有两条指令, 占用 3 个字节地址空间, 故修改指针应加 3。偏移量表首地址(查表指令下一条指令地址)偏移量表首地址(查表指令下一条指令地址) 34 例例 有一变量存放在片内有一变量存放在片内RAM的的20H单元,其取值范围为:单元,其取值范围为:00H05H。要求编制一段程序,根据变量。要求编制一段程序,根据变量值求其平方值,并存入片内值求其平方值,并存入片内RAM的的21H单元。程序如下:
32、单元。程序如下: ORG 1000HSTART:MOV DPTR,#2000H MOV A,20H MOVC A,A+DPTR MOV 21H,A SJMP $ ORG 2000HTABLE:DB 00,01,04,09,16,25 END。 #2000H DPTR(20H) A(A+DPTR) AA 21H开始结束35子程序及其调用子程序及其调用一、子程序的调用一、子程序的调用 在实际应用中,经常会遇到一些带有在实际应用中,经常会遇到一些带有通用性的问通用性的问题题,例如:数值转换、数值计算等,在一个程序中,例如:数值转换、数值计算等,在一个程序中可能要使用多次。这时可以将其可能要使用多次。
33、这时可以将其设计成通用的子程设计成通用的子程序供随时调用序供随时调用。 子程序主要特点子程序主要特点:在执行过程中需要由其它程序来在执行过程中需要由其它程序来调用,执行完后又需要把执行流程返回到调用该子调用,执行完后又需要把执行流程返回到调用该子程序的主程序。程序的主程序。 子程序调用时要注意两点:一是现场的保护和恢子程序调用时要注意两点:一是现场的保护和恢复;二是主程序与子程序的参数传递。复;二是主程序与子程序的参数传递。36现场保护与恢复现场保护与恢复 在子程序执行过程中常常要用到单片机的一些通在子程序执行过程中常常要用到单片机的一些通用单元,如工作寄存器用单元,如工作寄存器R0R7、累加
34、器、累加器A、数据指、数据指针针DPTR,以及有关标志和状态等。而这些单元中,以及有关标志和状态等。而这些单元中的内容在调用结束后的主程序中仍有用,所以需要的内容在调用结束后的主程序中仍有用,所以需要进行保护,称为进行保护,称为现场保护现场保护。 在执行完子程序,返回继续执行主程序前恢复其在执行完子程序,返回继续执行主程序前恢复其原内容,称为原内容,称为现场恢复现场恢复。保护与恢复的方法有以下。保护与恢复的方法有以下两种:两种:在主程序中实现;在主程序中实现;在子程序中实现。在子程序中实现。37 1、在主程序中实现、在主程序中实现 示例如下:示例如下: PUSH PSW ;保护现场;保护现场
35、PUSH ACC ; PUSH B ; MOV PSW,#10H ;换当前工作寄存器组;换当前工作寄存器组 LCALL addr16 ;子程序调用;子程序调用 POP B ;恢复现场;恢复现场 POP ACC ; POP PSW ; 38 2、在子程序中实现、在子程序中实现示例如下:示例如下:SUB1:PUSH PSW ;保护现场;保护现场 PUSH ACC ; PUSH B ; MOV PSW,#10H ;换当前工作寄存器组;换当前工作寄存器组 POP B ;恢复现场;恢复现场 POP ACC ; POP PSW ; RET注意,无论哪种方法保护与恢复的注意,无论哪种方法保护与恢复的顺序要对应。顺序要对应。