已阅读5页,还剩60页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,第四章 汇编语言程序设计,主要内容 汇编语言及格式 伪指令 汇编语言程序设计,2,4.1 汇编语言及格式,4.1.1 汇编语言及特点 计算机只能识别、执行机器语言指令,但它的书写、记忆、阅读困难。 汇编语言比较容易记忆、书写、阅读。 现在已不使用机器语言直接编写程序。,3,用汇编语言编写的程序,叫做汇编源程序. 它需要经过翻译变成机器语言程序,计算机才能执行,这个翻译过程叫做汇编. 完成翻译过程的工具程序叫做汇编程序。 汇编后得到的机器语言程序,叫做目标程序。,4,汇编语言的特点,助记符与指令一一对应,因此用汇编语言编写的程序能真实反映计算机的实际运行情况,占用的空间小,运行速度快; 能直接操作存储器、I/O接口,控制、管理硬件的能力强,能充分发挥计算机硬件资源的效率 程序设计者必须熟悉计算机的硬件,程序设计比用高级语言困难 汇编语言缺乏通用性,程序的移植困难。,5,4.1.2 汇编语言的语句格式,一条汇编语言的语句包括四部分内容:标号、操作码、操作数和注释。其格式为: 标号:操作码 操作数 ;注释 例如: ABC1: ADD A,R3 ; A的内容与R3的内容相加, ; 结果存放在A. 标号位于语句的开始,它以字母开始,后面可跟字母、数字、下划线等。标号与指令助记符之间用冒号“:”分隔。标号是可选的,不是必需的。它可作为一个符号地址被使用。,6,操作码用助记符表示,操作数在助记符后。助记符与操作数之间至少要有一个空格,两操作数之间用“,”分隔。 注释是可选择的,目的是对程序进行解释,增加程序的可读性 。它用分号“;”开始,可以用任何符号。 指令中的数据可以使用二进制(结尾加B),十进制(D,是默认的,可省略),十六进制(H),八进制(Q或O)。 例如: MOV A,#12H MOV R3,#35 MOV B,#01110100B 等。,7,4.1. 3 伪指令,伪指令是为了协助汇编程序将汇编源程序按我们的要求正确的产生目标程序。 例如规定一段代码在存储器中的存储地址,定义符号地址等。 它本身与机器指令没有关系,在汇编过程中不产生形影的目标代码。,8,1、定位伪指令,在汇编语言程序设计中,经常用该伪指令制定某段代码的存放地址,(1)格式:ORG n n是一个数据,它表示在该指令后面的程序代码或数据表格的在程序存储器中存放的首地址。 (2)功能:指定该伪指令后面的代码或常数表格在程序存储器中存放的开始地址。,9,ORG 0000 LJMP M_START ORG 0100H ABC: DB 01H,02H,03H,04H M_START: MOV SP,#60H ,数据表ABC首地址在0100H 而程序在数据之后 (0100H+4=0104H),10,2、定义字节伪指令,(1)格式:标号:DB X1, X2, X (2)功能:定义字节数据、或字符数据常数。 其中,DB是伪指令,X1,X2是一个字节数据,或一个字符串。 每个数据占用一个字节; 字符串必须用单引号将它括起来,字符串中的每一个字符占用一个字节,用它的ASCII码表示。,11,(3)字节定义举例,ORG 2000H DATA:DB 01H,02H,A CHAR:DB CDE 经过汇编后,由于伪指令ORG定义DATA的首地址为2000H,存储器从2000H开始存放以上两组数据,2000H:01H 2001H:02H 2003H:41H 2004H:43H 2005H:44H 2006H:45H,A的ASCII码,字符串中CDE ,每个字符的ASCII码占用一个字节,DATA表从2000H开始存放,DATA=2000H,CHAR=2004H,12,3、定义双字节伪指令,(1)格式:标号:DW X1,X2,Xn (2)功能:它用于定义16位的数据。 (3)举例:,ORG 1000H ABC:DW 1234H,56H 汇编后,数据的存放 1000H: 12H 34H 00H 56H,注意: 对DW定义的双字节数据,高位在前,低位在后存放。 不足两字节,高位补0 数据可使用16进制、十进制、八进制、二进制方式进行定义,用后缀区分。没有后缀是默认的十进制数据。,12在前 34在高位地址,13,4、预留存贮区伪指令,(1)格式:DS (2)功能:DS n从标号指定单元开始,预留n个单元的存贮区。存储单元的个数由表达式的值确定(常数或者可求值的表达式),它可以使一个具体的数值。 (3)例 ORG 3000H SEG : DS 16 ABC: DB 12H, 34H,从 3000H开始预留16字节,从3016开始存放后面定义的数据 3000H : - 3016H : 12H 3017H: 23H,预留16字节,14,5、符号赋值伪指令,格式:符号 EQU 数值或汇编符号 功能: 给一个符号赋值。 利用该指令,我们可以将具体的地址、或常数,用一个符号地址或符号常数来表示。 (3)例:DATA1 EQU 1234 INPOT EQU 2000H,数据常数1234可以用DATA1代替,在程序设计中输入端口地址2000H可以用符号代替,使用符号的好处是:符号一般定义在程序的头部,或头文件里,当需要重新分配资源、或修改数据常数时,只需要修改定义部分,不必在整个程序中去查找修改。否则每一处都得修改。,15,EQU 指令还可以将一个汇编符号赋值给另一个符号。 例如 ABC EQU R7 ;符号ABC与寄存器符号R7等值 ;它的具体地址已居于工作寄存 ;器取得选择 定义了符号后,在程序设计中,我们就可以使用这些符号。 例如 MOV DPTR, #INPOT MOVX A,DPTR,A 从输入端口INPOT读入端口状态。 实际上,我们使用的P0P3等符号,也是这样定义的,只不过它是汇编工具软件定义的默认符号。,16,6. DATA伪指令,(1)格式: 符号 DATA 数据或表达式 (2)与EQU基本类似。 不同的地方是: EQU 必须先定义后使用,DATA则可以先使用后定义(使用的语句在前,定义域据在后) DATA语句只能将一个数据赋值给一个符号,不能将另一个已定义的符号赋值给一个新的符号; 表达式是可以求值的。,17,7. 位地址符号定义,(1)格式: 符号 BIT 位地址 (2)功能: 给位地址定义一个符号名 (3)例 LED BIT P1.7; POST BIT 00H;位地址00H可以用POST符号 注意:也可以使用EQU指令定义为地址 POST EQU 00H 只要程序设计中,将POST用位操作指令处理。但这样对程序的阅读不直观,建议还是使用位地址定义指令定义为地址,这样设计的程序给人的感觉比较好。,18,(1) 格式: END (2)功能:END指示源程序到结束。 END指令放在汇编语言源程序的末尾。 汇编程序遇到该指令后,就认为汇编源程序已经处理完毕,后面的代码不需要处理。因此,该指令不能放在源程序中间,必须放在最后。 如果在程序的最后没有END指令,汇编程序会提出警告。,8. 结束汇编指令,19,4.2 汇编语言程序设计,4.2.1 单片机汇编语言程序设计的基本步骤 分析问题,确定解决问题的思路和计算方法; 依据解题思路和算法确定运算步骤和顺序,把运算过程用程序流程框图表示; 确定所需数据、工作单元的数量,分配寄存器和存储单元; 根据流程图编写程序; 调试程序,发现并修正错误; 固化程序。 编写程序的相关说明,20,举例,求单字节带符号二进制数的补码。 求补码的算法:,资源分配: 输入数据:在DATA单元 结果:保存在SULT单元 使用子程序结构,21,求补码的程序代码,程序代码如下: DATA EQU 30H ORG 0 LJMP START ORG 03H LJMP INT0_FUN ORG 0100H START:MOV SP,#50H LCALL NEGSUB ,复位入口定位在0地址,外部中断0入口地址,主程序开始地址,求补码子程序,程序的其它功能,22,NEGSUB: PUSH ACC MOV A , DATA JNB ACC.7 , NEG_E ;(A)0,不需要转换 CLR ACC.7 ;先取反一次,再取反一 ;次相当于保存符号为不变 CPL A ADD A , #1 NEG_ E : MOV SULT,A ;保存结果 POP ACC RET END,该行只有注释,为了阅读方便对齐,23,4.2.2 程序的基本结构及程序流程框图,1。基本程序结构 最基本的程序结构:顺序结构、分支结构、循环结构。 子程序、中断服务程序是一种特殊的程序,它们也是由以上三种基本结构构成的。这三种结构用流程图表示为:,24,2。程序流程框图,程序设计实际上是程序流程图的设计。程序代码的编制只是依据程序流程图,用一定的程序设计语言来实现程序流程图所表达的的程序设计思想。 对于一个稍微复杂的程序,先设计流程图,再编写代码,其程序设计效率要高许多,同时程序的质量也会好许多,也便于程序的阅读、调试、修改。 要求你们在程序设计时,首先写出算法,然后画出程序流程图,在这之后再编写程序代码。,25,3。程序流程图的画法,在前面已经接触到了一些程序流程图,它是由一些基本图框符号,以及表示程序执行方向的有向线段组成。 (1)基本符号 程序的开始与结束符号框 程序的处理过程符号框 判断符号框 表示程序执行方向的有向线段 有这些基本符号,就可以画出程序流程框图。还有一些其它的符号,我们不要求,需要时查相关资料。,26, 当一张图不能表示一个完整的程序流程时,可以用多张图表示,这时,出现在不同位置的图,用一个连接符号 进行连接,例如,符号,27,4。流程图的画法,(1)依据算法,将一个问题分解为一系列的计算、或判断步骤,用图框符号表示每一步的处理、或判断过程; (2)按照算法顺序,用有向线段将这些图框符号表示的处理过程连接起来,箭头表示的是处理过程的执行方向。 (3)对于判断框,在它的分支出标出条件:用Y 表示判断结果为“是”执行该分支,“N”表示判断结果为非执行; (4)对于转移目标,一般应该给出一个符号,作为编写程序代码是的转移符号地址(标号)。例如前面给出的求补码子程序。,28,例如前面的求补码程序,29,4.2.3 简单程序设计,简单程序就是不存在转移类指令的程序,程序的执行过程没有转移,严格按照先后顺序,中间没有分支、循环、也不存在子程序的调用。 例 :将内部数据存储器50H单元中的一个8位二进制数拆开,分成两个4位数,高四位存入61H单元,低四位存入60H单元,60H,61H的高4位清0。 算法很简单:取出所要处理的字节,将它的高4位清“0”后存入60H,将低4位清“0”并将高低4位做半字节交换后存入61H。 程序流程图:,30,例4.5 程序流程图,程序代码: CZCX: MOV R0,#50H ; 源地址 MOV R1,#60H ;目的地址 MOV A,R0 ;取源数据 ANL A,#0FH ;高4位清0 MOV R1,A ;保存低4位 INC R1 ;修改目的地址 MOV A,R0 ;取源数据 ANL A,#0F0H ;低4位清0 SWAP A ;半字节交换 MOV R1,A ;保存高4位 SJMP $ ;在该处无限循环,该符号表示转移到当前指令执行,31,程序代码: CZCX: MOV R0,#50H ; 源地址 MOV R1,#60H ;目的地址 MOV A,R0 ;取源数据 ANL A,#0FH ;高4位清0 MOV R1,A ;保存低4位 INC R1 ;修改目的地址 MOV A,R0 ;取源数据 ANL A,#0F0H ;低4位清0 SWAP A ;半字节交换 MOV R1,A ;保存高4位 SJMP $ ;在该处无限循环,正常程序设计时,不能有这样的死循环,这个例子只表示前面的代码已完成了所要求的功能。,32,例4.6 单字节十六进制转换成BCD码,将存放在56H单元的一个十六进制(二进制)数转换成BCD码。 教材上有一种算法,它适合于单字节的运算。 算法分析:一个十六进制数,其十进制值在0255之间,一种算法是:该数除以100,得到的商为十进制的百位数,剩下的余数再除以10,得到的商为十进制数的十位,剩下的余数(除以1)是十进制数的个位。 教材上75页给出了该程序。 如果是任意位二进制数,这种算法就有困难。 我们来看另外一个算法。,33,通用二进制BCD码转换算法,展开后,对于一个二进制数据,34,逐步将2提出来,它可以表达为:,35,对于任意k字节的二进制数据,1个字节8位,k个字节,k*8位,这是一个非常规则的迭代运算公式,从二进制数的最高位开始 利用循环程序可以很方便编出程序,现我们先看简单程序(顺序程序)如何实现。以一字节为例,36,我们可以这样计算 1. 令 D0=0; 2. D1=2D0+b7; D2=2D1+b6=2(b7)+b6 ; D3=2D2+b5=2(2b7+b6)+b5 ; D4=2D3+b4; D5=2D4+b3; D6=2D5+b2; D7=2D6+b1; D8=2D7+b0. 经过以上步骤,得到的D8就是压缩的BCD码。我们可以用手工作一个计算来验证。B=64H=01100100B D0=0 D1=2*0+0=0,37,D2=2*0+1=1 D3=2*1+1=3 D4=2*3+0=6 D5=2*6+0=12 D6=2*12+1=25 D7=2*25+0=50 D8=2*50+0=100 可以得到D8=100。 注意: 加bi通过将源操作数左移一位,将最高位移到CY,再使用带进位加法指令进行Di+Di+CY 来实现。 加法运算后,要使用十进制调整指令DAA。 该方法适用于任意字节的二进制数转换成十进制数。,38,程序流程框图,假设待转换的数据保存在符号地址DATA的内部RAM,结果存放在JG_BUF单元,实现该算法的程序流程框图如下,39,程序代码,DATA EQU 30H ;符号地址定义 JG_BUF EQU 40H ORG 0000H ; 伪指令 LJMP STARA ;让开中断服务程序入口 ORG 0100H STARA: MOV SP,#60H ;设置堆栈 BTOBCD: MOV R0,#DATA ;源操作数地址 MOV R1,#JG_BUF ;结果存放地址 MOV R1, #0 ;D0=0(结果清0) INC R1 MOV R1, #0 DEC R1 ;求D1 MOV A, R0 ;取源操作数 RLC A ;将最高位移到进位位,其它为左移一位 MOV R0, A ;保存源数据其它位,,40,MOV A, R1 ;取D0低位(十位,个位) ADDC A, R1 ; 计算D0+D0+Cy DAA ;十进制调整 MOV R1, A ;保存十位、个位结果 INC R1 ;修改地址,指向百位 MOV A, R1 ;取百位 ADDC A, R1 ;带进位加法 Di+Di+Cy DAA ; 十进制调整 MOV R1, A ;保存百位 DEC R1 ;修改地址指向低位 ;求D2 MOV A, R0 ;取源操作数 RLC A ;将最高位移到进位位,其它为左移一位 MOV R0, A ;保存源数据其它位, MOV A, R1 ;取D0低位(十位,个位) ADDC A, R1 ; 计算D0+D0+Cy DAA ;十进制调整 MOV R1, A ;保存十位、个位结果,共8次,41,MOV A, R1 ;取D0低位(十位,个位) ADDC A, R1 ; 计算D0+D0+Cy DAA ;十进制调整 MOV R1, A ;保存十位、个位结果 INC R1 ;修改地址,指向百位 MOV A, R1 ;取百位 ADDC A, R1 ;带进位加法 Di+Di+Cy DAA ; 十进制调整 MOV R1, A ;保存百位 DEC R1 ;修改地址指向低位 ;求D3 MOV A, R0 ;取源操作数 RLC A ;将最高位移到进位位,其它为左移一位 MOV R0, A ;保存源数据其它位, MOV A, R1 ;取D0低位(十位,个位) ADDC A, R1 ; 计算D0+D0+Cy DAA ;十进制调整 MOV R1, A ;保存十位、个位结果,42,MOV A, R1 ;取D0低位(十位,个位) ADDC A, R1 ; 计算D0+D0+Cy DAA ;十进制调整 MOV R1, A ;保存十位、个位结果 INC R1 ;修改地址,指向百位 MOV A, R1 ;取百位 ADDC A, R1 ;带进位加法 Di+Di+Cy DAA ; 十进制调整 MOV R1, A ;保存百位 DEC R1 ;修改地址指向低位 ;求D4 MOV A, R0 ;取源操作数 RLC A ;将最高位移到进位位,其它为左移一位 MOV R0, A ;保存源数据其它位, MOV A, R1 ;取D0低位(十位,个位) ADDC A, R1 ; 计算D0+D0+Cy DAA ;十进制调整 MOV R1, A ;保存十位、个位结果,43,MOV A, R1 ;取D0低位(十位,个位) ADDC A, R1 ; 计算D0+D0+Cy DAA ;十进制调整 MOV R1, A ;保存十位、个位结果 INC R1 ;修改地址,指向百位 MOV A, R1 ;取百位 ADDC A, R1 ;带进位加法 Di+Di+Cy DAA ; 十进制调整 MOV R1, A ;保存百位 DEC R1 ;修改地址指向低位 ;求D5 MOV A, R0 ;取源操作数 RLC A ;将最高位移到进位位,其它为左移一位 MOV R0, A ;保存源数据其它位, MOV A, R1 ;取D0低位(十位,个位) ADDC A, R1 ; 计算D0+D0+Cy DAA ;十进制调整 MOV R1, A ;保存十位、个位结果,44,MOV A, R1 ;取D0低位(十位,个位) ADDC A, R1 ; 计算D0+D0+Cy DAA ;十进制调整 MOV R1, A ;保存十位、个位结果 INC R1 ;修改地址,指向百位 MOV A, R1 ;取百位 ADDC A, R1 ;带进位加法 Di+Di+Cy DAA ; 十进制调整 MOV R1, A ;保存百位 DEC R1 ;修改地址指向低位 ;求D6 MOV A, R0 ;取源操作数 RLC A ;将最高位移到进位位,其它为左移一位 MOV R0, A ;保存源数据其它位, MOV A, R1 ;取D0低位(十位,个位) ADDC A, R1 ; 计算D0+D0+Cy DAA ;十进制调整 MOV R1, A ;保存十位、个位结果,45,MOV A, R1 ;取D0低位(十位,个位) ADDC A, R1 ; 计算D0+D0+Cy DAA ;十进制调整 MOV R1, A ;保存十位、个位结果 INC R1 ;修改地址,指向百位 MOV A, R1 ;取百位 ADDC A, R1 ;带进位加法 Di+Di+Cy DAA ; 十进制调整 MOV R1, A ;保存百位 DEC R1 ;修改地址指向低位 ;求D7 MOV A, R0 ;取源操作数 RLC A ;将最高位移到进位位,其它为左移一位 MOV R0, A ;保存源数据其它位, MOV A, R1 ;取D0低位(十位,个位) ADDC A, R1 ; 计算D0+D0+Cy DAA ;十进制调整 MOV R1, A ;保存十位、个位结果,46,MOV A, R1 ;取D0低位(十位,个位) ADDC A, R1 ; 计算D0+D0+Cy DAA ;十进制调整 MOV R1, A ;保存十位、个位结果 INC R1 ;修改地址,指向百位 MOV A, R1 ;取百位 ADDC A, R1 ;带进位加法 Di+Di+Cy DAA ; 十进制调整 MOV R1, A ;保存百位 DEC R1 ;修改地址指向低位 ;求D8 MOV A, R0 ;取源操作数 RLC A ;将最高位移到进位位,其它为左移一位 MOV R0, A ;保存源数据其它位, MOV A, R1 ;取D0低位(十位,个位) ADDC A, R1 ; 计算D0+D0+Cy DAA ;十进制调整 MOV R1, A ;保存十位、个位结果,47,MOV A, R1 ;取D0低位(十位,个位) ADDC A, R1 ; 计算D0+D0+Cy DAA ;十进制调整 MOV R1, A ;保存十位、个位结果 INC R1 ;修改地址,指向百位 MOV A, R1 ;取百位 ADDC A, R1 ;带进位加法 Di+Di+Cy DAA ; 十进制调整 MOV R1, A ;保存百位 DEC R1 ;修改地址指向低位 。 END,注意: 这里的程序仅作参考; 程序中有许多重复的代码,如果使用循环程序结构,程序将变得 非常短; 在实际程序设计中,这样的功能程序一般编写成子程序。后面我 们就讨论循环程序。,该程序用顺序程序结构实现,太长了,如果2字节,4字节转换就更长。 程序中求Di的部分是相似的,能否让计算机重复执行,而不需要重复写着部分代码?,48,4.2.4 循环程序设计,循环程序包括循环变量初始化、循环体、修改循环变量、循环判断4部分。 1。循环程序的结构 有两种结构 (1)先执行,后判断 对于这种结构,循环体至少被执行一次。,49,(2) 先判断,后执行 这种结构的循环程序,循环体有可能一次也不会被执行。,50,2。单循环程序举例,(1)二进制BCD程序 前面讨论该程序,使用的是顺序程序结构,在该程序中有许多相同的代码,程序长度较长(当然执行时间是比较短的)。如果使用循环程序结构,则程序会变得比较简单。 我们使用子程序结构,待转换的数据存放在DATA中,结果存放在JG_BUF单元。,51,BTOBCD程序,DATA EQU 30H ;符号地址定义 JG_BUF EQU 40H ORG 0000H ; 伪指令 LJMP STARA ;让开中断服务程序入口 ORG 0100H STARA: MOV SP,#60H ;设置堆栈 MOV 30H, #56H ; 调用前,需要先将需要转换的 ;数据送DATA M-LOOP: LCALL BTOBCD ;调用子程序 LCALL DISP_SUB LCALL KB_SUB LJMP M-LOOP ;子程序 BTOBCD: MOV R0, #DATA ;源操作数地址 MOV R1, #JG_BUF ;结果存放地址 MOV R1, #0 ;D0=0(结果清0) INC R1 MOV R1, #0,52,DEC R1 ;恢复结果存放地址 MOV R3,#8 ;循环变量赋初值8次 LOOP: MOV A, R0 ;取源操作数 RLC A ;将最高位移到进位位,其它为左移一位 MOV R0, A ;保存源数据其它位, MOV A, R1 ;取D0低位(十位,个位) ADDC A, R1 ; 计算D0+D0+Cy DAA ;十进制调整 MOV R1, A ;保存十位、个位结果 INC R1 ;修改地址,指向百位 MOV A, R1 ;取百位 ADDC A, R1 ;带进位加法 Di+Di+Cy DAA ; 十进制调整 MOV R1, A ;保存百位 DEC R1 ;修改地址指向低位 DJNZ R3,LOOP RET END,53,利用循环程序结构,程序比顺序程序代码短多了。但执行时间要稍长一点。,54,对于任意字节的二进制数据转换成BCD数据的过程是一样的。区别仅在于: 将待转换的数据左移时,必须从最低字节开始,每个字节左移一位,低字节的最高位移到高字节的最低位上,最高字节的最高位移出到CY。 如果字节数比较多,也可以使用循环方式。 对于N(N5)个字节二进制数据,转换成压缩的BCD码后,一般不超过N+2字节(2N+1为)。 作为作业,编写一个N(N5)的二进制到BCD的转换程序,二进制字节数存放在BIN_NUMB 单元,待转换的数据存放在DATA单元,结果BCD数据存放在JG_BUF单元。,55,56,教材上有一个例子:将内部RAM中20H3FH单元的数据传送到外部2000H开始的连续单元中去。 外RAM只能用间接寻址,地址大于0FFH,地址寄存器只能用DPTR 源地址在内部低128字节空间,但为了在循环程序中修改地址方便,应使用寄存器间址寻址。,57,START: MOV R0, #20H MOV DPTR, #200H MOV R1, #32H LOOP: MOV A, R0 MOVX DPTR, A INC R0 INC DPTR DJNZ R1, LOOP SJMP $ ;,58,延时子程序,假设使用12Mhz时钟,则一个机器周期=1微秒, NOP指令1个机器周期, DJNZ Rn指令2个机器周期, 要设计一个1毫秒的延时子程序。,59,DLY1MS:PUSH ACC ;1 MOV A,R2 ;1 PUSH ACC ;1 MOV R2, #198 ;2 DLY01: NOP ;1 NOP ;1 NOP ;1 D
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 腿部疏通功效话术
- 消防安全与生命至上
- 智研咨询-中国数字化智能控制系统及设备行业市场规模、行业集中度及发展前景研究报告
- 2025年厨师长的年终总结样本(4篇)
- 关于长城的测试题及答案
- 机电设备安装工程施工质量保证方案
- 2026届湖南省岳阳县一中、汨罗市一中高一化学第一学期期末综合测试模拟试题含解析
- 项目5任务5-3-3系统自带杀毒软件的配置
- 2025年后端服务面试题目及答案
- 2025年金坛疾控面试题及答案
- 党的二十届四中全会精神丨线上知识有奖竞答题库
- 天翼云高级解决方案架构师认证考试复习题库(含答案)
- 15D501 建筑物防雷设施安装
- 第11课+宋元时期的经济、科技与文化+课件-2023-2024学年中职高一上学期高教版(2023)中国历史全一册
- 制糖工艺基础知识及煮糖技术(上课)
- GB/T 799-2020地脚螺栓
- CTO病变的介入治疗课件
- 急性冠脉综合征指南
- 2022年成都空港城市发展集团有限公司招聘笔试题库及答案解析
- 旅游职业学院专业设置与调整管理办法
- 美国航空救援发展概述与启示
评论
0/150
提交评论