第4章汇编语言程序设计4.1程序设计语言概述4.2汇编语言的程序结构与语句格式4.3汇编语言的伪指令4.4汇编语言程序设计方法4.5模块化程序设计技术4.6综合应用程序设计举例4.7汇编语言与C/C++语言的混合编程第4章汇编语言程序设计本章重点:源程序基本结构汇编语言的语法规则(基本语法及常用伪指令)汇编语言程序设计方法。程序:是一组为完成某种功能而按一定顺序(由算法确定)编排的指令序列。汇编语言:具有执行速度快、易于实现对硬件控制等优点,是实时控制等应用软件经常使用的程序设计语言。第4章汇编语言程序设计南京航空航天大学电子信息工程学院4.1程序设计语言概述机器语言:当指令和数据都用二进制代码表示时,计算机能够直接识别与执行,因而称之为机器语言。高级语言:是完全独立于机器的通用语言,效率低。面向过程、面向对象,必须译成机器语言。汇编语言:是将机器指令符号化了的编程语言。是一种采用助记符表示的、面向CPU指令系统的程序设计语言。1.3种语言机器语言程序(目标代码)高级语言源程序编译或解释(可由编译程序完成)汇编语言源程序汇编(可由汇编程序完成)第4章汇编语言程序设计南京航空航天大学电子信息工程学院①能够利用硬件系统的特性(寄存器、标志、中断系统等)直接对位/字节/字/寄存器/存储单元/I/O端口进行处理。②采用CPU指令系统提供的各种寻址方式编制程序目标代码占用内存少,执行速度快,效率高,具有实时性。用汇编语言编写程序的优点:常用于编写系统软件、实时通信与控制程序、I/O接口驱动等。缺点:依赖于机器硬件,通用性和移植性较差。2.汇编程序(Assembler)(1)汇编程序的作用①将源程序翻译成机器语言程序;②按用户要求自动分配存储区域(如程序区、数据区、堆栈区等);③自动将各种进制→2#数;将字符→ASCII码;计算表达式的值;④自动对源程序进行检查,指出语法错误(如,非法格式、未定义的助记符和标号、漏掉操作数等)南京航空航天大学电子信息工程学院第4章汇编语言程序设计汇编程序提供汇编语言源程序的所有语法规则,常用的有:①ASM基本汇编,占内存少;②MASM宏汇编,除ASM功能外,还支持:宏操作、条件汇编、结构、记录等高级宏汇编语言功能。有各种版本,并不断在升级中;③TASM(TurboAssembler)Borland公司的汇编编译器,性能同MASM。④OPTASM(OptimizingAssembler)一种优化的MASM(2)汇编程序分类Microsoft公司3.汇编语言程序的上机与处理过程南京航空航天大学电子信息工程学院第4章汇编语言程序设计上机环境硬件系统软件应用软件操作系统:DOS系统编辑器:EDIT.exe编译程序:MASM.exe连接程序:LINK.exe调试程序:DEBUG.exe用户开发的程序:ABC.exe等CPU、存储器(ROM、RAM)、I/O接口、输入、输出设备第4章汇编语言程序设计编辑源程序EDITABC.ASM汇编源程序MASMABC.ASM形成目标程序ABC.OBJ连接目标程序LINKABC.OBJ有连接错误信息?形成可执行程序ABC.EXE装入可执行程序到内存,并执行D:\subABC下一程序用DEBUG调试可执行程序D:\subDEBUGABC.EXE找到原因YNYNNYN有汇编错误信息?Y运行结果正确?用DEBUG调试程序查错?汇编语言上机过程D:EDITABC.ASMD:MASMABC有语法错,回EDIT下修改程序D:LINKABC有错,回EDIT下修改程序D:ABC运行结果错,回EDIT下改程序或在DEBUG下调试,找原因。D:DEBUGABC.exe第4章汇编语言程序设计语法:语句和程序结构必须遵循的规则4.2汇编语言的程序结构与语句格式4.2.1汇编语言源程序的框架结构源程序应按编译器(如,MASM汇编程序)能够理解的语法编写每段由伪指令SEGMENT开始,至ENDS结束(完整段定义)。代码段:程序的主体(必不可少的段)。堆栈段:在内存建立堆栈区,以存放中断或子程序调用时的断点地址、各模块间传递的参数等。数据段和附加数据段:在内存中建立适当容量的工作区,以存放程序需要的常数或变量等。(1)源程序由若干个逻辑段组成程序中段的顺序:数据段、堆栈段定义在前,代码段在后。(①变量应先定义;②汇编过程遇到变量时需要知道变量的属性)源程序的结构特点:按逻辑段组织源程序。包括代码段、堆栈段、数据段等。第4章汇编语言程序设计程序结构(P133);----------------------------------------------------------------------------------------段名1SEGMENT;一个段的开始语句1语句2……段名1ENDS;一个段的结束;----------------------------------------------------------------------------------------段名2SEGMENT;另一个段的开始……段名2ENDS;另一个段的结束;----------------------------------------------------------------------------------------……;其它段;----------------------------------------------------------------------------------------ENDSTART;源代码结束源程序以END结束,它通知汇编程序停止汇编。START标号为程序运行时的起始地址。第4章汇编语言程序设计程序中段的使用:8086/8088/80286允许同时使用4种类型的段:代码段CS、堆栈段SS、数据段DS和附加数据段ES80386/80486和Pentium系列允许同时使用6种段:以上4个段+FS和GS两个附加数据段一个源程序中每种类型的段可不止使用一个,如:n个数据段。(2)ASSUME伪指令在代码段起始处用ASSUME伪指令说明各个段Reg与逻辑段的关系,并在程序起始处设置段Reg的初值(代码段CS除外)。(3)每段由若干语句行组成每行只有一条语句且不能超过128个字符,允许有后续行。在8086/8088和实地址模式下,每段的最大长度均为64KB;在保护模式下,80286允许每个段的最大长度为16MB,80386~Pentium系列CPU允许4GB。END通知汇编程序停止汇编,START标号为程序运行时的起始地址。第4章汇编语言程序设计终止当前程序使其正确返回到DOS状态的常用方法有:将源程序中的主程序定义为FAR,其最后一条指令为RET;在主程序的开始处使用3条指令:PUSHDS;保护程序段前缀PSP的段地址MOVAX,0;保护PSP的0偏移地址PUSHAX;注:所保护的地址中是INT20H(4)每条语句由4个字段构成。各字段间用空格分开。(5)源程序中设有返回DOS的指令语句,使程序执行完后能够返回DOS系统的命令接受状态。①标准序法②使用DOS的4CH号功能调用不定义主程序为FAR过程并去掉上面3条指令;在代码段结束(CODEENDS)之前增加两条语句:MOVAH,4CH;功能号4CH→AHINT21H;软中断调用MASM从5.0版开始支持简化段定义,它通过伪指令EXIT返回DOS。当程序执行到RET,这两个地址会弹出送IP、CS第4章汇编语言程序设计源程序与PCDOS的接口汇编语言源程序(.ASM)经过汇编转变为目标程序(.OBJ),当用链接程序对其进行链接和定位时,操作系统为用户程序:①建立1个256字节的程序段前缀区(PSP)INT20HPSP起始0000H定位用户程序PSP用于存放用户程序信息,包括:在PSP的开始处(偏移地址0000H)安排了一条INT20H软中断指令INT20H功能:系统返回DOS管理状态据此特征,用户编写程序时必须:在程序执行完毕后,能够转到PSP起始处执行INT20H指令。②定位用户程序③设置DS和ES的值,使之指向PSP的起始(DS/ES←PSP的段地址)④将用户程序第1条指令的地址设置CS、IP;将堆栈段地址设置SS、SP。⑤运行用户程序由于DS/ES已由DOS设置,在用户程序开始处应重新设置。第4章汇编语言程序设计4.2.2汇编语言的语句1.语句的种类与格式(1)语句的种类语句:汇编语言源程序的基本组成单位,规定一个基本操作。源程序:语句序列,完成某个特定的操作任务。①指令语句——可执行语句,对应CPU指令系统规定的一条指令。三种基本语句:指令语句、伪指令语句和宏指令语句汇编时,汇编程序为之产生一一对应的机器目标代码。例:MOVDS,AX;双字节指令,机器码为8EH、D8H②伪指令语句——由伪指令构成的说明语句(不可执行),可在任何段内汇编时,指示汇编程序如何汇编源程序,如分配存储单元、将程序分段等,本身不产生目标代码,CPU不执行。第4章汇编语言程序设计例:SEGMENT/ENDS;将程序分段信息提供给汇编程序,以不同;的名字来说明是数据段、代码段、堆栈段例:MESSAGEDB‘THISISASAMPLEPROGRAM.’;定义变量MESSAGE在数据段DATA中的存放形式;汇编时,汇编程序将MESSAGE定义为一个字节类;型数据区的首地址,并按字节存储字符串。③宏指令语句——是以某个宏名字定义的一段指令序列汇编时,程序中有宏指令语句的地方被展开成相应的指令序列。宏指令语句是一般性指令语句的扩展。例:SHIFTMACRO;定义宏指令语句SHIFTMOVCL,4SALAL,CLENDM南京航空航天大学电子信息工程学院第4章汇编语言程序设计①标号和名字分别是为指令单元和伪指令所起的符号名称,是自定义的标识符。命名必须符合汇编语言对标识符的规定:以字母开头,由字母(不区分大小写)、数字(0~9)及部分特殊字符(?@$和下划线_等)组成的字符串,长度不超过31。不能是有特定意义的保留字,如寄存器名AL和助记符等。标号后必须有冒号,代表指令所在存储单元的符号地址。在程序中作为JMP、LOOP等指令的转移目标。名字用于定义常量、变量、过程、段名等,指示所定义变量、过程以及段的起始地址。(2)语句的格式指令语句的一般格式:[标号:][前缀]指令助记符[操作数][;注释]伪指令语句的格式:[名字]伪指令定义符[操作数][;注释][]表示可选南京航空航天大学电子信息工程学院第4章汇编语言程序设计②助记符、定义符规定指令或伪指令的操作功能,是语句中唯一不可缺少的部分。指令助记符,汇编程序将其翻译成机器代码。MOVAX,100;B80001伪指令定义符,汇编程序根据其要求的功能进行处理。dataSEGMENT;data与某个段地址对应stringDB‘Tsinghua’;定义string为字节存储区的起始地址前缀仅可出现在指令助记符前(如,REP及段超越前缀等)指令语句中的操作数提供操作对象、存放位置、访问形式。操作数可以是1个、2个或0个,2个时用逗号‘,’分开。(INCBX;MOVAX,DATA;RET)伪指令语句中操作数的格式和含义随伪操作指令各有不同。③操作数南京航空航天大学电子信息工程学院第4章汇编语言程序设计④注释操作数的表现形式有4种——常量操作数:如,34等。寄存器操作数:如,AX等。存储器操作数:如,[0100H]等。表达式操作数:如,[BX+2]、SEGNUM1等。以“;”开始,对程序的功能加以说明。汇编程序对“;”之后的内容不做处理。注释对汇编不起任何作用,不对应于任何机器码,仅增强源程序的可读性。第4章汇编语言程序设计4.2.2.2语句中的操作数1.常量操作数在运行期间不变化的量:立即数、端口地址。常用:(1)数值常量2#(B)、10#(D)、8#(Q)、16#(H)的整型常量。对16#:必须以数字打头,若最高位为字母A~F,必