汇编语言入门教程-第五章:汇编语言程序结构.ppt
《汇编语言入门教程-第五章:汇编语言程序结构.ppt》由会员分享,可在线阅读,更多相关《汇编语言入门教程-第五章:汇编语言程序结构.ppt(64页珍藏版)》请在三一办公上搜索。
1、教学重点,本章重点掌握:程序的格式、开发方法参数的表达、变量的定义变量和标号的属性,第一章 基础知识,第五章 汇编语言程序结构,第一章 基础知识,机器语言计算机能够直接识别并执行的二进制机器指令序列,优点:开销小、运行速度快;缺点:难以编写和理解,编程效率很低。,汇编语言(Assembly Language)用助记符号表示机器指令代码、变量地址,标号等的符号指令序列。,优点:易记、易理解,易编写程序,大大提高了编程效率;问题:需要将助记符号翻译为机器语言。,汇编语言源程序:用汇编语言编写的程序。,汇编程序:将助记符号翻译为机器语言的语言处理程序,以便 计算机能够识别。,汇编:将助记符号翻译为机
2、器语言的过程。,理解以上几个名词概念:汇编语言、汇编语言源程序、汇编程序、汇编,概 念,第一节:汇编程序功能及上机过程,汇编程序功能,一般汇编程序都应具有如下功能:宏汇编功能 支持地址和数据的符号表示 支持内存管理 支持程序的模块化组织 支持多种类型的数据表示等,汇编程序依赖于硬件,不同机型的系统有自己的汇编程序。,上机过程,上机过程如图所示,第一章 基础知识,第五章 汇编语言程序结构,汇编语言源程序的结构与书写格式,汇编语言源程序是段结构的:代码段、数据段、堆栈段、附加段,源程序由段组成,每段有一个段名,segment定义段起点,ends定义段结束点。每段由若干语句行组成,源程序以end结束
3、。,例字符串传送,指令和伪指令,指令使CPU产生动作、并在程序执行时才处理的语句,就是前一章学习的处理器指令伪指令(Directive)不产生CPU动作、在程序执行前由汇编程序处理的说明性语句,例如,数据说明、变量定义等等伪指令与具体的处理器类型无关,但与汇编程序的版本有关,本课程采用微软宏汇编程序 MASM 5.0,汇编语言语句一般格式为:标识符/语句标号 指令名 操作数序列;注释,标识符用来为变量、段及过程等命名,语句标号标识符后加:,提供转移地址,指令名指令可分为三类:机器指令、伪指令和宏指令。,机器指令:指令系统中的指令,程序运行时由CPU执行;,伪指令:汇编程序执行的操作,规定汇编程
4、序如何按要求进行汇编及分配内存。,宏指令:由一系列指令或伪指令构成,汇编时展开成若干条机器指令,用于提高编程效率。,操作数序列可以是常量、变量、表达式、寄存器名或标号等,用逗号隔开。,(伪指令和宏指令由汇编程序在汇编期间处理),注释符“;”后可给出语句注释,提高可读性和可理解性。,第二节:汇编语言语句格式与分类,(1)常量 00110110B 389D 467O B407H 3.475E+5 Input a number,(2)变量 变量名:存储单元的符号地址 变量值:存储单元中的数据,MOV AL,Amov al,a,变量的三种属性:段值(SEG):变量所在段的起始地址 偏移量(OFFSET
5、):段起点距离变量所在存储单 元位置的字节数,类型(TYPE):变量占用的字节数,常量、变量、标号,(3)标号 标号:存放指令的存储单元的符号地址,常用作转移地址。,NEAR:2字节转移地址,CMP AX,BX JNE NEXT NEXT:MOV AX,0,标号的三种属性:段值(SEG):标号所在段的起始地址 偏移量(OFFSET):段起点距离标号所指存储单 元位置的字节数,类型(TYPE):NEAR,FAR,(偏移地址),短指针(近指针),段内转移,FAR:4字节转移地址,(段、偏移地址),长指针(远指针),段间转移,第一章 基础知识,第五章 汇编语言程序结构,汇编语言程序的语句类型:1、程
6、序执行指令语句。2、伪操作语句。3、宏指令语句。,伪操作的功能:伪操作又称为伪指令,它不象机器指令那样是在程序运行期间由计算机来执行的,它是在汇编程序对源程序汇编期间由汇编程序处理的操作,它们可以完成如下功能:(1)符号定义伪指令(2)数据定义伪指令(3)段定义伪指令(4)过程定义伪指令(5)条件汇编伪指令(6)宏指令(7)结构与记录,一、数据定义及存储器分配伪操作,格式:Variable Mnemonic Operand,Operand;Comments,变量(Variable)字段:是可有可无的,它用符号地址表示,其作用与指令语句前的标号相同,但它的后面不跟冒号。如果语句中有变量则汇编程序
7、使其记以第一个字节的偏移地址。,第一章 基础知识,第五章 汇编语言程序结构,注释(Comments)字段:用来说明该伪操作的功能,它也是可有可无的。助记符(Mnemonic)字段:说明所用伪操作的助记符,常用的有以下几种:,DB伪操作:用来定义字节,其后的每个操作数都占有一个字节。DW的操作:用来定义字,其后的每个操作数占有一个字(低位字节在第一个字节地址中,高位字节在第二个字节地址中)。,DD伪操作:用来定义双字,其后的每个操作数占有二个字。DQ伪操作:用来定义四个字,其后的每个操作数占有四个字。DT伪操作:用来定义十个字节,其后的每个操作数占有十个字节,形成压缩的BCD码。,这些伪操作可以
8、把其后面跟着的数据存入指定的存储单元,或者只分配存储器空间而并不存入确定的数值。DW和DD伪操作可以存储偏移地址或完整的地址。,第一章 基础知识,第五章 汇编语言程序结构,例 操作数可以是常数,或者是表达式(根据该表达式可以求得一个常数),如 DATA_BYTE DB 10,4,l0H DATA_WORD DW 100,100H,-5 DATADW DD 3*20,0FFFDH汇编程序可以在汇编期间在存储器中存入数据,如右图所示。,例 操作数也可以是字符串,如:MESSAGE DB H2LLO,则存储器存储情况如下图所示:,第一章 基础知识,第五章 汇编语言程序结构,注意:DB AB和DW A
9、B的存储 分配空间的不同。如下图:,例 操作数?可以保留存储空间,但不存入数据。如:ABC DB 0,?,?,?,0 DFF DW?,52,?经汇编后的存储情况如右图所示。,第一章 基础知识,第五章 汇编语言程序结构,操作数字段还可以使用复制操作符来复制某个(或某些)操作数。其格式为:repeat_count DUP(operate,operate,),其中repeat_count可以是一个表达式,它的值应该是一个正整数,用来指定括号中的操作数的重复次数。,例 ARRAYl DB 2 DUP(0,1,2,?)ARRAY2 DB 100 DUP(?),汇编后的存储情况如下图所示。,ARRAYl
10、DB 2 DUP(0,1,2,?)和以下语句是等价的:ARRAYl DB 0,I,2,?,0,1,2,?,第一章 基础知识,第五章 汇编语言程序结构,例 DUP操作可以嵌套,例如ARRAY3 DB 100DUP(0,2 DUP(1,2),0,3),则汇编结果如右图所示:,可以用DW或DD伪操作把变量或标号的偏移地址(DW)或整个地址(DD)存入存储器。用DD伪操作存入地址时,第一个字为偏移地址,第二个字为段地址。,例如 PARAMETER_TABLE DW PAR1 DW PAR2 DW PAR3 INTERSEG_DATA DD DATA1 DD DATA2则汇编后的存储情况如下图所示。其中
11、偏移地址或段地址均占有一个宇,其低位字节占有第一个字节,高位字节占有第二个字节。,第一章 基础知识,第五章 汇编语言程序结构,第一章 基础知识,第五章 汇编语言程序结构,顺便说明一下,这里操作数字段中的变量或标号可以使用表达式如:,在这种情况下,汇编后,存储器中应该存入表达式的值。例如 PARAMETER_TABLE DW PAR1+1 DW PAR2+1,说明变量的类型属性问题:,在数据定义伪操作前面的变量的值是该伪操作中的第一个数据项在当前段内的第一个字节的偏移地址。此外,它还有一个类型属性用来表示该语句中的每一个数据项的长度(以字节为单位表示),因此DB伪操作的类型属性为1,DW为2,D
12、D为4,DQ为8,DT则为10,变量表达式的属性和变量是相同的。汇编程序可以用这种隐含的类型属性来确定某些指令是字指令还是字节指令。,第一章 基础知识,第五章 汇编语言程序结构,例如 OPER1 DB?,?OPER2 DW?,?MOV OPER1,0 MOV OPER2,0,则第一条指令应为字节指令,第二条指令则应为字指令。,如果有下列指令序列:,OPER1 DB 1,2 OPER2 DW 1234H,2345H MOV AX,OPER1+1 MOV AL,OPER2,汇编程序在汇编这一段程序时,能发现两条MOV指令的两个操作数的类型属性是不相同的:OPERl十1为字节类型属性而AX为字类型属
13、性;OPER2为字类型属性而AL为字节类型属性。汇编语言将指示由于属性类型不匹配出错。,第一章 基础知识,第五章 汇编语言程序结构,有一个办法可以指定操作数的类型属性,它优先于隐含的类型属性,即可以使用PTR属性操作符。其格式为:type PTR Varible士 constant expression其中类型可以是BYTE,WORD或DWORD(双字),这样变量的类型就可以指定了。上面例子可以写为:OPER1 DB 1,2 OPER2 DW 1234H,2345H MOV AX,WORD PTR OPER1+1 MOV AL,BYTE PTR OPER2,通过PTR属性操作符就把OPER1十
14、1的类型属性指定为字,两个操作数的属性就一致了,汇编时不会出错,而运行时应把OPER1十1的字内容送到AX,即把OPER1十1的内容送AL,把OPER2的第一个字节的内容运AH,所以指令执行完后,(AX)3402H。同样,对于第二条语句(AL)=34H,第一章 基础知识,第五章 汇编语言程序结构,LABEL伪操作:,除了用属性操作符给以定义外,还可以用LABEL伪操作来定义,其格式为:name LABEL type,(1)对于数据项可以表示为:variable_name LABEL type其中,type可以是BYTE,WORD或DWORD(双字)。(2)对于可执行的代码,则可表示为 labe
15、l_name LABEL type其中,type可以是NEAR或FAR。,第一章 基础知识,第五章 汇编语言程序结构,例如4.9 BYTE_ARRAY LABEL BYTE WORD_ARRAY DW 50 DUP(?)这样在100个字节数组中的第一个字节的地址赋于二个不同类型的变量名:字节类型的变量BYTE_ARRAY和字类型变量WORD_ARRAY。指令 MOV WORD_ARRAY十2.,0把该数组的第3个和第4个字节置0,而 MOV BYTE_ARRAY十2.,0则把该数组的第3个字节置0。,例:LABF LABEL FAR LAB:MOV AX,100,第一章 基础知识,第五章 汇编
16、语言程序结构,二、表达式赋值伪操作EQU,有时程序中多次出现同一个表达式为方便起见可以用赋值伪操作给表达式赋予一个名字,其格式如下:,此后,程序中凡需要用到该表达式之处就可以用表达式名来代替了。上式中的表达式可以是任何有效的操作数格式,可以是任何可以求出常数值的表达式,也可以是任何有效的助记符。举例如下:,第一章 基础知识,第五章 汇编语言程序结构,必须注意EQU语句的表达式中如果有变量或标号的表达式,则在该语句前应该先给出它们的定义。例如,语句:,则必须放在DATA_ONE的定义之后才行,否则汇编程序将指示出错。,另外还有一个与EQU相类似的=伪操作也可以作为赋值伪操作使用。它们之间的区别是
17、:EQU伪操作中的表达式名是不允许重复定义的,而=伪操作则允许重复定义。例如:EMP=6 或 EMP EQU 6都可以使数6赋以符号名EMP,但是不允许两者同时使用。,第一个语句后的指令中EMP值为7;而第二个语句后的指令中EMP值为8。,第一章 基础知识,第五章 汇编语言程序结构,三、段定义伪操作,存储器的物理地址是由段地址和偏移地址组合而成的,汇编程序在把源程序转换为目标程序时,必须确定标号和变量的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起形成一个可执行程序。为此,需要用段定义伪操作,段定义伪操作的格式如下:,此外,还要明确段和段寄存器的
18、关系,这可用ASSUME伪操作来实现,其格式为:,其中assignment说明分配情况,其格式为:,其中段寄存器名必须是CS、DS、ES和SS中的一个,而段名则必须是由segment定义的段中的段名。而ASSUME NOTHING则可取消前面由ASSUME所指定的段寄存器。,第一章 基础知识,第五章 汇编语言程序结构,例如:,由于assume伪操作只是指定某个段分配给那一个段寄存器,它并不能把段地址装入段寄存器中,所以在代码段中。还必须把段地址装入相应的段寄存器中。为此,在上例的程序中,分别用两条MOV指令完成这一操作。如果程序中有堆栈段,也需要把段地址装入SS中。但是,代码段不需要这样做,代
19、码段的这一操作在程序初始化时完成。功能:,通知MASM用指定的段寄存器来寻址对应的逻辑段,即建立段寄存器与段的缺省关系在明确了程序中各段与段寄存器之间的关系后,汇编程序会根据数据所在的逻辑段,在需要时自动插入段超越前缀。这是ASSUME伪指令的主要功能ASSUME伪指令并不为段寄存器设定初值,连接程序LINK将正确设置CS:IP和SS:SP由于数据段通常都需要,所以在样板源程序中,首先为DS赋值;如果使用附加段,还要赋值ES,段寄存器的装入,DS和ES的装入通过寄存器传送如:MOV AX,DATA1 MOV DS,AX MOV AX,DATA2 MOV ES,AXSS的装入(1)自动装入采用定
20、义段时指定组合类型STACK参数,在ASSUME语句中建立SS的关系,这样就可以自动装入SS。,SS段寄存器的装入,stack1segment para stackdw 40h dup(?)stack1ends code1segmentassume cs:code1,ss:stack1,SS段寄存器的装入,(2)程序设置stack1segment para stackdw 40h dup(?)toplabelwordstack1ends code1segmentassume cs:code1,ss:stack1,mov ax,stack1mov ss,axmov sp,offset top,C
21、S和IP的装入,初始化时装入,根据END伪指令指示的地址 END 标号END语句的作用:告诉汇编程序,源程序结束指定程序运行时的起始地址,即:seg 标号 csoffset 标号 ip,汇编结束伪指令,END 标号,指示汇编程序MASM到此结束汇编过程源程序的最后必须有一条END语句可选的标号用于指定程序开始执行点,连接程序将据此设置CS:IP值,不要糊涂程序终止和汇编结束是两码事,CS和IP的装入,(2)自动修改CS和IP执行CALL FAR和RET指令执行JMP FAR指令响应中断及中断返回(IRET)RESET,第一章 基础知识,第五章 汇编语言程序结构,SEGMENT伪操作还可以增加类
22、型及属性的说明,格式如下:,一般情况下,这些说明可以不用。但是,如果需要用连接程序把本程序与其他程序模块相连接时,就需要使用这些说明。分别叙述如下:,*定位类型(align_type)可以是:,段名 SEGMENT 定位类型 组合类型 段字类别名 段名 ENDS,实际上定位类型可以理解为对两个相临段的段地址给予的一些规定。定位类型可以有以下几种:PARA:指定所定义的段开始于小段边界,实际是规定这个段的起始地址与前面一个段的起始地址之差必须是16字节的整数倍。这意味着相临两个段的段地址之差最小也得是1。PAGE:指定定义的段开始于页边界,实际是规定这个段的起始地址与前面一个段的起始地址之差必须
23、是256字节的整数倍。BYTE:所定义的段开始于字节边界,实际上是指这个段可以从任何地址开始。WORD:所定义的段开始于字边界,实际是指这个段只能从偶数地址开始。,如果源程序中指定了段的定位类型为PARA或PAGE,那么获得的可执行文件中相临段的段地址就有差异。但是如果源程序中指定了段的定位类型是BYTE或WORD,那么在可执行文件中相临段的段地址就有可能相同。为了说明这个问题,我们下面给出了一个程序例:,第一章 基础知识,第五章 汇编语言程序结构,*组合类型(combine_type)设置一定的组合类型就可以通知LINK程序把一些分散在不同模块内的同类型段组织在一个段内,这样可以使最终形成的
24、可执行文件结构比较清晰。,PUBLIC 该段连接时将与有相同名字的其他分段连接在一起。其连接次序由连接命令指定。COMMON 该段在连接时与其他同名分段有相同的起始地址,所以会产生覆盖。COMMON的连接长度是各分段中的最大长度。AT expression 使段的起始地址是表达式所计算出来的16位段地址。但它不能用来指定代码段。STOCK 指定该段在运行时为堆栈段的部分。MEMORY 指定该段将分配在所有其他连接在一起的段的前面(在高地址上),如果连接时有几个指定MEMORY的段,则遇到的第一段作为MEMORY段,其他则作为COMMON段,*类别(CLASS)连接时用于组成段组的名字:,可以是
25、:,第一章 基础知识,第五章 汇编语言程序结构,四、程序开始和结束伪操作(ASM操作规则),在程序的开始可以用NAME或TITLE为模块取名字,NAME的格式是:NAME module_name汇编程序将以给出的module_name作为模块的名字。如果程序中没有NAME伪操作,则也可使用TITLE伪操作,其格式为;TITLE textTITLE 伪操作可指定每一页上打印的标题。同时,如果程序中没有使用NAME伪操作则程序将用text中的前六个字符作为模块名。text最多可有60个字符。如果程序中既无NAME又无TITLE伪操作,则将用源文件名作为模块名。所以NAME及TILLE伪操作并不是必
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 入门教程 第五 程序结构
链接地址:https://www.31ppt.com/p-6586390.html