您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 53第4章汇编源程序的书写格式和编译调试
第四章汇编语言程序格式4.1汇编语言的执行过程4.2汇编语言的程序格式4.3伪指令4.4汇编语言的上机过程AssembleLanguage一种面向机器的程序设计语言,是一种用符号表示的低级程序设计语言(机器语言的符号化描述),通常是为特定计算机或计算机系列专门设计的。AssembleLanguage用汇编语言编写的程序不能由机器直接执行,而必须经汇编程序翻译成机器语言程序。汇编语言指令与翻译成的汇编过程示意:采用汇编语言进行程序设计的优点可充分利用机器的硬件功能和结构特点,加快程序的执行速度,减少目标程序所占用的存储空间常用来编写实时控制程序、实时通信程序,有时也用来编制某些系统软件程序。缺点:1.编程效率低(与人们描述计算过程的需要差距大)2.与机器硬件的具体结构联系过于紧密——在一种结构的机器上开发的程序极难移植到另一种不同结构的机器上去。4.1汇编语言程序的执行过程:编辑程序.ASM文件汇编程序.OBJ文件连接程序.EXE文件Edit等MASMLINK出错1.检查源程序;2.测出源程序中的语法错误,并给出出错信息;3.产生目标文件(.OBJ),并可给出列表文件(同时列出汇编语言源程序和机器语言目标程序的文件,称之为.LST文件)和交叉索引文件(列出程序中使用的符号、变量和标号以及引用情况,称之为.CRF文件)。4.展开宏指令。汇编示意图调用MASM.EXE.ASM汇编.OBJ.LST.CRF可选1.汇编程序的主要功能汇编程序分两种,一种是基本汇编(ASM.EXE),一种是宏汇编(MASM.EXE),宏汇编功能比较强。2.连接程序汇编之后生成的OBJ文件必须经过链接过程,才能成为扩展名.EXE的可执行文件。链接的过程就是调用连接程序(LINK.EXE),对OBJ文件进行定位、链接,最后生成扩展名为EXE的可执行文件。如果需要,也可生成MAP文件和LIB文件。连接示意图:调用LINK.EXE.OBJ.OBJ.LIB连接.EXE.MAP.LIB可选3.调试程序(DEBUG.COM)DEBUGPROG.EXE-U(反汇编)-g=起始地址断点地址-T=地址指令条数汇编语言程序开发中的相关文件HandwrittensourceprogramEDITEditorprogramMASMassemblerprogramLINKlinkerprogramDEBUGdebugprogramFinaldebuggedrunmodulePROG1.LSTPROG1.OBJPROG1.CRFOther.OBJfilesLibraries4.2汇编语言程序格式8088汇编语言的源程序是由多个段组成的,一个可执行的汇编程序一般至少有一个代码段,其中包含可执行的语句。一般程序结构:(1)代码段:存放程序执行的指令(2)数据段:存放程序所需的数据(3)堆栈段:存放程序执行的临时信息数据段定义格式DATASEGMENTSOURCE_BUFFERDB40DUP(‘A’)ARRAYDB1,-1,2,-2,3,-3,4,-4,5,-5COUNTEQU50DATAENDS.附加段的定义EXTRASEGMENTDEST_BUFFERDB50DUP(‘?’)EXTRAENDS堆栈段的定义STACKSEGMENTSTACKSTADB50DUP(?)STACKENDS示例程序DATASEGMENT;数据段定义SOURCE_BUFFERDB40DUP(‘A’)ARRAYDB1,-1,2,-2,3,-3,4,-4,5,-5COUNTEQU50DATAENDSEXTRASEGMENT;附加段定义DEST_BUFFERDB50DUP(‘?’)EXTRAENDSCODESEGMENT;代码段定义MAINPROCFARASSUMECS:CODE,DS:DATA,ES:EXTRA接上面START:PUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVAX,EXTRAMOVES,AX接上面LEASI,SOURCE_BUFFERLEADI,DEST_BUFFERCLDMOVCX,COUNTRREPMOVSBRETMAINENDPCODEENDSENDSTART编写一个完整的汇编程序,其实现w=x+y-6的功能my_datasegmentmovah,4chxdw05int21hydw4my_codeendswdw?my_dataendsendbeginmy_codesegmentassumecs:my_codeassumeds:my_databegin:movax,my_datamovds,axmovax,x;(ax)=5addax,y;(ax)=5+4=9subax,6;(ax)=9-6=3movw,ax05000400xDSCSyw其基本格式如下:一、基本格式S_NAME1SEGMENT语句…语句S_NAME1ENDSS_NAME2SEGMENT语句…语句S_NAME2ENDSS_NAME3SEGMENT语句…语句S_NAME3ENDSENDCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFAR;将本程序作为DOS操作系统的子程序。BEGIN:PUSHDSXORAX,AXPUSHAX;标准程序前缀MOVAX,DATAMOVDS,AXMOVES,AX······RETSTARTENDPCODEENDSENDBEGIN汇编源程序的格式一CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AXMOVES,AX······MOVAH,4CHINT21H;DOS功能调用,结束程序,返回DOSCODEendsENDBEGIN汇编源程序的格式二而每个段是由语句行构成的。一个语句行的基本格式为:标识符操作码操作数1[,操作数2];注释二、语句行构成1、8088汇编语句中的标记(1)标识符标识符由一串字符构成,用于一段程序、一组(或一个)数据或一个段的开头。使用时要注意以下3点:•标识符可由数字、字母和下划线组成;•不能以数字开头,数据可用在非开头的其它位置;•其最大长度为31个字符。(2).保留字保留字是汇编语言中预先保留的特殊字串,只能用于特殊用途,所有8086/8088的指令、伪指令和寄存器名都是保留字。如AX、MOV、DB、INT、EQU等等。保留字不能用作标识符(3).界符界符是用于一个程序或一条指令中不同部分的分隔符,如MOVAX,0010H中的“,”就是界符。其内容见下表:8086/8088汇编语言的界符’;*,:[]+-=()$&?./(4).常量常量就是指令中的一些不变的数据。它可以用二进制、十六进制、十进制和八进制表示,也可以用引号引起来的字串。例如:二进制:00011101B十六进制:0C5AAH十进制:9856D八进制:237O字串:’The2Xmeans2multipleX’其中的B、H、D和O为数制的结尾符。(5).注释注释是用于使程序易于理解的句子,用来表示某行或某段语句的作用或与其它部分的关系,一般写在某语句的后面或某段的开始处,注释的前面由“;”前导,表示后面的内容为注释。如果一行写不下,换行后也要使用“;”前导。2、符号在8086/8088汇编语言的源程序中为了使程序有很好的可读性和易修改性,通常使用有一定意义的符号来代替某些单元、数据或表达式。符号可分为四类:寄存器、变量、标号、数。如SUM、DATA1。(1).寄存器8086/8088的寄存器是程序中最常出现的符号,它可分为字节寄存器和字寄存器,如AX为字寄存器,而AL则为字节寄存器。只有AX、BX、CX、DX可分为字和字节寄存器。(2).变量变量是存放在某些单元中的操作数,使用有一定意义的符号来代表这些单元。所有的变量都有一个固定的地址,它由段和偏移组成;同时还有一个类型,它可以是字节、字或双字。在程序中,变量可以使用数据定义伪指令进行初始化,见伪指令一节中的数据定义部分。(3).标号标号实际上是用符号表示的地址,因此它也是由段、偏移地址和类型组成,其类型分为段内(NEAR)和段间(FAR)两种,通过SEG标号OFFSET标号可以分别得到标号的段地址和偏移地址。如果是NEAR类型,在程序执行时,只取标号的偏移地址,例如在过程调用(CALL)时,只取IP,而对于FAR类型,则要取段地址和偏移地址,在CALL时要取IP和CS。(4).数在程序设计中,为了程序有良好的可读性和可修改性,有些数据使用符号来表示,通过伪操作,将数据与某些符号相联系。④分析运算符分析运算在汇编语言程序设计中很重要。它包括取存储单元偏移:OFFSET取存储单元段:SEG取类型:TYPE按类型取长度:LENGTH(对于变量中使用dup的情况,汇编程序将会送分配给该变量的单元数,而对于其他情况则回送1)取字节数:SIZE(length*type)例1:设有数据段中使用DATA1DB5定义了一个单元,则MOVAL,DATA1可将DATA1中的数传送到AL中,AL=05MOVAX,SEGDATA1可将DATA1的所在段地址传到AX中,AX=2000MOVAX,OFFSETDATA1可将DATA1的偏移地址传入AX中,AX=1500例2:设有数据段中使用DATA1DW100DUP(?)定义了100个字单元,则MOVAX,TYPEDATA1AX=2MOVAX,SIZEDATA1AX=200MOVAX,LENGTHDATA1AX=10005A2001085DSCSDATA12000:1500⑤综合运算符PTR——改变存储器地址操作数的操作类型,但其段地址和偏移地址不变。如:DATA1DW100DUP(?)05A2001085DSMOVAL,DATA1MOVAL,BYTEPTRDATA1√DATA1DATA1SEGMENTWBUFFEREQUTHISWORDBUFFERDB12H,34H,00H,91HDATA1ENDSCODE1SEGMENTASSUMECS:CODE1,DS:DATA1START:MOVAX,DATA1MOVDS,AXMOVAL,BUFFERMOVBX,WBUFFER……CODE1ENDSENDSTARTTHIS——用来建立新的存储器地址操作数,且不分配存储单元。新的操作数类型在THIS中指定,而其段地址和偏移量就是汇编时的当前值。1234009185DSBUFFERWBUFFERAL=12HBX=3412H4.3伪指令在8086/8088汇编语言中伪指令是用于诸如数据定义、存储区分配等功能。所谓伪指令是非机器指令,它是在汇编期间进行操作的。4.3.1符号定义语句EQU为了使程序便于阅读和修改,我们有时使用一个符号来代表一个值,而符号代表了一定的意义,在程序中使用一个符号代表一个值进行操作,其格式为:符号EQU表达式例如:PORTEQU3F8H在程序中可使用MOVDX,PORT对DX进行赋值,实际上PORT就是一个常量。还可在语句中进行运算,如:DATA_PORTEQU3F8HSTAT_PORTEQU3F8H+2SEEDEQU10FUNCEQUSEED*SEED+2*SEED+1‘=’号操作对符号的赋值还可使用“=”操作,它与EQU的区别是“=”操作可以重复定义,而EQU则不能重复定义。如:X=3Y=6Y=Y*Y-X……MOVAX,Y通过上述操作,最后使Y=33,后面的MOV语句中,当生成目标代码时将用33取代Y。即MOVAX,21H(33D)4.3.2数据定义语句数据定义语句用于为数据分配相应的存储单元。用一个符号名代表一个或一些单元,并可为这个或这些单元提供初始值。定义数据的操作符有:字节定义——DB字定义——DW双字定义——DD重复定义——mDUP(n)_(重复m次个数据n)与数据相联系的符号名称为变量。数据定义语句的格式为:变量名操作符数据项通过上述定义,在存储器中将产生如图所示的结果,以DATA1到DATA5为例:例:DATA1DB?DA
本文标题:53第4章汇编源程序的书写格式和编译调试
链接地址:https://www.777doc.com/doc-3931331 .html