版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
18十一月2022第1页
5.1汇编语言与机器语言的关系
5.2汇编语言源程序的结构
5.3汇编语言程序设计基础
本章内容
5.4汇编语言程序设计11十一月2022第1页5.1汇编语言与机器语言的关系18十一月2022第2页把指令进行有机组合完成一定的任务,就是汇编语言程序设计。本章任务:汇编语言的语法规定
汇编语言程序的格式伪指令的格式与用法汇编语言程序编写的步骤汇编语言的程序设计方法11十一月2022第2页把指令进行有机组合完成一定的任务18十一月2022第3页5.1汇编语言与机器语言的关系用二进制代码“0”和“1”编写的指令称为机器指令,用机器指令编写的程序称为机器语言(MachineLanguage)。计算机只能直接识别和执行机器语言程序。【例5.1】在起始地址为2000H:0500H的内存中存放有20个带符号的字,从中找出最大值,并保存到偏移地址为0528H单元。程序如下:11十一月2022第3页5.1汇编语言与机器语言的关18十一月2022第4页5.1汇编语言汇编语言(assemblylanguage)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。许多汇编程序为程序开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编程工具经常会提供宏,它们也被称为宏汇编器。汇编语言不像其他大多数的程序设计语言一样被广泛用于程序设计。在今天的实际应用中,它通常被应用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言。11十一月2022第4页5.1汇编语言汇编18十一月2022第5页5.1机器语言机器语言(machinelanguage)是一种指令集的体系。这种指令集,称机器码(machinecode),是电脑的CPU可直接解读的数据。机器码有时也被称为原生码(NativeCode),这个名词比较强调某种编程语言或库,它与运行平台相关的部份。机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指指令系统令的集合。它是计算机的设计者通过计算机的硬件结构赋予计算机的操作功能。机器语言具有灵活、直接执行和速度快等特点。
[2]
不同型号的计算机其机器语言是不相通的,按着一种计算机的机器指令编制的程序,不能在另一种计算机上执行。11十一月2022第5页5.1机器语言机器语言(18十一月2022第6页 MOV AX,2000H ;段地址送DS寄存器
MOV DS,AX MOV SI,0500H ;偏移地址送SI寄存器
MOV CX,19 ;比较19次
MOV AX,[SI] ;取第一个字,假定为最大SEEK:ADD SI,2 ;指向下一个字
CMP [SI],AX ;与后面的字比较
JLE NEXT ;[SI]≤AX转NEXT MOV AX,[SI] ;[SI]>AX,则[SI]送AXNEXT:LOOP SEEK ;循环
MOV [0528H],AX ;保存最大值
INT 20H ;返回DOS11十一月2022第6页 MOV AX,200018十一月2022第7页汇编后的机器码在内存中的存放情况内存地址机器代码对应的汇编指令137E:0100B80020
MOVAX,2000H137E:01038ED8
MOVDS,AX137E:0105BE0005
MOVSI,0500H137E:0108B91300
MOVCX,19137E:010B8B04
MOVAX,[SI]137E:010D83C602SEEK: ADDSI,2137E:01103904
CMP[SI],AX137E:01127E02
JLENEXT137E:01148B04
MOVAX,[SI]137E:0116E2F5NEXT: LOOPSEEK137E:0118A32805
MOV[0528H],AX137E:011BCD20
INT20H用机器语言编写程序很不直观,困难很大,编写程序效率低。汇编语言(AssemblyLanguage)指令与机器语言指令一一对应,书写相对方便。11十一月2022第7页汇编后的机器码在内存中的存放情况18十一月2022第8页5.2汇编语言源程序的结构例5.1的程序段不能汇编运行,必须按照一定格式进行编写,才能被汇编程序汇编。【例5.2】例5.1的标准格式。;exam5_2.asm.Seekthelargestnumberandstoreinthemaxunitdata segment ;数据段定义
buffer dw -5,3,-15,-67,39,20,4,-158,-32734,256;字数据定义
dw 32762,10,-1000,500,0,-128,1,45,6,-100 count equ ($-buffer)/2 ;数据个数
max dw ? ;最大值空间data endsstack segmentstack‘stack’ ;堆栈段定义
db 100dup(?)stack ends11十一月2022第8页5.2汇编语言源程序的结构code segmentpara‘code’ ;代码段定义
assumecs:code,ds:data,ss:stackmain proc far ;函数定义
push ds ;返回地址入栈
xor ax,ax push ax mov ax,data ;数据段寄存器赋值
mov ds,ax lea si,buffer ;指向buffer区
mov cx,count ;数据个数送cx dec cx mov ax,[si] ;取第一个数据存入ax作为最大值seek: add si,2 ;指向下个数据
cmp [si],ax ;与之比较
jle next ;小于等于,跳转至next mov ax,[si] ;大值保存在axnext: loop seek ;循环直至比较完毕
mov max,ax ;最大值存入max ret ;返回main endp ;函数结束code ends ;代码段结束
end main ;源程序结束,并指定从main开始执行汇编语言程序是由段(Segment)构成的。段是由语句(Statement)构成的。code segmentpara‘code’ ;代码段定18十一月2022第10页5.2.1汇编语言的语句格式汇编语言语句大致分为三类:指令语句、伪指令语句、宏指令语句。1.指令语句的格式[标号:]助记符
[操作数][,操作数][;注释]用方括号括起来的项是可以缺省的项。汇编语言中的标号或名字以及变量名必须是由字母、特殊字母打头的字母数字串,中间不能有空格。合法的字符可以是:A~Z、a~z、0~9、?、·(圆点)、@、$、_(下划线),不能以数字开头;问号本身不能单独作为名字;如果用到“·”则必须是第一个字符;标号和名字的最大长度为31个字符。11十一月2022第10页5.2.1汇编语言的语句格18十一月2022第11页5.2.1汇编语言的语句格式汇编语言语句大致分为三类:指令语句、伪指令语句、宏指令语句。2.伪指令语句的格式[名字]伪指令
[操作数][;注释]伪指令的名字后面不能跟冒号。伪指令为汇编程序提供汇编信息,可以用来定义段和过程、定义语句、分配内存空间以及完成各种与程序设计有关的重要说明。操作数项可选,操作数的个数随不同伪指令而相差悬殊,有的伪指令不允许有操作数,有的伪指令允许带多个操作数。对于多个操作数,有的伪指令要求用空格分开,有的操作数要求用逗号分开。11十一月2022第11页5.2.1汇编语言的语句格18十一月2022第12页5.2.2汇编语言源程序的段定义汇编语言源程序的段定义与内存的分段组织直接相关。一个程序可以包含数据段、代码段、堆栈段和扩展段。段定义使用SEGMENT和ENDS伪指令,格式为:段名SEGMENT[Align][Combine][‘class’]
段模块段名ENDS段开始与段结束的段名必须一致。11十一月2022第12页5.2.2汇编语言源程序的18十一月2022第13页对齐方式(align)包括byte、word、dword、para、page用于规定所定义的段以字节、字、双字、节(16字节)、页(256字节)为边界。合并(combine)包括public、stack、common、memory、atpublic一般用于代码段或数据段定义,凡段名相同且合并类型为public的段在连接时合并为一个段。stack一般用于堆栈段定义,凡段名相同且合并类型为stack的段在连接时合并为一个段。并在程序装入内存准备运行时,段寄存器SS自动初始化为该堆栈段的段址,SP为最后一个字节的地址加1。11十一月2022第13页对齐方式(align)包括by18十一月2022第14页5.2.3汇编语言源程序的过程定义代码段的主要内容是程序的可执行代码。一个代码段可以由一个或几个过程(子程序)组成。过程定义使用PROC和ENDP伪指令,格式为:过程名
PROC [属性]
过程体过程名ENDP
PROC和ENDP必须成对出现,并且前面的过程名必须一致。11十一月2022第14页5.2.3汇编语言源程序的18十一月2022第15页5.2.4汇编结束语句END伪指令用于指示汇编语言源程序结束,END是源程序的最后一条语句。END语句格式为:END
表达式必须是一个存储器地址,该地址是程序执行时的第一条指令的地址。如果一个模块是主模块,那么表达式通常是过程名,或者是第一条指令前的标号,汇编程序通过END后面的标号确定程序的入口;如果不是主模块,而只是把该模块与另外一个主模块连接,那么END后面就不需要带任何表达式。11十一月2022第15页5.2.4汇编结束语句E18十一月2022第16页5.2.5汇编语言的段寻址
SEGMENT定义了不同的段,段名完全任意。必须使用ASSUME伪指令来说明段寄存器与段名之间的对应关系。ASSUME
段寄存器名:段名[,段寄存器名:段名]ASSUME语句必须写在代码段中,一般情况下放在段定义语句之后。汇编程序不会识别段名的意义,不能确定哪个段是数据段、哪个段是代码段。ASSUME语句只给出了段寄存器与段之间的对应关系,但是并没有真正给段寄存器赋值。段寄存器的赋值还需要由指令完成。程序中只需要为数据段寄存器DS、附近段寄存器ES赋值,不需要为代码段寄存器CS、堆栈段寄存器SS赋值。MOV AX,DATA ;段基址送AX寄存器MOV DS,AX ;数据段寄存器CS赋值11十一月2022第16页5.2.5汇编语言的段寻址18十一月2022第17页5.2.6标准程序前缀PSPEXE可执行文件除了数据、代码之外,还包含一个头文件,这个头文件叫做程序段前缀PSP(ProgramSegmentPrefix),占用256个字节。PSP实际上是一个程序控制块,并利用它来管理系统的进程。PSP包含了操作系统的装入程序在把该EXE文件装入内存时所需要的有关信息,如重定位表和初始化有关段寄存器的信息等。当DOS加载一个可执行文件的程序代码到内存中时,它首先为该程序建立一个程序段前缀PSP,然后把可执行的程序代码加载到PSP后面的内存中(由CS指示),而DS和ES初始化在PSP的起始地址。11十一月2022第17页5.2.6标准程序前缀PS18十一月2022第18页DOS装入EXE文件后的内存分配如图所示。由于DOS的装入程序在加载一个程序时把DS和ES定位在PSP的起点上,所以一般在程序的开始处将PSP起点地址压入堆栈:PUSH DSXOR AX,AXPUSH AX程序结束时通过RET指令返回DOS。常把上述三条指令称为标准程序前缀。11十一月2022第18页DOS装入EXE文件后的内存分18十一月2022第19页5.2.7COM文件的汇编语言源程序结构如果一个汇编语言程序规模较小,而且只有一个用户使用,也不需要与外部的其他模块装配,那么就可以把数据、代码连同堆栈段都定义在一个段内,这种结构的程序就是COM文件。ASSUME只有一个项,即CS:CODE。
由于DOS的装入程序在加载这种COM程序时,把4个段寄存器都初始化在PSP的起点上,所以IP初始化在0100H(留出PSP占用的256字节),SP初始化在整个段的高端。11十一月2022第19页5.2.7COM文件的汇编18十一月2022第20页
中断向量表
ROMBIOS
数据区
DOS常驻部分
PSP
00
00
DOS暂驻部分
图5-2-2
装入COM程序后内存的情况
RAM低端
CS/DS/ES/SS
IP=0100H
用户程序区
SP=0FFFEH
64KB
11十一月2022第20页中断向量表ROMBIO18十一月2022第21页把例5.2改写为COM程序格式,源程序如下。;exam5_3.asm.Seekthelargestnumberandstoreinthemaxunit.Comfileform.code segment ;代码段定义
assume cs:codemain proc far ;函数定义
org 0100hstart: jmp init buffer dw-5,3,-15,-67,39,20,4,-158,-32734,256;字数据定义
dw 32762,10,-1000,500,0,-128,1,45,6,-100 count equ ($-buffer)/2 ;数据个数
max dw ? ;最大值空间init: push ds ;保存程序前缀
xor ax,ax push ax mov ax,cs ;数据段寄存器赋值 mov ds,ax
告诉汇编程序,程序起始地址为0100h,跳过标准前缀PSP。11十一月2022第21页把例5.2改写为COM程序格式18十一月2022第22页
lea si,buffer ;指向buffer区
mov cx,count ;数据个数送cx dec cx mov ax,[si] ;取第一个数据存入ax作为最大值seek: add si,2 ;指向下个数据
cmp [si],ax ;与之比较
jle next ;小于等于,跳转至next mov ax,[si] ;大值保存在axnext: loop seek ;循环直至比较完毕
mov max,ax ;最大值存入max ret ;返回main endp ;函数结束code ends ;代码段结束
end start ;源程序结束,并指定从start开始11十一月2022第22页 lea si,buffer18十一月2022第23页COM格式的汇编语言源程序经汇编、连接后生成EXE文件,此时需要使用DOS提供的EXE2BIN实用程序将EXE文件转换为COM文件。EXE2BIN
文件名.EXE文件名.COM与EXE格式的可执行程序相比,COM程序更紧凑,执行速度更快,但是COM程序大小不能超过64KB。11十一月2022第23页COM格式的汇编语言源程序经汇18十一月2022第24页5.2.8汇编语言上机过程计算机只能识别二进制目标代码,汇编语言程序必须被翻译成相应的机器码(二进制目标代码)才能被计算机执行。将汇编语言源程序翻译成机器码程序(目标程序)的过程称为汇编。汇编程序以源程序为输入,并由它产生两个文件,一个是目标程序文件(文件扩展名为.OBJ),另一个是源程序列表文件(文件扩展名为.LST)汇编语言上机过程为:编辑软件.asm文本文件汇编程序.obj目标文件连接程序库文件.exe执行程序11十一月2022第24页5.2.8汇编语言上机过程18十一月2022第25页1.DOS命令操作方式⑴编辑(Edit)编辑就是将源程序(SourceProgram)输入计算机的过程。汇编语言源程序文件编辑完毕后,存盘时的文件名必须以“.asm”作为扩展名。如把例5.2保存为名称为“seekmax.asm”。⑵汇编(Assemble)汇编就是将编辑形成的汇编语言源程序翻译成二进制目标程序(ObjectProgram)的过程,这个工作由汇编程序(Assembler)来完成。11十一月2022第25页1.DOS命令操作方式⑴编辑18十一月2022第26页MASMseekmax;Microsoft(R)MacroAssemblerVersion5.00Copyright(C)MicrosoftCorp1981-1985,1987.Allrightsreserved.50794+415590Bytessymbolspacefree0WarningErrors0SevereErrorsTASMseekmax;TurboAssemblerVersion4.1Copyright(c)1988,1996BorlandInternationalAssemblingfile:SEEKMAX.asmErrormessages:NoneWarningmessages:NonePasses:1Remainingmemory:419k汇编后将生成一个相同文件名而扩展名为“.obj”的目标文件。11十一月2022第26页MASMseekmax;M18十一月2022第27页1.DOS命令操作方式⑶连接(Link)汇编生成的目标文件还不能执行,需要经过连接才能变成可执行文件。LINKseekmax;Microsoft(R)OverlayLinkerVersion3.65Copyright(C)MicrosoftCorp1983-1988.Allrightsreserved.LINK:warningL4021:nostacksegmentTLINKseekmax;TurboLinkVersion.Copyright(c)1987,1996BorlandInternationalWarning:Nostack目标文件seekmax.obj经连接后生成扩展名为“.exe”的可执行文件seekmax.exe。11十一月2022第27页1.DOS命令操作方式⑶连接18十一月2022第28页1.DOS命令操作方式⑷运行(Run)连接生成的扩展名为“.exe”的文件,可以直接运行。seekmax.exe
运行时输入文件名即可:或:seekmax11十一月2022第28页1.DOS命令操作方式⑷运行18十一月2022第29页2.可视化方式可视化汇编程序环境,不需要用户记忆、输入繁琐的DOS命令,只需要用户点击鼠标就可以实现相关操作。可视化汇编程序visualassembly安装完毕后包含如图所示的文件夹。11十一月2022第29页2.可视化方式可视化汇编程序18十一月2022第30页打开bin文件夹,双击其中的visualassembly.exe文件,则打开可视化汇编环境,如图所示。菜单栏工具栏实用工具编辑区输出栏状态栏编译连接运行11十一月2022第30页打开bin文件夹,双击其中的v18十一月2022第31页源程序文件编辑完毕并保存后,需要设置选项。点击菜单栏中的“选项”,出现,点击,则弹出如图所示的对话框。设置编译器路径设置连接器路径11十一月2022第31页源程序文件编辑完毕并保存后,需18十一月2022第32页5.3汇编语言程序设计基础本节介绍汇编语言源程序所需要的数据及伪指令。任何一个程序都需要使用数据,数据是指令中操作数的基本组成部分,数据的形式对语句格式有很大影响。汇编程序能识别的数据项有常数、变量和标号。5.3.1常量、变量和标号1.常量(Constant)常量是没有任何属性的纯数值。在汇编时,常量的值已经确定,并且在程序运行过程中,常量的值不会改变。常量分为两种类型:数值型常量和字符串型常量。11十一月2022第32页5.3汇编语言程序设计基础18十一月2022第33页2.变量(Variable)常量可以用二进制(数据以B结尾)、十进制(数据以D结尾或不用任何字母结尾)、十六进制(数据以H结尾)和八进制(数据以Q结尾)表示。一个常量如果是一个字符串,该字符串必须用单引号或双引号括起来,汇编程序把字符串汇编成相应的ASCII码,一个字节存放一个字符的ASCII码。变量在除代码段以外的其他段中被定义,用来定义存放在存储器单元中的数据。变量代表着内存单元,因此有时也称为内存变量。11十一月2022第33页2.变量(Variable)18十一月2022第34页既然变量是内存单元,必然具有段地址和段内偏移量,所以变量有三个属性:段基址(SEG)、段内偏移量(OFFSET)和类型(TYPE)。变量的类型指的是变量占有的字节数。当存储单元中的数据在程序运行中随时可修改时,这个存储单元的数据可以用变量来定义。为了便于对变量的访问,要给变量取一个名字,这个名字称为变量名,变量名应符合标识符的规定。11十一月2022第34页既然变量是内存单元,必然具有段18十一月2022第35页3.标号(Lable)标号可在代码段中被定义。标号是指令语句的标识符,表示后面的指令所存放单元的符号地址(即该指令第一个字节存放的内存地址)标号是可有可无的,如果有标号,必须和后面的操作项以冒号“:”分隔开来。标号常作为转移指令的操作数,确定程序转移的目标地址。标号也有三重属性:段地址、段内偏移量和类型。标号的类型有两种:NEAR、FAR常量、变量以及标号不能使用汇编程序规定的保留字,这些保留字包括指令助记符、寄存器名、伪指令及汇编程序所使用的其他保留字。11十一月2022第35页3.标号(Lable)标号可18十一月2022第36页伪指令有:ASSUME、CODEMACRO、DB、DD、DW、END、ENDM、ENDP、ENDS、EQU、EXTERN、GROUP、LABEL、MACRO、MODRM、NAME、NOSEGFIX、ORG、PROC、PUBLIC、PURGE、RECORD、RELB、RELW、SEGFIX、SEGMENT。其他保留字包括:ABS、AT、BYTE、COMMON、DUP、EQ、FAR、GE、GT、HIGH、INPAGE、LE、LENGTH、LOW、LT、MASK、MEMORY、MOD、NE、NEAR、NOTHING、OFFSET、PAGE、PARA、PREFIX、PROCLEN、PTR、SEG、SHORT、SIZE、STACK、THIS、TYPE、WIDTH。11十一月2022第36页伪指令有:ASSUME、COD18十一月2022第37页5.3.2伪指令伪指令语句是说明性语句,告诉汇编程序如何工作,主要完成数据定义、分配存储区、指示程序结束等。伪指令没有对应的机器码,不由CPU执行,而是在汇编程序汇编时识别,用于说明CPU的类型、段结构、源程序起止信息和段内存安排等。伪指令可分为变量定义伪指令、符号定义伪指令、段定义伪指令、段分配伪指令、过程定义伪指令、群定义伪指令、结构定义伪指令和记录定义伪指令等。1.变量定义伪指令变量定义伪指令包括DB、DW、DD、DQ、DT,用于定义变量的类型,并为变量中的数据项分配存储单元。11十一月2022第37页5.3.2伪指令伪指令语18十一月2022第38页⑴简单变量定义格式:[变量名]DB/DW/DD/DQ/DT
表达式变量名是可选项,但是如果程序中要引用变量,则变量名必须给出。DB(DifneByte):定义一个字节类型的变量,其后的每个操作数均占用1个字节。DW(DefineWord)
:定义一个字类型的变量DD(DefineDoubleWord):定义一个双字类型的变量DQ(DefineQuadWord):定义一个四字类型的变量DT(DefineTenBytes):定义一个十字节类型的变量
11十一月2022第38页⑴简单变量定义格式:[变量名18十一月2022第39页①用数值表达式定义变量【例5.4】 V1DB 20,30,80 V2DW 100,300H,-5,3*30②用地址表达式定义变量【例5.5】 RS1DW ADDR1,ADDR2 RS2DD SUB1,SUB2【例5.6】 STR1DB'Hello!' STR2DW'C','DE'③用字符串定义变量11十一月2022第39页①用数值表达式定义变量【例518十一月2022第40页④用问号(?)定义不确定值的变量【例5.7】 MAX DB ?,'A',? INBUF DW ?,0,800[变量名]DB/DW/DD/DQ/DTnDUP(表达式)⑵重复数据变量定义DUP(Duplicate)用于定义重复的数据或分配数据块空间;n可以是常数或表达式,但值必须为正整数,数值范围为1~65535。11十一月2022第40页④用问号(?)定义不确定值的变18十一月2022第41页DATA1DB2DUP(?) ;分配2个字节空间,内容不定DATA2DB3DUP(5) ;分配3个字节空间,内容为05HDATA3DB2DUP('A',2DUP(0)) ;重复2次'A'、0、0变量定义后,就可以在指令语句中被引用。如果var是变量名,则在指令中var或[var]都可以作为操作数表示该变量的值。11十一月2022第41页DATA1DB2DU18十一月2022第42页变量引用:简单变量X DB 'A'MOV AL,X ;(AL)=‘A’MOV BL,[X] ;(BL)=‘A’数组变量A DB 10,20,30,40,50MOV AL,[A+1] ;(AL)=20MOV BL,A[3] ;(BL)=40MOV CL,A ;(CL)=10MOV DL,[A] ;(DL)=1011十一月2022第42页变量引用:简单变量X DB 18十一月2022第43页2.符号定义伪指令汇编语言中所有的变量名、标号名、过程名、指令助记符、寄存器名等统称为“符号”。这些符号可以用符号定义伪指令来命名或重新命名。伪指令不占用内存,有两种基本格式。⑴等值语句EQU符号EQU
表达式将表达式的值赋值给EQU左侧的符号。【例5.9】STRDB 'Followme!' ;定义字符串
NUM EQU $-STR;计算得到字符串长度使用EQU为某个符号赋值后,不能再用EQU伪指令对该符号重新赋值。符号后面不能带冒号。11十一月2022第43页2.符号定义伪指令汇编语言中18十一月2022第44页⑵等号伪操作语句符号=表达式将表达式的值赋值给等号左侧的符号。【例5.10】 COUNT=10 COUNT=COUNT+20等号语句与EQU语句有同样的功能,区别在于等号语句定义的符号允许重新定义,使用更加方便灵活。11十一月2022第44页⑵等号伪操作语句符号=表18十一月2022第45页3.模块定义伪指令汇编语言中每一个独立的源程序称为一个模块。在源程序的开始可以用NAME伪指令为模块命名,而源程序结束使用END伪指令。NAME
模块名TITLE
模块名NAME伪指令可以缺省,如果缺省NAME指令,汇编程序以TITLE指令中前6个字符作为模块名。TITLE伪指令用于在打印程序时给定一个标题,列表文件中每一页的第一行都会显示这个标题,它是用户任意选定的字符串,但是字符的个数不能超过60个。TITLE指令也可以缺省,如果NAME和TITLE都缺省,则以源文件名作为模块名。11十一月2022第45页3.模块定义伪指令汇编语言中18十一月2022第46页4.偏移地址设置伪指令ORG
表达式ORG(origin)是操作码,不可省略。表达式给出的偏移地址值,即ORG语句后的指令或数据以表达式给出的值作为起始的偏移地址。表达式必须是一个可计算得到的正整数,数值范围在0~65535之间。在大多数情况下,不需要用ORG语句设置位置指针。汇编程序汇编时把语句中表达式的值作为起始地址,连续存放ORG语句之后的程序和数据,直到出现一个新的ORG指令。若省略ORG语句,则从本段起始地址开始连续存放。11十一月2022第46页4.偏移地址设置伪指令ORG18十一月2022第47页【例5.11】
SDATA SEGMENT ORG0010H D1 DB00H,5AH,80H,24H ORG 30H D2 DW4142H,6162H,0A0DH
SDATAENDS
由于ORG的设置,D1的第一个元素00H的偏移地址为0010H,而D2的第一个元素4142H的偏移地址为0030H。11十一月2022第47页【例5.11】由于ORG的设置18十一月2022第48页5.3.3表达式表达式是操作数的常见形式,它是常数、寄存器、标号、变量与一些运算符和操作码相组合的序列。表达式的运算不由CPU完成,而是在汇编过程中由汇编程序进行计算确定,并将表达式的结果作为操作数参与指令所规定的操作。MASM允许使用的表达式分为数值表达式和地址表达式两类。1.数值表达式(NumberExpression)MOVDX,(6*A-B)/2
若设变量A的值为1,变量B的值为2,则此表达式的值为(6*1-2)/2=2。11十一月2022第48页5.3.3表达式表达式是18十一月2022第49页2.地址表达式(AddressExpression)当这个地址中存放的是数据时,称为变量;当这个地址中存放的是指令时,则称为标号。当在指令的操作数部分用到地址表达式时,应注意其物理意义。例如,两个地址相乘、相除没有任何意义,两个不同段的地址相加减也没有意义。经常使用的是地址加减数字量。MOVAX,ES:[BX+SI+1000H]
结果是一个存储单元的地址。11十一月2022第49页2.地址表达式(Address18十一月2022第50页3.表达式中使用的运算符(Operator)运算符包括:算术运算符、逻辑运算符、关系运算符、值返回运算符、属性运算符。⑴算术运算符(ArithmeticOperator)包括+(加)、-(减)、*(乘)、/(除)、MOD(模)、SHL(左移)和SHR(右移)七种运算。算术运算符通常用于数字表达式或地址表达式中。在将它们用于地址表达式中时,一般应采用在标号上加减某一个数字量,如START+3,SUM-1等。用这样的表达式来表示一个存储单元的地址。11十一月2022第50页3.表达式中使用的运算符(Op18十一月2022第51页【例5.12】下面左侧的语句等价于右侧的语句。A1 EQU 1020H+2200H ;A1 EQU 3220HMOV BX,A1-2000H ;MOV BX,1220HMOV AX,35*6 ;MOV AX,210MOV DX,A1/100H ;MOV DX,32HMOV CX,A1MOD100H ;MOV CX,20H
SHL和SHR为移位操作,一般在建立屏蔽字时使用。【例5.13】
MASKA EQU 01011010BMASKB EQU MASKASHL2;MASKB=01101000BMASKC EQU MASKASHR2;MASKC=00010110B11十一月2022第51页【例5.12】下面左侧的语句等18十一月2022第52页3.表达式中使用的运算符(Operator)运算符包括:算术运算符、逻辑运算符、关系运算符、值返回运算符、属性运算符。⑵逻辑运算符(LogicalOperator)包括NOT(非)、AND(与)、OR(或)和XOR(异或)四种。逻辑运算符完成的运算是按位操作的,只能用于数值表达式中,不能用于存储器的地址表达式中。11十一月2022第52页3.表达式中使用的运算符(Op18十一月2022第53页【例5.14】 MASKA EQU00101010B MOV AL,5FH AND AL,MASKAAND0FH在汇编时,汇编程序计算出MASKAAND0FH的值为0AH,然后再按ANDAL,0AH汇编第三条指令。11十一月2022第53页【例5.14】在汇编时,汇编程18十一月2022第54页3.表达式中使用的运算符(Operator)运算符包括:算术运算符、逻辑运算符、关系运算符、值返回运算符、属性运算符。⑶关系运算符(RelationalOperator)包括EQ(相等)、NE(不等)、LT(小于)、LE(小于或等于/不大于)、GT(大于)、GE(大于或等于/不小于)六种运算。关系运算符连接的两个操作数必须都是数字的或是同一段内的两个存储器地址。11十一月2022第54页3.表达式中使用的运算符(Op18十一月2022第55页关系运算符很少单独使用,一般都是同其他操作结合以构成一个判断表达式。【例5.15】实现关系运算符对两个运算对象进行比较操作,运算的结果是逻辑值,若满足条件,则表示运算结果为真(TRUE),输出结果全为1;若不满足条件,则表示运算结果为假(FALSE),这时输出结果为全0。语句为:MOVAX,((NUMLT20)AND5)OR((NUMGE20)AND6)11十一月2022第55页关系运算符很少单独使用,一般都18十一月2022第56页3.表达式中使用的运算符(Operator)运算符包括:算术运算符、逻辑运算符、关系运算符、值返回运算符、属性运算符。⑷值返回运算符(ValuereturnOperator)又称分析运算符。包括$、SEG、OFFSET、LENGTH、TYPE、SIZE、HIGH和LOW。值返回运算符总是加在运算对象之前,返回的结果是运算对象的某个参数或将存储器地址分解为它的组成部分,如段基址、偏移地址和类型等。11十一月2022第56页3.表达式中使用的运算符(Op18十一月2022第57页$运算符返回当前地址的值。【例5.16】 BUFFER DW 20DUP(?) NUMBER EQU ($-BUFFER)/2①$运算符$表示汇编程序的汇编地址计数器的当前值,在这里等于BUFFER区域的下一个字节的地址的偏移量,BUFFER是第一个字节的地址的偏移量,$-BUFFER=40个字节,再除以2就是BUFFER区所存储的字数。11十一月2022第57页$运算符返回当前地址的值。【18十一月2022第58页SEG/OFFSET
变量/标号SEG运算符返回一个变量或标号的段基址,OFFSET运算符返回一个变量或标号的偏移地址。②SEG和OFFSET运算符【例5.17】MOV AX,SEGTABLE ;把TABLE的段地址送AXMOV BX,OFFSETTABLE ;把TABLE的偏移地址送BX等价于LEABX,TABLE11十一月2022第58页SEG/OFFSET 变量18十一月2022第59页TYPE
变量/标号TYPE运算符加于某个变量或标号之前,如果是变量,汇编程序将返回该变量的类型属性所表示的字节数;如果是标号,则汇编程序将返回代表该标号类型属性(又称距离属性)的数值。③TYPE运算符变量/标号的属性返回的数值变量字节变量(DB)1字变量(DW)2双字变量(DD)4四字变量(DQ)8十字节变量(DT)10标号NEAR标号-1(0FFH)FAR标号-2(0FEH)【例5.18】ARRAYDW100DUP(0)则:MOV AX,TYPEARRAY执行后,(AX)=211十一月2022第59页TYPE 变量/标号TYPE18十一月2022第60页LENGTH/SIZE
变量LENGTH和SIZE运算符只对使用DUP定义的变量有意义。LENGTH返回的是分配给该变量的元素的个数(长度),而SIZE返回的是分配给该变量的字节数。④LENGTH和SIZE运算符SIZE变量=(LENGTH变量)*(TYPE变量)(BX)=100【例5.19】对于例5.18中的ARRAYMOVBX,LENGTHARRAYMOVCX,SIZEARRAY(CX)=20011十一月2022第60页LENGTH/SIZE 变18十一月2022第61页HIGH/LOW表达式
HIGH运算符返回一个16位表达式的高位字节,LOW运算符返回其低位字节。⑤HIGH和LOW运算符(AH)=12H【例5.20】NUMEQU1234HMOVAH,HIGHNUMMOVBH,LOWNUM(BH)=34H11十一月2022第61页HIGH/LOW表达式H18十一月2022第62页3.表达式中使用的运算符(Operator)运算符包括:算术运算符、逻辑运算符、关系运算符、值返回运算符、属性运算符。⑸属性运算符属性运算符用于修改变量或标号的属性。包括PTR、LABEL、THIS、段操作符和SHORT。11十一月2022第62页3.表达式中使用的运算符(Op18十一月2022第63页类型
PTR
表达式
PTR运算符可用来修改变量或标号的类型属性。①PTR运算符(AX)=3426H【例5.21】对于定义 V1 DB 26H,34H V2 DW 5678H执行指令: MOV AX,WORDPTRV1 MOV BL,BYTEPTRV2(BL)=78H类型可以是BYTE、WORD、DWORD、NEAR和FAR,表达式可以是变量、标号或存储器操作数,其含义是将PTR左边的类型属性赋给其右边的表达式。11十一月2022第63页类型PTR表达式18十一月2022第64页【例5.22】BNUMLABELBYTE;字节变量,具有与WNUM相同的地址WNUMDW 2345H;字变量DFW LABEL WORD;字变量,具有与DFB相同的地址DFB DB 78H,56H ;字节变量则: MOV AL,BNUM MOV BX,WNUM MOV CX,DFW MOV DL,DFB 名字LABEL
类型LABEL可以对已定义的内存单元的属性重定义,并取一个新名字。②LABEL运算符(AL)=45H(BX)=2345H(CX)=5678H(DL)=78H11十一月2022第64页【例5.22】名字LABE18十一月2022第65页【例5.23】FIRSTEQUTHISBYTE;具有BYTE属性,地址与SECOND相同SECOND DW5678H则执行: MOVAX,TYPEFIRST MOVBL,FIRSTTHIS类型THIS运算符为指定类型属性运算符,与PTR运算符具有类似的功能。③THIS运算符(AX)=0001H(BL)=78HTHIS运算符的对象是类型(BYTE,WORD,DWORD)或距离(NEAR,FAR),用于规定所指变量或标号的类型属性或距离属性,使用时常和EQU伪指令连用。11十一月2022第65页【例5.23】THIS类18十一月2022第66页段操作符又称段超越前缀,用来表示一个标号、变量或地址表达式的段属性。④段操作符指令执行时,强迫源操作数来自ES段,而不是DS段。【例5.24】MOV AX,ES:[BX]段操作符强迫当前指令的操作数的寻址不按约定的段进行,而由段操作符指定的段寻址。11十一月2022第66页段操作符又称段超越前缀,用来表18十一月2022第67页【例5.25】
JMP SHORTNEXT;表示与NEXT之间的距离小于127字节
…NEXT:MOV AX,BXSHORT为说明运算符,它说明转移指令的目标地址与本指令之间的字节距离在-128~+127范围内,具有短程转移的属性。⑤SHORT运算符JMP原来为三字节指令,加上SHORT后汇编为两字节指令。11十一月2022第67页【例5.25】 SHORT为说18十一月2022第68页运算符的优先级优先级运算符1LENGTH、SIZE、WIDTH、MASK、()、[]、<>2PTR、OFFSET、SEG、TYPE、THIS3HIGH、LOW4+、-(单目)5*、/、MOD、SHL、SHR6+、-(双目)7EQ、NE、LT、LE、GT、GE8NOT9AND10OR、XOR11SHORT11十一月2022第68页运算符的优先级优先级运算符118十一月2022第69页5.3.4宏指令在汇编语言源程序中,有的程序段需要多次使用。为了在源程序中不重复书写这个程序段,可以用一条宏指令来代替。宏指令是源程序中具有独立功能的一段程序代码。它可以根据用户的需要,由用户自己在源程序中定义。1.宏定义宏指令名 MACRO[形式参数][,形式参数…]
宏定义体
ENDM
形参又称哑元宏指令一经定义,便可以在以后的程序中多次调用。宏定义是对宏指令进行定义的过程。11十一月2022第69页5.3.4宏指令在汇编语18十一月2022第70页2.宏调用经过定义后的宏指令就可以在源程序中被调用,这种对宏指令的调用称为宏调用。宏指令名
[实际参数列表]3.宏展开具有宏调用的的源程序被汇编时,汇编程序将对每个宏调用进行宏展开。宏展开实际上是用宏定义时设计的宏体去代替宏指令名,并且用实际参数取代形式参数,即第n个实际参数取代第n个形式参数,以形成符合设计功能且能够实现、执行的程序代码。11十一月2022第70页2.宏调用经过定义后的宏指令就18十一月2022第71页【例5.26】用宏指令定义两个字操作数相乘,得到16位的结果。宏定义:WMUL MACROOPR1,OPR2,RESULT PUSH DX PUSH AX MOV AX,OPR1 IMUL OPR2 MOV RESULT,AX POP AX POP DX
ENDM宏调用: WMUL CX,VAR,[RES]
… WMUL 240,BX,SAVE11十一月2022第71页【例5.26】用宏指令定义两个18十一月2022第72页宏展开: + PUSH DX + PUSH AX + MOV AX,CX + IMUL VAR + MOV [RES],AX + POP AX + POP DX
… + PUSH DX + PUSH AX + MOV AX,240 + IMUL BX + MOV SAVE,AX + POP AX + POP DX11十一月2022第72页宏展开: + PUSH DX18十一月2022第73页4.宏定义中的变量与标号如果在宏定义体中出现标号和变量定义,该宏指令又需要多次被调用,这样在宏展开后的程序中将多次重复出现相同的标号和变量,也就是说会产生重复定义标号或变量的错误。为了避免发生这种错误,在宏定义中用伪指令LOCAL把要出现在宏体中的标号或变量定义为局部标号或变量。LOCAL
参数表宏展开时,汇编程序用??0000,??0001,
…
??FFFF来依次取代参数表中出现的标号或变量,以建立惟一的标号或变量。11十一月2022第73页4.宏定义中的变量与标号如果18十一月2022第74页LOCAL伪指令只能出现在宏定义体内,而且必须是MACRO伪操作后的第一条语句,在MACRO和LOCAL伪操作之间不允许有注释和分号标志。【例5.27】对于如下宏定义:ABSL MACRO OPR CMP OPR,0 JGE NEXT NEG OPRNEXT:… ENDM如果在程序中多次宏指令调用ABSL,则宏展开后就会出现重复的标号。
ABSL MACRO OPR
LOCAL NEXT CMP OPR,0 JGE NEXT NEG OPRNEXT:… ENDM11十一月2022第74页LOCAL伪指令只能出现在宏定18十一月2022第75页5.宏嵌套宏定义中允许宏嵌套。即在宏定义中允许使用宏调用,但所调用的宏指令必须预先被定义过。宏定义中还可以包含宏定义。【例5.28】宏嵌套举例SHIFT MACRO OPR PUSH CX MOV CL,4 SAL OPR,CL POP CX
ENDMSQR MACRO OPR1,OPR2,RESULT PUSH DX PUSH AX
SHIFT OPR1 MOV AX,OPR1 IMUL OPR2 MOV RESULT,AX POP AX POP DX
ENDM11十一月2022第75页5.宏嵌套宏定义中允许宏嵌套18十一月2022第76页当使用宏调用SQRVAR1,VAR2,RESULT时,展开为: + PUSH DX + PUSH AX ++ PUSH CX ++ MOV CL,4 ++ SAL VAR1,CL ++ POP CX + MOV AX,VAR1 + IMUL VAR2 + MOV RESULT,AX + POP AX + POP DXSHIFT展开
11十一月2022第76页当使用宏调用SQRVAR118十一月2022第77页5.3.5DOS功能调用DOS(DiskOperatingSystem)是微型计算机磁盘操作系统,操作系统是用来控制和管理计算机的硬件资源、方便用户使用的程序集合。操作系统是人和机器交互的界面,用户通过操作系统使用和操作计算机。DOS为程序设计者提供了可以直接调用的软中断处理程序,每一个中断处理程序完成一个特定的功能操作,以软中断指令INTn的形式提供给用户使用。基本输入/输出系统BIOS(BasicInput/OutputSystem)是固化在只读存储器ROM(ReadOnlyMemory)中的基本输入/输出程序,它可直接对外部设备进行设备升级的控制,包括系统测试、初始化引导程序、控制I/O设备的服务程序等。11十一月2022第77页5.3.5DOS功能调用18十一月2022第78页当类型码n=05H~1FH时,调用BIOS的中断处理程序;类型码n=20H~3FH时,调用DOS的中断处理程序。INT22H、INT23H、INT24H不允许用户直接使用。INT20H的作用是终止正在运行的程序,返回操作系统。这种终止退出程序,适用于扩展名为.COM的文件,而不适用于扩展名为.EXE的可执行文件。INT27H的作用也是终止正在运行的程序,返回操作系统,但被终止的程序仍然驻留在内存中,不会被其他程序覆盖。INT21H软中断是一个具有几十种子功能的大型中断服务程序,给这些子功能程序分别予以编号,称为功能号。每个子功能完成一种特定的操作和处理。11十一月2022第78页当类型码n=05H~1FH时,软件中断功能入口参数出口参数INT20H程序正常退出(CS)=PSP段地址无INT21H系统功能调用(AH)=功能号,对应入口参数相应处理结果INT22H结束退出INT23HCtrl-Break退出INT24H严重错误处理INT25H绝对磁盘读功能(AL)=驱动器号(CX)=读出的扇区数(DX)=起始扇区数(DS:BX)=数据缓冲区地址(CF)=0,操作成功否则,AX=错误号INT26H绝对磁盘写功能同INT25H同INT25HINT27H驻留退出(CS)=PSP的段值(DX)=被保护程序最后一个字节的偏移量再加1无INT28H~2EHDOS保留INT2FH打印机INT30H~3FHDOS保留软件中断功能入口参数出口参数INT20H程序正常退出(C18十一月2022第80页应用INT21H系统功能调用的方法为:①入口参数送指定的寄存器或内存
DOS功能调用一般都是通过DL/DX寄存器传送入口参数,也有一些功能调用不需要设置入口参数。②功能号送AH中
将所需要调用的子程序的功能号送入AH寄存器。③执行INT21H软中断指令
该指令将程序控制自动转向相应子程序的入口,并执行功能。④结果(出口)处理
11十一月2022第80页应用INT21H系统功能调用18十一月2022第81页1.带显示的键盘输入(1号调用)功能:等待从键盘输入一个字符,并将输入字符的ASCII码送入AL寄存器,且在屏幕上显示输入的字符。若输入字符为CTRL+BREAK组合键时,则中断程序执行,返回DOS。调用方式:MOV AH,01H INT 21H入口参数:无出口参数:AL中为输入字符ASCII码。11十一月2022第81页1.带显示的键盘输入(1号调用18十一月2022第82页3.不带显示的键盘输入(7、8号调用)2.显示字符(2号调用)调用方式:MOV AH,07H/08H INT 21H功能:与1号调用不同的是,键入的字符不在屏幕上显示。且7号调用对键入的字符不做
CTRL+BREAK检查。调用方式:
MOV DL,‘字符’ MOV AH,02H INT 21H入口参数:DL的内容,为要显示字符的ASCII码。出口参数:无功能:将DL寄存器中的字符送显示器输出。11十一月2022第82页3.不带显示的键盘输入(7、18十一月2022第83页【例5.29】从键盘输入一个字符,并在显示器上输出,按下CTRL+BREAK组合键时结束。使用1号功能调用:
MOV AH,01HINT 21H1号功能输入字符并显示,同时检查Ctrl+Break使用8号和2号功能调用
MOV AH,08H ;输入字符不显示,但检查Ctrl+BreakINT 21HMOV DL,AL ;把刚刚输入的字符显示出来
MOV AH,2INT 21H11十一月2022第83页【例5.29】从键盘输入一个字18十一月2022第84页4.字符串显示(9号调用)功能:将字符串显示在屏幕上。调用方式:LEA DX,OFFSETSTRING MOV AH,09H INT 21H入口参数:DX的内容是要显示字符串的首地址。出口参数:无字符串必须以‘$’为结束标志,且字符串应在数据段中。11十一月2022第84页4.字符串显示(9号调用)功18十一月2022第85页5.字符串输入(10号调用)
功能:从键盘输入字符串到指定缓冲区,直到输入回车符为止。调用方式:LEA DX,OFFSETBUFFER
MOV AH,0AH INT 21H入口参数:DX的内容为缓冲区的首地址,且第一字节为用户设置的最大输入的字符数(1~255)。
出口参数:缓冲区第二字节为实际输入的字符数(不含回车),从第三字节开始存放输入的字符。
若实际输入的字符多于定义的字节数,则多余字符被略去,且响铃报警。
11十一月2022第85页5.字符串输入(10号调用)18十一月2022第86页【例5.30】实现字符串输入并输出显示。DATASEGMENT BUFFER DB80 ;定义最大输入字符数
DB? ;实际输入字符数
CHAR DB 80DUP(?) ;字符存储空间
DB $ ;字符串结束标志DATAENDS11十一月2022第86页【例5.30】实现字符串输入并18十一月2022第87页CODE SEGMENT ASSUME CS:CODE,DS:DATA
… MOV AX,DATA ;数据段寄存器赋值
MOV DS,AX
… LEA DX,BUFFER ;指向输入缓冲区开始位置
MOV AH,0AH ;10号功能
INT 21H ;输入串
… LEA DX,CHAR ;指向串开始位置
MOV AH,09H ;9号功能
INT 21H ;显示串
…CODE ENDS11十一月2022第87页CODE SEGMENT18十一月2022第88页7.设置系统日期(2BH号功能调用)6.结束用户程序返回DOS(4CH号调用)调用方式:MOV CX,年
MOV DH,月
MOV DL,日
MOV AH,2BH
INT 21H
调用方式:
MOV AH,4CH INT 21H功能:终止当前程序的运行,并把控制权交给调用的程序,即返回DOS系统,屏幕出现DOS提示符,如“C:\>”,等待DOS命令。功能:设置有效的日期。当AL=0时,设置成功;当AL=0FFH时,设置失败。11十一月2022第88页7.设置系统日期(2BH号功能18十一月2022第89页8.设置系统时间(2DH号功能调用)调用方式:
MOV CH,小时
MOV CL,分
MOV DH,秒
MOV AH,2DH
INT 21H功能:设置有效的时间。当AL=0时,设置成功;当AL=0FFH时,设置失败。11十一月2022第89页8.设置系统时间(2DH号功能18十一月2022第90页5.4汇编语言程序设计5.4.1汇编语言程序的基本结构与设计步骤1.汇编语言程序的基本格式每种程序设计,都有一定的格式,汇编语言程序具有自己的格式。每个源程序在代码段中都必须含有返回DOS的指令语句,以保证程序执行结束后能自动返回DOS状态。第一种格式采用INT21H的4CH功能。11十一月2022第90页5.4汇编语言程序设计5DATA SEGMENT ;定义数据段
……DATA ENDSEDATA SEGMENT ;定义附加数据段
……EDATA ENDSSTACK SEGMENTSTACK‘STACK’;定义堆栈段
……STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:EDATA,SS:STACKSTART: MOV AX,DATA ;DS段寄存器赋值 MOV DS,AX MOV AX,EDATA ;ES段寄存器赋值 MOV ES,AX
…… ;核心程序段
MOV AH,4CH ;返回DOS IN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重庆财经学院《平法识图与钢筋计算》2023-2024学年第一学期期末试卷
- 重庆财经学院《公共管理学》2022-2023学年第一学期期末试卷
- 策略单元项目式研究报告
- 白银玻璃隔断装修施工方案
- 仲恺农业工程学院《现代文学与新女性》2021-2022学年第一学期期末试卷
- 潮流计算matlab课程设计
- 潮州超市布袋风管施工方案
- 仲恺农业工程学院《农产品安全生产与认证》2023-2024学年第一学期期末试卷
- 测试技术基础课程设计
- 仲恺农业工程学院《机械制图与CAD基础》2021-2022学年第一学期期末试卷
- 巯基乙醇化学品安全技术说明书
- 小学道德与法治课评分表
- 汽修厂搞个优惠活动
- 幼儿园教研五大领域主题30篇
- 2023年民俗博物馆防火、防盗、防恐应急预案
- 七年级劳动技能课全册教案
- 法学英语论文
- 如何培养一支高素质的班干部演示文稿
- 2023年西安国际港务区招聘笔试参考题库附带答案详解
- 发动机冷却系统说课稿课件
- 高中美术 湘美版 美术鉴赏第2单元 美术的历程第二课
评论
0/150
提交评论