1、第五章汇编语言程序设计主要内容第五章汇编语言程序设计汇编语言的结构常用的伪指令各种汇编语言程序的基本结构的设计方法及实现常用的DOS功能调用 主要内容:难点:常用的DOS功能调用计算机程序设计语言的演变计算机程序设计语言的演变 1.机器语言机器语言(MachineLanguage)2.汇编语言汇编语言(AssemblyLanguage)汇编程序的“翻译”作用汇编程序汇编程序AssemblerAssembler汇编语言汇编语言源程序源程序机器语言机器语言目标程序目标程序机器语言、汇编语言和高级语言第五章汇编语言程序设计3.高级语言高级语言(High-levellanguage)C/C+4.混合语
2、言(混合语言(HybridLanguage)一、汇编语言语法一、汇编语言语法 汇编语言源程序书写格式 第五章汇编语言程序设计汇编语言源程序是汇编语言语句的有序集合。1字符集8086/8088宏汇编语言的单词是由下列字符构成的。1)英文字母:az,AZ;2)数字:09;3)算术运算符:+-*/;4)分隔符:,:;()=SP(空格)TAB(制表符);5)控制符:CR(回车)LF(换行)FF(换页);6)专用字符:$&_(下划线)?.%。用汇编语言编写的程序中,指令的助记符、各种操作符等都是由上述字符组成。一、汇编语言语法一、汇编语言语法 汇编语言源程序书写格式 第五章汇编语言程序设计2标识符标识符
3、是给程序中的标号、变量、记录、结构、段、过程等起的名字,它应符合下列规定:1)标识符的第一个字符必须是字母、“?”、“”或“_”;2)从第二个字符开始可以是字母、数字、“?”、“”或“_”;3)一个标识符的最大长度为31个字符;4)不能为保留字。3保留字8086/8088中的寄存器名、指令助记符、各种操作符等都是系统专用的保留字。这些保留字用户不能用作标识符,编写程序时必须注意。一、汇编语言语法一、汇编语言语法 汇编语言源程序书写格式 第五章汇编语言程序设计4、三种基本语句 指令语句伪指令语句宏指令语句 5、四种逻辑段代码段(必须)数据段(可选)堆栈段(可选)附加段(可选)STACK_SEGS
4、EGMENT;定义作为堆栈段的逻辑段,段名为STACK_SEGDW256DUP(?);分配堆栈段的大小,设置为256个字TOPLABELWORD;定义堆栈栈底位置STACK_SEGENDSDATA_SEGSEGMENT;定义作为数据段的逻辑段,段名为DATA_SEGSTRINGDBLetushaveatry!,$;定义字符串数据DATA_SEGENDSCODE_SEGSEGMENT;定义作为代码段的逻辑段,段名为CODE_SEGASSUMECS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEGSTART:MOVAX,DATA_SEG;程序执行起始点MOVDS,AX;将段寄存器
5、指向用户数据段MOVAX,STACK_SEGMOVSS,AX;将堆栈指针指向用户定义堆栈MOVSP,OFFSETTOPLEADX,STRINGMOVAH,9;系统功能调用,在CRT显示字符串INT21HMOVAH,4CH;系统功能调用,程序结束返回操作系统INT21HCODE_SEGENDSENDSTART;汇编结束,程序起始点为START 堆栈段数据段代码段汇编语言源程序书写格式 第五章汇编语言程序设计程序结构程序结构l l 程序由数条语句构成,每条语句占一行。程序由数条语句构成,每条语句占一行。指令性语句指令性语句(指令语句指令语句)指示性语句指示性语句(伪指令语句伪指令语句)l l 分段
6、结构分段结构 程序按段编写程序按段编写,与与80868086内存分段编址相对应。内存分段编址相对应。每段每段由伪操作由伪操作SEGMENTSEGMENT开始、由开始、由ENDSENDS结束。结束。l l 程序中设有返回程序中设有返回DOSDOS的功能。的功能。使程序执行完后返回使程序执行完后返回DOSDOS系统的命令接受状态。系统的命令接受状态。程序中用到内存操作数时,程序中用到内存操作数时,应按操作数的寻址方式应按操作数的寻址方式,给相应的段寄存器赋值给相应的段寄存器赋值汇编语言源程序书写格式 第五章汇编语言程序设计一、汇编语言语句一、汇编语言语句 汇编语言源程序书写格式 第五章汇编语言程序
7、设计1汇编语言语句的种类汇编语言有三种基本语句:指令语句、伪指令语句和宏指令语句。指令语句:产生一个目标代码伪指令语句:为汇编程序和连接程序提供一些必要控制信息的管理性语句,不产生目标代码。宏指令语句的宏指令是编程者根据宏指令定义规则,将一组指令或伪指令集中定义的一条“宏大”的指令。宏指令只节省源程序篇幅,不节省汇编后的目标代码。伪指令语句在汇编时不产生目标代码,而指令语句必产生相对应的机器代码,这一点是两者的本质区别。此外,伪指令语句的伪操作是在汇编过程或连接过程中完成的,而指令语句的操作是在运行用户程序时完成的。汇编语言源程序书写格式 第五章汇编语言程序设计2汇编语言语句的格式汇编语言的三
8、种语句格式是类似的:指令语句的格式:标号:操作符参数,参数;注释伪指令语句的格式:名字操作符参数,参数;注释宏指令语句的格式:标号:操作符实参数表;注释汇编语言源程序书写格式 第五章汇编语言程序设计2汇编语言语句的格式三种语句都由四部分组成:第一部分是标号或名字,符合标识符定义的要求标号后面有冒号,表示此语句为指令语句,在汇编时产生与之对应的机器码,名字后没有冒号,表示此语句为伪指令语句,在汇编时不产生机器码,所以,汇编语言语句中有无冒号是在汇编时是否产生机器码的一个标志,也是指令语句和伪指令语句的最大区别。LAB:MOVAX,BX;指令语句,LAB后跟冒号YDB30H;伪指令语句,Y后不跟冒
9、号操作符项操作符项操作符可以是指令、伪操作中的助记符。操作符可以是指令、伪操作中的助记符。对于指令对于指令,汇编程序将其翻译成机器语言指令。汇编程序将其翻译成机器语言指令。MOVMOV AX,100AX,100B8B8 00010001对于伪指令对于伪指令,汇编程序据其要求的功能进行处理汇编程序据其要求的功能进行处理。datadataSEGMENTSEGMENTdatadata与一段值对应与一段值对应 stringstring DBDBhpudqxhpudqxstringstring与一内存地址对应与一内存地址对应汇编语言源程序书写格式 第五章汇编语言程序设计注释项注释项 由分号引出,用来说明
10、语句或程序的功能。由分号引出,用来说明语句或程序的功能。汇编程序对分号后的内容不做处理。汇编程序对分号后的内容不做处理。作用:作用:注释程序,增强程序可读性。注释程序,增强程序可读性。可放在语句最前,暂时注释某语句,调试程序用。可放在语句最前,暂时注释某语句,调试程序用。例例;MOVAH,2;MOVAH,2;显示提示信息显示提示信息;MOVDL,AMOVDL,A;INT21H;INT21H汇编语言源程序书写格式 第五章汇编语言程序设计2.汇编语句的操作数(汇编语句的操作数(Operands)寄存器(Registers)常量(Constants)常数常数 字符串常量字符串常量 符号常量符号常量
11、数值表达式数值表达式二进制常数二进制常数十进制常数十进制常数八进制常数八进制常数 十六进制常数十六进制常数 算术运算符算术运算符逻辑运算符逻辑运算符关系运算符关系运算符汇编语言源程序书写格式 第五章汇编语言程序设计qq常数常数给出具体的数据。可以是数字常量或字符常量。给出具体的数据。可以是数字常量或字符常量。数字默认十进制,也可加数字默认十进制,也可加D D表示十进制数。如表示十进制数。如12341234D,1234D,1234 数字后加数字后加B B表示二进制数。表示二进制数。如如10101010B B 数字后加数字后加H H表示十六进制数。表示十六进制数。如如12341234H H 字符常
12、量,用单引号表示。字符常量,用单引号表示。如如12341234汇编时,用字符对应的汇编时,用字符对应的ASCIIASCII表示。如表示。如3131H,32H,33H,34HH,32H,33H,34H例例data1DB12,34,56data1DB12,34,56;十进制十进制data2DB12H,34H,56Hdata2DB12H,34H,56H;十六进制十六进制MOVAL,GMOVAL,G;字符字符stringDB1234stringDB1234;字符串字符串汇编语言源程序书写格式 第五章汇编语言程序设计 A A、B B、C C、D D、E E、F F开头的十六进制数前面加开头的十六进制数前
13、面加0 0,与与H H结尾的标识符区别。结尾的标识符区别。如如 寄存器名寄存器名AHAH、BHBH、CHCH、DHDH变量名变量名 abcdHabcdH 等等例movmovAL,0AHAL,0AHmovmovAL,AHAL,AHmovmovBX,0abcdHBX,0abcdH汇编语言源程序书写格式 第五章汇编语言程序设计五、表达式及表达式中的操作符五、表达式及表达式中的操作符 表达式表达式qq 由常量、标号、变量和一些操作符构成。由常量、标号、变量和一些操作符构成。qq 汇编程序对表达式进行运算后,得到一个确定的数值,汇编程序对表达式进行运算后,得到一个确定的数值,再把这个数值汇编到指令中。再
14、把这个数值汇编到指令中。qq 据表达式所表示的内容,分数字表达式、地址表达式。据表达式所表示的内容,分数字表达式、地址表达式。qq 表达式是指令或伪操作的操作数表达式是指令或伪操作的操作数;表达式中的操作符由汇编程序完成表达式中的操作符由汇编程序完成例例MOVAX,12-4;MOVAX,8;MOVAX,12-4;MOVAX,8;数字表达式数字表达式 LEABX,string+4;LEABX,string+4;地址表达式地址表达式 汇编语言源程序书写格式 第五章汇编语言程序设计表达式中的操作符表达式中的操作符qq有以下几类有以下几类:1.1.算术运算符算术运算符(+(+、-、*、/、MOD)MO
15、D)2.2.逻辑运算符逻辑运算符(ANDAND、OROR、NOTNOT、XOR)XOR)3.3.关系运算符关系运算符(EQEQ、NENE、GTGT、GEGE、LTLT、LE)LE)真:真:FFFFH;FFFFH;假假:0:04.4.数值返回操作符数值返回操作符(SEGSEG、OFFSET)OFFSET)5.5.类型操作类型操作(PTR)PTR)6.6.地址记数器地址记数器($)($)汇编语言源程序书写格式 第五章汇编语言程序设计例例:1.1.算术运算符算术运算符(+(+、-、*、/、MOD(MOD(取余数取余数)MOVAX,6*8MOVAX,48MOVAX,6*8MOVAX,482.2.逻辑运
16、算符逻辑运算符(ANDAND、OROR、NOTNOT、XOR)XOR)MOVAX,80hOR70hMOVAXMOVAX,80hOR70hMOVAX,0F0h0F0h3.3.关系运算符关系运算符(EQEQ、NENE、GTGT、GEGE、LTLT、LE)LE)真:真:FFFFH;FFFFH;假假:0:0MOVAX,1GE2MOVAX,0MOVAX,1GE2MOVAX,0汇编语言源程序书写格式 第五章汇编语言程序设计存储器操作数标识符标号标号(Label)Label)变量变量(Variable)Variable)分析运算符分析运算符OFFSETOFFSETSEGSEGTYPETYPESIZESIZE
17、LENGTH属性属性偏移地址偏移地址段地址段地址类型类型大小大小长度类型运算符类型运算符PTRPTR、THISTHIS等新的属性新的属性汇编语言源程序书写格式 第五章汇编语言程序设计1.1.数值返回操作符数值返回操作符(SEGSEG、OFFSETOFFSET、TYPE)TYPE)SEGSEG取符号地址的段地址取符号地址的段地址例例 MOVAX,SEGMOVAX,SEGyyyyOFFSETOFFSET取符号地址的偏移地址取符号地址的偏移地址例例 MOVBX,OFFSETMOVBX,OFFSETyyyyTYPETYPE取变量的类型取变量的类型见表见表5 51 1LENGTHLENGTH和和 SIZ
18、ESIZE 对用对用DUPDUP定义的,且定义的,且DUPDUP后括号里为单项数据的后括号里为单项数据的x x有:有:SIZEx=TYPEx*LENGTHxSIZEx=TYPEx*LENGTHx汇编语言源程序书写格式 第五章汇编语言程序设计例:假设数据段的首地址50000HA1DB24H,47H,0F3HA2DW4567H,0A00HA3DD0B1234098H,98765432HA4DW40HDUP(1)SEGOFFSETTYPELENGTH SIZEA1A2A3A4汇编语言源程序书写格式 第五章汇编语言程序设计例:假设数据段的首地址50000HA1DB24H,47H,0F3HA2DW456
19、7H,0A00HA3DD0B1234098H,98765432HA4DW40HDUP(1)SEGOFFSETTYPELENGTH SIZEA150000111A250003212A350007414A4500015240H80H汇编语言源程序书写格式第五章汇编语言程序设计2、属性操作符这类运算符为存储器操作数临时指定一个新的属性,而忽略当前属性,因此又称为属性修改运算符。PTR格式:类型PTR存储器地址表达式例:INCWORDPTRBXTHIS格式:THIS类型作用:THIS运算符功能与PTR类似,由它所生成的新的存储器操作数的段和偏移量两属性与下一个存储单元的段和偏移量相同,但类型由THIS
20、指定,例如:Z11EQUTHISWORDZ1DB20H,40H则变量Z11和Z1具有相同的段和偏移量属性,但Z11的类型为WORD,而Z1是属性为BYTE。汇编语言源程序书写格式第五章汇编语言程序设计一、数据定义及存储分配伪指令一、数据定义及存储分配伪指令格式:变量名DB/DW/DD/DQ/DT;注释DUP常用在数据定义伪指令中,其使用的格式为:变量名DB/DW/DD/DQ/DTDUP(表达式2);注释例:A1DB10,10H;定义两个字节A2DW10,10H;定义两个字A3DBAB;定义两个字节A4DWAB;定义一个字A5DB3DUP(1,2,3)见L1.ASM0A100A001000414
21、24241010203010203010203ARRAYDB20DUP(0,1,4DUP(2),5)共占有多少字节?140个个伪指令及其应用 第五章汇编语言程序设计等值(赋值)语句等值(赋值)语句EQU格式:符号名EQU表达式等号语句等号语句=格式:符号名=表达式注意:用EQU和=定义的符号不占存储单元。例:假设数据段的首地址50000HA1DB24H,47H,0F3HA2DW4567H,0A00HA3DD0B1234098H,98765432HL1EQU40HA4DWL1DUP(1)标号定义伪指令标号定义伪指令LABEL格式:变量名或标号名LABEL类型伪指令及其应用第五章汇编语言程序设计格
22、式:变量名或标号名变量名或标号名LABEL类型类型例:VAR1LABLEWORDVAR2DB20DUP(1)变量VAR1和VAR2具有相同的段基址和偏移量,但类型不同:VAR1是字型,VAR2是字节型。段定义伪指令段定义伪指令SEGMENT/ENDS格式:段名SEGMENT定位类型组合类型类别;段内语句序列段名ENDS定位类型定位类型规定了对该段的起始地址的要求,可以有以下四种选择:PAGE(页):其16进制地址最低2位为00H。PARA(节):其16进制地址最低1位为0H。该类型为系统的缺省值。WORD(字):该段从偶地址开始。BYTE(字节):组组合合类类型型表示该段与其它段之间的连接和定
23、位关系,是在连接时起作用的。可以有以下六种选择:NONE:该类型为系统的缺省值。PUBLIC、STACK、COMMON、AT表达式、MEMORY。类别类别是由编程者赋予该段的与段名不同的另一个名字信息,必须用单引号括起来。在连接时由连接程序将程序中所有类别相同的段组成一个段组。伪指令及其应用 第五章汇编语言程序设计过程定义伪指令过程定义伪指令定义子程序的格式为:过程名PROCNEAR/FARRET过程名ENDP程序结束伪指令程序结束伪指令END该语句为汇编语言源程序的最后一个语句,用以标志整个程序的结束,即告诉汇编程序,汇编到此结束,停止汇编工作。其中表达式的值必须是一个存储器地址,即程序中第
24、一条可执行指令的地址。其格式为:END标号程序开始伪指令程序开始伪指令ORG告诉汇编程序在它以后的程序段或数据块存放起点的偏移地址。其格式为:ORG表达式段寻址伪指令段寻址伪指令ASSUME该伪指令用来告诉汇编程序某个段是使用哪一个段寄存器。格式:ASSUME段寄存器名:段名,段寄存器名:段名,伪指令及其应用 第五章 汇编语言程序设计指令或语句指令或语句就是告诉计算机为完成某一计算步骤需要执行的操作。程序程序是为了求解某个问题所必须的完整的指令序列或语句串加上必要的数据。程序设计程序设计是编写程序的过程。当在设计一个程序时,应该考虑满足以下目标目标:1)程序的正确性。2)增强程序的可读性。3)
25、所写程序应该是结构化的,易修改,易调试,即程序的可维护性。程序设计的基本步骤基本步骤1.分析问题,建立模型例:Y=|X|Y=-X开始X=0Y=X结束Y=-X4分配存储空间和工作单元5编写程序6上机调试、运行程序2确定算法3根据算法画出程序流程图程序设计步骤 第五章 汇编语言程序设计程序的基本结构程序程序是指令(语句)的有序集合,是对系统任务处理步骤的描述。程序的执行是有一定顺序的,依据执行顺序执行顺序可将程序分为如下基本结构:顺序结构、分支(选择)结构、循环结构和子程序结构顺序结构、分支(选择)结构、循环结构和子程序结构。顺序结构顺序结构:是一种线性结构,这种结构的程序每执行一次,其中的语句或
26、程序段依次被执行一次程序的顺序结构如图所示:S1S2S3其中S1、S2、S3表示顺序执行的语句或程序段。例例5-4假设由下列数学公式:Y=X3+8X2+8X+6试编写当X=10时,计算Y值的程序。(X)AX(AX)+8AX(AX)*(X)AX(AX)+6AX(AX)+8AX(AX)*(X)AXAX(Y)Y=(X+8)X+8)X+6程序的基本结构 第五章 汇编语言程序设计START:MOV AX,STACK_SEG MOV SS,AX MOV SP,OFFSET TOP PUSH DS SUB AX,AX PUSH AX MOV AX,DATA_SEG MOV DS,AX MOV AX,X AD
27、D AX,8 MUL X ADD AX,8 MUL X ADD AX,5 MOV Y,AX RET MAIN ENDPCODE_SEG ENDS END STARTDATA_SEG SEGMENT X DW 10 Y DW 0 DATA_SEG ENDSSTACK_SEG SEGMENT STACK STACK DW 100 DUP(?)TOP LABEL WORDSTACK_SEG ENDSCODE_SEG SEGMENTMAIN PROC FAR ASSUME CS:CODE_SEG,DS:DATA_SEG ASSUME SS:STACK_SEG例例5-4假设由下列数学公式:Y=X3+8X
28、2+8X+6试编写当X=10时,计算Y值的程序。程序的基本结构 第五章 汇编语言程序设计2查表程序查表的关键在于组织表格,表格中应包含题目所有可能的值,且按顺序排列。这样查表操作的思路是:先利用表格首址加偏移地址形成结果所在地址,再用MOV数据传送指令得到结果;或直接利用XLAT查表指令得到结果。例5-5内存中自TABLE开始的16个单元连续存放着自然数015的平方值(称作平方表)。任给一数X(0X15)在XX单元,查表求X的平方值,并把结果存入YY单元。014916253649程序的基本结构 第五章 汇编语言程序设计DATASEGMENTTABLEDB0,1,4,9,16,25,36,49,
29、64,81;预置平方表DB100,121,144,169,196,225XXDB5;变量XYYDB?;定义结果存放单元DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFARPUSHDS;保存返回地址MOVAX,0PUSHAXMOVAX,DATA;初始化DSMOVDS,AXLEABX,TABLE;BX指向表首址MOVAL,XX;被查数作索引值XLAT;查表MOVYY,AL;存结果RET;返回DOSSTARTENDPCODEENDSENDSTART例5-5内存中自TABLE开始的16个单元连续存放着自然数015的平方值(称作平方表
30、)。任给一数X(0X15)在XX单元,查表求X的平方值,并把结果存入YY单元。程序的基本结构 第五章 汇编语言程序设计二、分支程序结构 汇编语言中实现分支的要素有二:(1)使用能影响状态标志的指令,如算术运算指令、逻辑运算指令和移位指令等,利用状态标志来反映条件成立与否。(2)使用条件转移指令,对状态位进行测试判断,确定程序如何转移,形成分支。程序的基本结构 第五章 汇编语言程序设计2分支程序设计的方法(1)利用比较(或测试)、转移指令实现分支例5-6编写程序计算Y=X,X,Y为字变量。DATASEGMENTXDW10HYDW?DATAENDSCODESEGMENTMAINPROCFARASS
31、UMECS:CODE,DS:DATASTART:PUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVAX,X;取数TESTAX,8000H;测试数据正负JZPOS;为正转移至POSNEGAX;为负,求补POS:MOVY,AX;送结果至Y单元RET;返回DOSMAINENDPCODEENDSENDSTART程序的基本结构 第五章 汇编语言程序设计(2)利用跳转表实现分支跳转表是存放一系列跳转地址、跳转指令或关键字等的表,可以放在内存中的一段地址连续的存储单元中。这种方法常用于多分支的情况。例5-7某工厂8种产品的加工程序R0、R1、R7,分别存放在以L0、L1、L7
32、为首址的内存区域中,这8个首址偏移量连续存放在BASE为首址的跳转表内,如图5-8所示。从键盘上键入产品号(实际上是一个07数字的ASCII码,先去掉高位,将它转换成真正产品号),存于AL中,然后利用这个跳转表可以求出表地址=表首址+产品号2,再通过寄存器间接寻址方法,由无条件转移指令转到不同的程序段去执行相应的加工程序。程序的基本结构 第五章 汇编语言程序设计(2)利用跳转表实现分支跳转表是存放一系列跳转地址、跳转指令或关键字等的表,可以放在内存中的一段地址连续的存储单元中。这种方法常用于多分支的情况。例5-7某工厂8种产品的加工程序R0、R1、R7,分别存放在以L0、L1、L7为首址的内存
33、区域中,这8个首址偏移量连续存放在BASE为首址的跳转表内,如图5-8所示。从键盘上键入产品号(实际上是一个07数字的ASCII码,先去掉高位,将它转换成真正产品号),存于AL中,然后利用这个跳转表可以求出表地址=表首址+产品号2,再通过寄存器间接寻址方法,由无条件转移指令转到不同的程序段去执行相应的加工程序。程序的基本结构 第五章 汇编语言程序设计DATASEGMENTBASEDWL0,L1,L2,L3,L4,L5,L6,L7DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARSTART:MOVAX,DATAMOVDS,AXMOVAH,01H
34、INT21HCMPAL,30HJBEXITCMPAL,38HJAEEXITANDAL,0FHADDAL,ALMOVAH,0LEABX,BASEADDBX,AXJMPWORDPTRBX L0:MOVDL,AJMPLL1:MOVDL,BJMPLL2:MOVDL,CJMPLL3:MOVDL,DJMPLL4:MOVDL,EJMPLL5:MOVDL,FJMPLL6:MOVDL,GJMPLL7:MOVDL,HL:MOVAH,02HINT21HEXIT:MOVAH,4CH;返回返回DOSINT21HMAINENDPCODEENDSENDSTART程序的基本结构 第五章 汇编语言程序设计循环程序:当每次执行这
35、个程序结构时,有部分程序可能被执行若干次。循环程序一般由五部分组成:(1)初始化部分也称循环的准备部分。(2)工作部分也称循环体,是循环程序的核心部分。(3)修改部分(4)控制部分(5)结束处理部分对循环结果进行分析或保存。循环程序从执行循环的控制结构上分可有两种基本结构形式:(1)“先执行,后判断”控制结构(2)“先判断,后执行”控制结构初始化部分初始化部分工作部分循环结束?YN修改部分工作部分N循环结束?修改部分Y结束处理部分结束处理部分程序的基本结构 第五章 汇编语言程序设计循环程序的控制方法常用的循环程序的控制方法有计数法、寄存器终值法、条件控制法、开关控制法和逻辑控制法等(主要叙述前
36、三种方法)。单循环程序的设计方法单循环程序的设计方法1.计数控制型计数控制型这种程序设计方法直观,方便,但必须在循环次数已知的的条件下才能采用。例1:在以BLOCK为首址的存区中存有一组带符号的字节数,编制从中找出最大数并送入MAX单元的程序。程序的基本结构 第五章 汇编语言程序设计DATASEGMENTBLOCKDB5,15,10,38,-6,72,120,-64COUNTEQU$-BLOCKMAXDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARPUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXSTART:
37、MOVCX,COUNT-1MOVBX,OFFSETBLOCKMOVAL,BXLOP:INCBXCMPAL,BXJGENEXTMOVAL,BXNEXT:LOOPLOPMOVMAX,ALRETMAINENDPCODEENDSENDMAIN例1:在以BLOCK为首址的存区中存有一组带符号的字节数,编制从中找出最大数并送入MAX单元的程序。程序的基本结构 第五章 汇编语言程序设计例例:编写一程序,从数据段中一未排序的字数组ARRAY中,找出最大值和最小值分别存放到AX和BX 寄存器中。开始N-1CX取数组第一个数 AX和BX数组中数与(AX)和(BX)比较大数 AX小数 BX比较完?结束NY程序的基本
38、结构 第五章 汇编语言程序设计DATA SEGMENTN EQU 6ARRAY DW 98H,04H,76H,12H,09H,0F8HDATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATASTART:PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV CX,N-1 LEA SI,ARRAY MOV AX,SI MOV BX,AXAGAIN:ADD SI,2 CMP BX,SI JLE FMAX MOV BX,SI JMP SHORT NEXTFMAX:CMP AX,SI JGE NE
39、XT MOV AX,SINEXT:LOOP AGAIN RETMAIN ENDPCODE ENDSENDSTART例例:编写一程序,从数据段中一未排序的字数组ARRAY中,找出最大值和最小值分别存放到AX和BX 寄存器中。程序的基本结构 第五章 汇编语言程序设计(2)寄存器终值控制法 该方法与计数法不同,控制寄存器初值或终值不是循环次数,它可能是一个操作数地址、时间的一种表示或程序中要使用的其他内容等。每执行一次循环体,该寄存器的值都要按某种规律进行处理,直到该寄存器的值达到某种条件就退出循环。例:求平方根程序:内存SQU单元存放一个完全平方数,编一个求平方根程序。分析:从1开始连续I个奇数之
40、和是I的平方数N,如:1+3+5+7+9+11+13=49,其 中 I=7(7个 连 续 的 奇 数),N=49(连续奇数之和),所以N=I2;程序的基本结构 第五章 汇编语言程序设计开始初始化平方值=0?平方数减奇数计数器加1形成下一个奇数保存结果结束DATA SEGMENTSQU DW 13924 ROOT DW?DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA SQROOT:MOV AX,DATA MOV DS,AX XOR CX,CX ;计数器清0 MOV BX,1 ;置奇数 MOV DX,SQU ;把平方数送DXL1:AND DX,DX ;判
41、断平方数是否为0 JZ L2 ;为0,退出 SUB DX,BX ;平方数减奇数 INC CX ;减奇数的次数加1 ADD BX,2 ;形成下一个奇数 JMP L1L2:MOV ROOT,CX ;保存结果 MOV AH,4CH ;返回DOS INT 21HCODE ENDS END SQROOT程序的基本结构 第五章 汇编语言程序设计3.3.条件控制型条件控制型 在实际工作中,有时循环次数无法事先确定,但循环次数与问题中的某些条件有关,这时就应根据给定的条件满足与否来判断是否结束循环。例424 计算以ARRAY1和ARRAY2为首地址的两个长度都为100个的字数组对应项之和,并把结果送至首地址为
42、SUM的数据区中,且当两个数组中间对应项的和为0时,停止求和。其程序如下:MOVAX,0MOVSI,0FFFEHMOVCX,64HNOZERO:INCSIINCSIMOVAX,ARRAY1SIADDAX,ARRAY2SIMOVSUMSI,AXLOOPNZNOZEROHLT程序的基本结构 第五章 汇编语言程序设计源程序:DATASEGMENTSTRINGDBME$LENGTH1DW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARPUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXSTART:LEASI,STRINGM
43、OVCX,0MOVAL,$LOP:CMPAL,SIJEMOVE1INCCXINCSIJMPLOPMOVE1:MOVLENGTH,CXRETMAINENDPCODEENDSENDMAIN例2在字符串变量STRING中存有一个以$为结尾的ASCII码字符串,现要求出字符串的长度,并把它存入LENGTH单元中。程序的基本结构 第五章 汇编语言程序设计5多重循环程序 一个循环程序中的循环体内还包含一个或多个循环结构,称为双重循环或多重循环程序。例5-10 软件延时程序,延时时间为1s(设CPU的时钟为4.77MHz)。SOFTDLYPROCMOVBL,100;4TDELAY:MOVCX,2801;4T
44、WAIT:LOOPWAIT;(17/5)TDECBL;2TJNZDELAY;(16/4)TRETSOFTDLYENDP在CPU时钟为4.77MHz时,T=1/4.77210ns,内、外循环的延时时间:T内=4+17*(n-1)+5*T10ms,n=2801的取值是以T内的要求和T确定的。T外=4T+100*T内+100*(2+16)*T-12T1s程序的基本结构 第五章 汇编语言程序设计在实际使用的程序中,大多数程序是由一个主程序和若干个子程序组成的。所谓子程序是指人们将那些重复使用的程序段从程序中分离出来,编写成相对独立的、具有特定功能的程序。子程序的特点:通用性重入性子程序嵌套参数传递方式
45、:寄存器堆栈专用存储区子程序的说明文件一般应包括以下几项内容:(1)子程序名:一般取具有象征意义的标识符;(2)子程序的功能:说明子程序完成的具体任务;(3)子程序的输入参数:说明子程序运行时所需的参数以及存放位置;(4)子程序的输出参数:说明子程序运行完毕的结果参数及存放位置;(5)子程序占用寄存器、存储单元情况(未保护部分);(6)子程序嵌套情况;(7)调用示例。现场保护:SUMPROCFARPUSHAXPUSHBXPUSHBPPOPBPPOPBXPOPAXRETSUMENDP程序的基本结构 第五章 汇编语言程序设计DATASEGMENTD0DB0DH,0AHD1DBAHhyKYVdghY
46、hVFiK,$DATAENDSSTACSEGMENTSTA1DW50DUP(?)STACENDSCODESEGMENTASSUMECS:CODE,DS:DATAASSUMESS:STAC,ES:DATASTARPROCFARPUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVES,AXCALLTTLEADI,D1CALLTT1CALLTTLEADI,D1CALLTT2CALLTTRETSTARENDP例:例:内存数据区有大小写混合英文ASCII码字母(以“$”为结束符)。将其转换程全部大写和全部小写,并在屏幕显示这三种字母。程序的基本结构 第五章 汇编语言程序设计
47、TT2PROCGQ:MOVAL,DICMPAL,$JZGQ2CMPAL,aJBGQ1CMPAL,zJAGQ1SUBBYTEPTRDI,20HGQ1:INCDIJMPGQGQ2:RETTT2ENDPCODEENDSENDSTARTTPROCLEADX,D0MOVAH,09HINT21HRETTTENDPTT1PROCGO:MOVAL,DICMPAL,$JZGO2CMPAL,AJBGO1CMPAL,ZJAGO1ADDBYTEPTRDI,20HGO1:INCDIJMPGOGO2:RETTT1ENDP程序的基本结构 第五章 汇编语言程序设计常用常用DOSDOS功能调用功能调用:DOS 规定用中断命令I
48、NT 21H 进入各功能调用子程序的总入口,再为每个功能调用规定一个功能号,以便进入相应的子程序入口。DOS DOS 功能调用方法功能调用方法1)将要调用的功能的功能号送入AH寄存器;2)根据所调用功能的规定设置输入参数;3)用INT 21H 指令转入子程序;4)相应子程序执行完后,可按规定取得输出参数。注意:第二步和第四步并不是每个功能的调用都需要的;若需要输入参数时,第一步和第二步顺序可换。5.6 常用DOS功能调用 DOS 不仅为用户提供了许多可以直接使用的命令,而且也提供了80多个可供汇编程序员直接调用的子程序。这80多个功能调用子程序,大致分为基本输入输出管理、文件管理、目录管理、内
49、存管理、日期和时间设置及其它多种功能。常用DOS功能调用 第五章 汇编语言程序设计从键盘输入一个字符从键盘输入一个字符:1号功能调用:无输入参数格式:MOV AH,1 INT 21H功能:执行1号系统功能调用时,系统等待键盘输入,一旦有键按下,系统先检查是否是Ctrl-Break键,如果是则退出,否则将键入的字符的ASCII码值存入AL寄存器中,并在屏幕上显示该字符。7号功能调用功能:执行7号系统功能调用时,系统等待键盘输入,一旦有键按下,将键入的字符的ASCII码值存入AL寄存器中。8号功能调用功能与1号功能调用类似,检查Ctrl-Break键,但不回显。从键盘输入一个字符串从键盘输入一个字
50、符串:0AH号功能功能:是将键盘输入的字符串写入指定内存缓冲区中。因此必须事先定义一个输入缓冲区:第一个单元存放能输入字符串的最大长度(不能为零);第二个单元保留,以用作填写实际输入的字符个数,从第三个单元开始存放从键盘输入的字符串(以回车键表示字符串的结束)。调用前,要求DS:DX指向输入缓冲区。常用DOS功能调用 第五章 汇编语言程序设计DATA SEGMENT DATA SEGMENT BUFFER DB 50BUFFER DB 50;缓冲区长度缓冲区长度 DB DB?;由由0AH0AH号功能填入实际字符个数号功能填入实际字符个数 DB 50 DUP DB 50 DUP(?);(?);定