第5章循环与分支程序设计.ppt
《第5章循环与分支程序设计.ppt》由会员分享,可在线阅读,更多相关《第5章循环与分支程序设计.ppt(47页珍藏版)》请在三一文库上搜索。
1、2019/4/11,ch5,第五章,循环与分支程序设计,教学重点,1. 掌握基本程序结构顺序结构、循环结构、分支结构及其汇编语言程序设计 2. 熟悉常见程序设计问题: 数据范围判断(09、AZ、az) 字母大小写转换; 字符串传送、比较等操作 求最大最小值、数据求和、统计字符个数 数组排序,查找,插入,删除,2019/4/11,ch5,(3)分支结构 (4) 子程序结构, 程序结构,(5)复合结构:多种程序结构的组合,(1) 顺序结构 (2) 循环结构,2019/4/11,ch5, 编制汇编语言程序的步骤,(1) 分析题意,确定算法 (2) 根据算法画出程序框图 (3) 根据框图编写程序 (4
2、) 上机调试程序,2019/4/11,ch5,5.0 顺序程序设计,顺序程序完全按指令书写的前后顺序执行每一条指令,是最基本、最常见的程序结构 一般纯粹的顺序结构的程序设计较少。,2019/4/11,ch5,例,data segment X dw 5 Y dw 6 Z dw 7 W dw ? data ends code segment main proc far assume cs:code,ds:data start: push ds,xor ax,ax push ax mov ax,data mov ds,ax mov ax,X add ax,Y add ax,Z mov W,ax re
3、t main endp code ends end start,WX+Y+Z,2019/4/11,ch5,例 代码转换,;查表法,实现一位16进制数转换为ASCII码显示 data segment ASCII db 30h,31h,32h,33h,34h,35h db 36h,37h,38h,39h ;09的ASCII码 db 41h,42h,43h,44h,45h,46h;AF的ASCII码 hex db 0bh ;任意设定一个待转换的一位16进制数 data ends code segment main proc far,2019/4/11,ch5,例 代码转换,assume cs:cod
4、e,ds:data start: push ds xor ax,ax push ax mov ax,data mov ds,ax ;- mov bx,offset ASCII ;BX指向ASCII码表 mov al,hex ;AL取得一位16进制数,正是ASCII码表中位移,2019/4/11,ch5,and al,0fh ;只有低4位是有效的,高4位清0 xlat ;换码:ALDS:BXAL mov dl,al ;入口参数:DLAL mov ah,2 ;02号DOS功能调用 int 21h ;显示一个ASCII码字符 ret main endp code ends end start,例 代
5、码转换,;查表法,实现一位16进制数转换为ASCII码显示 data segment ASCII db 30h,31h,32h,33h,34h,35h db 36h,37h,38h,39h ;09的ASCII码 db 41h,42h,43h,44h,45h,46h;AF的ASCII码 hex db 0bh ;任意设定一个待转换的一位16进制数 data ends code segment main proc far assume cs:code,ds:data start: push ds xor ax,ax push ax mov ax,data mov ds,ax ;- mov bx,of
6、fset ASCII ;BX指向ASCII码表 mov al,hex ;AL取得一位16进制数,正是ASCII码表中位移,and al,0fh ;只有低4位是有效的,高4位清0 xlat ;换码:ALDS:BXAL mov dl,al ;入口参数:DLAL mov ah,2 ;02号DOS功能调用 int 21h ;显示一个ASCII码字符 ret main endp code ends end start,2019/4/11,ch5,5.1 循环程序设计,循环结构一般是根据某一条件判断为真或假来确定是否重复执行循环体 循环指令和转移指令可以实现循环控制,2019/4/11,ch5, 循环程序
7、结构形式,DO-WHILE 结构 DO-UNTIL 结构,2019/4/11,ch5,初始化: 设置循环的初始状态 循环体: 循环的工作部分及修改部分 控制条件:计数控制(LOOP) 特征值控制(LOOPZ/LOOPNZ/ 条件跳转指令), 循环程序结构说明,2019/4/11,ch5,例:把 BX 中的二进制数以十六进制的形式显示在屏幕上,如:1011 0010 1111 1010 B B2FAH,BX,1 2 3 4,2019/4/11,ch5,分析:(1)程序结构的确定 由题意应该把BX的内容从左到右每4位为一组在屏幕上显示出来,显然这可以用循环结构来完成,每次显示一个十六进制数位,因而
8、循环次数是已知的,计数值为4。,(2)循环体的构成(算法确定) 循环体应该包括:二进制到所显示字符的ASCII之间的转换,以及每个字符的显示。 需要了解相关知识:字符和其ASCII码之间的关系? “0”“9” 30H39H, “A”F” 41H5AH 如何显示一个字符? (a)将显示字符的ASCII码放入DL寄存器;(b)将AH的内容置为2(功能号);(c)执行INT 21H(DOS 功能调用)。,2019/4/11,ch5,(3)循环控制条件分析 因为循环次数已知,可以使用LOOP指令实现,但是必须注意:由于循环移位指令中使用CL寄存器作为移位次数寄存器,而LOOP 指令的循环次数隐含在CX
9、寄存器中,因此,必须注意这两者之间的冲突。 除了可以使用LOOP指令之外,还可以使用条件跳转指令来实现。,2019/4/11,ch5, mov cx, 4 ;初始化 rotate: push cx mov cl, 4 rol bx, cl mov al, bl and al, 0fh add al, 30h ; 09 ASCII 30H39H cmp al, 3ah jl printit add al, 7h ; AF ASCII 41H46H printit: mov dl, al mov ah, 2 int 21h pop cx loop rotate ,方法1 (LOOP),2019/4
10、/11,ch5, mov ch, 4 ;初始化 rotate: mov cl, 4 rol bx, cl mov al, bl and al, 0fh add al, 30h ; 09 ASCII 30H39H cmp al, 3ah jl printit add al, 7h ; AF ASCII 41H46H printit: mov dl, al mov ah, 2 int 21h dec ch jnz rotate ,方法2 (条件跳转指令),2019/4/11,ch5,例:将正数 n 插入一个已整序的正数字数组。该数组的 首地址和末地址分别为ARRAY_HEAD, ARRAY_END
11、。,分析:题目要求在已经排好序的正数数组中插入一个正数n,因此,解决问题的关键是找到要出入正数n的位置。需要考虑如下问题? (1)如何找到插入位置及软件实现? (2)如何插入正数n及软件实现? (3)数组边界问题考虑?,2019/4/11,ch5,由于数组已经排好序,因此可以将正数n依次和数组中的数进行比较,比较有个方向问题,这里假设数组在存储单元中按地址递增的方向从小到大依次存放。不妨从大数开始进行比较,当遇到第一个比n小的数,记下该位置,该位置就是要插入n 的位置。 找到出入位置后,如何在不破坏原来数据顺序基础上插入n呢?打个比方:9个同学按高矮依次做在110号椅子上,现在第10个同学按照
12、高矮要做在第5号椅子上,那么如何空出第5号椅子呢,但仍然保持高矮次序?只要9号同学移到10号, 9 10, 8 9, 7 8, 6 7, 5 6就可以了。同样,我们可以如法炮制,数组中将要插入数n位置前的数依次前移一个位置(两个字节),空出要插入位置,将n放入即可。 在插入数时,可能遇到特殊情况,即数n比数组中所有的数都要大,或者小。若比所有的数都大,就不需要移动原数组中的数,直接插入即可;若比所有的数都小,就将数n放在数组的首位置。,2019/4/11,ch5,很显然,查找位置和空出位置的过程就是循环比较的过程,因此采用循环结构来实现,那么,循环条件如何确定呢?其中一种比较容易想到循环条件就
13、是:数组长度(或数组首地址)及K=n,其中K为依次从数组中取出的一个数。 另外,可以充分利用题目中的已知条件即数组中的数均为正数,所以我们可以在数组的开始的前一个位置存放一个负数,不妨存放数-1,这样,在循环控制时就不需要用数组长度来进行控制,可以进一步简化程序的设计。而且需要注意的是,有可能一次都不需要移动数组中的数。因此,应选择DOWHILE 结构形式。,2019/4/11,ch5,2019/4/11,ch5,x dw ? array_head dw 3,5,15,23,37,49,52,65,78,99 array_end dw 105 n dw 32,105,array_head,ar
14、ray_end,n ,x ,2019/4/11,ch5,例:有数组 x(x1,x2,x10) 和 y(y1,y2,y10), 编程计算 z(z1,z2,z10) z1 = x1 + y1 z2 = x2 + y2 z3 = x3 - y3 z4 = x4 - y4 z5 = x5 - y5 z6 = x6 + y6 z7 = x7 - y7 z8 = x8 - y8 z9 = x9 + y9 z10= x10 + y10,逻辑尺:0 0 1 1 0 1 1 1 0 0 1 减法 0 加法,2019/4/11,ch5,2019/4/11,ch5,x dw x1,x2,x3,x4,x5,x6,x7
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 循环 分支 程序设计
链接地址:https://www.31doc.com/p-2577943.html