微机汇编语言程序设计.ppt_第1页
微机汇编语言程序设计.ppt_第2页
微机汇编语言程序设计.ppt_第3页
微机汇编语言程序设计.ppt_第4页
微机汇编语言程序设计.ppt_第5页
已阅读5页,还剩159页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章8086/8088汇编语言程序设计,汇编语言程序设计是开发微机系统软件的基本功,在程序设计中占有十分重要的地位。,由于汇编语言具有执行速度快和易于实现对硬件的控制等独特的优点,所以至今它仍然是用户使用得较多的程序设计语言。特别是在对于程序的空间和时间要求很高的场合,以及需要直接控制设备的应用场合,汇编语言更是必不可少了。由于汇编语言本身的特点,本章将选择目前国内广泛使用的IBMPC机作为基础机型,着重讨论8086/8088汇编语言的基本语法规则和程序设计的基本方法,以掌握一般汇编语言程序设计的初步技术。,4.1程序设计语言概述,4.28086/8088汇编语言的基本语法,4.3汇编语言程序设计基本方法,4.4软件调试技术,目录,4.1程序设计语言概述,程序设计语言是专门为计算机编程所配置的语言。它们按照形式与功能的不同可分为3种,即:机器语言汇编语言高级语言,目录,一、机器语言(MachineLanguage),机器语言是由0、1二进制代码书写和存储的指令与数据。特点:能为机器直接识别与执行;程序所占内存空间较少。缺点:难认、难记、难编写、易出错。,二、汇编语言(AssemblyLanguage),汇编语言是用指令的助记符、符号地址、标号等书写程序的语言,简称符号语言。特点:易读、易写、易记。缺点:不能像机器语言那样为计算机所直接识别,也不如高级语言那样具有很好的通用性和可移植性。,三、高级语言(HighLevelLanguage),高级语言是脱离具体机器(即独立于机器),面向用户的通用语言,不依赖于特定计算机的结构与指令系统。用同一种高级语言编写的源程序,一般可以在不同计算机上运行而获得同一结果。由于高级语言的通用性特点,对于高级语言程序员来说,不必熟悉计算机内部具体结构和机器指令,而只需要把主要精力放在程序结构和算法描述上面。所以,高级语言具有更广泛的领域。,汇编语言程序的上机与处理过程,图中,椭圆表示系统软件及其操作,方框表示磁盘文件。椭圆中横线上部是系统软件的名称,横线下部是软件所作的操作。首先,用户编写汇编语言源文件;再经过汇编程序进行汇编,产生属性为OBJ的以二进制代码表示的目标程序并存盘。然后通过连接程序(LINK)把目标文件与库文件以及其他目标文件连接在一起,形成可执行文件,才能在DOS环境下在机器上执行之。,4.28086/8088汇编语言的基本语法,各种机器的汇编语言其语法规则不尽相同,但基本语法结构形式类似。现以8086/8088汇编语言为例加以具体讨论。,目录,一、8086/8088汇编源程序实例,在具体讨论8086/8088汇编语言的繁琐语法规则之前,下面先举一个具有完整段定义格式的汇编源程序(即MASM程序)实例,以便对汇编语言的有关规定和格式有个初步了解。例:求从1开始连续50个奇数之和,并将结果存放在名字为SUM的字存储单元中。,例:求从1开始连续50个奇数之和,并将结果存放在名字为SUM的字存储单元中。,段,汇编源程序一般由若干段组成,每个段都有一个名字(叫段名),以SEGMENT作为段的开始,以ENDS作为段的结束,这两者(伪指令)前面都要冠以相同的名字。,段可以从性质上分为代码段、堆栈段、数据段和附加段4种,但代码段与堆栈段是不可少的,数据段与附加段可根据需要设置。在上面这个例子中,一共定义了3个段:1个数据段1个堆栈段1个代码段,NOTE,每一行只有一条语句且不能超过128个字符(从MASM6.0开始可以是512个字符)但一条语句允许有后续行,最后均以回车作结束。,NOTE,整个源程序必须以END语句来结束,它通知汇编程序停止汇编。END后面的标号START表示该程序执行时的起始地址。每一条汇编语句最多由4个字段组成,它们均按照一定的规则分别写在一个语句的4个区域内,各区域之间用空格或制表符(TAB键)隔开。,二、8086/8088汇编语言语句,(一)汇编语言语句的种类和格式1语句的种类在8086/8088汇编语言中,有3种基本语句:指令语句伪指令语句宏指令语句,指令语句,是一种执行性语句,它在汇编时,汇编程序将为之产生一一对应的机器目标代码。,汇编指令,机器码,MOVDS,AXADDAX,BX,8ED803C3,伪指令语句,是一种说明性语句,它在汇编时只为汇编程序提供进行汇编所需要的有关信息,如定义符号,分配存储单元,初始化存储器等,而本身并不代表生成目标代码DATASEGMENTAADW20H,-30HDATAENDS内存位置:,FF,20,00,D0,宏指令,是以某个宏名字定义的一段指令序列,在汇编时,凡有宏指令出现的地方都将用相应的指令序列的目标代码插入。宏指令语句是一般性指令语句的扩展,2语句格式8086/8088的汇编语句一般由4个字段组成如下:,(1)指令语句的格式标号:前缀指令助记符操作数表;注释其中,表示可以任选的部分;操作数表是由逗号分隔开的多个操作数。1)标号标号代表“:”后面的指令所在的存储地址(这里是逻辑地址),供JMP、CALL和LOOP等指令作操作数使用,以寻找转移目标地址。除此之外,它还具有一些其他“属性”。2)前缀8086/8088中有些特殊指令,它们常作为前缀同其他指令配合使用,例如和“串操作指令”(MOVS、CMPS、SCAS、LODS与STOS)连用的5条“重复指令”(REP、REPE/REPZ、REPNE/REPNZ),以及总线封锁指令LOOK等,都是前缀。,3)指令助记符包括8086/8088的指令助记符,以及用宏定义语句定义过的宏指令名。4)操作数表对8086/8088的一般性执行指令来说,操作数表可以是一个或两个操作数,若是两个操作数,则称左边的操作数为目标操作数,右边的操作数为源操作数;对宏指令来说,可能有多个操作数。操作数之间用逗号分隔。5)注释以“;”开始,用来简要说明该指令在程序中的作用(不是重复解释指令本身的功能),以提高程序的可读性。,(2)伪指令语句的格式名字伪指令参数表;注释其中,“名字”可以是标识符定义的常量名、变量名、过程名、段名以及宏名等。所谓标识符是由字母开头,由字母、数字、特殊字符(如?、下划线、等)组成的字符串。默认情况下,汇编程序是不区分大、小写字母的。注意,名字的后面没有冒号,这是伪指令语句同指令语句在格式上的主要区别。,MASM中伪操作命令,在伪指令语句的参数表中,包含有用逗号分隔的多个参数,它们可以是常数、变量名、表达式等。例:SUMDB12H,23H,34H,45H,56H,67H,78H,89H,(二)指令语句的各个部分:指令语句主要由8086/8088指令系统中的指令组成,一条指令必须包括一个指令助记符,以及充分的寻址信息,以使汇编程序能将其转换成一条机器指令的操作码字段及由操作数寻址方式指定的操作数字段。,1标号(Label)(1)标号及其属性标号是为一组机器指令所起的名字,用来作为汇编语言源程序中转移、调用以及循环等指令的操作数程序转移的转向地址(目标地址)。标号表示指令地址,是指令的符号地址,它具有3种属性段地址、段内偏移量(或相对地址)以及类型。1)段地址(SegmentBase)标号所在段的段地址(16位数),是标号所在段的20位起始地址的前16位。,2)段内偏移量(Offset)它是标号与段起始地址之间相距的字节数,为一16位无符号数。3)类型(Type)类型表示该标号所代表的指令的转移范围,分(近)与(远)两种。类型的标号仅在同一段内使用,用字节指针给出转移的偏移量属性(即只改变IP值,不改变CS值);而类型的标号无此限制,必须用字节指针指出转移的段地址与段内偏移量。当标号用作或等指令的目标操作数时,若为段内转移或调用则采用类型;若为段间转移或调用则应当采用类型。JMPFARPTRLINE,()标号的定义)标号的组成标号用一标识符定义,即以字母开头,由字母、数字、特殊字符(如?、下划线、等)组成的字符串表示。标号的最大长度一般不超过个字符,除宏指令名外,标号不能与保留字相同。保留字看上去类似标识符,但它们在语言中有被机器赋于的特殊意义。,寄存器名;指令系统的全部指令助记符;汇编语言的伪指令;其他名字标号最好用具有一定含义的英文单词或单词缩写表示,以便于阅读。,)在指令的助记符之前,使用标号并紧跟一个冒号“:”,表示该标号被定义为一个类型为的标号。当然,标号也可单列一行例如:subrout:movax,3000h)标号的使用,通常“标号”只在循环、转移和调用指令中使用。,例如:JMPSHORTSUBOUT1字节立即数JMPSUBOUT2字节立即数JMPFARPTRSUBOUT4字节立即数表4.1,指令助记符(InstructionMnemonics)执行性指令中的指令助记符主要为指令系统中指令助记符。操作数(Operand)操作数的汇编语言表示法及规则比较复杂,这是因为操作数的表示既要能充分体现出汇编语言中使用符号操作数和指令助记符的优越性,使程序员能尽可能地减少在存储分配和地址计算方面的工作,又要能被汇编程序有效地翻译成对应的特定处理器所具有的各种寻址方式。,()立即操作数立即操作数在指令中直接给出,不需要使用寄存器,也不涉及访问数据区的操作,只能作为源操作数。立即操作数是整数,可以是字节或字节。在汇编语言中,立即操作数用常量(包括数值常量和符号常量)以及由常量与有关运算符组成的数值表达式表示。如:MOVBX,1000+5*3()寄存器操作数通用寄存器、以及段寄存器、都可以作为操作数。如:MOVBX,AX,()存储器操作数以指定的存储单元中的内容作为指令的处理对象,汇编指令中的存储器操作数实际上是存储单元的逻辑地址。例4.3MOVWORDPTR0A00H,12ABH例4.4MOVAX,BX例4.5DECBYTEPTRBP+12H例4.6DECWORDPTRSI+66例4.7DECWORDPTRBX+DI+50,存储器操作数的段超越:INCBYTEPTRBX+20H与INCBYTEPTRBP+20HINCBYTEPTRES:BX+20H与INCBYTEPTRDS:BP+20HINCBYTEPTRDATA:BP+20H,各种寻址方式下操作数的表达式,()常量与数值表达式)常量是指那些在汇编过程中已经有确定数值的量,它主要用作指令语句中的立即操作数、变址寻址和基址加变址寻址中的(位移量)或在伪指令语句中用于给变量赋初值。)常量分“数值常量”(也称字面常数)与“符号常量”两种。数值常量:以各种进位制数值形式表示,以后缀字符区分各种进位制,后缀字符表示十六进制,或表示八进制,表示二进制,表示十进制,十进制常省略后缀。,符号常量:预先给常量定义一个“名字”,然后在汇编语句中用该“名字”表示该常量。采用符号常量的优点是改善程序的可读性;如果将符号常量作为程序的参数,则可方便地实现参数的修改,增强程序的通用性。其定义需用伪操作命令(伪指令)“”或“”。例:*,即把送。常量是没有属性的纯数据,其值是在汇编时确定的。,)各种形式的常量格式,4)数值表达式一个能被计算并产生数值的表达式称为数值表达式(ConstantExpression)。一个数值表达式可由常量、字符常量以及代表常量或串常量的名字等以算术、逻辑和关系运算符(Operator)连接而成。,1.算数运算符:+,-,*,/,MOD,SHR,SHLMOVAL,18MOD7;AL中为余数MOVBL,00111111BMOVAL,BLSHR3;00000111B2.逻辑运算符:AND,OR,XOR,NOTMOVAX,3456HAND1234H3.关系运算符:EQ,NE,LT,GT,LE,GE条件真,结果为:0FFFFH;否则为0000H。MOVBX,PORTLT5;当PORT小于5,BX=FFFFH,否则BX=0000H。,例4.12:ANDAX,(NUMBLT5)AND30)OR(NUMBGE5)AND20)当时,指令含意为,;当时,指令含意为,。此例中,操作符与操作数表达式中的具有不同的含意,前者是助记符,后者是伪运算。,()变量与地址表达式)变量及其属性汇编语言中,“变量”()是内存中的一个数据区的名字,即数据所存放地址的符号地址,它可以作为指令中的存储器操作数来引用。由于存储器是分段使用的,因而对源程序中所定义的变量有多种属性。,变量的三种属性:段属性:代表该变量对应数据区所在段的段地址。偏移值属性:代表该变量与段起始地址的距离。类型属性:代表存取单位,到底是字节还是字或者是双字等。,)变量的定义变量一般都是在数据段或附加段中使用伪指令(即伪操作命令)、和来进行定义的,这些伪指令称为数据区定义伪指令,其格式为:变量名数据区定义伪指令表达式例:DATASEGMENTSUMDB12H,23H,34H,45HCOUNTDW22H,33H,44AEH,55HDATA1DD9876H,ABCDHDATAENDS在内存的位置:,DATA段:,34,45,22,00,33,00,AE,44,55,00,76,98,00,00,CD,AB,00,00,23,12,SUM,COUNT,DATA1,MOVAX,COUNTAX=0022MOVBX,SUM错数据区大小及初值确定:A.数字表达式:DATA1DB3*5+2B.ASCII字符串(DB)STRINGDBHELLOW48H,45H,4CH,4CH,4FH,57H,C.地址表达式:(DW,DD)ADDRDW1234H,3456H,4567HDISPDWADDR;取ADDR在数据段的偏移量DISP1DDADDR;取偏移量和段地址D.?无确定初值ADDRDW?E.DUP重复因子DATA2DB20DUP(?)DATA3DW2DUP(11),3DUP(22)注意:地址位置及属性MOVAX,DATA3+2MOVAL,DATA3+2错MOVAL,BYTEPTRDATA3+2,)变量的使用变量是存储器数据区的符号表示,因此指令中的存储器操作数可以用变量形式给出。程序中必须明确该指令是字节操作还是字操作:a、指令中至少一个操作数能说明是字节还是字操作。例如:MOVAX,BXMOVAL,BX目的操作数说明了操作类型。b、当使用变量进行存储器寻址时,变量的类型必须与指令的要求相符。,例如:DATA2DB20DUP(2A)DATA3DW2DUP(11),3DUP(22)MOVAX,DATA3+2MOVAL,DATA3+2错MOVBX,DATA2错c、若要在该存储器数据段进行操作,可用类型运算符PTR明确指出变量的类型。MOVAL,BYTEPTRDATA3+2,d、变量仅对应数据区的第一个数据,当对其他数据项进行操作时,必须使用地址表达式指出该数据项。例如:DATADB12,23,45COUNTDW1234H,0AB55H,45FEHMOVAL,DATA;AL=12MOVBL,DATA+1;错MOVBL,DATA+1MOVCX,COUNT;CX=1234HMOVSI,COUNT+2;SI=0AB55H,e、可以用PRT属性运算符改变存储器数据区的类型:例如:DATA-WDW10DUP(0EEH)说明DATA-W段的数据属性为字;用PTR及EQU伪指令建立一个与DATA-W同一数据段而类型不同的变量方法如下:DATA-B1EQUBYTEPTRDATA-WDATA-DEQUDWORDPTRDATA-WDATA-B2EQUBYTEPTRDATA-W+1DATA-B1为20个字节的数据组DATA-D为5个双字的数据组DATA-B2为19个字节的数据组,NOTE,使用变量作为存储器操作数时要注意几个问题。必须在程序中明确一条指令是完成位数据操作还是1位数据操作。变量作为指令中的存储器操作数使用时,其段属性(段基址)与该指令使用的缺省段寄存器内容必须相符,若不相符则必须使用“跨段前缀”(或称段超越),否则指令无法从存储器中取得正确的操作数进行操作。,)地址表达式汇编语言中表达式有两类数值表达式:在汇编时产生一数值,仅具有大小而无其他属性,可作为执行性指令中的立即操作数和数据区中的初值使用。地址表达式:它表示存储器地址,其值一般都是段内的偏移地址,因此它具有段属性、偏移值属性、类型属性。地址表达式主要用来表示执行性指令中的多种形式的操作数。地址表达式由变量、标号、常量、寄存器,的内容(用寄存器名以及方括号表示)以及一些运算符组成。,地址表达式中可以使用的运算符及使用规则:、数字表达式的三种运算符:变量或标号可以加上或减去某个结果为整数的数值表达式,其结果仍为变量或标号,类型及段地址属性不变,仅修改偏移值属性。由于数值表达式可以出现在地址表达式中,因此,一切数值表达式的运算符都可在地址表达式中出现。同一段内的两个变量或标号可以相减,但结果不是地址,而是一个数值,表示两者间相距的字节数。MOVAX,1000+50*4,、方括号及寄存器BX,BP,SI,DI如这几个寄存器不用方括号括起来,表示寄存器本身或操作数。例:,表示将中的内容送中如这几个寄存器用方括号括起来,则表示地址表达式。例:,表示将所指的存储单元中的字数据送中,c、运算符是类型运算符,它用来说明某个变量、标号或地址表达式的类型属性,或者使它们临时兼有与原定义所不同的类型属性,但保持它们原来的段属性和偏移地址属性不变。格式为:数据类型PTR地址表达式根据地址表达式的不同值,数据类型可以是BYTE、WORD、DWORD、NEAR、FAR等。例:ADDBYTEPTRDI,23HPRT指定地址表达式DI的类型为字节,此句表示将23H与内存字节单元DI中的字节数据相加,结果送回内存字节单元DI。,d、段超越运算符段超越运算符用来临时给变量、标号或地址表达式指定一个段属性。段超越运算符格式:段名:地址表达式或段寄存器名:地址表达式,例:INCBYTEPTRES:BP+3ES:为跨段前缀,冒号“:”前的ES段寄存器指明了操作数当前所在的段为附加数据段。这时,操作数的物理地址将由ES中的内容左移4位与偏移地址BP+3相加而求得。此句表示将附加数据段中偏移地址为BP+3的内存单元中的数据加1后仍保留在该单元中。跨段时,物理地址的计算是由系统自动完成的。如果没有跨段前缀“ES:”,那么,由BP+3地址表达式所表示的偏移地址将被系统默认为是在堆栈段中。,(3)运算符综述IBM宏汇编中有5种运算符,即:算术运算符(Arithmeticoperators)逻辑运算符(Logicaloperators)关系运算符(Relationaloperators)分析运算符(Analyticoperators)合成运算符(Syntheticoperators)前面3种运算符已经介绍了,下面对后2种运算符作一简单介绍。,1)分析运算符分析运算符用来把存储器操作数(变量或标号)分解为它的组成部分(段地址、偏移值、类型、数据字节总数、数据项总数等),并以数值形式回送给存储器操作数(变量或标号)。A.SEG取段地址MOVBX,SEGDATA1B.OFFSET取偏移值MOVAX,OFFSETDATA1C.TYPE取类型值DB:1,DW:2,DD:4,DQ:8,DT:10,NEAR:-1,FAR:-2MOVAX,TYPEDATA1,D.SIZE取数据区字节总数MOVAX,SIZEDATA1E.LENGTH取数据区数据项数(DUP),如未用DUP,结果是1。MOVAX,LENGTHDATA1SIZE=LENGTHTYPEF.HIGH取高8位G.LOW取低8位例COUNTEQU0ABCDHMOVAH,HIGHCOUNT;AH=ABMOVAL,LOWCOUNT;AL=CD,例如:DATA1DW?DATA2DB45,29HARRAYDW100DUP(22)则:MOVBX,SEGDATA1;取L2的段基址MOVBX,OFFSETDATA2;取L2的偏移量MOVAX,TYPEDATA1;AX=2MOVAX,TYPEDATA2;AX=1MOVCX,LENGTHDATA1;CX=1MOVCX,LENGTHDATA2;CX=1MOVCX,LENGTHARRAY;CX=100MOVCX,SIZEDATA1;CX=2MOVCX,SIZEARRAY;CX=200,2)合成运算符合成运算符用来把存储器操作数的属性部分建立一个新的存储器地址操作数A.PTR:例:DATA2DW12,34DATA1EQUBYTEPTRDATA2B.THIS:格式:THIS例:DATA1EQUTHISBYTEDATA2DW1234C.SHORT:例如:指定某个标号为短标号。,3)运算符的优先级,(三)伪指令语句伪指令语句又称为说明性指令或指示语句。高级语言程序中的可执行语句被翻译成机器语言时,必须有非执行语句用于实现赋值、保留存储器,给常数分配符号名字、形成数据结构和终止编译等。当汇编语言被翻译成机器语言时,也必须包括有执行类似任务的伪指令。同时,由于还依靠段寄存器工作,所以,还必须包括有一些在汇编过程中能告诉汇编程序把某个段分配给哪一个段寄存器的伪指令。,伪指令语句的格式为:名字伪指令助记符参数表;注释名字是一标识符,一般不能有“:”结尾,名字可以是符号常量名、段名、变量名等,由不同的伪指令决定。参数表是用“,”分隔开的一系列参数(包括操作数)。,、5种数据定义伪命令)(定义字节)用于申请一个数据项为字节的数据区,需要时可以用数值表达式赋予初值。如果该数据区定义作为一个变量,则变量类型是。)(定义字)数据项为字,允许用地址表达式为数据项赋初值(即偏移量属性),变量类型是。,)(定义双字)数据项为双字,允许用地址表达式为数据项赋初值(即段属性及偏移量属性),变量类型为。)(定义4字)数据项为4字,变量类型为BYTE。)(定义10字节)数据项为10个字节,变量类型为。*:在存储器中的排列顺序:低字节在前,高字节在后。,这段程序用DB、DW和DD定义了若干变量,根据上述对数据定义命令的约定,则各变量及其属性可列于表4.5中:所有变量的段属性(分量)均为。、右边的表达式或数值即相应存储单元中的内容,汇编后的存储器分配情况如图4.3所示。,数据定义的作用存储器初始化、可用于初始化存储器。这些伪指令的右边有一表达式,表达式之值即该存储“单位”的初值。一个存储单位可以是字节、字、双字。表达式有数值表达式与地址表达式之分,在使用地址表达式来初始化存储器时,这样的表达式只可在或伪操作命令中出现,绝不允许出现在中。“变量”语句表示利用该变量的偏移量来初始化相应的存储字;“变量”语句表示利用该变量的段分量和偏移量来初始化相应的两个连续的存储字,低位字中是偏移量,高位字中是段分量。,;内容为;内容为;即高位字为,低位字为;内容为;内容为*;内容为,)从单元开始分配个存储单元。)为个字节存储单元设置初值。汇编后将变量的偏移量存入其前2个字节内存单元;而将段的段地址存入其后2个字节内存单元中。伪指令中的2个字节即表示变量的偏移地址及段地址。一个字节的操作数也可以是某个字符的代码,注意只允许在伪操作命令中用字符串来初始化存储器。,例4.26HELLOABWAB,、符号定义伪指令汇编语言中所有的变量名、标号名、过程名、指令助记符、寄存器名等统称“符号”,这些符号可以通过伪指令重新命名,也可以通过伪指令为其定义其他名字及新的类型属性。(1)EQU:,)为常量定义一个符号,以便在程序中使用符号来表示常量。格式:符号常量名数值表达式例如:SUMEQU20HMOVAL,SUM;(AL)=20H)给变量或标号定义新的类型属性并起一个新的名字。格式:变量名或标号名类型变量或标号例如:DATAEQUTHISWORDDATA1DBABCDEFG,)可以给由地址表达式指出的任意存储单元定义一个名字。格式:符号名地址表达式符号名可以是“变量”或“标号”,取决于地址表达式的类型。例如:ADREQUES:BX+SI+5MOVAL,ADR;将BX+SI+5单元内容送到AL)用来为汇编语言中的任何符号定义一个新的名字。格式:新的名字原符号名例如:CBCDEQUAAM)使用伪操作命令时,左端的符号名不能是程序已定义过的符号名。,()(等号伪指令)它与基本类似,起赋值作用)使用“”定义的符号名可以被重新定义,使符号名具有新值。例:;先将12赋于符号名X;将符号名X重新定义使其具有新值则在第2个语句经过汇编后,最终。)习惯上“”主要用来定义符号常量。,()(类型定义伪指令)伪指令为当前存储单元定义一个指定类型的变量或标号。其格式为:变量名或标号名类型对于数据项,类型可以是、;对于可执行的指令代码,类型为和。伪指令不仅给名字(标号或变量)定义一个类型属性,而且隐含有给名字定义段属性和段内偏移量属性。例如:AREAWLABELWORDAREABDB100DUP(23)MOVAREAW,AXMOVAREAB49,AL,、段定义伪指令段定义伪指令指示汇编程序应如何按段来组织程序和使用存储器。所用命令主要有,等。()和伪指令和伪指令用来把程序模块中的指令或语句分成若干逻辑段,其格式如下:,段名定位类型组合类型类别;一系列汇编指令段名格式中与必须成对出现,与之间为段体,给其赋于一个名字,名字由用户指定,是不可省略的,而定位类型、组合类型和类别是可选的。例如:DATASEGMENTAAADB20DUP(?)BBBDW10DUP(?)DATAENDS,)定位类型又称“定位方式”,表示该段对起始边界地址的要求,有4种定位类型:起始地址即字节型;起始地址即字型;起始地址即节型;起始地址即页型。其中为隐含值,即如果省略“定位类型”,则汇编程序按处理。,)组合类型组合类型又称“联合方式”或“连接类型”。它指示连接程序,如何将某段与其他段组合起来的关系。连接程序不但可以将不同模块的同名段进行组合,并根据组合类型,可将各段顺序地连接在一起或重叠在一起。共有6种组合类型:A.不组合:缺省,汇编将不同的逻辑段分别在装入。B.PUBLIC:将相同名字的逻辑段集中成一个段装入。C.STACK:同PUBLIC,仅限堆栈段用。D.COMMON:对于相同名字的逻辑段,从同一个地址开始装入,导致逻辑段重叠,连接后的段长为原最长逻辑段,内容是最后逻辑段内容。,E.MEMORY:本逻辑段放在所有段的最后,若出现多个MEMORY段,其余作COMMON段处理。F.AT:表示该段定位段地址。)类别类别是用单引号括起来的字符串,以表示该段的类别,连接程序只使同类别的段发生关联,连接时用于组成段组的名字。典型的类别如、等,也允许用户在类别中用其他的表示。例如:,(2)ASSUME伪指令ASSUME是段定义伪指令,它一般出现在代码段中,用来告诉汇编程序哪一个段寄存器是其对应段的段地址寄存器。当在程序中使用这条语句后,汇编程序就能将被设定的段作为当前可访问的段来处理。它也可以用来取消某段寄存器与其原来设定段之间的对应关系(使用NOTHING即可)。引用该伪指令后,汇编程序才能对使用变量或标号的指令汇编出正确的目标代码。其格式为:ASSUME段寄存器:段名,段寄存器名:段名其中“段名”可以是程序中已定义过的任何段名或组名,也可以是表达式“SEG变量”或“SEG标号”,或者是关键字NOTHING。,例4.34:ASSUMECS:SEGA,DS:SEGB,SS:NOTHING其中:SEGA是代码段SEGB是数据段NOTHING表示SS所作的设定已取消。CS的段地址由系统决定;DS的段地址由编程直接装入。,()伪指令伪指令用来指出其后的程序段或数据块存放的起始地址的偏移量。其格式为:表达式汇编程序把语句中表达式之值作为起始地址,连续存放程序和数据,直到出现一个新的指令。若省略,则从本段起始地址开始连续存放。,例如:DATASEGMENTORG6ADW1234HORG$+4BDW5678HDATAENDS,34,12,78,56,DATA,1000H,0006H+1000H,000CH+1000H,、过程定义伪指令过程分为两类:外部过程:当调用该过程的主程序与该过程不在一个源程序文件中时,该过程应定义成外部过程。这时在主程序文件中应说明该过程(设过程名为)为外部过程:在定义该过程的程序文件中应说明该过程可被其他程序文件调用:内部过程:当调用该过程的主程序与该过程在同一个源程序文件中时,该过程叫做内部过程。,(2)过程定义伪指令格式:过程名类型;指令序列过程名类型可选作或。选时,该过程一定要与主程序在一个段;选时,该子程序可以与主程序在同一个段,也可与主程序不在同一个段。如果类型省略,则系统取类型。例如:NAME1PROCFARCALLNAME2RETNAME2PROCNAME2ENDPNAME1ENDP,(3)调用过程调用过程用“过程名”来实现。其中过程名是个标识符,可作为调用此过程的指令中的操作数。过程可以“嵌套”使用,即过程中又可以调用别的过程;过程还可以“递归”使用,即过程中又可以调用过程本身。调用指令的使用要和过程的属性一致,尤其是一个过程已定义为的话,那末即使当前调用指令和此过程有同一代码段,也必须使用段间调用指令,否则将会出错。IP及CS的入栈(4)过程返回RETnIP及CS的出栈,例4.36:SEGXSEGMENTCALLFARPTRSUBTSUBTPROCFARRETSUBTENDPSEGXENDSSEGYSEGMENTCALLFARPTRSUBTSEGYENDS,4.3汇编语言程序设计基本方法,与高级语言编程相似,编写汇编语言源程序也应当首先理解和分析题意与要求,选择适当的数据结构和算法,然后,再着手用汇编语言来实现。有关8086/8088汇编源程序的结构及语法规则,我们在前面已有详述。从中可以看到,在环境下的汇编语言程序结束时,通常用的号中断调用,以便使程序控制返回。MOVAH,4CHINT21H,目录,一、顺序结构程序,例:对两个字节无符号数求和,这两个数分别用变量及表示。将两数之和的最高位进位放在中,两数之和的其他位按从高到低顺序依次放在,中。,程序如下:DSEGMENTD1DB12H,34H,56H,78H,9AH,0ABH,0BCH,0CDHD2DB0CDH,0BCH,0ABH,9AH,78H,56H,34H,12HDENDSCSEGMENTASSUMECS:C,DS:D;说明代码段、数据段BG:MOVAX,DMOVDS,AX;给DS赋段值LEADI,D1;将D1表示的偏移地址送DIMOVDX,DI;取第1操作数到寄存器中MOVCX,DI+2MOVBX,DI+4,MOVSI,DI+6LEADI,D2;将D2表示的偏移地址送DIADDDX,DIADCCX,DI+2ADCBX,DI+4ADCSI,DI+6MOVAL,0ADCAL,0MOVAH,4CHINT21HCENDSENDBG,二、分支结构程序,例:比较以存储器变量和表示的两个有符号字数据的大小,将其中较大数据放在寄存器中程序如下:DATASEGMENTD1DW-123H;补码为FF85HD2DW-120H;补码为FF88HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA;说明代码段、数据段,BEGIN:MOVAX,DATAMOVDS,AX;给DS赋段值MOVBX,D1CMPBX,D2JGENEXT;若D1D2,则不换,转NEXTMOVBX,D2;若D1DEBUGd:pathfilename.exeparm1parm2回车说明:“C”为DOS下的提示符;d::表示DEBUG.EXE程序所在的盘符;path:filename的目录路径(一般可在系统Autoexec.bat文件中将路径设置好,这样就不必在每次进入DEBUG时都输入盘符及路径);filename:要分析或调试的二进制程序文件名;exe:程序文件的扩展名;parm1:被调试程序约定的第1参数文件名;parm2:被调试程序约定的第2参数文件名。,功能:该命令是在DOS下把DEBUG.EXE程序调入内存,并运行DEBUG程序。输入命令后,屏幕上将出现提示符“-”,表示当前已进入DEBUG的命令状态,可执行DEBUG程序的命令。,下面介绍一些常用的DEBUG命令。(一)显示存储单元内容:格式:起始地址格式:地址范围功能:格式命令是从起始地址开始按十六进制显示个单元的内容,每行个单元。每行右侧还显示该个单元的码字符,对于无字符对应的ASCII码则显示“.”。格式命令是显示指定范围存储单元中的内容,每行个单元。每行右侧还显示该个单元的码字符,无字符对应的则显示“.”。如果不给出起始地址或地址范围,则从当前地址开始按格式操作。,例:显示16B7:100H至11FH内存块的内容。(一)D16B7:100L2016B7:0100B44CCD2107B80048-8CC1FA8ED1BC8008.L.!.K.16B7:0110FB2EFF2E20D42073-746172743400A616.,start4.,(二)修改存储单元内容格式:起始地址列表格式:地址功能:格式是按列表内容(包括字符或数值串)修改从起始地址开始的多个存储单元内容。,(三)显示、修改寄存器内容格式:寄存器名功能:如果指定了寄存器名,则显示寄存器的内容,并允许修改。如果不指出寄存器名,则按如下格式显示CPU内部各寄存器(包括通用寄存器、段寄存器、标志寄存器)的内容:AX=XXXXBX=XXXXCX=XXXXDX=XXXXSP=XXXXBP=XXXXSI=XXXXDI=XXXXDS=XXXXES=XXXXSS=XXXXCS=XXXXIP=XXXXNVUPDIPLNZNAPONCXXXX:XXXXC70604023801MOVWORDPTR0204,0138DS:0204=0000以上各通用寄存器显示了其中的内容,均以4位十六进制数的形式来显示;标志寄存器中各标志位(除TF外)的值均以符号形式显示;CS:IP所指向的内存内容反汇编成一条指令,可视为将要执行的指令。,(四)运行命令格式:起始地址第1断点地址第2断点地址功能:从指定起始地址开始执行,依次在第1、第2等断点处中断。若命令格式中不给出起始地址,则从当前:指示的地址开始执行。例:从2180:100处开始执行,设置断点315H。-G=2180:100116显示:2180:0116CD20INT20执行到2180:0116H处的指令时,程序停下来并返回DEBUG,此时指令INT20H尚未执行。,(五)跟踪命令格式:起始地址正整数功能:从指定地址开始执行正整数条指令。如果不给出正整数,则按处理;如果不给起始地址,则从当前CS:指示的地址开始执行。例:执行2180:300H处的指令MOVAH,2。-T=2180:100显示:2180:0102B264MOVDL,61执行结果,CS的值不变,IP值加2;此时CS:I指向第2条指令MOVDL,61H。,(六)汇编命令格式:起始地址功能:从指定地址开始接受汇编指令,并将汇编指令译成机器码,存入内存。如果不给出起始地址,则从当前地址开始接受,或从当前代码段的进制表示的相对地址处接受汇编指令。如果输入汇编指令过程中,在某行不作任何输入而直接回车,则结束命令,回到接受命令状态“”处。,例:将利用DOS功能2显示字符a的一段小程序汇编到2180:100H开始的内存中。-A2180:1002180:0100MOVAH,22180:0102MOVDL,aError2180:0102MOVDL,612180:0104INT212180:0106INT202180:0108在上例中,由于A命令不支持字符方式,当在0102地址后输入指令MOVDL,a后,显示出错信息,然后仍然提示当前汇编地址2180:0102,此时可重新输入指令MOVDL,61,其中61H为a的ASCII码。,(七)反汇编命令格式:起始地址格式:地址范围功能:格式是从指定起始地址处开始对个字节内容转

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论