教学课件PPT循环与分支程序设计.ppt

上传人:李主任 文档编号:3834026 上传时间:2019-09-28 格式:PPT 页数:28 大小:152.53KB
返回 下载 相关 举报
教学课件PPT循环与分支程序设计.ppt_第1页
第1页 / 共28页
教学课件PPT循环与分支程序设计.ppt_第2页
第2页 / 共28页
教学课件PPT循环与分支程序设计.ppt_第3页
第3页 / 共28页
教学课件PPT循环与分支程序设计.ppt_第4页
第4页 / 共28页
教学课件PPT循环与分支程序设计.ppt_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《教学课件PPT循环与分支程序设计.ppt》由会员分享,可在线阅读,更多相关《教学课件PPT循环与分支程序设计.ppt(28页珍藏版)》请在三一文库上搜索。

1、1,第五章 顺序、循环与分支程序设计,5.1 顺序程序设计 5.2 循环程序设计 5.3 分支程序设计,2,顺序程序完全按指令书写的前后顺序执行每一条指令,是最基本、最常见的程序结构。,5.1 顺序程序设计,例5.1,例5.2,3,例5.1,Data segment X dw 33 Y dw 47 Z dw 65 W dw ? Data ends Code segment assume cs:code,assume ds:data Begin:mov ax,X add ax,Y adc ax,Z mov W,ax mov ah,4ch int 21h Code ends end Begin,4

2、,例5.2,qvar dq 1234567887654321h,mov al,byte ptr qvar6 mov byte ptr qvar7,al mov al,byte ptr qvar5 mov byte ptr qvar6,al mov al,byte ptr qvar4 mov byte ptr qvar5,al mov al,byte ptr qvar3 mov byte ptr qvar4,al,mov al,byte ptr qvar2 mov byte ptr qvar3,al mov al,byte ptr qvar1 mov byte ptr qvar2,al mov

3、al,byte ptr qvar0 mov byte ptr qvar1,al mov byte ptr qvar0,0,12 34 56 78 87 65 43 21h,34 56 78 87 65 43 21 00h,移位后,图示,5,例5.2 64位数据左移8位的图示,12,34,56,78,87,65,43,21,00,qvar0,qvar1,qvar2,qvar3,qvar4,qvar5,qvar6,qvar7,6,循环结构一般是根据某一条件判断为真或假来确定是否重复执行循环体。 循环指令和转移指令可以实现循环控制,5.2 循环程序设计,循环指令LOOPE:例5.4,转移指令:例5.

4、5,多重循环:例5.6,循环指令LOOP:例5.3,7,.model small .stack 256 .data sum dw ? .code begin: mov ax,data mov ds,ax xor ax,ax ;被加数AX清0 mov cx,100 again: add ax,cx ; loop again mov sum,ax ;将累加和送入指定单元 mov ah,4ch int 21h end begin,例5.3 计算1100数字之和,循环次数固定,8,begin: mov ax,wordX ;测试目标送AX mov cx,16 ;循环计数器置初值 mov dl,-1 ;计

5、位器置初值 again: inc dl test ax,1 ror ax,1 ;循环指令不影响ZF loope again ;CX0且ZF=1(测试位为0) ;继续循环 je notfound mov byteY,dl jmp done notfound:mov byteY,-1; ZF=1,测试目标的16个位均为0 done: mov ah,4ch int 21h,例5.4 确定wordX中1的最低位数,最大循环次数固定, 满足条件退出。,9,Begin: mov bx,offset string again: mov al,bx ;取一个字符 or al,al ;是否为结尾符0 jz do

6、ne ;是,退出循环 cmp al,A ;是否为大写AZ jb next cmp al,Z ja next or al,20h ;是,转换为小写字母(使D5=1) mov bx,al ;仍保存在原位置 next: inc bx jmp again ;继续循环 done: mov ah,4ch int 21h,例5.5 大写字母改为小写字母,循环次数不定, 利用标志退出。,10,mov cx,count ;CX数组元素个数 dec cx ;元素个数减1为外循环次数 outlp: mov dx,cx ;DX内循环次数 mov bx,offset array inlp: mov al,bx ;取前一

7、个元素 cmp al,bx+1 ;与后一个元素比较 jna next;前一个不大于后一个元素,则不进行交换 xchg al,bx+1 ;否则,进行交换 mov bx,al next: inc bx ;下一对元素 dec dx jnz inlp ;内循环尾 loop outlp ;外循环尾,例5.6 对数组元素排序:冒泡法,双重循环, 内循环含分支,11,“冒泡法”是一种排序算法,不是最优的算法,但它易于理解和实现。 冒泡法从第一个元素开始,依次对相邻的两个元素进行比较,使前一个元素不大于后一个元素;将所有元素比较完之后,最大的元素排到了最后;然后,除掉最后一个元素之外的元素依上述方法再进行比较

8、,得到次大的元素排在后面;如此重复,直至完成就实现元素从小到大的排序。 这是一个双重循环程序结构。外循环由于循环次数已知,可用loop指令实现;而内循环次数每次外循环后减少一次,我们用DX表示。内循环体比较两个元素大小,又是一个分支结构。,冒泡法,12,例5.7 把BX中的二进制数以十六进制的形式显示在屏幕上。,13,mov ch, 4 rotate: mov cl, 4 rol bx, cl mov al, bl and al, 0fh add al, 30h ;0-9 ASCII 30H-39H cmp al, 3ah jl printit add al, 7h ;A-F ASCII 41

9、H-46H printit: mov dl, al mov ah, 2 int 21h dec ch jnz rotate,14,例5.8 将正数n插入一个已整序的字数组的正确位置。 x dw ? array_head dw 3,5,15,23,37,49,52,65,78,99 array_end dw 105 n dw 32 mov ax, n mov array_head-2, 0ffffh mov si, 0 compare: cmp array_endsi, ax jle insert mov bx, array_endsi mov array_endsi+2, bx sub si,

10、 2 jmp short compare insert: mov array_endsi+2, ax,15,例5.9 将首地址为a的字数组从大到小排序(气泡算法,多重循环) a dw 100,30,78,99,15,-1,66,54,189,256 mov cx, 10 dec cx loop1: mov di, cx mov bx, 0 loop2: mov ax, abx cmp ax, abx+2 jge continue xchg ax, abx+2 mov abx, ax continue: add bx, 2 loop loop2 mov cx, di loop loop1,16,

11、分支程序根据条件是真或假决定执行与否。 判断的条件是各种指令,如CMP、TEST等执行后形成的状态标志。 转移指令Jcc和JMP可以实现分支控制;,5.3 分支程序设计,单分支:例5.10,双分支:例5.11,多分支:例5.12,17,例5.10,;计算XY的绝对值 mov ax,X sub ax,Y jns nonneg ;条件满足(X-Y 0)? neg ax ;条件不满足,求补 nonneg: mov result,ax ;条件满足,18,例5.11,mov al,_b imul al mov bx,ax mov al,_a imul _c mov cx,4 imul cx cmp bx

12、,ax ;比较二者大小 jge yes ;条件满足? mov tag,0 ;第一分支体:条件不满足,tag0 jmp done ;跳过第二个分支体 yes: mov tag,1; Done: mov ah,4ch int 21h,前一个分支后要使用JMP指令,切切!,19,or ah,ah ;等效于cmp ah,0 jz function0 ;ah=0,转向function0 dec ah ;等效于cmp ah,1 jz function1 ;ah=1,转向function1 dec ah ;等效于cmp ah,2 jz function2 ;ah=2,转向function2 .,多分支结构,

13、20,Table db disp1, disp2, disp3, disp4, .,例5.12 利用入口地址表,形成多分支,数据段,程序段,分支体,21,.data msg db Input number(18):,0dh,0ah,$ msg1 db Chapter1:Fundamentalsof Assembly Language,0dh,0ah,$ msg2 db Chapter2:8086 Instruction Set,0dh,0ah,$ msg3 db Chapter3:Statements of Assembly Language,0dh,0ah,$ msg4 db Chapter

14、4:Assembly Language Programming,0dh,0ah,$ msg5 db Chapter5:32-bitInstructionsand Programming,0dh,0ah,$ msg6 db Chapter 6 : Mixed Programming with C/C+,0dh,0ah,$ msg7 db Chapter7:FP Instructions and Programming,0dh,0ah,$ msg8 db Chapter8: MMX Instructions and Programming,0dh,0ah,$ table dw disp1,disp

15、2,disp3,disp4,disp5,disp6,disp7,disp8 ;取得各个标号的偏移地址,例5.12 数据段,22,start1: mov dx,offset msg ;提示输入数字 mov ah,9 int 21h mov ah,1 ;等待按键 int 21h cmp al,1 ;数字 8? ja start1 and ax,000fh ;将ASCII码转换成数字 dec ax shl ax,1 ;等效于add ax,ax mov bx,ax jmp tablebx ;(段内)间接转移:IPtable+bx,例5.12 程序段,23,start2: mov ah,9 int 21

16、h .exit 0 ; disp1: mov dx,offset msg1 ;处理程序1 jmp start2 disp2: mov dx,offset msg2 ;处理程序2 jmp start2 disp3: mov dx,offset msg3 ;处理程序3 jmp start2 disp4: mov dx,offset msg4 ;处理程序4 jmp start2 .,例5.12 分支体,24,例5.13 设有数组x(x1, , x10)和y(y1, , y10),编程计算 z1=x1 + y1 z2=x2 + y2 z3=x3 - y3 z4=x4 - y4 z5=x5 - y5 z

17、6=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 加法,25,x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10 logic_rule dw 00dch mov bx, 0 mov cx, 10 mov dx, logic_rule next: mov ax, xbx shr dx, 1 jc subtrac

18、t add ax, ybx jmp short result ; 向前引用 subtract: sub ax, ybx result: mov zbx, ax add bx, 2 loop next,26,例5.14 根据AL寄存器中哪一位为1(从低位到高位)把程序 转移到8个不同的程序分支去 。(寄存器间接寻址),branch_table dw routine1 dw routine2 dw routine3 dw routine4 dw routine5 dw routine6 dw routine7 dw routine8,cmp al, 0 je continue lea bx, br

19、anch_table L : shr al, 1 ;逻辑右移 jnb add1 ;jnb=jnc jmp word ptr bx ;段内间接转移 add1: add bx, type branch_table jmp L continue: routine1: routine2: ,27,(基址变址寻址),cmp al, 0 je continue lea bx, branch_table mov si, 7* type branch_table mov cx, 8 L : shl al, 1 ;逻辑左移 jnb sub1 ;jnb=jnc jmp word ptr bxsi ;段内间接转移 sub1: sub si, type branch_table loop L continue: routine1: routine2: ,28,(寄存器相对寻址),cmp al, 0 je continue mov si, 0 L : shr al, 1 ;逻辑右移 jnb add1 ;jnb=jnc jmp branch_tablesi ;段内间接转移 add1: add si, type branch_table jmp L continue: routine1: routine2: ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育


经营许可证编号:宁ICP备18001539号-1