资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,微机原理,与汇编语言程序设计,第,6,章,汇编语言程序设计-2,第6章,1,本次课主要教学内容,循环程序根本结构和控制方法,典型循环程序的设计,实例分析,实验安排,第6章,汇编语言程序设计,2,第6章,6.4 循环程序结构和程序设计,1.循环程序根本结构,1初始化:设置循环程序初始状态。,2循环体:重复执行的操作。,3参数修改:计数器值、操作数地址指针等相关信息的变化。,4循环控制:选择恰当条件控制循环的运行和结束。,3,2循环的控制方法,1计数控制法:循环次数N。,正计数法计数器从1计数到N;,倒计数法计数器从N减数到0。,第6章,4,2条件控制法:循环次数N预先不能确定,只能通过测试循环过程中某特定条件是否成立来决定循环的继续执行。,3混合控制法:前两种控制方法的结合。结束循环的条件是已到达预定的循环次数或出现某种退出循环的条件。,第6章,5,第6章,3.单循环程序设计,程序中只需一个循环过程即可完成规定操作。,【例6.13】设计程序完成求1100的累加和,结果送RESULT单元。,循环次数,可采用计数控制方法。程序中用递增计数法实现求累加和。,6,DATASEGMENT,RESULT DW?;定义结果保存单元,CN EQU 100 ;预置计数器终值,DATA ENDS,CODE SEGMENT,ASSUME DS:DATA,CS:CODE,START:MOV AX,DATA ;初始化DS,MOV DS,AX,MOV AX,0 ;累加器清0,MOV CX,1 ;计数器初值为1,7,LP:ADD AX,CX ;求累加和,INC CX ;计数器加1,CMP CX,CN ;CX和计数终值比较,JBE LP ;低于或等于转LP,MOV RESULT,AX;结果送内存单元,MOV AH,4CH ;返回DOS,INT 21H,CODE ENDS,END START ;汇编结束,(6-13.asm),8,【例6.16】,数据段以BUF为首地址区域,存放CN个带符号字节数据,要求将其中正数送入PLUS存储区,负数存入MINUS存储区,。,DATA SEGMENT,BUF DB 12,-15,0,9,-7,-25,DB -65,34,2,11,-1,-2,4,8,CN EQU$-BUF ;计数值,PLUS DB CN DUP(?);正数单元,MINUS DB CN DUP(?);负数单元,DATA ENDS,9,CODE SEGMENT,ASSUME DS:DATA,CS:CODE,START:MOV AX,DATA;初始化DS,MOV DS,AX,MOV SI,OFFSET BUF ;SI指向数据地址,MOV DI,OFFSET PLUS;DI指向正数首址,MOV BX,OFFSET MINUS;BX指向负数首址,MOV CX,CN ;循环次数送CX,10,LP:MOV AL,SI ;取源操作数送AL,TEST AL,80H;测试AL中数的正负,JZ BIG ;为正数转BIG,MOV BX,AL;否那么AL送负数区,INC BX ;负数区地址指针加1,JMP NEXT ;无条件转NEXT,BIG:MOV DI,AL ;AL内容送正数区,INC DI ;正数区地址指针加1,NEXT:INC SI ;原始数据区地址指针加1,LOOPLP ;CX10转LP,MOV AH,4CH ;返回DOS,INT 21H,CODE ENDS,END START ;汇编结束,(6-16.asm),11,【例6.17】,编写程序完成求123N的累加和,直到累加和超过1000为止。,统计被累加的自然数的个数送CN单元,累加和送SUM单元。,第6章,12,DATA SEGMENT,SUM DW?;预留结果单元,CN DW?;预留计数单元,DATAENDS,CODESEGMENT,ASSUME CS:CODE,DS:DATA,START:MOV AX,DATA;初始化DS,MOV DS,AX,MOV AX,0 ;AX初始化为0,MOV BX,0 ;BX初始化为0,13,LP:INC BX ;BX内容加1,ADD AX,BX ;求累加和,CMP AX,1000;与终值比较,JBE LP ;1000转LP,MOV SUM,AX;最后的累加和送内存,MOV CN,BX ;计数结果送内存,MOV AH,4CH;返回DOS,INT 21H,CODEENDS,END START ;汇编结束,(6-17.asm),14,【补充】内存BUF单元存放10个无符号字节数据,找出其中最大数保存在AL存放器中。,从3个方面考虑:,1确定数组中数据起始地址,采用地址指针的变化进行指向。,2设定循环结构初始入口、循环体、判断条件等。,3循环次数,计数判断,用LOOP指令实现规定功能。,15,DATASEGMENT,BUF DB 12H,35H,61H,01H,52H,DB 8AH,9FH,10H,2BH,3FH,CN EQU$-BUF ;定义数组指针变量,DATAENDS,CODE SEGMENT,ASSUME CS:CODE,DS:DATA,START:MOV AX,DATA,MOV DS,AX,MOV BX,OFFSET BUF;取数组偏移地址,MOV CX,CN ;取数据个数,DEC CX ;计数器减1,MOV AL,BX;取第1个数据,INC BX;内存地址加1,16,LP:CMP AL,BX ;两数比较,JA NEXT ;高于转NEXT,MOV AL,BX ;保存大数在AL,NEXT:INC BX ;地址加1,取下一个数,LOOP LP ;CX-10,转LP,MOV AH,4CH ;返回DOS,INT 21H,CODE ENDS,END START ;汇编结束,(B1.asm),17,【例6.18】NUM单元起存有10个无符号字节数据,要求找出其中最大数和最小数,分别存入MAX和MIN单元。,先取第一个数据,将它作为最大数和最小数分别存入AH和AL中,,取第二个数据,分别与最大数和最小数比较,如比AH大那么送AH中;假设比AL小那么送AL中。,再读取第三个数重复上述过程,共需比较9次。,18,DATA SEGMENT,NUM DB 15,23,12,28,120,DB 10,7,0,45,67,CN EQU$-NUM ;设置计数器,MAX DB?;最大数预存单元,MIN DB?;最小数预存单元,DATAENDS,CODESEGMENT,ASSUME DS:DATA,CS:CODE,19,START:MOV AX,DATA,MOV DS,AX,MOV SI,0 ;SI指针初始化,MOV CX,CN ;循环次数送CX,MOV AH,NUMSI;第一个数送AH,MOV AL,NUMSI;第一个数送AL,DEC CX ;CX值减1,LP:INC SI ;指针加1,CMP AH,NUMSI;AH和下一个数比较,JAE BIG ;高于或等于转BIG,MOV AH,NUMSI;将该数送AH,20,BIG:CMP AL,NUMSI;AL和下一个数比较,JBE NEXT ;低于或等于转NEXT,MOV AL,NUMSI;将该数送AL,NEXT:LOOP LP ;CX-10转LP,MOV MAX,AH ;保存最大值,MOV MIN,AL ;保存最小值,MOV AH,4CH ;返回DOS,INT 21H,CODE ENDS,END START,(6-18.asm),21,第6章,4.多重循环程序设计,一个循环体中又出现另一个循环操作即为多重循环,也称循环嵌套。,注意:,1内循环须完整地包含在外循环中,循环可嵌套和并列,但内外循环不能交叉;,22,2可从内循环直接跳到外循环,但不能从外循环直接跳到内循环;,3无论是内循环还是外循环,都不要使循环回到初始化局部,否那么将出现死循环;,4每次完成外循环再次进入内循环时,初始条件必须重新设置。,第6章,23,【补充例题】从键盘输入39之间的数字,用“*号组成三角形图案,如输入数字7,屏幕上显示以以下图案:,*,*,*,*,*,*,*,可采用双重循环,外循环控制行数,内循环控制列数。,24,CODE SEGMENT,ASSUME CS:CODE,START:MOV AH,01H ;键盘输入1个数字至AL,INT 21H,CMP AL,33H ;与数字3比较,JB START ;低于转,CMP AL,39H ;与数字9比较,JA START ;高于转,SUB AL,30H ;ASCII码转换为数字,MOV CL,AL ;保存至AL中,MOV CH,0 ;CH清0,MOV DL,0DH ;输出回车,MOV AH,02H,INT 21H,MOV DL,0AH ;输出换行,INT 21H,25,AA:PUSH CX ;保存循环次数,BB:MOV DL,*;输出“*,MOV AH,02H,INT 21H,LOOP BB ;内循环,MOV DL,0DH ;输出回车,INT 21H,MOV DL,0AH ;输出换行,INT 21H,POP CX,LOOP AA ;外循环,EXIT:MOV AH,4CH,INT 21H,CODE ENDS,END START,(BB.ASM),26,思考:在本例根底上,假设要在屏幕上显示出以以下图案,应如何设计程序?,*,*,*,*,*,*,*,*,27,【例6.19】数据段中有一组带符号数据,从NUM单元开始存放,编程实现将它们按从小到大顺序排序。排序后依然放在原来存储区。,逐次比较法:,将第一个数与后面N-1个数逐一比较,如后面数小于第一个数,那么互换位置,否那么第一个数继续与下一个数进行比较。,经过N-1次比较后,最小数放到第一个存储单元。,28,然后从第二个数开始,将它与其后N-2个数逐一比较,经N-2次比较后,第二个最小值被放到第二个存储单元依次类推,可实现数据升序排列。,排序算法可用双重循环结构实现:,内循环执行一次,完成一次比较;,外循环执行一次,得到一个最小数。,外循环执行N-1次,可完成数据升序排列。,第6章,29,DATASEGMENT,A DB 9,-1,3,7,-9,DB 0,-3,-5,1,5,CN EQU$-A,DATAENDS,CODESEGMENT,ASSUME CS:CODE,DS:DATA,START:MOV AX,DATA,MOV DS,AX,MOV SI,0 ;指针SI初始化,MOV CX,CN-1 ;循环次数送CX,30,LP1:MOV DI,SI ;保存中间结果,INC DI ;地址加1,PUSH CX ;CX入栈,保存中间值,MOV AL,ASI;取数据到AL中,LP2:CMP AL,ADI;两数比较,JLE NEXT ;小于或等于转NEXT,XCHG AL,ADI;否那么交换两数,MOV ASI,AL ;结果送内存,第6章,31,NEXT:INC DI ;DI指针调整,LOOP LP2 ;CX-1不为0转LP2,INC SI ;SI指针调整,POP CX ;CX出栈,LOOP LP1 ;CX-1不为0转LP1,MOV AH,4CH,INT 21H ;返回DOS,CODE ENDS,END START;汇编结束,(6-19.asm),32,思考:此题假设要求将排序好后的数据存放在另一个规定的存储区,即不占用原来的存储区,应如何处理?,33,完成?学习与实验指导?中的相关实验;,验证课本上的相关程序;,验证本次课讲的例题;,自行编程。,1.实验内容与要求,上机实验,34,上机实验,2.实验时间,本周五的1单元。,上午8:009:45,3.上机地点,软件2实验室,35,4.实验报告,本次实验完成后每人写出一份完整程序的实验报告,包括实验目的、内容、过程、结果窗口截图、总结、体会和收获等。,第7周周五前上交实验报告电子稿,发至邮箱:,上机要求,36,本次课内容到此结束,谢 谢!,第6章,37,
展开阅读全文