资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,5,章,循环与分支程序设计,本章要点,1,掌握汇编语言程序设计的基本步骤和顺序程序设计的基本结构形式,2,学会如何分析问题,确定算法,画出程序流程图,分配工作单元和选择合适指令和编写程序的设计思想和方法,3,掌握简单的算术运算程序设计、直接查表法程序设计和简单的代码转换程序设计。,汇编语言程序的设计步骤,1,、分析题意,确定算法,2,、根据算法画出程序框图,3,、根据框图编写程序,4,、上机调试程序,程序的结构,程序有:,顺序、循环、分支和子程序四种结构形式,顺序结构:每条指令按其在程序中的排列顺序执行,5,1,循环程序设计,循环程序的结构形式:,循环程序组成,1,)设置循环的初始状态,2,)循环体。循环工作的主体,由循环的工作部分及修改部分组成。,3,)循环控制部分,LOOP,、,LOOPZ,、,LOOPNZ,在循环体中的使用,循环程序设计方法,例,5,l,试编制一个程序把,BX,寄存器内的二进制数用十六进制数的形式在屏幕上显示出来,二进制到十六进制数转换的程序框图(略),编程方法,-,举例,1,Data segment,mess db Your Hex number is:$,bb db 00110100b,00010010b,Data ends,Prognam segment,assume cs:prognam,ds:data,start:mov ax,data,mov ds,ax,lea dx,mess,mov ah,9,int 21h,mov bx,word ptr bb,mov Ch,4 ;,四个,16,进制数位,循环,4,次,rotate:mov cl,4 ;,rol bx,cl ;,右移四位,mov al,bl,and al,0fh ;,取低,4,位,add al,30h ;,将,16,进制转为,ASCII,码,cmp al,3ah ;,比较,,9,?,JL printit ;,是,0,到,9,的数码,打印,Add al,7h ;,是,A,到,F,,转换,Printit:,mov dl,al ;ASCII,码放,DL,mov ah,2 ;,显示功能,int 21h ;Call DOS,dec ch,jnz rotate,;,是,4,个数位吗?如还不是,继续,mov ah,4ch,int 21h ;return to DOS,prognam ends ;end of segment,end start ;end of assembly,用,JNZ,或,JZ,指令,编程方法,-,举例,2,Data segment,mess db Your Hex number is:$,bb db 00110100b,00010010b,Data ends,Prognam segment,assume cs:prognam,ds:data,start:mov ax,data,mov ds,ax,lea dx,mess,mov ah,9,int 21h,mov bx,word ptr bb,mov CX,4 ;,四个,10,进数位,rotate:push cx,mov cl,4 ;,rol bx,cl ;,右移四位,mov al,bl,and al,0fh ;,取低,4,位,add al,30h ;,将,16,进制转为,ASCII,码,cmp al,3ah ;,比较,,9,?,JL printit ;,是,0,到,9,的数码,打印,Add al,7h ;,是,A,到,F,,转换,用,LOOP,指令,Printit:,mov dl,al ;ASCII,码放,DL,mov ah,2 ;,显示功能,int 21h ;Call DOS,pop cx,loop rotate ;,是,4,个数位吗?如还不是,继续,mov ah,4ch,int 21h ;return to DOS,prognam ends ;end of segment,end start ;end of assembly,编程方法,-,举例,3,Prognam segment,main proc far,assume cs:prognam,start:,push ds ;,保存,data,段地址,设置返回栈,sub ax,ax,Push ax,push bx ;,修改部分,mov bx,1234h ;,修改部分,子程序格式,;main part of program,mov Ch,4 ;,四个,10,进数位,rotate:mov cl,4 ;,rol bx,cl ;,右移四位,mov al,bl,and al,0fh ;,取低,4,位,add al,30h ;,将,16,进制转为,ASCII,码,cmp al,3ah ;,比较,,9,?,JL printit ;,是,0,到,9,的数码,打印,Add al,7h ;,是,A,到,F,,转换,Printit:,mov dl,al ;ASCII,码放,DL,mov ah,2 ;,显示功能,int 21h ;Call DOS,dec ch,jnz rotate ;,是,4,个数位吗?如还不是,继续,pop bx ;,修改部分,ret ;return to DOS,main endp ;end of main part,prognam ends ;end of segment,end ;end of assembly,例,5.2,在,ADDR,单元中存放着数,Y,的地址,试编制一程序把,Y,中,1,的个数存入,COUNT,单元中。,两个问题:,数据段如何定义,需定义哪些变量?,需不需要附加段?,Y DW 1234H,ADDR DW Y,COUNT DB?,算法分析与程序框架,逐位测试,采用,DO-WHILE,的结构,子程序形式的程序:,m502CNT1.asm,程序,datarea segment,addr dw Y,Y dw 1234h ;,修改,count dw?,datarea ends,Prognam segment,assume cs:prognam,ds:datarea,start:mov ax,datarea,mov ds,ax,mov cx,0,mov bx,addr,mov ax,bx,;,将,Y,中数据,=AX,repeat:test ax,0ffffh,jz exit,jns Shift,inc cx,Shift:shl ax,1,Jmp repeat,exit:mov count,cx,mov ax,4c00h,int 21h,Prognam ends,End start,以十进制怎样显示,COUNT,中数据?,如,Y,为双字长数据,本程序应怎样修改?,例,5,3,在附加段中有一个首地址为,LIST,和未经排序的字数组,在数组的第一个字中存放着该数组的长度,数组的首地址已存放在,DI,寄存器中。,AX,寄存器中存放着一个数。要求编制一程序:在数组中查找该数,如果找到此数则把它从数组中删除。,分 析,查找元素可使用串处理指令,:,删除元素可使用循环结构,:,处理方法:,如果找到这一元素则把数组中地址比该元素高的元素 向低地址方向移动二个字,并修改数组长度值,如果找到的元素正好位于数组末尾,则不必移动任何元素,只要修改数组长度值就可以,程序:,m503DelE.asm (,子程序格式,),编程方法,-,举例,1,datarea segment ;define data segment,修改,-,LIST dw 10,65,67,69,71,66,73,71,77,68,72,datarea ends,prognam segment,assume cs:prognam,es:datarea,start:mov ax,datarea,mov es,ax,mov ax,71 ;,如要查数据,71,cld,Push di ;,保存原先,DI,中数据,mov di,offset list ;,取,LIST,地址,Push di ;,保存开始地址,DI,续,mov cx,es:di;,取长度,add di,2,Repne scasw,je delete,Pop di,jmp short exit,delete:jcxz dec_cnt,Next_el:;,移动,mov bx,es:di,mov es:di-2,bx,add di,2,loop next_el,dec_cnt:pop di,dec word PTR es:di,exit:POP DI,MOV AX,4C00H,INT 21H,Prognam ends,End start,例,5,4,将正数,N,插入一个已排序的字数组的正确位置。该数组的首地址和末地址分别为,ARRAY_HEAD,和,ARRAY_END,,其中所有数均为正数且已按递增的次序排列。,分 析,找到应插入数的位置作为循环的结束条件,空出插入数的位置,高地址元素,向高地址方向移一个字,从数组的尾部向头部查找,数据段定义,datarea segment,x dw?,array_head dw 3,5,15,23,37,49,52,65,78,99,array_end dw 105,n dw 32,datarea ends,程序:,m504Sort.asm,例,5,5,设有数组,X,和,Y,。,X,数组中有,X1,,,,,X10,;,Y,数组中有,Y1,,,,,Y10,。试编制程序计算:,Z1,X1+Y1 Z5,X5-Y5 Z8,X8-Y8,Z2,X2+Y2 Z6,X6+Y6 Z9,X9+Y9,Z3,X3-Y3 Z7,X7-Y7 Z10,X10+Y10,Z4,X4-Y4,结果存入,Z,数组。,分 析,用循环程序结构,循环计数值为,10,每次操作:加法或减法,每次应该做哪一种操作,由逻辑尺确定:,0000 0000 1101 1100,最高的,6,位没有意义,程序框图,程序:,chap5m505Calc.asm,例,5.6,试编制一程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不是则退出程序;如是则开始接收键入的字符并顺序存放在首地址为,BUFFER,的缓冲区中(空格符不存入),直到接收到第二个空格符时退出程序。,程序框图,程序,例,5.6,Flag=1,记第一个空字符,5.1.3,多重循环程序设计,多重循环程序设计的基本方法和单重循环程序设计一致,注意控制条件和循环次数:,1,、应分别考虑各重循环的控制条件及其程序实现,相互之间不能混淆;,2,、应注意在每次通过外层循环再次进入内层循环时,初始条件必须重新设置,3,、在多次使用,CX,时,要注意循环次数的保存,例,5,7,有一个首地址为,A,的,N,字数组,请编制程序使该数组中的数按照从大到小的次序整序。,采用起泡排序算法,方法:,从第一个数开始依次对相邻两个数进行比较。如次序对,则不做任何操作;如次序不对,则将这两个数交换位置。,数据段,datarea segment,n equ 12 ;,此处修改,a dw n dup(?),datarea ends,程序:,例,5.7,例,5,8,在附加段中有一个字数组,其首地址已存放在,DI,寄存器中,在数组的第一个字中存放着该数组的长度。要求编制一个程序使该数组中的数按照从小到大的次序排列整齐。,数据段、代码段,data segment,save_cnt dw?,Start_addr dw?,data ends,extra segment ;,修改,len dw 9,14,32,12,87,54,23,42,53,76,extra ends ;,修改,prognam segment,bubble Proc far,assume cs:prognam,ds:data,ES:extra ;,此处修改,start:push ds ;,修改,sub ax,ax,push ax ;,修改,mov ax,
展开阅读全文