1本次课主要教学内容分支程序设计循环程序设计实例分析实验安排汇编语言第4章2第4章4.2.3分支结构程序设计分支结构设计可在不同条件下处理;程序结构清晰,易于阅读及调试;程序中分支由条件转移指令完成;可根据不同转移指令产生的结果状态选择要转移程序段,处理给定问题。3第4章【例1】将键盘输入的小写字母转换为大写字母显示在屏幕上。从键盘接收单个字符;判断接收的是否是小写字母,是则转换,否则不处理,保证输入字符在‘a’和‘z’范围;键盘输入小写字母及转换后结果显示均通过DOS功能调用。4源程序设计如下:CODESEGMENT;代码段定义ASSUMECS:CODESTART:MOVAH,01H;DOS调用的01号功能从键盘输入字符INT21HCMPAL,‘a’;与‘a’的ASCII码比较JBEXIT;低于‘a’,转EXITCMPAL,‘z’;与‘z’的ASCII码比较JAEXIT;高于‘z’,转EXIT5SUBAL,20H;大小写字母相差20HMOVDL,AL;转换后结果送DLMOVAH,02H;DOS调用02号功能,显示结果INT21HEXIT:MOVAH,4CH;返回DOSINT21HCODEEND;代码段结束ENDSTART;汇编结束A3.ASM6【例2】连续将键盘输入小写字母转为大写字母输出,字母之间用“-”号间隔。CODESEGMENTASSUMECS:CODESTART:MOVAH,01H;从键盘输入字符INT21HMOVBL,AL;保存在BL中MOVDL,‘-’;送‘-’号到DLMOVAH,02H;显示字符‘-’INT21HMOVAL,BL;取回键盘输入字符CMPAL,‘a’;与‘a’比较JBEXIT;低于转EXIT7CMPAL,‘z’;与‘z’比较JAEXIT;高于转EXITSUBAL,20H;转换为大写字母MOVDL,AL;结果送DLMOVAH,02H;调屏幕显示INT21HMOVDL,0AH;调换行ASCII码MOVAH,02H;输出换行INT21H8MOVDL,0DH;调回车的ASCII码MOVAH,02H;输出回车INT21HJMPSTART;无条件转STARTEXIT:MOVAH,4CH;返回DOSINT21HCODEENDSENDSTARTA4.ASM9【例3】:有3个无符号字节数无序存放在BUF1开始的存储区,将其从大到小排列并存放在BUF2开始的存储区。原理分析:3个数据分别送AL、BL、CL,在3个寄存器间比较大小,排序后依次存放在BUF2开始的存储区。第4章10存储单元和寄存器分配如下:(1)BUF1为原始数据存储区首址;(2)BUF2为已排序数据存储区首址;(3)AL、BL、CL存放原始数据;(4)SI指向BUF1;(5)DI指向BUF2。第4章11源程序设计如下:DATASEGMENT;数据段定义BUF1DB56H,12H,78HBUF2DB3DUP(?)DATAENDSCODESEGMENT;代码段定义ASSUMECS:CODE,DS:DATABEGIN:MOVAX,DATA;初始化DSMOVDS,AX12MOVSI,OFFSETBUF1;取偏移地址MOVDI,OFFSETBUF2MOVAL,[SI];取内存单元中第1个数据MOVBL,[SI+1];取内存单元中第2个数据MOVCL,[SI+2];取内存单元中第3个数据CMPAL,BL;两数比较JAENEXT1;高于或等于转NEXT1XCHGAL,BL;否则,两数交换13NEXT1:CMPAL,CL;两数比较JAENEXT2;高于等于转NEXT2XCHGAL,CL;否则,两数交换NEXT2:CMPBL,CL;两数比较JAENEXT3;高于等于转NEXT3XCHGBL,CL;否则,两数交换第4章14NEXT3:MOV[DI],AL;保存最大值MOV[DI+1],BL;保存中间值MOV[DI+2],CL;保存最小值MOVAH,4CHINT21HCODEENDSENDBEGINA5.ASM第4章15第4章4.2.4循环结构程序设计1.循环程序基本组成(1)初始化部分:设置循环程序初始状态。(2)循环体:重复执行的操作。(3)参数修改部分:计数器值、操作数地址指针等相关信息的变化。(4)循环控制部分:选择恰当的条件来控制循环的运行和结束。16第4章2.单循环程序设计【例1】编程完成求1~100的累加和,结果送SUM单元。该题循环次数已知,采用计数控制方法。程序中用递增计数法实现求累加和。17DATASEGMENTSUMDW?;预留结果单元CNEQU100;计数终止值DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODESTART:MOVAX,DATA;初始化DSMOVDS,AX18MOVAX,0;累加器清零MOVCX,1;置循环计数初始值LP:ADDAX,CX;求累加和INCCX;计数器加1CMPCX,CN;CX和终止值比较JBELP;小于等于转LPMOVSUM,AX;结果送SUMMOVAH,4CH;返回DOSINT21HCODEENDSENDSTART;汇编结束B1.ASM19【例2】求S=12+22+32+…前N项和,使S值大于1000结束计算。N2可写成N个N相加的形式,采用循环实现计算平方和;判断结果是否大于1000。由于N值从1到N逐级递增,可采用计数器递增实现;设寄存器BX和DX分别保存N值及前N项和。第4章20CODESEGMENTASSUMECS:CODESTART:MOVBX,0;BX保存N值,初值0MOVDX,0;DX保存前N项和LOP1:INCBX;N值递增MOVCX,BX;设置循环次数MOVAX,0;AX清0第4章21LOP2:ADDAX,BX;计算N2LOOPLOP2;(CX)-1≠0转ADDDX,AX;计算前N项和CMPDX,1000;判断JBELOP1;不大于转LOP1MOVAH,4CH;大于,返回DOSINT21HCODEENDSENDSTART;汇编结束B2.ASM22【例3】内存BUF单元开始存放10个无符号字节数组,从中找出最大数和最小数,其值保存在内存MAX和MIN单元中。从以下3个方面考虑:(1)确定数组中数据起始地址,采用地址指针的变化合理指向。(2)设定循环结构的初始入口、循环体、判断条件等。(3)循环次数已知,使用计数器,采用LOOP指令实现规定功能。23DATASEGMENTNUMDB15,23,12,28,100DB10,7,1,45,67DB6DUP(?)MAXDB?MINDB?DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AX24MOVSI,0;设地址指针MOVCX,10;计数初值MOVAH,NUM[SI];第1个数分别送AH和ALMOVAL,NUM[SI]DECCX;计数器减1LP:INCSI;地址加1CMPAH,NUM[SI];后数与前大数比较JAEBIG;高于等于转BIGMOVAH,NUM[SI];保存大数至AH25BIG:CMPAL,NUM[SI];后数与前数比较JBENEXT;低于等于转NEXTMOVAL,NUM[SI];保存小数至ALNEXT:LOOPLP;(CX)-1不为0转LPMOVMAX,AH;保存最大数MOVMIN,AL;保存最小数MOVAH,4CHINT21HCODEENDSENDSTARTB3.ASM26第4章3.多重循环程序设计循环体中又出现另一个循环(循环嵌套)。(1)内循环应完整包含在外循环内,内外循环不能交叉;(2)可从内循环直接跳到外循环,但不能从外循环直接跳到内循环;(3)无论是内循环还是外循环,都不要使循环回到初始化部分,否则将出现死循环;(4)每次完成外循环再次进入内循环时,初始条件须重新设置。27第4章【例4】内存BUF单元区域中存放一组无符号字节数据,编程将数据按从小到大顺序排序,排序后数据仍放在原来存储区中。设计思路:将第一个数与其后N-1个数逐一比较;如前数小于后数则不做任何操作;否则两数交换位置。第一轮比较后最小数放第一个存储单元。依次类推,比较完毕后完成数据从小到大排序。28第4章排序算法可用双重循环结构实现:内循环执行一次,完成一次比较;外循环执行一次,得到一个最小数。外循环执行N-1次,可完成数据升序排列。29DATASEGMENTBUFDB23H,09H,14H,53H,67H,89HDB4FH,20H,05H,10HCNEQU$-BUFDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATA;初始化DSMOVDS,AXMOVCX,CN-1;外循环次数送CXLP1:MOVSI,0;数组起始下标0送SIPUSHCX;外循环计数器入栈30LP2:MOVAL,BUF[SI];取数送ALCMPAL,BUF[SI+1];两数比较JLENEXT;小于或等于转NEXTXCHGAL,BUF[SI+1];两数交换MOVBUF[SI],ALNEXT:INCSI;数组下标加1LOOPLP2;CX-1不为0转LP2POPCX;退出内循环,CX出栈LOOPLP1;CX-1不为0转LP1MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART;汇编结束B4.ASM31思考:本题若要求将排序好后的数据存放在另一个规定的存储区,即不占用原来的存储区,应如何处理?——上机编程解决第4章32【例5】从键盘输入3~9之间的数字,用“*”号组成三角形图案如输入数字7,屏幕上显示以下7行7列的图案:****************************采用双重循环,外循环控制行数,内循环控制列数。33CODESEGMENTASSUMECS:CODESTART:MOVAH,01H;键盘输入1个数字至ALINT21HCMPAL,33H;与数字3比较JBSTART;低于转CMPAL,39H;与数字9比较JASTART;高于转SUBAL,30H;ASCII码转换为数字MOVCL,AL;保存至CL中,计数用MOVCH,0;CH清0MOVDL,0DH;输出回车MOVAH,02HINT21HMOVDL,0AH;输出换行INT21H34AA:PUSHCX;保存循环次数BB:MOVDL,‘*’;输出“*”MOVAH,02HINT21HLOOPBB;内循环MOVDL,0DH;输出回车INT21HMOVDL,0AH;输出换行INT21HPOPCX;恢复循环次数LOOPAA;外循环EXIT:MOVAH,4CHINT21HCODEENDSENDSTARTB5.ASM35思考:在本例基础上,若要在屏幕上显示出以下图案,应如何设计程序?****************************第4章36(1)熟悉分支结构程序设计与操作(2)熟悉循环结构程序设计与操作(3)理解各类指令对标志位的影响(4)进一步熟练掌握汇编语言上机操作技能实验要求1.实验目的及要求37验证课本上的相关程序;验证本次课讲的例题;自行编程——教材:P115五、设计题:4、7题学习指导:15.4,15.5,15.62.实验内容实验要求38实验安排3.实验时间及地点第4周五的1单元——软1机房394.第7周五上交实验报告电子稿——在相关例题或思考与练习题中任选,要求有实验目的、内容、过程、源程序及运行结果、实验总结和收获等内容。实验要求40本次课内容到此结束请做好实验准备第4章