汇编循环与分支程序设计.ppt
《汇编循环与分支程序设计.ppt》由会员分享,可在线阅读,更多相关《汇编循环与分支程序设计.ppt(66页珍藏版)》请在课桌文档上搜索。
1、1,第五章 循环与分支程序设计,1、编制汇编语言程序的步骤如下:,分析问题问题性质、目的、要求、已知条件等等。建立相应数学模型。确定算法把实际问题转化为计算机求解的步骤和方法。确定数据结构数据的组织方式,分配存储区绘制流程图形象化描述程序算法。编写程序将流程图用指令集合来实现。应该“简单明了、层次清晰、运算正确、短小精悍”。上机调试验证程序功能,反复修改达到完善。,基本步骤,2,计算机通常不会从程序的第一条指令直接顺序执行到程序的最后一条指令结束,会根据处理事务的不同而具有不同的执行流程。程序的流程是由程序的结构决定的。基本的程序结构有:,2、程序基本结构,顺序结构分支结构循环结构子程序结构,
2、3,程序设计基础一、读键盘输入的两种方法INT 21H 功能调用,1键盘一次输入一个字符的方法,例如,在数据区定义的字符缓冲区如下:DATA SEGMENT Buffer DB 32ACTLEN DB?STRING DB 32 DUP(?)DATA ENDS,2键盘一次输入一个字符串的方法:,串地址存入(DS:DX)、调用参数为10送AH MOV AX,SEG Buffer/Buffer是存放输入字符串的缓冲区 MOV DS,AX/Buffer的段地址存入DS MOV DX,Offset Buffer/Buffer的偏移地址存入DX MOV Buffer,count/设置存入字符串的最大长度并
3、存入Buffer的首字节;MOV AH,0AH/设置INT 21H功能参数为0AH INT 21H/调用DOS功能,By brooks too broad for leaping,4,二、DOS显示功能调用 INT 21H 功能调用1显示单个字符的方法调用参数为2或6(AH)02H/06H;MOV AH,2或MOV AH,6置21H功能调用参数2或6于AH中;MOV DL,&被显示的字符ASCI码放入DL中;INT 21H 2显示一个字符串的方法串地址存入(DS:DX)、调用参数为9送AH说明.被显示的字符串必须以结束;.并且字符串在内存中的段地址存放在DS中,段内偏移地址(即首字符偏移)存放
4、在寄存器DX中;.字符串必须以ASC码值存放;Eg:DATA_SEG segment Sting1 Good Moring$students!,10,13,$DATA_SEG ends MOV AX,SEG sting1/取字符串的段地址并存放在DS中;MOV DS,AX MOV DX,offset sting1/取字符串变量的偏移并放入DX中;MOV AH,09H/AH中设置21H中断参数9;INT 21H/调用21H中断;,5,3光标自动换行(即换行开始显示)的方法:1方法一在需要换行显示的字符前加“回车”和“换行”的ASC码;2方法二用单字符显示方法连续显示“回车”和“换行”(可反序);
5、,6,顺序结构及简单程序设计,程序设计中最基本的结构是如图所示的顺序结构,它只有一个起始框、一个结束框和一至多个执行模块。具有顺序结构的程序叫做简单程序。顺序结构中的执行模块可以是一条指令或完成某一功能的程序。简单程序执行的特点是其中的指令或语句是按顺序执行的,没有分支或循环。,开始,A,B,结束,7,例:设置光标到屏幕左上角。SET_CURPROC MOV AH,2 MOV BH,0 MOV DX,0 INT 10H RET SET_CURENDP 这个程序是顺序执行的,一条指令执行后顺序执行紧接其后的另一条指令。实际上许多程序片段都具有顺序结构。,【例】编制一个程序,求下列公式中的Z值,并
6、将结果存放到RESULT单元中:Z=(AB)10500。设A、B的值分别存放在BUFA、BUFB单元中,运算结果不超过16位。,算 法:在二进制整数中左移1位相当于乘2,右移1位相当于除2,所以可将(A+B)左移3位完成乘以8的操作,然后再与(A+B)左移1位(乘以2)的结果相加得到(A+B)10的计算。,顺序结构程序简单程序结构,分 析:这是一个简单的顺序结构程序,可以直接使用汇编指令完成。,数据结构:存储单元RESULT用来存放结果,BUFA、BUFB存放A、B的值,可用寄存器BX存放中间运算结果。,程序流程图,DATA SEGMENTBUFA DW?BUFB DW?RESULTDW?DA
7、TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV DX,BUFA;DX=A ADD DX,BUFB;DX=A+B MOV BX,DX;BX=DX=A+B MOV CL,3 SAL DX,CL;DX=(A+B)8 SAL BX,1;BS=(A+B)2 ADD DX,BX;DX=(A+B)*8+(A+B)*2=(A+B)*10 SUB DX,500;DX=(A+B)*8-500 MOV RESULT,DX MOV AH,4CH;DOS系统功能调用 INT 21H;返回操作系统CODE ENDS END
8、START,编写程序,【例】用查表法求整数X的平方值(0 x15的整数),将结果存入RESULT单元中。,分析:用查表法求平方值,首先需要建一个用于存放各数平方值的表,以TABLE表示表头,表中依次存放015的平方值,将待求数X放入AL寄存器,表的起始地址放入BX寄存器。使用XLAT查表指令可以将地址BX+AL上的一个字节,即AL数值对应的平方值读入AL中。,程序流程图,编写程序,DATA SEGMENT TABLE DB 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225 X DB 9RESULT DB?DATA ENDSCODE SEGMEN
9、T ASSUME CS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOV AL,X MOV BX,OFFSET TABLE;LEA BX,TABLE XLAT MOV RESULT,AL MOV AH,4CH INT 21HCODE ENDS END START,12,5.1 循环程序设计,5.1.1 循环程序的结构形式,13,5.1.2 循环程序设计方法,无论使用哪种循环结构,循环程序一般应包括以下几部分:循环初始化。包括设置循环次数的初值、地址指针初始设置等。循环体。循环工作主体,包括要重复执行的操作以及循环的修改部分。修改部分包括地址指针的修改、循环控制
10、条件的修改等。循环控制部分:判断循环条件满足与否,常用方法:计数控制、特征值控制、地址边界控制等。常用指令1.LOOP,LOOPZ/LOOPE,LOOPNZ/LOOPNE;2.各种跳转指令;特别要注意循环入口和循环次数的正确设置、地址指针及循环控制条件的修改等。否则会得不到期望的结果。多重循环程序设计循环嵌套 注意事项每次通过外层循环再次进入内层循环时,内层初始条件将重新设置;,14,例5.1:把 BX 中的二进制数以十六进制的形式显示在屏幕上,如:1011 0010 1111 1010 B B2FAH,BX,1,2,3,4,分析:(1)程序结构的确定由题意应该把BX的内容从左到右每4位为一组
11、在屏幕上显示出来,显然这可以用循环结构来完成,循环次数为4。,用何种移位指令?,15,(2)循环体的构成(算法确定)循环体应该包括:(a)BX循环左移一个数位(b)把最右边的数位转换为ASCII(c)显示字符.需要了解相关知识:字符和其ASCII码之间的关系?“0”“9”30H39H,(0+30H=30H)“A”F”41H46H(A+37H=41H=A+30H+7H)如何显示一个字符?(a)将显示字符的ASCII码放入DL寄存器;(b)将AH的内容置为2(功能号);(c)执行INT 21H(DOS 功能调用).,16,(3)循环控制条件分析因为循环次数已知,可以使用计数值作为循环控制条件。可以
12、使用LOOP指令实现。循环移位指令中移位次数存放于CL寄存器中LOOP 指令的循环次数隐含在CX寄存器中注意:两者之间有冲突!如何解决?用PUSH 和 POP指令解决,17,mov cx,4;初始化 push cx mov cl,4;设置移动的位数 rol bx,cl;循环左移 mov al,bl;避免bx中的数被修改 and al,0fh;高4位清零 add al,30h;09 ASCII 30H39H cmp al,3ah jb printit add al,7h;AF ASCII 41H46H mov dl,al mov ah,2 int 21h pop cx loop rotate,方
13、法1(LOOP),rotate:,容易出错处1,容易出错处4,容易出错处3,容易出错处2,printit:,结束,开始,初始化循环计数值,BX循环左移一个数位,把最右边的数位转换为ASCII(即将最右边的数位+30H),是ASCII AF?,加上7,显示一个字符,循环计数值=0?,Y,用隐藏的cx作为控制条件,printit:,18,除了可以使用LOOP指令之外,还可以使用条件跳转指令来实现。如何实现?,19,mov ch,4;初始化rotate:mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30h;09 ASCII 30H39H cmp al,
14、3ah jl printit add al,7h;AF ASCII 41H46Hprintit:mov dl,al mov ah,2 int 21h dec ch jnz rotate,方法2(条件跳转指令),将cx分成ch和cl两部分使用,代替loop rotate,20,mov bx,0newchar:mov ah,1;键盘输入 int 21h sub al,30h jl exit;9退出,分支2 cbw;符号扩展而清除AH xchg ax,bx mov cx,10 mul cx;AX的内容乘10 xchg ax,bx add bx,ax jmp newchar;无条件死循环exit:;输
15、入非法字符时退出,实例2从键盘接收十进制数并存入BX,(010)+1)10+2)10+5,1 2 531H 32H 35H如何把125D变成007DH?,21,mov bx,0newchar:mov ah,1;键盘输入 int 21h sub al,30h jl exit;f退出,分支4add_to:mov cl,4 shl bx,cl mov ah,0 add bx,ax jmp newchar;无条件死循环exit:,实例3从键盘接收十六进制数并存入 BX,1 a f31H 61H 66H,(016)+1)16+0a)16+0f,22,例5.2 在ADDR单元存放着数Y的地址,试编制一程序
16、把Y中1的个数存入COUNT单元中,循环次数固定,完全由循环计数器控制,23,DATA SEGMENTYDW 1234HADDRDW YCOUNTDB?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV DL,0MOV BX,ADDRMOV AX,BXMOV CX,16,REPEAT:SHL AX,1JNC NEXTINC DLNEXT:LOOP REPEATEXIT0:MOV COUNT,DLMOV AH,4CHINT 21HCODEENDSEND START,例5.2,24,例5.2,25,DATA
17、SEGMENTYDW 1234HADDRDW YCOUNTDB?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV DL,0MOV BX,ADDRMOV AX,BXMOV CX,16,REPEAT:SHL AX,1JNC NEXTINC DLNEXT:LOOP REPEATEXIT0:MOV COUNT,DLMOV AH,4CHINT 21HCODEENDSEND START,CMP AX,0JZ EXIT0,例5.2,JMP REPEAT,26,作业:Page193 5.15.8,27,例5.3 在附加
18、段中,有一个首地址为LIST和未经排序的字数组。在数组的第一个字中,存放着该数组的长度,数组的首地址已存放在DI寄存器中,AX寄存器中存放着一个数。要求编制一程序:在数组中查找该数,如果找到此数,则把它从数组中删除。,分析:题目要求在未整序的字数组中删除正数n,因此,解决问题的关键是如何找出全部要删除的正数n的位置。需要考虑如下问题?(1)从那个方向查找及软件实现?(2)找到后如何删除该位置的数及软件实现?(3)如何删除全部的查找到的位置上的数?,28,del_ul proc near cld push di mov cx,es:di add di,2 repne scasw je delet
19、e pop di jmp short exitdelete:jcxz dec_cnt,next_el:mov bx,ex:di mov es:di-2,bx add di,2 loop next_eldec_cnt:pop di dec word ptr es:diexit:retdel_up endp,最后一个是,直接把长度减1,如果有多个需要删除的数,怎么办?,29,例5.4:将正数 n 插入一个已整序的正数字数组。该数组的首地址和末地址分别为ARRAY_HEAD,ARRAY_END。,分析:题目要求在已经排好序的正数数组中插入一个正数n,因此,解决问题的关键是找到要插入正数n的位置。需要
20、考虑如下问题?(1)如何找到插入位置及软件实现?(2)如何插入正数n及软件实现?(3)数组边界问题考虑?,x dw?array_head dw 3,5,15,23,37,49,52,65,78,99 array_end dw 105n dw 32,30,由于数组已经排好序,因此可以将正数n依次和数组中的数进行比较,比较有个方向问题,怎样比较最简单?当遇到第一个比n小的数,记下该位置,该位置的下一个位置就是要插入n 的位置。找到插入位置后,如何在不破坏原来数据顺序基础上插入n呢?数组中将要插入数n位置后的数依次后移一个位置(两个字节),空出要插入位置,将n放入即可。在插入数时,可能遇到特殊情况,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 循环 分支 程序设计
链接地址:https://www.desk33.com/p-257660.html