1、2022-5-25汇编语言程序设计16.1 概述概述6.2 顺序程序设计顺序程序设计6.3 分支程序设计分支程序设计6.4 循环程序设计循环程序设计第第6 6章章 结构化程序设计方法结构化程序设计方法2022-5-25汇编语言程序设计2第6章 结构化程序设计方法(1) (1) 分析问题。分析问题。对问题进行充分的分析,确定问题是对问题进行充分的分析,确定问题是什么,解决问题的步骤又是什么。什么,解决问题的步骤又是什么。(2) (2) 确定算法和数据结构。确定算法和数据结构。根据问题的分析结果,选择合适的解根据问题的分析结果,选择合适的解决方案即算法。决方案即算法。(3) (3) 编制程序。编制
2、程序。将算法和数据结构等转换成程序代码。将算法和数据结构等转换成程序代码。(4) (4) 调试程序。调试程序。在计算机上实际运行,进行程序的测在计算机上实际运行,进行程序的测试和调整,直至获得预期的结果。试和调整,直至获得预期的结果。6.1 概述概述程序设计的一般步骤程序设计的一般步骤2022-5-25汇编语言程序设计36.1 概述汇编语言程序设计的一般步骤:汇编语言程序设计的一般步骤:1. 1. 分析问题,抽象出描述问题的数学模型。分析问题,抽象出描述问题的数学模型。 2. 2. 确定确定解决问题的解决问题的算法算法或算法思想。或算法思想。3. 3. 绘制绘制流程图流程图或结构图。或结构图。
3、4. 4. 分配存储空间及工作单元分配存储空间及工作单元( (包括寄存器包括寄存器) )。5. 5. 逐条逐条编写程序编写程序。6. 6. 静态检查。静态检查。7. 7. 上机上机运行运行调试调试。2022-5-25汇编语言程序设计4(1 1)任何程序都可以由)任何程序都可以由3 3种基本结构程序种基本结构程序构成构成 顺序结构顺序结构 分支分支( (条件选择条件选择) )结构结构 循环结构循环结构 (2 2)每一个结构只有一个入口和一个出口)每一个结构只有一个入口和一个出口结构化程序设计原则:结构化程序设计原则:6.1 概述 在汇编语言中,选择和循环结构必须通过比较或测试指令、算术逻辑指令、
4、条件转移指令和循环指令等来完成。2022-5-25汇编语言程序设计5第6章 结构化程序设计方法 顺序程序结构是完全按顺序逐条执顺序程序结构是完全按顺序逐条执行的指令序列。即指令指针行的指令序列。即指令指针IPIP顺序往下,顺序往下,不发生跳变。不发生跳变。6.2 顺序结构程序设计顺序结构程序设计 在程序中大量以程序段出现。顺序程在程序中大量以程序段出现。顺序程序设计是复杂程序设计的基础。序设计是复杂程序设计的基础。特点:无分支、无循环。特点:无分支、无循环。顺序程序举例顺序程序举例 例例1 1 将一字节数据从数据段将一字节数据从数据段的某个单元传送到另一单元。的某个单元传送到另一单元。DATA
5、DATASEGMENTSEGMENTFIRSTFIRSTDBDB7AH7AHSECONDSECONDDBDB?DATADATAENDSENDSCODECODESEGMENTSEGMENTASSUME CSASSUME CS:CODECODE,DSDS:DATADATASTARTSTART:MOVMOVAXAX,DATADATAMOVMOVDSDS,AXAXMOVMOVALAL,FIRSTFIRSTMOVMOVSECONDSECOND,ALALMOVMOVAHAH,4CH4CHINTINT21H21HCODECODEENDSENDSENDENDSTARTSTART6.2 顺序结构程序设计2022
6、-5-25汇编语言程序设计62022-5-25汇编语言程序设计76.2 顺序结构程序设计DATADATASEGMENTSEGMENTBUFBUFDBDB7AH7AH,48H48HSUMSUMDBDB?DATADATAENDSENDSCODECODESEGMENTSEGMENTASSUME CSASSUME CS:CODECODE,DSDS:DATADATASTARTSTART:MOVMOVAXAX,DATADATAMOVMOVDSDS,AXAXMOVMOVALAL,BUFBUFADDADDALAL,BUF+1BUF+1MOVMOVSUMSUM,ALALMOVMOVAHAH,4CH4CHINTI
7、NT21H21HCODECODEENDSENDSENDENDSTARTSTART 例例2 2 将存储器中的两将存储器中的两个字节数相加,结果存个字节数相加,结果存入另一单元。入另一单元。顺序程序举例顺序程序举例顺序程序举例顺序程序举例 例例3 3 按公式按公式Y=XY=X X-X-5050编程。编程。:X XDBDB45H45HY YDWDW?:MOVMOV ALAL,X XMULMUL ALALAUBAUB AXAX,5050MOVMOV Y Y,AXAX:6.2 顺序结构程序设计2022-5-25汇编语言程序设计8顺序程序举例顺序程序举例 例例4 4 将一字节压缩型将一字节压缩型BCDBC
8、D码转换为两个码转换为两个ASCIIASCII码。码。:BCDBUFBCDBUFDBDB59H59HASCBUFASCBUFDBDB2 DUP(?)2 DUP(?):MOVMOVALAL,BCDBUFBCDBUFMOVMOVBL,ALBL,ALMOVMOVCL,4CL,4SHRSHRBL,CLBL,CLADDADDBL,30HBL,30HMOVMOVASCBUF,BLASCBUF,BLANDANDAL,0FHAL,0FHADDADDAL,30HAL,30HMOVMOVASCBUF+1ASCBUF+1,ALAL:6.2 顺序结构程序设计2022-5-25汇编语言程序设计9顺序程序举例顺序程序举例
9、 例例5 5 单字节压缩型单字节压缩型BCDBCD数的加法运算。(考虑进数的加法运算。(考虑进位)位):A ADBDB59H59HB BDBDB81H81HC CDBDB2 DUP(?) 2 DUP(?) :MOVMOV ALAL,A AADDADD ALAL,B BDAADAAMOVMOV C C,ALALLAHFLAHFANDAND AHAH,01H01HMOVMOV C+1C+1,AHAH:S Z _ A _ P _ CS Z _ A _ P _ C6.2 顺序结构程序设计2022-5-25汇编语言程序设计10 例例66用查表法完成将从键盘输入的一位十用查表法完成将从键盘输入的一位十进制
10、数转换为对应的平方值。进制数转换为对应的平方值。:SQUSQU DBDB0,1,4,9,16,25,36,49,64,810,1,4,9,16,25,36,49,64,81BUFBUF DBDB? ?:MOVMOV AHAH,1 1INTINT 21H21HANDAND AL,OFHAL,OFHLEALEA BXBX,SQUSQUXLATXLATMOVMOV BUFBUF,ALAL:6.2 顺序结构程序设计2022-5-25汇编语言程序设计112022-5-25汇编语言程序设计12第6章 结构化程序设计方法 分支程序结构分支程序结构根据某些条件根据某些条件进行逻辑判断,当满足时进行某种处进行逻
11、辑判断,当满足时进行某种处理;当不满足时进行另一种处理。理;当不满足时进行另一种处理。6.3 分支结构程序设计分支结构程序设计用条件转移指令实现,实用条件转移指令实现,实现计算机的逻辑判断能力。现计算机的逻辑判断能力。特定特定: :只执行二分支或多分支中的一个分支。只执行二分支或多分支中的一个分支。一、分支结构的两种形式:一、分支结构的两种形式: 二分支结构二分支结构 多分支结构多分支结构 6.3 分支结构程序设计2022-5-25汇编语言程序设计131.二分支结构6.3 分支结构程序设计2022-5-25汇编语言程序设计14 条件条件分支程序段分支程序段1 1分支程序段分支程序段2 2 条件
12、条件分支程序段分支程序段2 2双分支程序相当于高级语言中的双分支程序相当于高级语言中的IF-THEN-ELSEIF-THEN-ELSE语言。语言。右图只对其中之一分支进行处理,也称为右图只对其中之一分支进行处理,也称为单分支结构单分支结构。2.多分支结构多分支程序相当于高级语言中的多分支程序相当于高级语言中的CASE语句。语句。 条件条件程序段程序段1 1程序段程序段2 2程序段程序段n n.条件条件1 1条件条件2 2条件条件n n6.3 分支结构程序设计2022-5-25汇编语言程序设计15注意:注意:在分支程序的两种结构中,无在分支程序的两种结构中,无论条件是否满足,论条件是否满足,只能
13、走一个分支只能走一个分支,不可能同时走两个分支。不可能同时走两个分支。且程序只有且程序只有一个入口一个出口一个入口一个出口。6.3 分支结构程序设计2022-5-25汇编语言程序设计161.1.二分支程序的一般结构二分支程序的一般结构一般要有产生一般要有产生条件、测试、定向、标条件、测试、定向、标号号四个部分组成。四个部分组成。也就是先通常用也就是先通常用CMPCMP、TESTTEST、SUBSUB、ANDAND和移位指令等,影响标志位,再使用分和移位指令等,影响标志位,再使用分支转移指令。支转移指令。如:如:CMPCMPAXAX,0 0;条件条件JCJCNEXTNEXT;测试、定向测试、定向
14、:NEXT:NEGNEXT:NEGAXAX;标号标号二、二分支程序设计二、二分支程序设计6.3 分支结构程序设计2022-5-25汇编语言程序设计17(1)(1)单分支结构一单分支结构一: : ; ;程序段程序段1 1: :; ;产生条件产生条件JCCJCC BRANCH BRANCHS2S2:: :; ;程序段程序段2 2: :HLTHLTBRANCHBRANCH:: :; ;分支程序段分支程序段: : :JMPJMPS2S2S2:S2:否否是是BRANCHBRANCH:分支程序段分支程序段程序段程序段1 1产生条件产生条件条件?条件?程序段程序段2 26.3 分支结构程序设计2022-5-
15、25汇编语言程序设计18(2)(2)单分支结构二单分支结构二S1S1: : :; ;程序段程序段1 1: :; ;产生条件产生条件JCCJCCS2S2; ;条件满足,转条件满足,转S2S2BRANCHBRANCH:: :; ;分支程序段分支程序段: : :S2S2: : :; ;程序段程序段2 2: :HLTHLT; ;结束结束S2:否是是BRANCHBRANCH:分支程序段分支程序段程序段程序段1 1产生条件产生条件条件?条件?程序段程序段2 26.3 分支结构程序设计2022-5-25汇编语言程序设计19MOVMOV ALAL,X XCMPCMP ALAL,0 0JLJLB BS2S2:M
16、OVMOV Y Y,ALALHLTHLTB B: NEGNEG ALALJMPJMP S2S2MOVMOV ALAL,X XCMPCMP ALAL,0 0JGEJGE S2S2NEGNEG ALALS2S2:MOVMOV Y Y,ALALHLTHLT例:求例:求Y=|A|Y=|A|6.3 分支结构程序设计2022-5-25汇编语言程序设计20(3)(3)双分支结构一双分支结构一S1S1: : :程序段程序段1 1: :; ;产生条件产生条件JCCJCC BRANCH BRANCH: :; ;分支程序段分支程序段1 1: :S2S2: : :; ;程序段程序段2 2: :HLTHLT; ;结束结
17、束BRANCHBRANCH:: :; ;分支程序段分支程序段2 2: :JMPJMPS2S2S2:S2:否否是是BRANCHBRANCH:分支程序段分支程序段2 2程序段程序段1 1产生条件产生条件条件?条件?程序段程序段2 2分支程序段分支程序段1 16.3 分支结构程序设计2022-5-25汇编语言程序设计21(4)(4)双分支结构二双分支结构二S1S1: : :; ;程序段程序段1 1: :; ;产生条件产生条件JCCJCC BRANCH BRANCH: :; ;分支程序段分支程序段1 1: :JMP JMP S2S2BRANCHBRANCH:: :; ;分支程序段分支程序段2 2: :
18、S2:S2: :; ;程序段程序段2 2: :HLTHLTS2:S2:否否是是BRANCHBRANCH:分支程序段分支程序段2 2程序段程序段1 1产生条件产生条件条件?条件?程序段程序段2 2分支程序段分支程序段1 16.3 分支结构程序设计2022-5-25汇编语言程序设计22ANDAND ALAL,0FH0FHCMPCMP ALAL,1010JLJLB BADDADD ALAL,37H37HS2S2:MOVMOV DLDL,ALALMOVMOV AHAH,2 2INTINT 21H21HHLTHLTB B: ADDADD ALAL,30H30HJMPJMP S2S2ANDAND ALAL
19、,0FH0FHCMPCMP ALAL,1010JGEJGE B BADDADD ALAL,30H30HJMPJMP S2S2B B: ADDADD ALAL,37H37H S2S2:MOVMOV DLDL,ALALMOVMOV AHAH,2 2INTINT 21H21HHLTHLT例:将例:将ALAL中的一位十六进制数显示出来。中的一位十六进制数显示出来。6.3 分支结构程序设计2022-5-25汇编语言程序设计23ANDAND ALAL,0FH0FHCMPCMP ALAL,1010JLJLB BADDADD ALAL,37H37HS2S2:MOVMOV DLDL,ALALMOVMOV AHA
20、H,2 2INTINT 21H21HHLTHLTB B: ADDADD ALAL,30H30HJMPJMP S2S2改为单分支形式:改为单分支形式:ANDAND ALAL,0FH0FHCMPCMP ALAL,1010JLJLB BADDADD ALAL,7 7B B: ADDADD ALAL,30H30H MOVMOV DLDL,ALALMOVMOV AHAH,2 2INTINT 21H21HHLTHLT例:将例:将ALAL中的一位十六进制数显示出来。中的一位十六进制数显示出来。6.3 分支结构程序设计2022-5-25汇编语言程序设计242.2.双分支程序设计举例双分支程序设计举例SOURC
21、ESOURCEDB 12,78DB 12,78MAX MAX DB ?DB ?: :MOV AL,SOURCEMOV AL,SOURCE CMP AL,SOURCE+1CMP AL,SOURCE+1 JNC BRANCHJNC BRANCH MOV AL,SOURCE+1MOV AL,SOURCE+1BRANCH:BRANCH: MOV MAX,ALMOV MAX,AL : : 例例1 1 比较两个无符号数的大小,把大数存比较两个无符号数的大小,把大数存入入MAXMAX单元。单元。EP601.asm6.3 分支结构程序设计2022-5-25汇编语言程序设计25B L O C KB L O C
22、KD B D B S e a r c h a l a r g e s t S e a r c h a l a r g e s t character!character!COUNT COUNT EQUEQU $-BLOCK$-BLOCK 例例3 3 设在一字符串中,找出设在一字符串中,找出ASCIIASCII值最大的显示。值最大的显示。EP603.asmLEA LEA SI,BLOCKSI,BLOCK MOV MOV CX,COUNT-1CX,COUNT-1 MOV MOV AL,SIAL,SI INC INC SISICOMP:CMPCOMP:CMP AL,SIAL,SI JA JA NEX
23、T NEXT MOVMOV AL,SIAL,SINEXT:INCNEXT:INC SISI LOOP COMP LOOP COMP MOV MOV DL,ALDL,AL MOV MOV AH,2AH,2 INT 21HINT 21H6.3 分支结构程序设计2022-5-25汇编语言程序设计26START: START: MOVMOV AL,AL,5D5DH H MOV MOV BL,ALBL,AL MOV MOV CL,4CL,4 SHR SHR AL,CLAL,CL CMP CMP AL,0AHAL,0AHJL JL ADD_0ADD_0 ADD ADD AL,7AL,7ADD_0: ADD
24、_0: ADD ADD AL,30HAL,30H MOV MOV AH,2AH,2 MOV MOV DL,ALDL,AL INT INT 21H21H 例例4 4 设将设将ALAL中的无符号数,按十六进制显示。中的无符号数,按十六进制显示。ANDAND BL,0FHBL,0FH CMP CMP BL,0AHBL,0AH JL JL ADD_30HADD_30H ADD ADD BL,7BL,7ADD_30H:ADD_30H: ADDADD BL,30HBL,30H MOVMOV DL,BLDL,BL MOV MOV AH,2AH,2INT INT 21H21H MOV MOV AH,4CHAH
25、,4CH INT INT 21H21H6.3 分支结构程序设计2022-5-25汇编语言程序设计27 EP604.asm 例例55判断变量判断变量X X的值是否为的值是否为“偶数偶数”。6.3 分支结构程序设计2022-5-25汇编语言程序设计28CODESEGMENTASSUMECS: CODESTART:JMPBEGINXDB?; 被测试的数,汇编之前置入被测试的数,汇编之前置入YESDB0AH, 0DH, “Its a even number.”, 0AH, 0DH, $NODB0AH, 0DH, “Its a odd number.”, 0AH, 0DH, $BEGIN:PUSHCSP
26、OPDS6.3 分支结构程序设计2022-5-25汇编语言程序设计29TEST X, 1;测试;测试X的最低位,确定是否为偶数的最低位,确定是否为偶数JZEVN;ZF=1,该数是偶数,转向,该数是偶数,转向“EVN”ODD: LEADX, NO;否则,该数是奇数;否则,该数是奇数MOV AH, 9INT21H;输出奇数的相关信息;输出奇数的相关信息JMPDONE;跳过程序;跳过程序“EVN”EVN: LEADX, YESMOV AH, 9INT21H;输出偶数的相关信息;输出偶数的相关信息DONE:MOV AX, 4C00HINT21HCODEENDSENDSTART如果两个如果两个“平行平行
27、”分支有相同的处理过程,分支有相同的处理过程,可以把它们可以把它们“合并合并” ” :6.3 分支结构程序设计2022-5-25汇编语言程序设计30TEST X, 1;测试;测试X的最低位,确定是否为偶数的最低位,确定是否为偶数JZEVN;ZF=1,该数是偶数,转向,该数是偶数,转向“EVN”ODD: LEA DX, NO;否则,该数是奇数;否则,该数是奇数JMP DONE;跳过程序;跳过程序“EVN”EVN: LEA DX, YES;该数是偶数;该数是偶数DONE:MOV AH, 9INT21H;输出该数的相关信息;输出该数的相关信息MOV AX, 4C00HA A DB 12DB 12B
28、B DB 78DB 78: MOV AL,AMOV AL,A CMP B,ALCMP B,AL JAE BGAJAE BGA MOV DL,AMOV DL,A MOV DH,BMOV DH,B JMP COMJMP COM 例例5 5 设设A A、B B两单元各有一个无符号数,要两单元各有一个无符号数,要求根据大小显示求根据大小显示“ABAB”或或“BABA”。EP605.asmBGA:BGA: MOV DL,BMOV DL,B MOV DH,AMOV DH,ACOM:COM: MOV AH,2MOV AH,2 INT 21HINT 21H MOV DL,MOV DL, INT 21HINT
29、21H MOV DL,DHMOV DL,DH INT 21HINT 21H6.3 分支结构程序设计2022-5-25汇编语言程序设计31三、多分支程序设计三、多分支程序设计1.1.复合选择结构复合选择结构2.2.地址表法地址表法3.3.跳转表法跳转表法4.4.逻辑分解法逻辑分解法6.3 分支结构程序设计2022-5-25汇编语言程序设计32用多条条件转移指令组合实用多条条件转移指令组合实现。现。一次判断产生两条分支,一次判断产生两条分支,N N次判断产生次判断产生N+1N+1条分支。条分支。程序段程序段4 4程序段程序段1 1程序段程序段2 2程序段程序段3 3条件条件1 1条件条件2 2条件
30、条件3 36.3 分支结构程序设计2022-5-25汇编语言程序设计331.1.复合选择结构复合选择结构 例例6 6 符号函数。符号函数。EP606.asmEP606.asm1 1X0X0Y=Y=0 0X=0X=0-1-1X0X0X X DB DB 89H89HY Y DB DB ? ?: MOVMOV AL,XAL,X CMP CMP AL,0AL,0 JGE JGE BIGPRBIGPR MOV MOV Y,0FFHY,0FFH JMPJMP COMCOMBIGPR: BIGPR: JE JE EQUPREQUPR MOVMOV Y,1Y,1 JMPJMP COMCOMEQUPR: EQU
31、PR: MOVMOV Y,0Y,0COM: COM: MOVMOV AH,4CHAH,4CH INTINT 21H21H6.3 分支结构程序设计2022-5-25汇编语言程序设计34方法方法1 1,逐项排除,逐项排除6.3 分支结构程序设计2022-5-25汇编语言程序设计35CMP X, 0 JGPLUS JEZEROMINUS: MOVY, -1 JMP DONEPLUS: MOVY, 1 JMP DONEZERO: MOVY, 0DONE:方法方法2 2,逐项确认,逐项确认 例例77从键盘上输入一个小写字母,显示该从键盘上输入一个小写字母,显示该字母的前导和后继。字母的前导和后继。EP6
32、07.asmEP607.asm6.3 分支结构程序设计2022-5-25汇编语言程序设计36DATASEGMENTPROMPT DB 0DH, 0AH, “ Input a lowercase letter: $”;提示提示ERR_MSG DB 0DH, 0AH, “ Input error . $”;输入错误警告;输入错误警告BUFDB 0DH, 0AH, Prev: ;输出缓冲区;输出缓冲区PREVDB 20HDB 0DH, 0AH, Succ: SUCCDB 20HDB 0DH, 0AH, $DATAENDS6.3 分支结构程序设计2022-5-25汇编语言程序设计37CODESEGME
33、NTASSUMECS: CODE, DS: DATASTART:MOV AX, DATAMOV DS, AXINPUT:LEADX, PROMPTMOV AH, 9INT21H;输出提示信息;输出提示信息MOV AH, 1INT21H;输入一个字符;输入一个字符CMP AL, a;输入正确性检查;输入正确性检查JBERRORCMP AL, zJAERROR6.3 分支结构程序设计2022-5-25汇编语言程序设计38MOV BL, AL;计算;计算“前导前导”字母字母DECBLCMP BL, aJBSKIP1;“前导前导”非字母,跳过非字母,跳过MOV PREV, BL;保存;保存“前导前导”
34、字母字母SKIP1:INCAL;计算;计算“后继后继”字母字母CMP AL, zJASKIP2;“后继后继”非字母,跳过非字母,跳过MOV SUCC, AL;“后继后继”为字母,保存为字母,保存SKIP2:LEA DX, BUF;输出;输出“前导前导”和和“后继后继”字母字母MOV AH, 09HINT21H6.3 分支结构程序设计2022-5-25汇编语言程序设计39 JMPEXIT;跳过出错处理程序;跳过出错处理程序ERROR:LEA DX, ERR-MSG;显示出错信息;显示出错信息 MOV AH, 09HINT21HJMPINPUT;要求重新输入;要求重新输入EXIT:MOV AX,
35、4C00H;返回;返回OSINT21HCODEENDSENDSTART2.2.地址表法地址表法其设计思想是在数据段中定义一其设计思想是在数据段中定义一张地址表,将各个分支程序段的入口张地址表,将各个分支程序段的入口地址放入表中,然后根据各分支程序地址放入表中,然后根据各分支程序的编号,在地址表中找出转向某个分的编号,在地址表中找出转向某个分支程序的入口地址。支程序的入口地址。表地址表地址= =地址表首址地址表首址+ +编号编号* *2 26.3 分支结构程序设计2022-5-25汇编语言程序设计40例:设有例:设有0 0,1 1,N N,共,共N+1N+1个个分支程序,各分支程序的入口分别为分
36、支程序,各分支程序的入口分别为ADD0ADD0,ADD1ADD1,ADDNADDN。DATADATASEGMENTSEGMENTNUMNUMDBDBN NADTABADTABDWDWADD0ADD0,ADD1ADD1,ADDNADDNDATADATAENDSENDS6.3 分支结构程序设计2022-5-25汇编语言程序设计41:MOVMOV AHAH,0 0MOVMOV ALAL,NUMNUMADDADD AXAX,AXAXMOVMOV SISI,AXAXMOVMOV BXBX,ADTABSIADTABSIJMPJMP NEAR PTR BXNEAR PTR BX:代码段中:代码段中:ADDR
37、0ADDR0:ADDR1ADDR1:ADDRNADDRN:6.3 分支结构程序设计2022-5-25汇编语言程序设计423.3.转移表法转移表法与地址表法类似,不同的是表中与地址表法类似,不同的是表中建立的是建立的是转移指令转移指令表。表。BRATABBRATAB: JMPJMP SHORT M0SHORT M0JMPJMP SHORT M1SHORT M1:JMPJMP SHORT M9SHORT M9M0M0:M1M1:M9M9:6.3 分支结构程序设计2022-5-25汇编语言程序设计432022-5-25汇编语言程序设计44第6章 结构化程序设计方法循环结构循环结构也称也称“重复结构重
38、复结构”,重,重复执行一组指令若干次,用有限长度复执行一组指令若干次,用有限长度的程序完成大量的处理任务,实现计的程序完成大量的处理任务,实现计算机的重复操作。算机的重复操作。6.4循环程序设计循环程序设计几乎所有的应用程序中都离不开循环结构几乎所有的应用程序中都离不开循环结构一、循环程序的结构一、循环程序的结构2022-5-25汇编语言程序设计45(1 1)初始化部分:初始化部分:为循环做准备,如累加器为循环做准备,如累加器清零,设置地址指针和计数器的初始值等。清零,设置地址指针和计数器的初始值等。(2 2)工作部分:工作部分:实现循环的基本操作,也就实现循环的基本操作,也就是需要重复执行的
39、一段程序。是需要重复执行的一段程序。(3 3)修改部分:修改部分:修改指针、计数器的值,为修改指针、计数器的值,为下一次循环做准备。下一次循环做准备。(4 4)控制部分:控制部分:判断循环条件,结束循环或判断循环条件,结束循环或继续循环。继续循环。1.1.循环一般由以下循环一般由以下4 4个部分组成:个部分组成:6.4 循环程序设计2022-5-25汇编语言程序设计46(1 1)先判断后循)先判断后循环,即环,即WHILEWHILE循环。循环。2.2.根据循环结束判断在循环中的位置,根据循环结束判断在循环中的位置,有以下两种结构的循环:有以下两种结构的循环:(2 2)先循环后判)先循环后判断,
40、即断,即DO-WHILEDO-WHILE循循环或环或DO-UNTILDO-UNTIL循环。循环。循环次数最少为循环次数最少为0 0次次循环次数最少为循环次数最少为1 1次次6.4 循环程序设计2022-5-25汇编语言程序设计476.4 循环程序设计2022-5-25汇编语言程序设计48 循环的次数已知,常用循环的次数已知,常用CXCX寄存器(也寄存器(也可以用其他寄存器或存储器单元)记录循可以用其他寄存器或存储器单元)记录循环的次数(称为环的次数(称为“循环计数器循环计数器”)。进行)。进行减法计数时,循环计数器的初值直接设为减法计数时,循环计数器的初值直接设为循环次数,每循环一次将计数器减
41、循环次数,每循环一次将计数器减1 1,计,计数器减为数器减为0 0时,循环结束。时,循环结束。3.3.按照循环结束的条件,有以下两类循环:按照循环结束的条件,有以下两类循环:(1 1)计数循环:)计数循环:6.4 循环程序设计2022-5-25汇编语言程序设计49 循环的次数事先并不确定,每循环的次数事先并不确定,每次循环开始前或结束后测试某个条次循环开始前或结束后测试某个条件,根据这个条件是否满足来决定件,根据这个条件是否满足来决定是否继续下一次循环。是否继续下一次循环。(2 2)条件循环:)条件循环:6.4 循环程序设计条件循环更具普遍意义条件循环更具普遍意义4.4.循环控制条件的选择循环
42、控制条件的选择(1) (1) 循环次数已知:循环次数作为循环次数已知:循环次数作为循环控制条件,用循环控制条件,用LOOPLOOP指令完成。指令完成。(2) (2) 循环次数已知,但可能会提前循环次数已知,但可能会提前结束:可用结束:可用LOOPZLOOPZ、LOOPNZLOOPNZ指令完成。指令完成。(3) (3) 循环次数未知:根据具体的情循环次数未知:根据具体的情况找出循环结束条件,用况找出循环结束条件,用条件转移条件转移、JMPJMP等完成。等完成。2022-5-25汇编语言程序设计506.4 循环程序设计2022-5-25汇编语言程序设计51计数循环是基本的循环组织方式,计数循环是基
43、本的循环组织方式,用循环计数器的值来控制循环,有用循环计数器的值来控制循环,有时候也可以结合其它条件共同控制。时候也可以结合其它条件共同控制。二、计数循环二、计数循环:LOOPLOOPLOOPZ/LOOPELOOPZ/LOOPELOOPNZ/LOOPNELOOPNZ/LOOPNE6.4 循环程序设计: :START:START:MOVMOV BXBX,1 1; ;项项MOVMOV AXAX,0 0; ;部分和部分和MOVMOV CXCX,100100; ;循环次数循环次数AGAIN:AGAIN:ADDADD AXAX,BXBX; ;循环工作部分循环工作部分INCINC BXBX; ;修改部分修
44、改部分LOOPLOOP AGAINAGAIN; ;循环控制循环控制MOVMOV S S,AXAX; ;存结果存结果: : 例例1 1 计算计算S=1+2+3+100S=1+2+3+100倒计数法2022-5-25汇编语言程序设计526.4 循环程序设计: : MOV MOVCXCX,28012801 ; ;初始化初始化DELAY: LOOPDELAY: LOOP DELAYDELAY; ;循环体、循环控制循环体、循环控制: : 例例2 2 延时程序(延时程序(10ms10ms)2022-5-25汇编语言程序设计536.4 循环程序设计2022-5-25汇编语言程序设计54CRLFMACROMO
45、VAH,2MOVDL,0DHINT 21HMOVDL,0AHINT 21HENDM 例例3 3 从键盘上输入一个字符串(不超从键盘上输入一个字符串(不超过过8080个字符),将它逆序后输出。个字符),将它逆序后输出。6.4 循环程序设计2022-5-25汇编语言程序设计55DATASEGMENTBUFFERDB81, ?, 81 DUP(?)MESSDB0AH, 0DH, Input a string please : $DATAENDSCODESEGMENTASSUME CS:CODE, DS:DATASTART:MOV AX, DATAMOV DS, AXLEADX, MESSMOV AH
46、, 09HINT21H; 输出提示信息输出提示信息MOV AH, 0AHLEADX, BUFFERINT21H; 输入字符串输入字符串6.4 循环程序设计2022-5-25汇编语言程序设计56CRLFLEABX, BUFFER; 缓冲区首地址送缓冲区首地址送BXMOV CL, BUFFER+1MOV CH, 0; 输入字符个数送输入字符个数送CX(循环次数)(循环次数)ADDBX, CXINCBX; 计算字符串末地址送计算字符串末地址送BX(指针)(指针)DISP: MOV DL, BXMOV AH, 02HINT21H; 逆序输出一个字符逆序输出一个字符DECBX; 修改指针修改指针LOOP
47、DISP; 计数循环计数循环CRLF; 输出换行、回车,结束本行输出换行、回车,结束本行MOV AX, 4C00HINT21HCODEENDSENDSTART6.4 循环程序设计 例例44P161P161例例5.15.1把把BXBX寄存器中的二进制数以十寄存器中的二进制数以十六进制的形式在屏幕上显示出来。六进制的形式在屏幕上显示出来。Hb0501.asm上述例子都是倒计数法,正计数法一般不用。2022-5-25汇编语言程序设计576.4 循环程序设计2022-5-25汇编语言程序设计58 在循环次数未知的情况下,一般在循环次数未知的情况下,一般采用条件控制法编写循环程序。采用条件控制法编写循环
48、程序。三、条件循环三、条件循环:6.4 循环程序设计 例例55计算计算S=1 + 2S=1 + 23 + 33 + 34 + 44 + 45 5 + + +N(N+1) + +N(N+1) + ,直到直到N(N+1)N(N+1)项大于项大于200200为止。为止。: :START:START:MOVMOVDXDX,1 1; ;和和MOVMOVBLBL,2 2;N;NNEXT:NEXT:MOVMOVALAL,BLBL; ;INCINCBLBL;N+1;N+1MULMULBLBL;N(N+1);N(N+1)项项ADDADDDXDX,AXAX; ;部分和部分和CMPCMPAXAX,200200; ;
49、 循环控制循环控制JNAJNANEXTNEXT; ;MOVMOVS S,DXDX: :2022-5-25汇编语言程序设计596.4 循环程序设计2022-5-25汇编语言程序设计60DATASEGMENTSTRING DB A string for testing ., 0LENTHDW ?DATAENDSCODESEGMENTASSUME CS: CODE, DS: DATASTART:MOV AX, DATA MOV DS, AX 例例77字符串字符串STRINGSTRING以代码以代码0 0结束,求这结束,求这个字符串的长度(字符个数)。个字符串的长度(字符个数)。6.4 循环程序设计2
50、022-5-25汇编语言程序设计61LEALEA SI, STRING SI, STRING;装载字符串指针;装载字符串指针MOVMOV CX, 0 CX, 0;设置计数器初值;设置计数器初值TST:TST: CMPCMPBYTE PTR SI, 0BYTE PTR SI, 0;比较;比较JEJEDONEDONE;串结束;串结束, ,转向转向DONEDONE保存结果保存结果INCINCSISI;修改指针;修改指针INCINCCX CX ;计数;计数JMPJMPTSTTST;转向;转向TSTTST,继续循环,继续循环DONE:MOV LENTH, CXDONE:MOV LENTH, CX;保存结