首页 汇编语言程序设计(22)

汇编语言程序设计(22)

举报
开通vip

汇编语言程序设计(22)第5章汇编语言程序设计汇编语言(AssemblyLanguage)是一种面向CPU指令系统的程序设计语言,它采用指令系统的助记符来表示操作码和操作数,用符号地址表示操作数地址,因而易记、易读、易修改,给编程带来很大方便。用汇编语言编写的程序能够直接利用硬件系统的特性,直接对位、字节、寄存器、存储单元、I/O接口等进行处理,同时也能直接使用CPU指令系统和指令系统提供的各种寻址方式编制出高质量的程序,这种程序不但占用内存空间少,而且执行速度快。所以计算机高级技术人员大量使用汇编语言来编写计算机系统程序,实时通信程序和...

汇编语言程序设计(22)
第5章汇编语言程序 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 汇编语言(AssemblyLanguage)是一种面向CPU指令系统的程序设计语言,它采用指令系统的助记符来表示操作码和操作数,用符号地址表示操作数地址,因而易记、易读、易修改,给编程带来很大方便。用汇编语言编写的程序能够直接利用硬件系统的特性,直接对位、字节、寄存器、存储单元、I/O接口等进行处理,同时也能直接使用CPU指令系统和指令系统提供的各种寻址方式编制出高质量的程序,这种程序不但占用内存空间少,而且执行速度快。所以计算机高级技术人员大量使用汇编语言来编写计算机系统程序,实时通信程序和实时控制程序等。用汇编语言编写的源程序在输入计算机后,需要将其翻译成目标程序,计算机才能执行相应指令,这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序。8086系统中常用的汇编程序是 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 汇编程序(ASM)和宏汇编程序(MASM),因此除了指令系统外,还要了解(MASM)中的标号、表达式、伪指令,必须按MASM中规定的格式来编写源程序,才能正确汇编成可执行程序。5.1.1分段结构汇编语言都是以逻辑段为基础,按段的概念来组织代码和数据的,因此作为用汇编语言编写的源程序,其结构上具有以下特点:(1)由若干逻辑段组成,各逻辑段由伪指令语句定义和说明;(2)整个源程序以END伪指令结束;(3)每个逻辑段由语句序列组成,以SEGMENT语句开始,以ENDS语句结束。【例5.1】在屏幕上显示并打印字符串“Thisisasampleprogram.”DATASEGMENT;数据段DA1DB'Thisisasampleprogram.'DB0DH,0AH,'$'DATAENDSSTACKSEGMNETST1DB100DUB(?)STACKENDSCODESEGMENT;代码段MAINPROCFARASSUMECS:CODE,DS:DATA,SS:STACKORG1000START:PUSHDS;正常返回所需段地址及偏移地址MOVAX,0PUSHAXMOVAX,DATA;送数据段段地址MOVDS,AXMOVAX,STACK;送堆栈段地址MOVSS,AXMOVAH,9;DOS9号功能调用,显示字符串MOVDX,OFFSETDA1INT21HRETMAINENDPCODEENDSENDSTART从例子中看到整个程序是分段的,先要设置数据段、堆栈段、代码段,每段均由伪指令SEGMENT开始,ENDS结束。整个源程序用END结尾,END后面可跟该程序执行的起始地址START。因此,汇编语言源程序的基本结构是段,一个汇编语言源程序由若干个代码段、数据段、附加段和堆栈段组成。段之间的顺序可以随意安排,通常数据段在前,代码段在后。每个段都有段首指令和段结束指令,段的内容介于这两条指令之间。其一般结构如下:SSEGSEGMENTSTACK〈堆栈段的内容〉SSEGENDSDSEGSEGMENTDATA〈数据段的内容〉DSEGENDSCSEGSEGMENTCODE〈代码段的内容〉CSEGENDSEND〈启动标号〉数据段用来在内存中建立一个适当容量的工作区,以存放常数、变量等操作数据。堆栈段用来在内存中建立一个适当的堆栈区,以便在中断、子程序调用时使用。代码段包括了许多以符号表示的指令,其内容就是程序要执行的指令。必不可少的是代码段和堆栈段,堆栈段也可以不用显示定义,可以直接使用隐式堆栈段,如果程序中需要使用数据存储区,则要定义数据段,必要时还要定义附加段。通常需要一个代码段、一个数据段和一个堆栈段,有时可包含一个附加段。而对于复杂的程序,除了使用上述3个段以外还可以使用多个段,甚至可以使用多个程序模块。5.1.2汇编语言源程序语句的类型及组成语句是汇编语言源程序的基本组成单位。一个汇编语言源程序中有3种基本语句:指令语句、伪指令语句和宏指令语句。前两种是最常见、最基本的语句。指令语句和伪指令语句不仅在程序中的功能不同,而且实现其功能的方法和时间也不同。1.指令性语句指令性语句与机器指令相对应,汇编程序可将它翻译成目标代码(机器指令代码),所以这种语句又称为可执行语句。语句格式为[标号:]指令助记符 [操作数] [;注释]标号表示本指令语句的符号地址,标号后面必须紧跟“:”。标号可使用的字符为字母(A~Z,a~z)、数字(0~9)或某些特殊字符(@、__、?)等。第一个字符必须为字母或某些特殊字符,最大有效字符长度为31个字符。指令助记符是该语句的指令名称的代表符号,汇编程序将其翻译成机器命令。操作数表示参加指令运算的数据,根据指令要求可以有一个或多个操作数,有的指令不需要操作数,多个操作数之间应用逗号隔开,操作数与指令助记符之间用空格隔开。操作数可以是常数、变量、标号、寄存器名或表达式。注释用来说明一条指令或一段程序的功能。注释前必须加上“;”。2.伪指令语句伪指令语句没有对应的机器指令,汇编程序汇编源程序时对伪指令进行处理,它可以完成数据定义,存储区分配,段定义,段分配,指示程序结束等功能。一条伪指令语句也由4个字段组成,其一般格式如下:[名字]伪指令定义符操作数[;注释]名字是给伪指令取的名称,它用符号地址表示,名字后不允许带冒号,名字可以省略。伪指令中的名字通常是变量名、段名、过程名、符号名等。伪指令定义符是汇编程序MASM汇编规定的符号,常用的有变量定义语句(DB、DW),符号定义语句(EQU、=),段定义语句(SEGMENT…ENDS)等类型。操作数是由伪指令具体要求的,有的伪指令不允许带操作数,有的要求带多个操作数,多个操作数之间必须用逗号分开。操作数可以是常数、变量、字符串、表达式等。伪指令语句的注释也是可选项,需要时必须以“;”开始。3.语句组成指令语句和伪指令语句的格式基本相同,均由4部分组成。而对于一个完整的汇编语句来说也是由下面几部分组成,格式如下:[name]operationoperand[;comment][名字项]操作项操作数项[;注释项]方括号[]的内容为可选项。每条汇编语句之间以及一条汇编语句内的4个字段之间都必须用分隔符分隔。宏汇编程序规定使用如下的分隔符号:(1)冒号是标号与指令之间的分隔符号;(2)空格是名字与伪指令之间的分隔符号,也是操作符和操作数之间的分隔符号;(3)逗号是多个操作数之间的分隔符号;(4)分号是注释开始的分隔符号;(5)回车是一条汇编语句的结束符号。为编写出格式清晰的源程序,宏汇编程序规定“Tab”制表符的作用同空格,并允许有空语句,它可能仅有回车符号,也可能仅有注释。5.1.3名字和标号名字和标号分别是给指令单元和伪指令起的符号名称,统称为标识符。1.名字名字是程序员按一定 规则 编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf 定义的标识符。字母:A~Z或a~z;数字:0~9;专用符号:?、•、@、__、$;名字的定义有如下规则:(1)名字的第一个字符不能是数字;(2)名字中如果用到“.”,则必须是第一个字符;(3)其字符串的长度不得超过31个字符;(4)汇编语言中已定义的保留字、指令助记符、伪指令助记符、寄存器名等,不能作为名字使用。一般说来,在代码段中的名字字段称为标号;在数据段或堆栈段中的名字字段称为变量。它们都用来表示本语句的符号地址。如下所示:THING、Y4、ALPHA、X、TABLE-TWO以上都是正确的名字,但下列名字都是错误的。86ABC、MOV这是因为:第一个用数字开头,第二个与保留字重名。2.标号标号是可执行指令语句的地址的符号表示,它可作为转移指令和调用指令CALL的目标操作数,以确定程序转向的目标地址,它具有3个属性。(1)段值(SEGMENT):标号所在段的段基址。(2)段内偏移地址(OFFSET):标号所在地址与所在段首地址之间的地址偏移字节数。(3)类型(TYPE):标号的类型属性指在转移指令中标号可转移的距离,也称距离属性。包括NEAR和FAR。NEAR是指转移或调用时,只需要改变IP值,而不改变CS值。也即段内转移或调用。FAR与NEAR不同,要转移或调用时,不仅需要改变IP,而且需要改变CS,即段交叉转移或调用。若标号后面紧跟标号,隐含此标号距离属性为NEAR,也可用伪指令将此属性改为FAR。标号的定义方法如下:(1)给指令取名字,例如DONE:MOVAH,1以此方式定义的标号的距离属性为NEAR。(2)用LABLE伪指令,形式为标号:LABLENEAR/FAR5.1.4助记符和定义符助记符和定义符分别用于规定指令语句的操作性质和伪指令语句的伪操作功能,所以统称为操作符。指令,汇编程序将其翻译为机器语言指令。伪操作,汇编程序将根据其所要求的功能进行处理。宏指令,则将根据其定义展开。要注意的是,在指令语句助记符的前面,还可根据需要加前缀。5.1.5操作数操作数也叫参数。助记符和定义符都可后跟一个和多个操作数,作为操作处理的对象;操作数项由一个或多个表达式组成,多个操作数项之间一般用逗号分开。根据寻址方式等因素的不同,操作数可分为4类:常量、寄存器、存储器和表达式。对常量、存储器和表达式这3种操作数的说明如下:1.常量操作数常量操作数可以是二进制、八进制、十进制或十六进制的整形常数,十六进制实数,字符串(必须用单引号括起来,其值为字符的ASCII码值)和已赋值的常数标识符,也可以是寄存器名称和I/O接口地址。2.存储器操作数存储器操作数,通常是标识符,可以分成标号(label)和变量(variable)两种。标号是可执行的指令语句的符号地址,通常是作为转移指令JMP和调用指令CALL的目标操作数。变量通常是指存放在一些存储单元中的值,这些值在程序运行过程中是可变的。变量可以具有以下几种寻址方式:(1)直接寻址16位地址偏移量包含在指令中;(2)基址寻址由一个基址寄存器(BX或BP)的内容,加上一个在指令中指定的8位或16位位移量,决定变量的地址;(3)变址寻址由一个变址寄存器(SI或DI)的内容,加上一个在指令中指定的8位或16位位移量,决定变量的地址;(4)基址加变址寻址由一个基址寄存器(BX或BP)的内容,加上一个变址寄存器(SI或DI)的内容,再加上一个在指令中指定的8位或16位位移量,决定变量的地址。作为存储器操作数的标号和变量都有3种共同属性:(1)段值——段基址,可用SEG运算符求得。(2)偏移值——段内地址偏移量,可用OFFSET运算符求得。(3)类型——对变量,有字节、字、双字、四字、十字这5种类型。对标号,有NEAR和FAR两种类型。可用TYPE运算符求得。另外,对于变量操作数,还有两个属性:长度和字节数。可分别用LENGTH和SIZE运算符求得。3.表达式操作数表达式由运算对象及运算符组成,在汇编时由汇编程序对它进行运算,运算结果作为一个语句中的操作数去使用。运算对象可以是常数、变量或标号,得到的运算结果可以是一个常数,也可以是一个存储器的地址,在此地址中存放了数据(称为变量)或指令(称为标号)。MASM中使用了6类运算符,即:(1)算术运算符(ArithmeticOperators);(2)逻辑运算符(LogicalOperators);(3)关系运算符(RelationalOperators);(4)数值返回运算符(Valeue-ReturningOperators);(5)修改属性运算符(ModifingAttributeOperators);(6)其他运算符(OtherOperators)。MASM汇编程序支持的运算符号见表5-1。1)算术运算符算术运算符包括+(加)、-(减)、*(乘)、/(除,只取除法运算结果之商)、MOD(模,只取除法运算结果之余)、SHL(左移,左移1位相当于乘2)、SHR(右移,右移1位相当于除2),因此19/7是2(商是2),而19MOD7是5(余数是5)。所有的算术运算符均可以对数据进行运算,运算对象与运算结果都是整数。当算术运算符应用于存储器即地址操作数时其规则就更加严格:只有当结果具有明确的、有意义的物理解释时,这些运算才是有效的。若对地址运算,通常是在标号上加/减某一个数字量,例DA1+2、K2―3各表示一个存储单元的地址,对地址乘是没有意义的。表5-1MASM支持的运算符类型符号名称运算结果算术运算符+-*/MODSHLSHR加法减法乘法除法模除左移右移和差乘积商余数左移后二进制数右移后二进制数逻辑运算符ANDORXORNOT与运算或运算异或运算非运算逻辑与结果逻辑或结果逻辑异或结果逻辑非结果关系运算符EQNELTLEGTGE相等不等小于小于等于大于大于等于结果为真输出全是“1”结果为假输出全是“0”数值返回OFFSETSEGTYPELENGTHSIZE返回偏移地址返回段基址返回元素字节数返回变量单元数返回变量总字节数偏移地址段基址字节数单元数总字节数修改属性段寄存器名PTRTHISHIGHLOWSHORT段前缀修改类型属性指定类型/距离属性分离高字节分离低字节短转移说明修改段修改后类型指定后类型高字节低字节-128~127字节间转移其他运算符( )[ ]·< >MASKWIDTH圆括号方括号点运算符尖括号记录图位记录宽度改变运算符优先级下标或间接寻址连接结构与变量修改变量位图形记录/字段位数【例5.2】源程序指令格式如下:DAEQU300MOVAX,DA-80MOVBX,DAMOD100MOVCX,DA/100MOVDH,01100100BSHR2汇编时,计算表达式形成指令为DAEQU300MOVAX,220MOVBX,0MOVCX,3MOVDH,19H2)逻辑运算符逻辑运算符包括AND(与)、OR(或)、NOT(非)、XOR(异或)4种,逻辑运算符是按位运算的,只能对常数进行运算,得到结果也是常数。【例5.3】MOVAL,NOT0FFHMOVBL,8CHAND73HMOVAH,8CHOR73HMOVCH,8CHXOR73H汇编时,计算表达式形成指令MOVAL,NOT0MOVBL,0MOVAH,0FFHMOVCH,0FFH逻辑运算符与8086指令系统中的指令助记符AND、OR、NOT、XOR的符号完全相同,但二者是不会混淆的。作为MASM的运算符是在汇编过程中进行计算的,而指令助记符是在程序执行时进行运算的。3)关系运算符关系运算符包括EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)6种。关系运算符的两个操作数必须是数据,或是同一段内的两个存储单元的地址。进行关系运算的比较操作后,结果是一个数值,若结果为真,输出全是“1”,即0FFH或0FFFFH。若结果为假,输出全是“0”。关系运算符一般与逻辑运算符组合起来使用。【例5.4】MOVAX,10HGT16ADDBL,6EQ0110BMOVCX,((POTRTLT5)AND100)OR((PORTGE5)AND200)汇编时形成指令为MOVAX,0ADDBL,0FFHMOVCX,100;当port<5时,本例最后一行表示当接口地址PORT小于5时,汇编结果相当于指令MOVCX,100若PORT大于等于5时,汇编结果相当于指令MOVCX,2004)数值返回运算符数值返回运算符也经常称作 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 运算符(analyticoperators),包括OFFSET、TYPE、LENGTH、SIZE这4种,它们加在变量或标号前,返回运算对象的某个参数值,例如偏移地址值、段地址值、类型属性、变量包含的单元数等。(1)OFFSET。格式:OFFSET变量或标号OFFSET返回标号或变量的偏移地址值,为程序设计中常用的运算符。【例5.5】若DA1为数据段中一个变量名:MOVBX,OFFSETDA1汇编程序将变量DA1的偏移地址送到BX中,相当于指令LEABX,DA1(2)SEG。格式:SEG变量或标号SEG用来取变量或标号的段基址。【例5.6】MOVAX,SEGM1MOVDS,AXM1是段名为DATA数据段中的一个变量名。假如DATA段从0500H开始,上述指令把0500H作为立即数在连接时插入指令,汇编成MOVAX,0500H(因为段地址是由连接程序分配的),执行程序时,AX的内容变成0500H,并存放到DS中。(3)TYPE。格式:TYPE变量或标号TYPE加在变量前,返回变量的类型属性,TYPE加在标号前,返回标号的距离属性。表5-2给出了TYPE运算符的返回数值对照表。表5-2TYPE运算符返回值类型返回值变量DBDWDDDQ1248标号NEARFAR-1[FFH]-2[FEH]【例5.7】A1DB20H,30HA2DW0438HA3DD?L1:MOVAH,TYPEA1MOVBH,TYPEA2MOVAL,TYPEA3MOVBL,TYPEL1汇编时形成指令MOVAH,1MOVBH,2MOVAL,4MOVBL,0FFH(4)LENGTH。格式:LENGTH变量当变量中使用DUP时,LENGTH返回此变量所包含的单元数,对其他变量则返回1。【例5.8】M1DW100DUP(?)M2DW1,2,3M3DB'ABCD'MOVCX,LENGTHM1MOVBL,LENGTHM2MOVAL,LENGTHM3汇编时形成指令MOVCX,100;返回此变量包含100个字单元MOVBL,1MOVAL,1(5)SIZE。格式:SIZE变量SIZE运算符加在变量前,返回该变量包含的总字节数。SIZE=LENGTH*TYPE【例5.9】对上例定义的M1,M2,M3,有MOVCX,SIZEM1MOVBL,SIZEM2MOVAL,SIZEM3汇编时形成指令MOVCX,200;返回此变量包含200个字单元MOVBL,2MOVAL,15)修改属性运算符修改属性运算符也经常称作综合运算符(SyntheticOperators),包括段操作符、PTR、THIS、HIGH、LOW、SHORT这6种,可以在程序运行过程中,通过修改属性运算符来修改变量或标号的属性,包括段属性、偏移地址属性、类型属性等。(1)段操作符。格式:段前缀:变量或地址表达式段前缀(段寄存器CS、DS、ES、SS)后跟冒号“:”,用来给一个存储器操作数指定一个段属性,而不管其原来隐含的段是什么,即段超越。【例5.10】MOVAX,ES:[BX]在ES段中,从偏移地址以BX间址所指定的存储单元中,取出一个字符送到AX中。(2)PTR。格式:类型/距离PTR变量或标号其功能是将PTR左边的类型属性赋给右边的变量或标号。PTR本身并不分配存储单元,仅给已分配的存储单元赋予新的属性,这样可以保证运算时操作数类型的匹配,常与类型BYTE、WORD、NEAR、FAR等连用。【例5.11】N1DB15H,36HN2DW1122H,3344HLO:MOVAX,WORDPTRN1MOVBL,BYTEPTRN2(3)THIS。格式:变量/标号EQUTHIS类型/距离THIS的功能是将EQUTHIS右边的类型/距离属性,赋给左边的变量。标号,该变量或标号的段地址和偏移地址与下一个存储单元的地址相同。【例5.12】FIRSTEQUTHISBYTETABLEDW200DUP(?)FIRST的偏移地址值与TABLE的偏移地址相同,区别在于FIRST变量为字节类型,TABLE为字类型。(4)SHORT。格式:SHORT标号SHORT用来说明转移类指令中转向地址的属性,指出转向的目标地址与本指令之间的距离在-128~+127之间,即限制在短转移范围内。【例5.13】L1:JMPSHORTL2L2:MOVAX,0(5)HIGH和LOW。格式:HIGH/LOW变量或标号HIGH和LOW称为字节分离运算符,对一个数或地址表达式,HIGH从中分离出高位字节,LOW从中分离出低位字节。【例5.14】K1EQU0ABCDHK2EQU1234HMOVAH,HIGHK1MOVBL,LOWK2汇编时形成指令MOVAH,0ABHMOVBL,34H6)其他运算符其他运算符有()、[]、<>、·、MASK和WIDTH这6种。(1)圆括号()。圆括号用来改变运算符的优先级别,()中的运算符具有最高优先权。(2)方括号[]。方括号主要用来表示地址表达式或多重变量的下标值。①用[]表示地址表达式。【例5.15】M1DB10H,20H,30H,40HM2DW1234H,5678H,9ABCHM3DW5DUP(?)MOVBX,OFFSETM1;变量M1的偏移地址→ALMOVCL,[BX];M1变量中第一单元的值10H→CLMOVBX,OFFSETM2MOVDX,[BX+2];将M2变量中的第三个单元的值5678H→DX②用[]来表示多重变量的下标值。【例5.16】M1,M2,M3同前例的定义。MOVAL,M1[3];M1变量中第三个元素40H→ALMOVCX,M2[0];M2变量中第0个元素1234H→CXMOVM3[1],CX;1234H→M3的第二个单元(3)尖括号<>,及圆点·。<>运算符在结构中专用,表示结构中的变量在预置结构副本时是否修改,修改成什么数值。·运算符在结构中专用,表示结构副本名与变量名连接在一起,作为预置的结构副本中的各个变量。<>和·的具体说明在结构中解释。(4)MASK和WIDTH。MASK和WIDTH运算符在记录中专用。WIDTH为记录名/字段名,运算后返回数值表示指定记录或字段的位的长度。MASK为字段名,返回数值为8位/16位二进制数,对应指定字段的各个位置“1”,其他位置“0”。7)优先级表达式是常数,变量,标号和运算符的组合,在计算表达式值时,应按优先级高低进行计算,同时遵循同级运算符从左到右的原则计算,圆括号()可改变优先级次序,表5-3给出了运算符的优先级别。实际上表达式的值由汇编程序计算,程序编写时要正确掌握次序,以免程序出错。表5-3中,优先级1为最高级,优先级10为最低级。表5-3运算优先级次序优先级运算符12345678910(),[],<>,·,LENGTH,WIDTH,SIZE,MASKPTR,OFFSET,SEG,TYPE,THIS,CS:,DS:,ES:,SS:HIGH,LOW*,/,MOD,SHL,SHR+,-EQ,NE,LT,LE,GT,GENOTANDOR,XORSHORT5.1.6注释注释项用来说明一段程序、一条或几条指令的功能,是可有可无的。它以分号开始,其作用是增加程序的可读性。注释应该写出本条(或本段)指令在程序中的功能和作用。而不应该只写指令的动作。给出恰如其分的注释,是一名好的程序员的基本训练之一。汇编程序对注释通常是不做任何处理的,只有在为源代码开列清单时才给以显示。如前所述,一个汇编语言的源程序是由一条条语句组成的,语句(statements)就是完成一个何种动作的说明。源程序中的语句可分成两类:指令语句和伪指令语句,其中指令语句为8086微处理器的各种符号指令,汇编程序把它们翻译成机器代码,这些代码命令8086执行某些操作。如MOV、ADD、JMP等。伪指令语句使用的是各种伪操作命令,汇编程序并不把它们(也不可能)翻译成机器代码,只是用来指示、引导汇编程序在汇编时进行一些操作,如定义符号、分配存储单元、初始化存储器等等,所以伪指令本身不占用存储单元。伪指令语句的格式为名称伪指令操作数;注释其中,名称字段对于某些伪指令是必需的,对于另外一些伪指令是可选择的,还有一些伪指令则不允许有名称。操作数字段可以是一项或多项,项与项之间用逗号分开。注释是任选的,用于提高程序的可读性。名称是该伪指令的标识符,当伪指令是数据定义伪指令时,名称为变量。指令中的名称和伪指令之间用空格符作为分隔,并且名称与指令的地址毫无关系。在IBM宏汇编中有以下几种伪指令语句(DirectiveStatements):(1)数据定义伪指令;(2)符号定义伪指令;(3)段定义伪指令;(4)过程定义伪指令;(5)宏处理伪指令;(6)其他伪指令。这一类伪指令帮助用户灵活简洁地使用汇编语言编程。5.2.1数据定义伪指令数据定义伪指令用来为数据分配内存空间,并设置相应内存单元的初始值,其形式为[变量名]变量定义符操作数[,…,操作数][;注释]变量名是一个符号地址,表示其后操作数的首地址,多个操作数构成一个数组。变量名是程序员给出的标识符,为可选项,给出变量名只是为了按名存取其对应的内存单元。变量定义符主要包括下列几种。(1)DB(DefineByte):定义字节,后面的每个操作数占1个字节。(2)DW(DefineWord):定义字,后面的每个操作数占1个字。(3)DD(DefineDWord):定义双字,后面的每个操作数占2个字。(4)DQ(DefineQWord):定义四字,后面的每个操作数占4个字。(5)DT(DefineTByte):定义十字节,后面的每个操作数占10个字节。操作数可以为:(1)数值表达式;(2)ASCⅡ码字符串;(3)地址表达式;(4)?(只保存内存空间,未定义初始值);(5)DUP子句,其格式为:重复次数DUP(操作数,…,操作数),DUP子句可以嵌套。注释项用来说明伪指令的功能,是任选项。下面用例题说明伪指令的用法。图5.1例5.17数据存储格式1.操作数为常量或数值表达式【例5.17】DB/DW/DD/DQ的用法。下列数据段定义和分配了一些存储单元,其实际分配图如图5.1所示。DA1DB10H,52H;定义2个字节DA2DW1122H,34H;定义2个字DA3DD5*20H,0FFEEH;定义1个双字2.操作数为字符串【例5.18】STDB‘ABCDE’DB伪指令也可用来定义一个字符串,此语句的含义是把字符串‘ABCDE’中的每个字符的ASCII码依次存入以变量ST的地址开始的连续字节单元中。3.操作数为“?”问号操作数表示预留存储单元,但不预置具体的数值,以便存放运算结果。【例5.19】M1DB?;定义变量M1为不确定字节,保留一字节空间M2DB0D55H,?;定义变量M2第二个字为不确定字,保留2个字节空间4.操作数用DUP来定义重复变量重复操作符DUP可作为操作数的组成部分,其使用格式为[变量名]DB/DW/DD/DQ/DT<表达式>DUP(表达式)其中,DUP左边的表达式表示重复的次数,右边括号中的表达式表示要重复的内容,括号中的表达式可以是一个“?”,表示不置初值,为随机值;也可以是一个数据表达式,将相应单元初始化。【例5.20】下面的数据段表示了DUP的用法,DB100DUP(0)DW2DUP(3DUP(0,1))第一条语句定义了100个字节,初值均为0;第二条语句相当于“DW0,1,0,1,0,1,0,1,0,1,0,1”,即定义了12个字单元,其初值为0、1、0、1、…、0、1。5.操作数为地址表达式DW伪指令用于预置该地址表达式的偏移地址,而DD伪指令则用于预置该地址表达式的偏移地址和段基址。【例5.21】若ARRAY为变量名,AGAIN为标号名,则语句ADDRNDWARRAY+2表示将ARRAY+2单元的偏移地址存入ADDRN这个字类型变量中。而语句ADDRFDDAGAIN则表示将标号AGAIN的段基址和偏移地址存入ADDRF这个双字类型变量中。其中,低字单元为偏移地址,高字单元中为段基址。5.2.2符号定义伪指令符号定义伪指令用于为程序中多次出现的同一个常量或表达式定义为一个标识符,以便在源程序中以标识符来代替对应的常量或表达式。符号定义伪指令有以下3种。1.等价伪指令EQU格式:符号名EQU表达式功能:为常量或表达式及其他各种符号定义一个等价的符号名,但它不 申请 关于撤销行政处分的申请关于工程延期监理费的申请报告关于减免管理费的申请关于减租申请书的范文关于解除警告处分的申请 分配存储单元。指令说明如下:(1)表达式可以是常量或数值表达式;地址表达式;变量、标号或指令助记符。(2)符号名不占存储单元,没有段、偏移和类型这3种属性。(3)在同一源程序中,使用EQU定义的符号不能与本程序中的其他符号名同名;另外,同一符号不能用EQU伪指令重新定义。EQU伪指令主要有以下3方面应用:(1)定义符号常量。用符号名表示常量、数值表达式。(2)EQU与属性运算符PTR或THIS连用,可以给变量或标号定义新的类型属性并重新命名。但其段属性和偏移属性不变。(3)利用EQU可以用一个符号名替代一个复杂的地址表达式和其他一些符号,如指令助记符、变量名、标号、段名、寄存器名、宏定义名等。2.等号伪指令“=”格式:符号名=表达式功能:该语句的功能与EQU语句类似,不同的是等号伪指令能对所定义的符号名多次重新定义,且以最后一次定义的值为准。【例5.22】例如:CNEQU100;符号CN等价为100CN1EQUCN+100;符号CN1等价为表达式CN+100CEQUCX;符号C等价为寄存器名CXMEQUMOV;MOV助记符可以由M代替BEQUDS:[BP+20];地址表达式DS:[BP+20]可由符号B代替有了以上定义后,下列语句有效。MC,CN;等效为MOVCX,100MBX,B;等效为MOVBX,DS:[BP+20]由EQU定义的符号,在整个程序中不可以被再次定义。而对于需要在程序中各处不断改变其意义的符号,应用“=”伪指令定义。【例5.23】例如:CNEQU100CNEQU200第二个对CN的定义是错误的,但是CN=100CN=200则以第二次对CN的定义为准,CN与200等价。3.定义伪指令LABEL格式:变量名或标号名LABEL类型功能:LABEL伪指令用来在某一变量或标号的基础上定义一个新的类型不同的变量或标号。其中变量的类型可用BYTE、WORD和DWORD;标号的类型有NEAR和FAR。例如:VAR1LABELWORDVAR2DB20DUP(1)变量VAR1与VAR2具有相同的段基址和偏移量,但VAR2是字节型。L1LABELFARL2:MOVAX,1000H标号L1以及L2均为指令MOVAX,1000H的符号地址,但L1具有FAR类型,L2却是NEAR类型的。从以上用法可知,LABEL伪指令与前述的综合运算PTR和THIS功能相似。5.2.3段定义伪指令编制一个80X86汇编语言源程序,段是基础,必须按段来构造程序,在程序执行时,要凭借4个段寄存器对各个段的存储单元进行访问。段结构伪指令主要有两条语句,即段定义伪指令和假定伪指令。1.段定义伪指令SEGMENT/ENDS格式:段名SEGMENT[定位类型][组合类型][‘类别’]段体段名ENDS其中,段名是编程者给该段取的名字。定位类型、组合类型、类别是赋予该段的属性,当默认时,使用8086/8088宏汇编给定的默认值。定位类型规定了对该段的起始边界地址的要求,可以有以下4种选择:(1)PAGE:段起始地址为一页(PAGE)的开始,规定256个字节为一页,页起始地址为XXXXXXXXXXXX00000000,低8位为0。(2)PARA:段起始地址为一节(PARAGRAPH)的开始,规定16个字节为一节,节起始地址为XXXXXXXXXXXXXXXX0000,低4位为0。(3)WORD:段起始地址为一规则字的开始,即偶地址开始,XXXXXXXXXXXXXXXXXXX0,最低位为0。(4)BYTE:段起始地址为任意值,即从任何字节开始都行。PARA定位类型为系统默认。组合类型表示该段与程序中其他段的关系。可以有以下6种选择:(1)NONE:该段独立与其他段无关。(2)PUBLIC:该段可与其他同名同类别的段相邻地连接在一起,共同拥有一个段基址。(3)STACK:与PUBLIC相同,但作为堆栈段处理。(4)COMMON:该段可能与其他同名同类别的段发生覆盖,共同拥有一个段基址,段的长度取决于最长的COMMON段。(5)AT表达式:该段应放在AT后的表达式值(16位)所指定的段地址上。这种方式不能用与代码段。(6)MEMORY:该段位于被连接在一起的其他所有段之上。NONE组合类型为系统默认值。类别是由编程者赋予该段的与段名不同的另一种名字信息。程序中所有类别相同的段将被组成一个段组,该段组以其们共同的类别作为名字。常使用的类别有“STACK”、“CODE”、“DATA”等。功能:定义一个逻辑段,指定段的名字和范围,段在内存中的起始位置、段与段之间的连接关系。说明:(1)段名由用户指定,开始与结束的段名须一致;(2)SEGMENT/ENDS伪指令把程序分成若干逻辑段;(3)删节号为段体,段体内为指令和伪指令序列。2.假定伪指令ASSUME假定伪指令主要用于指示汇编程序哪些段是当前段以及这些段与段寄存器之间的对应关系。格式:ASSUME段寄存器名:段名[,段寄存器名:段名,…]其中,段名是指用SEGMENT/ENDS语句已定义的段名,也可以是表达式“SEG变量或标号”,或者是关键字NOTHING;段寄存器名可为CS、DS、SS、ES之一。功能:该语句一般出现在代码段中,用来设定段寄存器与段之间的对应关系,以便汇编程序知道段的结构和在执行各种指令时知道应访问哪个段;也可用来取消段寄存器与段之间的对应关系(使用NOTHING时)。说明:(1)ASSUME伪指令设置在代码段内,第一个ASSUME语句一般放在段定义语句之后,是说明性语句;(2)在一个代码段中,如果没有另外的ASSUME伪指令重新设置,则原有ASSUME语句的设置一直有效;(3)不在当前段中的变量和数据存储单元均是不可访问的,否则,会在汇编时产生错误或运行时造成混乱,产生逻辑上的错误,得出错误结果。(4)ASSUME伪指令不产生任何目标代码,仅仅是告诉汇编程序,哪些段是当前段,而且分别与哪个段寄存器相联系。(5)汇编程序不能检查在程序运行期间段寄存器内容是否与上述ASSUME语句的设置一致。如果在程序中间用ASSUME语句重建了DS或ES与某段的关系时,就一定要紧跟着将这个新段首地址送入DS或ES中,否则,会因段寄存器的内容未更改而使得后面数据的读写仍在原来的数据段中进行,这样的错误,系统是检查不出来的,即出现逻辑错误。(6)宏汇编MASM利用ASSUME给出的信息产生正确的目标代码。在翻译过程中,根据ASSUME伪指令产生段寄存器——段名对应表,以后根据此表决定在相应指令的代码之前是否产生段超越前缀。如果某段对应的段寄存器与该指令的默认段寄存器一致,则直接产生机器代码,否则就产生段超越前缀。因此,每一个汇编源程序必须使用ASSUME伪指令。但ASSUME伪指令并不实际给段寄存器赋值,必须在程序中用指令的实际操作来给段寄存器赋值,例如:MOVAX,DATAMOVDS,AX这样的语句才给DS装入了一个实际的段基址。5.2.4过程定义伪指令汇编语言中的子程序是以过程的形式出现的,子程序的调用,即过程的调用。定义过程的格式为过程名PROC[NEAR]/FAR〈过程中的语句序列〉RET[〈过程中的语句序列〉]过程名ENDP其中,过程名由编程者任取;NEAR(默认值)或FAR是过程的类型,当为NEAR型时,可以不写;RET为过程返回主程序的出口语句。尽管源程序语序中RET的位置可放中间或结尾,但每一个过程最后执行的语句应为RET,否则会出错。过程定义伪指令PROC和ENDP必须成对出现,以定义一个完整的过程。5.2.5宏处理伪指令1.宏指令的定义编程者可以将一组语句用宏指令定义成一条宏指令:宏指令名MACRO[<形式参数1>,<形式参数2>,…]<语句组>;宏体ENDM其中宏指令名由编程者自取;形式参数意义同高级语言一样,在调用宏指令时用实在参数来代替。宏指令也可以不设参数。2.宏指令的使用——宏调用经定义的宏指令,可以在程序中像其他指令一样直接使用。对于出现在程序中的宏指令,汇编程序在翻译时,按照其定义逐条还原为宏体中的语句。使用宏指令时,需要将形式参数用一一对应的实在参数代替。当实在参数的个数多于形式参时,忽略多余的实在参数;当实在参数的个数少于形式参数时,多余的形式参数设为空白,这是汇编语言的规定。宏指令中的参数可以是常数、寄存器名、存储单元名、地址表达式以及指令的助记符或助记符的一部分。3.宏指令应用举例下面用一简单例子,来说明宏指令的定义及调用过程。【例5.24】将对某一寄存器的移位操作定义为一个宏指令,并在程序中使用它。完成移位操作的宏指令可以灵活地设置一个或多个参数,或不设参数。下面给出几种定义方式:(1)不设参数。SHIFTMACROMOVCL,4SHLAX,CLENDM宏指令SHIFT将AX左移4次。(2)设一个参数,将移位次数设为参数CN。SHIFTMACROCNMOVCL,CNSHLAX,CLENDM则SHIFT5;将AX左移5次SHIFT4;将AX左移4次用实在参数5和4替代形式参数CN,完成CN次移位。(3)设两个参数,将被移位的寄存器和移位次数都设为可替代的参数。SHIFTMACROCN,RMOVCL,CNSHLR,CLENDM则:SHIFT4,AX;将AX左移4次SHIFT2,BX;将BX左移2次SHIFT5,DH;将DH左移5次(4)设三个参数,将移位方向,被移位的对象及以为次数均设为参数。SHIFTMACROCN,R,SDMOVCL,CNS&SDR,CLENDM当参数为助记符的一部分时,用&将参数标注出来,以便替换。则SHIFT4,AX,HL;将AX左移4次SHIFT7,BX,HR;将BX右移7次下面的程序说明如何在一个完整的程序中使用宏指令,源程序如下:SHITFMACROR,CNMOVCL,CNSHLR,CLENDMDATASEGMENTXDB08HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARPUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVBX,OFFSETXMOVAL,[BX]  SHIFTAL,4RETMAINENDPCODEENDSENDMAIN4.取消宏指令伪指令PURGE宏指令一经定义,在整个程序中有效。若宏指令名与指令或伪指令助记符相同,则宏指令优先级更高,使同名指令或伪指令失效。在一般情况下,均不使用指令及伪指令助记符作为宏指令名,若出现了这种情况,也应在一定时候取消宏指令,使失效的指令或伪指令助记符恢复功能。取消宏指令伪指令PURGE格式如下:PURGE<宏指令名1>,<宏指令名2>,…其中,宏指令名1、宏指令名2等是需要被取消的宏指令名。执行此伪指令后,这些宏指令便失效,不能再被调用了。5.定义局部标号伪指令LOCAL在定义宏指令时,宏体中有可能出现标号。当宏指令在程序中多次被调用时,这些标号便会在多处出现,汇编程序将指出“标号重复定义”的错误。为避免这一错误,可以用LOCAL伪指令将宏体中的标号定义为局部标号,当多次调用宏指令时,汇编程序在展开还原宏指令时,将用“??0000~??FF”的编号来代替这些局部标号。LCOAL伪指令的格式为LCOAL标号1,标号2,…下面的例题,说明LOCAL的使用。【例5.25】用一条宏指令完成延时。延时的基本单位是10ms,参数X使宏指令完成x×10ms的延时。源程序如下:DELAYMACROX;宏定义LOCALDELAY1,WAIT1MOVBL,XDELAY1:MOVCX,2942;延时10msWAIT1:LOOPWAIT1DECBLJNZDELAY1ENDMDELAY100;调用宏指令DELAY,延时1s;+MOVBL,100;宏展开+??0000:MOVCX,2942;延时10ms+??0001:LOOP??0001DECBLJNZ??0000;DELAY10;再次调用宏指令DELAY,延时100ms+MOVBL,10;宏展开+??0002:MOVCX,2942;延时10ms+??0003:LOOP??0003DECBLJNZ??0002此程序为汇编程序输出的列表清单文件,即.LST文件。以“+”开头的语句行为宏指令的展开还原部分。5.2.6其他伪操作程序计数器$和ORG伪指令1.程序计数器$当字符$独立出现在表达式中时,它的值为程序下一个所能分配的存储单元的偏移地址。例如:DATASEGMENTA1DB10H,20H,30H;定义3个字节CEQU$—A1;符号C与表达式$—A1等价DATA ENDS其中表达式$—A1的值为程序下一个所等分配的偏移地址03H减去A1的偏移地址00H,所以,$—A1=03H-00H=03H。2.ORG伪指令ORG伪指令用来指定某条语句或某个变量偏移地址。格式为ORG数值表达式ORG后的数值表达式的值将作为下一条指令语句或变量的偏移地址,例如:DATASEGMENTORG2VAR1DB2,3,4ORG$+3VAR2DW1234HDATAENDS则VAR1和VAR2在存储器中的分布情况如图5.2所示。以上介绍了一些常用伪指令。8086/8088宏汇编还有诸如GROUP、TITLE、PAGE、RAGE、SUBTTL、LIST、XLISL、PUBLIC和EXTFN等伪指令。图5.2VAR1和VAR2在存储器中的分布情况为给编写汇编语言源程序提供方便,MS-DOS系统中设置了几十个内部子程序,它们可以完成输入/输出(I/O)设备管理、存储管理、文件管理和作业管理。对汇编语言程序而言,它们一部分被固化在系统的ROM中,可作为ROMBIOS模块。另一部分存放在系统磁盘上,在系统启动时被装入内存,用户的应用程序及MS-DOS的大部分命令都将通过软件中断来调用它们。下面先对DOS中常用的软件中断进行简单说明,然后介绍INT21H的系统功能调用,最后说明有关BIOS的中断调用。5.3.1DOS软件中断和系统功能调用磁盘操作系统(DiskOperatingSystem)是PC上最重要的操作系统,它是由软盘或硬盘提供的。它的两个DOS模块IBMBIO.COM和IBMDOS.COM使BIOS使用起来更方便。因为DOS模块提供了更多更必要的测试,所以使DOS操作比使用相应功能的BIOS操作更简易,而且DOS对硬件的依赖性更少些,一般来说MS-DOS中常用的软中断指令有8条,系统规定它们的中断类型码为20H~27H,它们各自的功能及入口/出口参数见表5-4。表5-4DOS常用的软中断命令软中断指令功能入口参数出口参数INT20H系统正常退出无无INT21H系统功能调用AH=功能号,相应入口号相应出口号INT22H结束退出INT23HCtrl-Break处理INT24H出错处理INT25H读磁盘AL=驱动器号CX=读入扇区数DX=起始逻辑扇区号DS:BX=内存缓冲区地址CF=0成功CF=1出错INT26H写磁盘AL=驱动器号CX=写入扇区数DX=起始逻辑扇区号DS:BX=内存缓冲区地址CF=0成功CF=1出错INT27H驻留退出DS:DX=程序长度在所有的这些DOS软件中断中,功能最强大的是INT21H,它提供了一系列的DOS功能调用。DOS版本越高,所给出的DOS功能调用越多,DOS6.2包含了100多个功能调用,这些子程序分别实现外部设备管理、文件读/写、文件管理、目录管理和内存分配等功能。每个子程序对应一个功能号,给定入口/出口参数后,用INT21H来调用。可以说INT21H的中断调用几乎包括了整个系统的功能,用户不需要了解I/O设备的特性及接口要求就可以利用它们编程,对用户来说非常有用。调用这些软中断时,只要给定入口参数,接着写一条中断指令INTn就可以了。DOS系统功能调用DOS系统功能调用分别实现设备管理、文件读/写、文件管理和目录管理等功能。每个子程序对应一个功能号,所有系统功能调用的格式是一致的,这些功能的调用步骤如下:(1)系统功能号送到AH寄存器中。(2)入口参数送到指定寄存器中。入口参数是子程序运行所需要的数据,DOS系统功能调用的入口参数通常是放在指定的内部寄存器中,少数功能调用也可以没有入口参数。(3)用INT21H指令执行功能调用。有些系统功能调用比较简单,不需要设置入口参数或者没有出口参数,则只需安排后两个语句,调用返回完成时,系统将出口参数送到指定的寄存器中,或送屏幕显示出来。【例5.27】2号功能调用。MOVDL,'B'MOVAH,2INT21H调用结果为在屏幕上显示‘B’下面选择一些常用的DOS功能调用,以作简要说明:1)DOS键盘功能调用键盘提供了字符键数字(0~9,字母A~Z,a~z,%,$,#),功(Home,End,Del,Ins,PgUp,PgDown等)和控制键(Ctrl,Alt,Shift)。每个键都有对应的键值,即标准ASCII码值,通过DOS功能调用可读入键值到AL寄存器或存储器中,表5-5列出了DOS键盘功能调用的有关命令。表5-5DOS键盘功能调用AH功能入口参数出口参数1从键盘输入一个字符,并在屏幕上显示,检查Ctrl-Break键AL=字符8键盘输入一个字符,无回显AL=字符6直接键盘输入/输出字符,不检查Ctrl-Break键DL=0FFHAL=字符7直接键盘输入/输出字符,无回显,不检查Ctrl-Break键AL=字符0AH0BH输入字符串到内存缓冲区检查键盘输入状态DS:DX=缓冲区首址AL=FFH有键入AL=0无键入0CH 清键盘缓冲区,调用键盘输入功能AL=键盘功能号(1,6,7,8,A)(1)键盘输入单字符。DOS功能调用中1,8,6,7号功能调用都能完成从键盘输入一个字符到到AL寄存器,差别在1号和6号功能调用键入同时在屏幕上显示字符,8号和7号功能调用不回显。①1号功能调用。从键盘输入字符并显示,调用格式为MOVAH,1INT21H它没有入口参数,执行上述命令后,系统扫描键盘等待是否有键按下,若有键按下,先检查是否为Ctrl-Break键,若是就自动调用中断INT23H,执行退出命令,否则就将键入字符的ASCII码送AL寄存器,并在屏幕上显示该字符。②8号功能调用。从键盘输入字符但不回显,调用格式为MOVAH,8INT21H它没有入口参数,与1号功能调用的区别仅仅在于键入的字符不送屏幕显示。③6号功能调用。直接控制台输入/输出单字符,调用格式为MOVDL,0FFHMOVAH,6INT21H;键盘输入单字符送AL中或MOVDL,'A'MOVAH,6INT21H ;将DL中的字符'A'送屏幕显示它可以从键盘输入字符,也可以向屏幕输出字符,并且不检查是否为Ctrl-Break键。当DL=0FFH时,表示从键盘输入,若标志位ZF=0,AL中为键值,若ZF=1,表示无键按下,AL中不是键值。(DL)≠0FFH时,表示屏幕无输出。 ④7号功能调用。直接控制台输入/输出但无回显,命令格式为MOVAH,7INT21H7号功能与6号功能调用相同,区别在于屏幕不显示,并且不检查是否为Ctrl-Break键。(2)键盘输入字符串。这是0AH号系统功能调用,其功能是将键盘接受的字符串写入到内存的输入缓冲区中,要求预先定义一个输入缓冲区,缓冲区的第一个字节指出能容纳的最大字符个数,由用户给出;第二个字节存放实际输入的字符个数,由系统最后填入;从第三个字节开始存放从键盘接受的字符,直到ENTER键结束。若实际键入的字符数大于给定的最大字符数,就会发出“嘟嘟”声,并且光标不再向右移动,后面输入的字符丢失。若键入的字符数小于给定的最大字符数,缓冲区其余部分填0。当0AH功能调用时,要求将DS:DX指向缓冲区的第一字节。0AH号系统功能调用格式如下:定义缓冲区BUFFDB100  ;用户定义存放100字节的缓冲区DB?  ;系统输入实际输入字符字节数DB100DUP(?);存放输入字符的ASCII码值0AH号系统功能调用MOVDX,OFFSETBUFFMOVAH,0AHINT21H(3)检验键盘状态。0BH功能调用:检验是否有键按下,若有键按下,AL=0FFH;若没有键按下,AL=0,无论检测到是否有键按下,程序继续执行下一条指令。调用格式如下:MOVAH,0BH;检测键盘状态,0BH功能调用INT21H    (4)清除键盘缓冲区。0CH功能调用:先清除键盘缓冲区,然后执行AL中指定的功能,AL中可以指定1,6,7,8或0AH功能号,使程序在输入字符前将以前键入的字符清掉。调用格式如下:MOVAH,0CH;清键盘缓冲区MOVAL,7;执行7号功能调用INT21H2)DOS显示功能调用DOS显示功能调用能够显示单字符或字符串,这些功能都自动向前移动光标,表5-6给出了DOS显示功能调用的有关命令。表5-6DOS显示功能调用AH功能入口参数说明269显示一个字符,检验Ctrl-Break键显示一个字符,不检验Ctrl-Bre
本文档为【汇编语言程序设计(22)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
机构认证用户
希望图文
公司秉着用户至上的原则服务好每一位客户,专注课件、范文、教案设计制作
格式:ppt
大小:2MB
软件:PowerPoint
页数:155
分类:
上传时间:2022-04-26
浏览量:23