第四章汇编语言程序设计•汇编语言语句的类型和组成•伪操作命令•DOS系统功能调用和BIOS中断调用•汇编语言程序设计汇编语言语句的组成1.指令性语句。即执行性语句(指令)包括四部分:[标号:]指令操作码[操作数][;注释]AGAN:ADCSUM,AX2.指示性语句。即说明性语句(伪指令),由四部分组成:[名字]伪指令[操作数][;注释]SUMDW0;为结果保留一个字3.宏指令语句。[宏名]宏操作助记符[操作数][;注释]汇编语言对标识符的规定•可用符号包括数字、字母和特殊符号?、$、@、_。•数字不能作为名字(变量或标号)的第一个符号。•名字的长度不能超过31个字符。•汇编语言中有特定含义的保留字,如操作码、寄存器名等,不能作为名字使用。•不区分字母的大小写。DATASEGMENT;定义数据段XDB2DATAENDS;数据段定义结束STACKSEGMENTPARASTACK‘STACK’;定义堆栈段DB100DUP(?);100字节的栈空间STACKENDS;堆栈段定义结束CODESEGMENT;定义代码段ASSUMEDS:DATA,SS:STACK,CS:CODE;对各段进行说明BEGIN:MOVAX,DATA;DS初始化为DATAMOVDS,AXMOVBH,XCODEENDS;代码段结束ENDBEGIN;整个程序结束汇编语言程序结构定义存储单元的数据定义堆栈汇编语言开发过程一、上机前的软件准备:MS-DOS操作系统(如:MSDOS6.22,MSDOS7.0等)文本编辑器(如:EDIT.COM,TURBO.EXE,TC.EXE,C.EXE等)汇编程序(如:MASM.EXE,ASM.EXE等)连接程序(如:LINK.EXE等)调试程序(如:DEBUG.EXE等)编辑文本编辑器,如EDIT.COM源程序:文件名.asm汇编汇编程序,如ML.EXE目标模块:文件名.obj连接连接程序,如LINK.EXE可执行文件:文件名.exe调试调试程序,如CodeView应用程序错误错误错误错误汇编语言程序的开发过程1.OFFSET运算符当OFFSET运算符置于变量或标号前时,汇编程序就自动计算出该变量或标号在它段内的偏移地址。如:BUFFERDB34,56,79,12MOVSI,OFFSETBUFFER运算符运算符2.PTR运算符表达式返回一个与原操作数具有相同的段基址和偏移量,但类型不同的操作数。格式:类型PTR地址表达式如:MOVBYTEPTR[SI],20HMOVWORDPTR[SI],20H基本伪指令--符号定义伪指令基本形式:符号名EQU表达式符号名=常数表达式功能:给表达式指定一个等价的符号名。说明:(1)=后的表达式只能是常数,对于字符或字符串,汇编时按整数处理。例如:COUNT=20MOVCX,COUNT;等价于MOVCX,20(2)EQU后的表达式可以是数值、字符串、寄存器名、指令助记符等。(3)EQU不能重复定义,而=可重复定义,其作用域从定义点到重新定义之前。基本伪指令--数据类型定义伪指令DB(DefineByte)DW(DefineWord)DD(DefineDWord)操作数可以为:(1)数值表达式;(2)ASCⅡ码字符串;(3)地址表达式;(4)?(只保存内存空间,未定义初始值);(5)DUP子句格式:重复次数DUP(操作数,…,操作数)DUP子句可以嵌套。DB、DW的应用特点DATASEGMENTARE1DB20H,30HARE2DW2030HARE3DB‘AB’ARE4DW?DATAENDS20H30H30H20H41H42H00H00HARE1ARE2ARE3ARE4V1DB20DUP(?)V2DW4DUP(3,5)V3DB5DUP(3DUP(2),7)V4DB10DUP(‘ABCD’)基本伪指令--数据类型定义伪指令基本伪指令--地址计数器伪指令$表示下一个地址变量的偏移地址值SORTDSEGMENTARRAYDB25,46,3,75,5COUNTEQU$-ARRAYSORTDENDSARRAY的偏移地址值为0000H$的偏移地址值为0005HCOUNT=0005H–0000H=525463755ARRAY0000H0005H$汇编语言程序设计程序设计一般应按下述步骤进行(对于给定的课题进行程序设计):1.依据设计任务,建立数学模型。2.确定算法或求解的具体步骤和方法。3.绘制出程序流程框图。4.分配存储空间及工作单元(包括寄存器)。5.依据流程图编写程序。6.静态检查(检查指令是否合适,是否有语法和格式错误)。7.上机调试。基本程序设计顺序程序设计指令指针IP值线性增加条件程序设计IP值受标志位的影响而跳变循环程序设计IP值受计数器CX中的值不为零而循环DOS系统功能调用DOS系统将输入/输出管理程序编写成一系列子程序,不仅系统可以使用,用户也可以像调用子程序一样方便的使用它们。在IBMPC系统中,除了DOS系统中有一组输入/输出子程序可供用户调用外,在系统的ROM中也有一组输入/输出管理程序可供用户使用,这组程序常称为ROMBIOS(ROMBasicI/OSystem)。DOS系统功能调用DOS共提供了约100个功能调用,按其完成的功能大致可以分为以下几类:基本输入/输出的管理(如键盘、显示器等)文件管理目录管理等调用方法:为了使用的方便,DOS所有功能的子程序已按序编号—功能号,从00H-68H。DOS规定用软件中断指令INT21H进入DOS功能调用子程序的总入口,再以具体的功能号进入相应各个子程序的入口。DOS系统功能调用具体调用方法为:①MOVAH,功能号②[入口参数→指定寄存器]③INT21H④[取出口参数]常用功能子程序功能号键盘输入单字符01H键盘输入字符串0AH输出单字符02H输出字符串09H返回操作系统4CH带回显的字符输入,功能号01H功能:从标准输入设备(如键盘)输入一个字符,并显示在标准输出设备(如CRT)上。如无字符输入,则等待。入口参数:无返回值:AL=输入字符的ASCII码例:MOVAH,01H;功能编号INT21H;调用CMPAL,0DH;输入字符是回车符吗?…字符输出,功能号02H功能:将一个字符(ASCII码)输出到标准输出设备(如CRT)上入口参数:DL=即将输出字符的ASCII码返回值:无例:MOVDL,‘$’;欲输出一个“$”符号MOVAH,02H;功能编号INT21H;调用输出字符串,功能号09H功能:向标准输出设备输出以“$”为结束符的字符串(“$”符不显示),串中不含控制符入口参数:地址指针DS:DX,指向待输出的字符串首址返回值:无例:STRDB‘TodayisMonday.$’;即将输出的字符串…LDSDX,STR;DS:DX为指针MOVAH,09H;功能编号INT21H;调用带缓冲区的字符串输入,功能号0AH功能:由用户提供缓冲区,从标准输入设备输入一个以回车符(0DH)结束的字符串并接收在缓冲区内,同时回显在标准输出设备上(不显示回车符)。入口参数:地址指针DS∶DX,指向接收缓冲区的首址返回值:无例:STRDB20,?,20DUP(?);用户定义的缓冲区LENDB?;实际串长单元LDSDX,STR;DS:DX为STR指针MOVAH,0AH;功能编号INT21H;调用LEASI,STRMOVLEN,[SI+1];实际串长例1:计算Y=X1+X2+X3。①表达式Y=X1+X2+X3的计算过程可采用顺序执行的方法来完成:首先读入数据X1、X2、X3;其次计算X1、X2、X3的和;最后保存结果到指定变量Y中。②根据计算步骤编写汇编语言程序:利用伪指令确定存储器的分配,将X1、X2、X3定义为字变量;按照汇编语言源程序结构要求编写源程序。思考:计算D=(A+B)*4-CDATASEGMENTDATA1DWX1,X2,X3,?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,[DATA1ADDAX,[DATA1+2]ADDAX,[DATA1+4]MOV[DATA1+6],AXHLTCODEENDSENDSTART例2:把BX中的二进制数用十六进制形式显示出来。MOVCH,4AGAIN:MOVCL,4ROLBX,CLMOVAL,BLANDAL,0FHORAL,30HCMPAL,3AHJBNEXTADDAL,07HNEXT:MOVDL,ALMOVAH,2INT21HDECCHJNZAGAIN例3:用查表法求Z=X3DATASEGMENTTABLEDB0,1,8,27,64,125,216XVALDB6YVALDB?DATAENDSSTACKSEGMENTDB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEABX,TABLEMOVAL,XVALXLATMOVYVAL,ALCODEENDSENDSTART分支结构程序设计程序中所产生的分支是由条件转移指令来完成的。例1:从键盘上输入字符,若为A~Z,显示;若为0,则结束输入。LP1:MOVAH,01H;置键盘输入并回显INT21HCMPAL,0;输入字符与0JELP2;为零结束CMPAL,‘A’;判断是否小于大写字母AJLLP1;小于大写字母ACMPAL,‘Z’;判断是否大于大写字母ZJGLP1;大于大写字母ZMOVDL,AL;将AL内容送DL,MOVAH,02INT21H;将A~ZLP2:MOVAH,4CH;带返回码结束INT21HINT21H例2:实现表达式波形图Y=1(X0)0(X=0)-1(X0)X在-128~+127之间XY流程图DATASEGMENTXDB?YDB?DATAENDSCODESEGMENTASSUMECS:CODE;DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,XCMPAL,0JGEBIG;X=0转BIGERMOVAL,0FFH;-1的补码为FFHMOVY,AL;Y=-1JMPNEXTBIG:JEEQUL;X=0转EQULMOVAL,1MOVY,AL;Y=1JMPNEXTEQUL:MOVY,AL;Y=0NEXT:HLTCODEENDSENDSTART例3:从键盘接收0~9范围的数字字符,按值显示对应的英语单词,如“0”显示“Zero”、“1”显示“One”等,若为其它字符,则不做任何处理。可在程序中安排十条分支以显示十个不同的英语单词。利用跳转表(地址表),具体算法如下:①将不同分支的入口地址L0,L1,...,L9顺序存入表中,每个入口地址占一个字,设表首址为TAB,用户键入数字为i,则:Li的存放地址=TAB+2*i②将Li的存放地址送BX,然后用指令“JMPWORDPTR[BX]”实现分支转移。分析:循环结构程序设计针对的是处理一些重复进行的过程的操作。使用循环结构形式设计程序时,通常将循环程序划分三个部分:①循环的初始化部分:变量赋初值。②循环体:可以有一个或多个。③循环控制部分:是否结束循环的条件。知道循环次数:可采用循环计数控制循环的结束;不知道循环次数:多采用结果及给定特征作为条件来控制循环的结束。循环程序设计一般循环次数有可能为零时,选择DO_WHILE形式结构,否则选择DO_UNTIL结构形式。循环程序设计DO_UNTIL(直到型循环结构)DO_WHILE(当型循环结构)(a)单循环结构;(b)双循环结构在多重循环程序设计中应注意:①内循环体可以几个并列在外循环体内,但内循环体之间不得交叉。②多重循环中可从内循环体转移到外循环体,但不允许外循环体直接转到内循环体中。③所编程序不能形成死循环程序。循环程序设计例1:要求将偏移地址为1000H开始存放的100个字节的数据传送到偏移地址为1500H开始的连续内存区。假设它们的段地址存放在DS中,段地址为2000H。MOVAX,2000HMOVDS,AXM