资源描述
【本章主要内容】,汇编语言基础汇编语言程序结构框架汇编语言程序设计方法汇编程序的开发过程,第4章汇编程序设计基础(自学),4.1汇编语言基础,第4章汇编程序设计基础,4.1.1概述,汇编语言是一种面向机器结构的低级程序设计语言,汇编语言程序是将机器指令组成的机器语言程序“符号化”,它同机器语言的目标代码一一对应。汇编语设计程序设计能充分发挥机器硬件的性能,提高计算机的运行效率,汇编语言比机器语言易于辨认、维护和修改。,第4章汇编程序设计基础,4.1.2汇编语言语句种类与格式,指令语句每条指令语句经编译后都要产生一条可执行的目标代码(机器指令),所以这种语句属于可执行语句。,例如:MOVAX,32HANDBX,01010111B,第4章汇编程序设计基础,伪指令语句指示汇编程序如何编译源程序,伪指令不产生目标代码。,例如:ORG100H,宏指令语句用户定义的新指令,用于替代源程序中一段有独立功能的程序。,第4章汇编程序设计基础,1.语句格式,标号:指令助记符操作数;注释,指令的符号地址,指明该指令的功能,若有多个操作数用“,”隔开,起说明作用的字符串,第4章汇编程序设计基础,标号的命名规则:,字符个数为131个。,第一个字符不能是数字,可以使用字母或点号.、$、?和下划线_;从第二个字符开始,可以是字符、数字和特殊字符。,不能与系统专用的保留字相同,第4章汇编程序设计基础,4.1.3汇编语言数据和表达式,1.常量,数值常量例如:25D、80H、101001B、45,字符串常量例如:2、A、”Computer”,第4章汇编程序设计基础,符号常量用一个符号来代表常。,1)等值伪指令EQU,格式:符号EQU表达式,例如:S1EQUABCDNEQU12NUMEQU23+25+NADR1EQUDS:BP+14H,第4章汇编程序设计基础,2)等号伪指令=,格式:符号=表达式,例如:NUM=10H,伪指令(EQU)和伪指令(=)的区别是:在同一源程序中,同一符号不能用EQU伪指令重新定义,“=”可以。,第4章汇编程序设计基础,2.变量,变量是指存放在存储单元中的数据,这些数据在程序运行过程中可以改变。,(1)数据定义伪指令,可选,是分配的存储单元的符号地址,按字节(DB)、字(DW)和双字(DD)分配内存单元,设定变量的初值,第4章汇编程序设计基础,1)数值表达式VARB1DB10HVARB2DB20H,30H,40HVARWDW1122H,3344H,上述变量的存储单元分配及初始化情况如右图所示。,第4章汇编程序设计基础,2)字符串表达式STR1DBABCDSTR2DWAB,C,上述变量的存储单元分配及初始化情况如右图所示。,第4章汇编程序设计基础,3)“?”表达式STR1DB?,?,4)DUP表达式,在连续的存储单元中重复定义一组数据。,例如:NUM1DB20HDUP(5)NUM2DW10HDUP(?),第4章汇编程序设计基础,4.运算符与表达式,(1)算术运算符参见下表。,第4章汇编程序设计基础,第4章汇编程序设计基础,(2)逻辑运算符,第4章汇编程序设计基础,(3)关系运算符,第4章汇编程序设计基础,(4)数值返回运算符,1)SEG和OFFSET运算符SEG:取变量或标号所在段的段基值;OFFSET:取变量名或标号所在段内的偏移量。,例如:MOVAX,SEGVAR1MOVSI,OFFSETVAR3,第4章汇编程序设计基础,(5)属性运算符,1)PTR运算符格式:类型PTR地址表达式,第4章汇编程序设计基础,4.2.1源程序的基本结构框架,8086/8088汇编程序采用分段结构,一个完整的源程序可以包含多个逻辑段,但当前段最多只能有4个:数据段、堆栈段、附加段和代码段。,4.2.1段定义,段名SEGMENT定位类型组合类型类别名段名ENDS,第4章汇编程序设计基础,例如:Data1SegmentDB?,10HV1DB20HData1Ends,第4章汇编程序设计基础,4.2.2段寻址伪指令(ASSUME),段寻址伪指令用来建立段与段寄存器之间的联系。,格式:ASSUME段寄存器名:段名,段寄存器名:段名,,例如:,第4章汇编程序设计基础,DATA1SEGMENT;定义段DATA1VAR1DB12HDATA1ENDS;DATA1段定义结束DATA2SEGMENT;定义段DATA2VAR2DB34HDATA2ENDS;DATA2段定义结束CODESEGMENTVAR3DB56HASSUMECS:CODE,DS:DATA1,第4章汇编程序设计基础,4.2.3END伪指令,格式:END地址表达式,4.2.4段寄存器的装入,1.DS和ES的装入,在指令中直接引用段名时,得到的是这个段的段基值,这个段基值是16位的立即数。,第4章汇编程序设计基础,例如:CODESEGMENTASSUMECS:CODE,DS:DATA1,ES:DATA2START:MOVAX,DATA1;设置DSMOVDS,AXMOVAX,DATA2;设置ESMOVES,AX,第4章汇编程序设计基础,2.SS的装入,(1)自动装入,Stack1SegmentParaStackDw20Hdup(?)Stack1Ends,codeSegmentAssumecode:CS,Stack1:SS,第4章汇编程序设计基础,(2)执行程序装入,Stack1SegmentDw20Hdup(?)Stack1Ends,codeSegmentAssumecode:CS,Stack1:SSMovAX,Stack1MovSS,AX,第4章汇编程序设计基础,2.CS的装入,CS和IP控制程序的执行流程。装载目标代码时自动将CS和IP初始化为程序将要执行的第一条指令的段基值和偏移量,它们由END伪指令提供。如果END伪指令没有指定地址表达式,则源程序中第一条指令语句的地址作为程序执行的起始地址。,基本框架,STATCKSEGMENTSTACK;定义堆栈段.STACKENDSDATASEGMENT;定义数据段DATAENDSCODESEGMENT;定义代码段ASSUMECS:CODE,DS:DATA,SS:STATCK;仅告诉汇编程序,并不能赋值START:MOVAX,DATAMOVDS,AX.MOVAH,4CH;程序结束返回DOSINT21HCODEENDSENDSTART,(X+125-X*Y)/Z,STATCKSEGMENTSTACKDW100HDUP(?)STACKENDSDATSEGMENTXDW3YDW4ZDW10DATENDSCODSEGMENTASSUMECS:COD,DS:DAT,SS:STACKSTART:MOVAX,DATMOVDS,AXMOVAX,XIMULYMOVCX,AXMOVBX,DXMOVAX,XADDAX,125CWD,SUBAX,CXSBBDX,BXIDIVZMOVX,AXMOVY,DXMOVAH,4CHINT21HCODENDSENDSTART,第4章汇编程序设计基础,1、返回DOS系统的方式,MovAH,4CHInt21H,2、从键盘接收一串字符,MOVAH,0AHINT21H;DS:DX:缓冲区可接收的字符缓冲区,4.3系统功能调用,第4章汇编程序设计基础,3、显示一个字符,MOVDL,41H;A的ASCIIMOVAH,2INT21H,4、从键盘接收一串字符,MOVAH,0AHINT21H;DS:DX:缓冲区可接收的字符缓冲区,第4章汇编程序设计基础,4.3其它伪指令,4.3.1过程定义伪指令,格式:过程名PROCNEAR/FARRet过程名ENDP,第4章汇编程序设计基础,4.3.2ORG伪指令,格式:ORG数值表达式将表达式的值赋给当前位置计数器,符号“$”就代表当前位置计数器。例:,第4章汇编程序设计基础,DATASEGMENT;定义段DATAORG30HVAB1DB12H,34HORG$+20HSTRDBSTRINGDATAENDS,第4章汇编程序设计基础,4.4汇编程序设计方法4.4.1概述,1.程序设计步骤,(1)分析问题,确定算法,(2)绘制程序流程图,(3)编写程序,(4)调试程序,第4章汇编程序设计基础,4.4.2顺序程序的设计,例4-1试编制程序,计算:Z=(3X+Y-5)/2其中X=15HY=10H,DATASegment;数据段XDW15HYDW10HZDW?DATAEnds,第4章汇编程序设计基础,CODESegment;代码段AssumeCS:CODE,DS:DATAStart:MovAX,DATAMovDS,AX;初始化DSMovAX,XShlAX,1;AX2XAddAX,X;AX3X,第4章汇编程序设计基础,AddAX,Y;AX3X+YSubAX,5;AX3X+Y-5SarAX,1;AX(3X+Y-5)/2MovZ,AX;存放结果MovAH,4CHInt21H;返回DOSCODEEndsEndStart,第4章汇编程序设计基础,4.4.3分支程序设计,在汇编语言中分支程序主要是通过转移指令来实现。,1.转移指令,(1)无条件转移指令,功能:无条件转移到“目标地址”处执行。,指令格式:JMP目标地址,例如:jmpLabel1jmpBX,第4章汇编程序设计基础,(2)条件转移指令,功能:条件成立时转移到“目标地址”处执行。,指令格式:JXX目标地址,XX为1-3个字母表示的转移条件,说明:条件转移指令只能在段内转移,转移范围只能在-128127之间。,条件:SSF(符号标志)CCF(进位标志),第4章汇编程序设计基础,ZZF(零标志)NNOTAAboveLLessEEqualG-Great,例如:JZLab1JNZLab2,第4章汇编程序设计基础,2.分支程序的设计,条件,Y,N,条件,图4.4-3分支程序结构形式,第4章汇编程序设计基础,1条件转移指令实现分支程序,例2编制程序,把DA1字节单元中数据变成偶数。,TESTDA1,01HJZNEXT;是偶数,转移INCDA1;是奇数,加1NEXT:,第4章汇编程序设计基础,例3设X、Y为带符号的字节变量,编程实现下面的公式。,CMPX,0;比较X与0进行比较JGEBIGER;X0,转移到BIGERMOVY,-1;X0,Y置1JMPNEXTEQUL:MOVY,0;Y置0NEXT:,第4章汇编程序设计基础,2用跳转表实现多路分支对于多分支结构通常采用跳转表来实现。,例4现有若干个程序段,每个程序段的入口地址分别是Sub1、Sub2、Subn,试编制一程序,根据指定的参数转入相应的程序段。,DATASEGMENT;定义数据段JUMP_TABLEDWSUB1,SUB2,SUB3DWSUB4,SUB5PARAMDB3DATAENDS;数据段结束,第4章汇编程序设计基础,STACK1SEGMENTSTACK;定义堆栈段DW20HDUP(0)STACK1ENDS;堆栈段结束,CODESEGMENT;定义代码段ASSUMECS:CODE,DS:DATA,SS:STACK1BEGIN:MOVAX,DATA;取DATA段的段基值MOVDS,AX;初始化段寄存器DSXORAH,AH;寄存器AH清0,第4章汇编程序设计基础,MOVAL,PARAM;参数PARAM送ALDECAL;AL(AL)-1SHLAL,1;AL(AL)*2LEABX,JUMP_TABLE;取跳转表首址ADDBX,AXJMPBX;转移到对应分支SUB1:JMPEND0SUB2:JMPEND0,第4章汇编程序设计基础,END0:MOVAH,4CH;返回DOSINT21HCODEENDSENDBEGIN,第4章汇编程序设计基础,4.4.4循环程序设计,1循环控制指令,(1)LOOP指令格式:LOOP目标地址功能:首先将CX内容减1,若(CX)0,则转至目标地址处执循环,否则顺序执行。例如:,Loop1:LoopLoop1,条件:(CX)0,,否则,第4章汇编程序设计基础,例6计算1+2+3+100的和。,MOVCX,100;设置循环次数MOVAX,0;AX保存计算结果L1:ADDAX,CXLOOPL1,第4章汇编程序设计基础,(1)LOOPZ/LOOPE指令格式:LOOPZ/LOOPE目标地址功能:首先将CX内容减1,若(CX)0且ZF=1,则转至目标地址处执循环,否则顺序执行。例如:,Loop1:LoopzLoop1,条件:(CX)0且ZF=1,,否则,第4章汇编程序设计基础,例7编程实现在字符串中查找第一个非空字符,并将其在字符串中的位置送入INDEX单元。,STRDB“THISISATEST.”LENEQU$-STRMOVCX,LEN;设置循环次数MOVBX,-1;地址指针初值NEXT:INCBXCMPSTRBX,20H;判断是否为空字符,第4章汇编程序设计基础,LOOPENEXT;空字符且CX0,继续循环JNEFOUND;找到非空字符JMPNONFOUND;未找到非空字符FOUND:JMPEND0NONFOUND:JMPEND0,第4章汇编程序设计基础,(3)LOOPNZ/LOOPNE指令格式:LOOPNZ/LOOPNE目标地址功能:首先将CX内容减1,若(CX)0且ZF=0,则转至目标地址处执循环,否则顺序执行。例如:,Loop1:LoopzLoop1,条件:(CX)0且ZF=0,,否则,第4章汇编程序设计基础,2循环程序结构,第4章汇编程序设计基础,初始化部分,工作部分,修改部分,结束处理部分,循环结束?,图4.4-9(b)先判断后执行,N,Y,第4章汇编程序设计基础,3单重循环程序设计,(1)计数控制循环即用CX的值来控制循环次数,常用于循环次数已知的情况。每循环一次,计数器计数一次,直到计数器达到预定值(CX)=0,循环结束。,(2)条件控制循环循环次数无法事先确定,只能用“条件”来控制循环。每循环一次,便对条件进行检测,若满足终止循环的条件,便结束循环,否则继续循环。,第4章汇编程序设计基础,4多重循环程序设计多重循环结构是指循环程序的循环体中又包含了另一个循环,即循环的嵌套。,在编制多重循环程序时,首先要分清内外循环的任务和要求,接着划分内外循环中有规律变化的参数,如哪些是内循环的地址指针、计数器,哪些是外循环的地址指针、计数器。然后分别确定内外循环的控制方法和具体实施。注意:内外循环都要修改CX寄存器的内容。,第4章汇编程序设计基础,4.4.5子程序设计,在程序设计使用子程序可减少重复编写程序,缩短目标代码,节省内存空间,便于阅读程序。在汇编语言中子程序是以“过程”的形式出现的。,第4章汇编程序设计基础,1.过程定义伪指令格式:过程名ProcNear/FarRet过程名Endp过程定义必在一个逻辑段内。,Code1Segmentp1Procp1EndpP2ProcFarp2endpCodeEnds,第4章汇编程序设计基础,2.子程序调用与调用格式:Call子程序入口地址返回格式:Retn(其中n是偶数),第4章汇编程序设计基础,在编写子程序时,应满足下面的基本要求:1适度地划分并确定子程序功能2选择适当的参量传递途径3信息的保存4清晰的子程序文本,4子程序与主程序的参数传递和设计举例,第4章汇编程序设计基础,(1)通过寄存器传递参量,例12设在数据段中有一数组,数组中元素为字类型。试编制程序,用减奇数法对数组中各个数据逐一开平方,并把结果依次存入字节数组PFG中。,DATASEGMENTDA1DW1234H,5678H,3456HCOUNTEQU($-DA1)/2PFGDBCOUNTDUP(0)DATAENDS,第4章汇编程序设计基础,DATASEGMENTDA1DW1234H,5678H,3456HCOUNTEQU($-DA1)/2PFGDBCOUNTDUP(0)DATAENDS,STACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDS,第4章汇编程序设计基础,CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXMOVCX,COUNT;循环计数器初值LEASI,DA1LEADI,PFGLOP:MOVAX,SI;取被开方数,第4章汇编程序设计基础,PUSHCX;保存循环计数器CALLSQR_PROC;调用子程序MOVDI,CL;存平方根POPCX;恢复循环计数器ADDSI,2;修改地址指针INCDILOOPLOPMOVAH,4CHINT21H,第4章汇编程序设计基础,;子程序SQR_PROC:开平方;入口参数:;(AX)为被开方数;(CL)为开方结果SQR_PROCPROC;开平方子程序MOVCL,0;开平方计数器CL0MOVDX,1;奇数1,第4章汇编程序设计基础,SQR:SUBAX,DX;减奇数JBEXIT0;不够减,转移INCCL;够减,计数ADDDX,2;形成下一个奇数JMPSQREXIT0:RET;子程序返回SQR_PROCENDPCODEENDSENDSTART,第4章汇编程序设计基础,(2)通过堆栈传递参数将要传递的参数放在寄存器中,主程序和子程序通过对堆栈的访问取得所需的参数。(3)用存储单元传递参数,4子程序嵌套与递归调用,(1)子程序嵌套即一个子程可以调用另外一个子程序。,第4章汇编程序设计基础,2子程序递归调用一个子程序直接或间接调用自己,叫递归调用。递归调用是子程序嵌套的特例,在某些应用场合它是很有用的程序设计技术。,例14子程序递归调用示例(计算N!)。,第4章汇编程序设计基础,DATASEGMENTNDW6MDW?DATAENDSSTK1SEGMENTSTACKDW40HDUP(0)STK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STK1START:,第4章汇编程序设计基础,MOVAX,DATAMOVDS,AXMOVAX,NCALLFACT;调用子程序MOVAH,4CHINT21H;返回DOS,第4章汇编程序设计基础,FACTPROCCMPAX,1JNENEXT;不等于1MOVM,1JMPEXIT0NEXT:PUSHAX;压栈DECAXCALLFACT;递归调用POPAXMULM,第4章汇编程序设计基础,MOVM,AXEXIT0:RETFACTENDPCODEENDSENDSTART,递归调用可以简化算法,且程序简洁,但由于要使用堆栈,因此在存储空间上需要一些开销。,举例,在ADDR单元中存放着16位数Y的地址,统计Y中放1的个数,结果存入COUNT单元中,例:按15行*16列的表格形式显示ASCII码10HFFH的所有字符。每16个字符为1行,每行中的相邻两个字符之间用空格隔开。,MOVAH,02HMOVDL,输出字符的ASCIIINT21H,CODSEGMENTASSUMECS:CODSTART:MOVDL,10H;显示的字符MOVCH,15NEXT_H:MOVCL,16;1行显示的个数NEXT_L:MOVAH,02INT21HPUSHDXMOVDL,20H;显示空格INT21HPOPDXINCDLDECCLJNZNEXT_L,PUSHDXMOVAH,02MOVDL,0DH;换行INT21HMOVDL,0AH;回车INT21HPOPDXDECCHJNZNEXT_HMOVAH,4CHINT21HCODENDSENDSTART,两个6字节数相加,第4章汇编程序设计基础,4.5汇编语言程序的开发过程,汇编语言程序的开发过程须经过:汇编连接、最后可执行程序。,下面介绍宏汇编MASM软件的使用,假定在C:MASM目录下,存放了宏汇编程序MASM和源程序EXAMPLE.ASM。,第4章汇编程序设计基础,一MASM的操作在C:MASM提示状态下,运行MASM,即键入命令:C:MASMMASMSourcefilename.ASM:EXAMPLEObjectfilenameEXAMPLE.OBJ:SourcelistingNUL.LST:Cross-referenceNUL.CRF:,第4章汇编程序设计基础,在结束上述提示应答之后,MASM便对源程序进行扫描和语法检查。在没有严重语法错误的情况下生成目标文件,扩展名为.OBJ。若有语法错误,则显示错误信息。,第4章汇编程序设计基础,二汇编状态信息和错误代码在汇编后,显示如下信息:Microsoft(R)MacroAssemblerVersion5.00Copyright(C)MicrosoftCorp.1981,1987,Allrightreserved47904+353887Bytessymbolspacefree0WarningErrors0SevereErrors,第4章汇编程序设计基础,三生成的文件1目标文件(OBJ)一个二进制目标文件。2列表文件(LST)列表文件是一个有助于程序调试的文本文件。3交叉引用文件(CRF)列出源程序自定义的各个符号,指明这些符号在源程序的定义位置和符号引用位置。,第4章汇编程序设计基础,4.5.3连接连接程序LINK能够把一个或多个独立的目标文件和定义于库文件.LIB中的子程序与变量,连接装配成一个可重定位的可执行文件,扩展名为.EXE。连接时,除了生成.EXE程序外,用户还可以根据需要,生成相应的内存映像文件。在DOS提示状态下执行如下命令:C:MASMLINK,第4章汇编程序设计基础,ObjectModules.OBJ:EXAMPLERunFileEXAMPLE.EXE:ListFileNUL.MAP:Libraries.LIB:,4.5.4调试与运行程序中的错误分为两类:一类是语法错误,另一类是逻辑错误。在程序的汇编和连接中,可以检查出语法错误。而对逻辑错误的检测最常用的工具软件是DEBUG。,第4章汇编程序设计基础,一进入与退出DEBUG状态在DOS状态下直接启动DEBUG,例如:CMASMDEBUGfilename-当要退出DEBUG,返回操作系统时,可使用Q(QUIT)命令,如:-QCMASM二DEBUG常用命令请同学参阅书中相关部分。,一进入与退出DEBUG状态在DOS状态下直接启动DEBUG,例如:CMASMDEBUGfilename-当要退出DEBUG,返回操作系统时,可使用Q(QUIT)命令,如:-QCMASM二DEBUG常用命令请同学参阅书中相关部分。,
展开阅读全文