《汇编语言第5章循环与分支程序设计.ppt》由会员分享,可在线阅读,更多相关《汇编语言第5章循环与分支程序设计.ppt(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 循环程序设计循环程序设计 分支程序设计分支程序设计第第5 5章章 循环与分支程序设计循环与分支程序设计分支结构分支结构 子程序结构子程序结构程序结构:程序结构:复合结构:多种程序结构的组合复合结构:多种程序结构的组合 顺序结构顺序结构 循环结构循环结构 编制汇编语言程序的步骤:编制汇编语言程序的步骤:(1)分析题意,确定算法(2)根据算法画出程序框图(3)根据框图编写程序(4)上机调试程序一、一、循环程序结构形式循环程序结构形式DO-WHILE 结构结构 DO-UNTIL 结构结构 零次循环零次循环 非零次循环非零次循环控制条件控制条件 初始化初始化循环体循环体 NY控制条件控制条件 初始化
2、初始化 循环体循环体 YN5.1 5.1 循环程序设计循环程序设计二、循环程序的组成二、循环程序的组成初始化初始化:设置循环的初始状态设置循环的初始状态循环体循环体:循环的工作部分及修改部分循环的工作部分及修改部分控制条件控制条件:计数控制计数控制 特征值控制(条件控制)特征值控制(条件控制)n 解析下面程序段,回答指定问题:XOR AX,AX INC AX NEG AX MOV BX,3FFFH ADC AX,BX问(AX)=(BX)=CF=BXBX1234三、循环程序设计方法三、循环程序设计方法1.计数法:正计数和倒计数计数法:正计数和倒计数例:把例:把 BX BX 中的二进制数以十六进制
3、的形式显示在屏幕上中的二进制数以十六进制的形式显示在屏幕上 mov ch,4mov ch,4rotate:mov cl,4rotate:mov cl,4 rol bx,cl rol bx,cl mov al,bl mov al,bl and al,0fh and al,0fh add al,30h add al,30h ;09 ASCII 30H39H;09 ASCII 30H39H cmp al,3ah cmp al,3ah jl printitjl printit add al,7h add al,7h ;AF ASCII 41H46H;AF ASCII 41H46Hprintit:mov
4、 dl,alprintit:mov dl,al mov ah,2 mov ah,2 int 21h int 21h dec ch dec ch jnz rotate jnz rotate 问题:问题:1)属于什么样的结)属于什么样的结构形式?构形式?2)JL能否用能否用JB3)什么计数形式?)什么计数形式?mov bx,0 mov bx,0newchar:mov ah,1 newchar:mov ah,1 ;键盘输入;键盘输入 int 21h int 21h sub al,30h sub al,30h jl exit ;jl exit ;099退出退出 cbw cbw xchg ax,bx x
5、chg ax,bx mov cx,10 mov cx,10 mul cx mul cx xchg ax,bx xchg ax,bx add bx,ax add bx,ax jmp newchar jmp newcharexit:exit:2.特征值控制(条件控制)特征值控制(条件控制)例:从键盘接收十进制数并存入例:从键盘接收十进制数并存入 BXBX(010)+1)10+2)10+5 1 2 531 32 35List List dw n,3,5,15,23,37,49,52,65,78,99 dw n,3,5,15,23,37,49,52,65,78,99例:在附加段上的一个数组中查找例:在
6、附加段上的一个数组中查找AX中的数,并把其删掉。中的数,并把其删掉。del_ul proc neardel_ul proc near cld cld push di push di mov cx,es:di mov cx,es:di add di,2 add di,2 repne scasw repne scasw je delete je delete pop di pop di jmp short exit jmp short exitdelete:jcxz dec_cntdelete:jcxz dec_cntnext_el:mov bx,es:dinext_el:mov bx,es:di
7、 mov es:di-2,bx mov es:di-2,bx add di,2 add di,2 loop next_el loop next_eldec_cnt:pop didec_cnt:pop di dec word ptr es:di dec word ptr es:diexit:retexit:retdel_ul endpdel_ul endp3 35 515152323373749495252656578789999n n list list didi问题:问题:1)使用什么寻址方式?)使用什么寻址方式?2)属于什么结构形式?)属于什么结构形式?x dw?x dw?array_he
8、ad dw 3,5,15,23,37,49,52,65,78,99array_head dw 3,5,15,23,37,49,52,65,78,99array_end dw 105array_end dw 105n dw 32 n dw 32 例:将正数例:将正数 n n 插入一个已整序的正数字数组插入一个已整序的正数字数组 mov ax,n mov ax,n mov array_head-2,0ffffh mov array_head-2,0ffffh mov si,0 mov si,0compare:compare:cmp array_end si,ax cmp array_end si,
9、ax jle insert jle insert mov bx,array_end si mov bx,array_end si mov array_end si+2,bx mov array_end si+2,bx sub si,2 sub si,2 jmp short compare jmp short compareinsert:insert:mov array_end si+2,ax mov array_end si+2,ax 3 35 5151523233737494952526565787899991051053232-1-1array_headarray_endn n x x 问
10、题:问题:1)使用什么寻址方式?)使用什么寻址方式?2)属于什么结构形式?)属于什么结构形式?3.3.逻辑尺法逻辑尺法例:有数组例:有数组 x(x1,x2,x10)x(x1,x2,x10)和和 y(y1,y2,y10)y(y1,y2,y10),编程计算编程计算 z z(z1,z2,z10)(z1,z2,z10)z1=x1 +y1z1=x1 +y1z2=x2 +y2z2=x2 +y2z3=x3 -y3z3=x3 -y3z4=x4 -y4z4=x4 -y4z5=x5 -y5z5=x5 -y5z6=x6 +y6z6=x6 +y6z7=x7 -y7z7=x7 -y7z8=x8 -y8z8=x8 -y8
11、z9=x9 +y9z9=x9 +y9z10=x10+y10z10=x10+y10 逻辑尺:逻辑尺:0 0 1 1 0 1 1 1 0 00 0 1 1 0 1 1 1 0 01 1 减法减法0 0 加法加法 x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10 z dw z1,z2,z3,z4
12、,z5,z6,z7,z8,z9,z10logic_rule dw 00dch ;0000,0000,1101,1100logic_rule dw 00dch ;0000,0000,1101,1100 mov bx,0mov bx,0 mov cx,10 mov cx,10 mov dx,logic_rule mov dx,logic_rulenext:mov ax,xbxnext:mov ax,xbx shr dx,1 shr dx,1 jc subtract jc subtract add ax,ybx add ax,ybx jmp short result jmp short result
13、 ;向前引用向前引用subtract:subtract:sub ax,ybx sub ax,ybxresult:mov zbx,axresult:mov zbx,ax add bx,2 add bx,2 loop next loop next 问题问题:1)属于什么结构形式?属于什么结构形式?2)寻址方式有何技巧?)寻址方式有何技巧?3)除了)除了CF标志位,还有哪些解决标志位,还有哪些解决办法?办法?四、多重循环四、多重循环例例:将首地址为将首地址为A的字数组从小到大排序的字数组从小到大排序(气泡算法,多重循环)(气泡算法,多重循环)32,85,16,15,8 32,85,16,15,8 序
14、号序号 地址地址 数数比比 较较 遍遍 数数12341 A 322 A+2 853 A+4 164 A+6 155 A+8 8321615885161583285158163285815163285 方法一:方法一:mov cx,5 mov cx,5 ;元素个数元素个数 dec cx dec cx ;比较遍数比较遍数loop1:mov di,cx loop1:mov di,cx ;比较次数比较次数 mov bx,0 mov bx,0loop2:loop2:mov ax,Abx mov ax,Abx ;相邻两数相邻两数 cmp ax,Abx+2 cmp ax,Abx+2;比较比较 jle con
15、tinue jle continue xchg xchg ax,ax,Abx+2 Abx+2;交交换换位位置置 mov Abx,ax mov Abx,axcontinue:continue:add bx,2 add bx,2 loop loop2 loop loop2 mov cx,di mov cx,di loop loop1 loop loop1问题:问题:1)内层循环计)内层循环计数如何初始化的数如何初始化的?2)用什么寻址方式?用什么寻址方式?3)如何解决内外层循)如何解决内外层循环计数冲突的?环计数冲突的?Push cxPop cx方法二:方法二:mov di,5 mov di,5
16、;元素个数元素个数 loop1:mov dxloop1:mov dx,1 1 ;设标志;设标志 dec di dec di ;比较次数比较次数 mov cx mov cx,didi mov bx,0 mov bx,0loop2:mov ax,Abx loop2:mov ax,Abx ;相邻两数相邻两数 cmp ax,Abx+2 cmp ax,Abx+2;比较比较 jle continue jle continue xchg xchg ax,ax,Abx+2 Abx+2;交交换换位位置置 mov Abx,ax mov Abx,ax sub dx sub dx,dxdxcontinue:add b
17、x,2 continue:add bx,2 loop loop2 loop loop2 cmp dx,0 cmp dx,0 je loop1 je loop1 5.2 5.2 分支程序设计分支程序设计 case 1 case 2 case n?case 1 case 2 case n CASE 结构结构 IF-THEN-ELSE 结构结构(1)条件控制:相容和相异条件控制:相容和相异(2)地址跳跃表地址跳跃表(值与地址有对应关系的表)(值与地址有对应关系的表)data segmentdata segment array dw 12,11,22,33,44,55,66,array dw 12,1
18、1,22,33,44,55,66,77,88,99,111,222,333 77,88,99,111,222,333 number dw 55 number dw 55 low_idx dw?low_idx dw?high_idx dw?high_idx dw?data endsdata ends1.1.条件控制条件控制例:折半查找算法例:折半查找算法 12 12 11 11 22 22 33 33 44 44 55 55 66 66 77 77 88 88 99 99111111222222333333 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 910101
19、1111212(ax)=55(ax)=55low_idx 1 1 4 5 high_idx 12555(si)=0ah(si)=0ahCf=0Cf=0(ax)=90(ax)=90low_idx 1 7 7 8 9 high_idx 1212888(si)=10h(si)=10hCf=1Cf=1 lea di,array mov ax,number ;要查找数要查找数 cmp ax,di+2 ;(ax);(ax)与第一个元素比较与第一个元素比较 ja chk_last lea si,di+2 je exit ;(ax);(ax)第一个元素第一个元素,找到退出找到退出 stc jmp exit ;
20、(ax);(ax);(ax)最后一个元素最后一个元素,未找到退出未找到退出compare:cmp ax,bx+si je exit ja higher dec cx mov high_idx,cx jmp midhigher:inc cx mov low_idx,cx jmp midno_match:stcexit:search:mov low_idx,1 mov bx,di;个数 mov high_idx,bx mov bx,dimid:mov cx,low_idx mov dx,high_idx cmp cx,dx ja no_match add cx,dx shr cx,1 mov si
21、,cx shl si,12.跳跃表法:跳跃表法:例:根据例:根据 AL 寄存器中哪一位为寄存器中哪一位为 1(从低位到高位),(从低位到高位),把程序转移到把程序转移到 8 个不同的程序分支个不同的程序分支branch_table dw routine1branch_table dw routine1 dw routine2 dw routine2 dw routine3 dw routine3 dw routine4 dw routine4 dw routine5 dw routine5 dw routine6 dw routine6 dw routine7 dw routine7 dw r
22、outine8 dw routine8 cmp al,0 cmp al,0 ;AL;AL为逻辑尺为逻辑尺 je continue je continue lea bx,branch_table lea bx,branch_table mov cx mov cx,8 8L:shr al,1 L:shr al,1 ;逻辑右移逻辑右移 jnc add1 jnc add1 jmp word ptrbx jmp word ptrbx ;段内间接转移add1:add bx,type branch_table add1:add bx,type branch_table ;add bx,2add bx,2 l
23、oop L loop Lcontinue:continue:routine1:routine1:routine2:routine2:(寄存器间接寻址寄存器间接寻址)(寄存器相对寻址寄存器相对寻址)cmp al,0 cmp al,0 je continue je continue mov si,0 mov si,0 mov cx mov cx,8 8 L:shr al,1 L:shr al,1 ;逻辑右移逻辑右移 jnc add1 jnc add1 jmp branch_tablesi jmp branch_tablesi ;段内间接转移add1:add1:add si,type branch_
24、table add si,type branch_table loop L loop Lcontinue:continue:routine1:routine1:routine2:routine2:(基址变址寻址基址变址寻址)cmp al,0cmp al,0 je continue je continue lea bx,branch_table lea bx,branch_table mov si,7*type branch_table mov si,7*type branch_table mov cx,8 mov cx,8L:shl al,1 L:shl al,1 ;逻辑左移逻辑左移 jnc sub1 jnc sub1 jmp word ptr bxsi jmp word ptr bxsi ;段内间接转移sub1:sub si,type branch_table sub1:sub si,type branch_table;(si)-2;(si)-2 loop L loop Lcontinue:continue:routine1:routine1:routine2:routine2: