汇编语言课件:第5章循环与分支程序设计

上传人:M****1 文档编号:569789949 上传时间:2024-07-31 格式:PPT 页数:26 大小:155KB
返回 下载 相关 举报
汇编语言课件:第5章循环与分支程序设计_第1页
第1页 / 共26页
汇编语言课件:第5章循环与分支程序设计_第2页
第2页 / 共26页
汇编语言课件:第5章循环与分支程序设计_第3页
第3页 / 共26页
汇编语言课件:第5章循环与分支程序设计_第4页
第4页 / 共26页
汇编语言课件:第5章循环与分支程序设计_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《汇编语言课件:第5章循环与分支程序设计》由会员分享,可在线阅读,更多相关《汇编语言课件:第5章循环与分支程序设计(26页珍藏版)》请在金锄头文库上搜索。

1、 循环程序设计循环程序设计 分支程序设计分支程序设计第第5章章 循环与分支程序设计循环与分支程序设计分支结构分支结构 子程序结构子程序结构程序结构:程序结构: 复合结构:多种程序结构的组合复合结构:多种程序结构的组合 顺序结构顺序结构 循环结构循环结构编制汇编语言程序的步骤:编制汇编语言程序的步骤:(1) 分析题意,确定算法(2) 根据算法画出程序框图(3) 根据框图编写程序(4) 上机调试程序1. 循环程序设计循环程序设计DO-WHILE 结构结构 DO-UNTIL 结结构构控制条件控制条件初始化初始化循环体循环体YN控制条件控制条件初始化初始化循环体循环体YN初始化初始化:设置循环的初始状

2、态设置循环的初始状态循环体循环体:循环的工作部分及修改部分循环的工作部分及修改部分控制条件控制条件:计数控制计数控制 特征值控制特征值控制 地址边界控制地址边界控制 BXBX1234例:把例:把 BX BX 中的二进制数以十六进制的形式显示在屏幕上中的二进制数以十六进制的形式显示在屏幕上 mov chmov ch, 4, 4rotate: rotate: mov clmov cl, 4, 4 rol bxrol bx, , cl cl mov mov al, al, blbl and al, 0fhand al, 0fh add al, 30h add al, 30h ; 09 ASCII 3

3、0H39H; 09 ASCII 30H39H cmp cmp al, 3ahal, 3ah jl printitjl printit add al, 7h add al, 7h ; AF ASCII 41H46H; AF ASCII 41H46Hprintitprintit: : mov mov dl, aldl, al mov mov ah, 2 ah, 2 int int 21h21h dec chdec ch jnz jnz rotaterotate mov bxmov bx, 0, 0newcharnewchar: : mov mov ah, 1 ah, 1 ;键盘输入键盘输入 int

4、 int 21h 21h sub al, 30h sub al, 30h jl jl exit ; exit ; 099退出退出 cbwcbw xchg xchg ax,ax, bx bx mov cx mov cx, 10, 10 mul cxmul cx xchg xchg ax,ax, bx bx add add bxbx, ax, ax jmp newcharjmp newcharexit: exit: 例:从键盘接收十进制数并存入例:从键盘接收十进制数并存入 BXBX( ( 010)+1 )10+2 )10+5 1 2 531 32 35 mov bxmov bx, 0, 0newc

5、harnewchar: : mov mov ah, 1 ah, 1 ;键盘输入键盘输入 int int 21h21h sub al, 30h sub al, 30h jl jl exit exit ; ; 00退出退出 cmp cmp al, 10al, 10 jl jl add_toadd_to sub al, 27h sub al, 27h ; af; af cmp cmp al, 0ahal, 0ah jl jl exit exit ; ; aff退出退出add_to: add_to: mov clmov cl, 4, 4 shl bx shl bx, , cl cl mov mov a

6、h, 0ah, 0 add add bxbx, ax, ax jmp newcharjmp newcharexit: exit: 例:从键盘接收十六进制数并存入例:从键盘接收十六进制数并存入 BXBX 1 a f31 61 66(016)+1) 16+0a) 16+0fx x dw dw ? ?array_headarray_head dw dw 3,5,15,23,37,49,52,65,78,99 3,5,15,23,37,49,52,65,78,99array_endarray_end dw dw 105 105n n dw dw 32 32 例:将正数例:将正数 n n 插入一个已整序

7、的正数字数组插入一个已整序的正数字数组 mov mov ax, nax, n mov mov array_head-2, 0ffffharray_head-2, 0ffffh mov si mov si, 0, 0compare:compare: cmp cmp array_end array_end si si, ax, ax jle jle insertinsert mov bx mov bx, array_end , array_end si si mov mov array_end array_end si si+2,+2, bx bx subsub si si, 2, 2 jmp j

8、mp short compareshort compareinsert:insert: mov mov array_end array_end si si+2, ax+2, ax 3 35 5151523233737494952526565787899991051053232-1-1array_headarray_endn n x x 例例: 将首地址为将首地址为A的字数组从小到大排序的字数组从小到大排序(气泡算法,多重循环)(气泡算法,多重循环) 32,85,16,15, 8 32,85,16,15, 8 序号序号 地址地址 数数比比 较较 遍遍 数数12341 A 322 A+2 853

9、A+4 164 A+6 155 A+8 8321615885161583285158163285815163285 mov cxmov cx, 5 , 5 ; ;元素个数元素个数 dec cx dec cx ; ;比较遍数比较遍数loop1: loop1: mov di mov di, , cx cx ; ;比较次数比较次数 mov bxmov bx, 0, 0loop2: loop2: mov mov ax, Aax, Abxbx ; ;相邻两数相邻两数 cmp cmp ax, Aax, Abxbx+2 +2 ; ; 比较比较 jle jle continuecontinue xchg xc

10、hg ax, ax, AAbxbx+2 +2 ; ;交交换换位位置置 mov mov AAbxbx, ax, axcontinue:continue: add add bx bx, 2 , 2 loop loop2 loop loop2 mov cxmov cx, , di di loop loop1loop loop12. 分支程序设计分支程序设计 case 1 case 2 case n? case 1 case 2 case n CASE 结构结构 IF-THEN-ELSE 结结构构(1) 逻辑尺控制逻辑尺控制(2) 条件控制条件控制(3) 地址跳跃表地址跳跃表(值与地址有对应关系的表)

11、(值与地址有对应关系的表)例:有数组例:有数组 x(x1,x(x1,x2,x2,x10) ,x10) 和和 y(y1,y2,y10)y(y1,y2,y10), 编程计算编程计算 z z(z1,(z1,z2,z2,z10),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 =

12、x8 - y8z9 = 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 x dw dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 y y dw dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 z z dw dw z1,z2,z3,z4,z5,z6,z7,z8,z

13、9,z10z1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_rule logic_rule dw dw 00dch ;0000,0000,1101,1100 00dch ;0000,0000,1101,1100 mov bxmov bx, 0, 0 mov cxmov cx, 10, 10 mov dxmov dx, logic_rule, logic_rulenext: next: mov mov ax, x ax, xbxbx shr dxshr dx, 1, 1 jc jc subtract subtract add ax, y add ax, ybxbx jmp

14、jmp short result short result ; ; 向前引用向前引用subtract: subtract: sub ax, y sub ax, ybxbx result: result: mov mov z zbxbx, ax, ax add add bx bx, 2, 2 loop next loop next data segmentdata segment array array dw dw 12,11,22,33,44,55,66,12,11,22,33,44,55,66, 77,88,99,111,222,333 77,88,99,111,222,333 number

15、 number dw dw 5555 low_ low_idx dw idx dw ? ? high_ high_idx dw idx dw ? ?data endsdata ends例:折半查找算法例:折半查找算法 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 9101011111212(ax)=55(ax)=55low_idx 1 1 4 5 high_idx 12555( (sisi)=0ah)=0ahC

16、fCf=0=0(ax)=90(ax)=90low_idx 1 7 7 8 9 high_idx 1212888( (sisi)=10h)=10hCfCf=1=1折半算法折半算法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 ; (ax); (ax); (ax)最后一个元素最后一个元素, ,未找到退出未找到退出算法算法

17、1 1compare: 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, cx shl si, 1

18、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 9101011111212(ax)=55(ax)=55 di 12 6 10si 1264( (sisi)=0ah)=0ah( (didi)=0ah)=0ahCfCf=0=0(ax)=90(ax)=90 di 12 18 14 16 si 12642( (sisi)=2)=2( (didi)=10h)=10hCfCf=1=1折半算法折半算法2算法算法2 2idx_o

19、k: shr si, 1 test si, 1 jz sub_idx inc sisub_idx: sub di, si jmp short comparehigher: cmp si, 2 je no_match shr si, 1 jmp short even_idxall_done: mov si, diexit: search: mov si, dieven_idx: test si, 1 jz add_idx inc siadd_idx: add di, sicompare: cmp ax, di je all_done ja higher cmp si, 2 jne idx_okn

20、o_match: stc jmp exit例:根据例:根据 AL 寄存器中哪一位为寄存器中哪一位为 1(从低位到高位),(从低位到高位), 把程序转移到把程序转移到 8 个不同的程序分支个不同的程序分支branch_table branch_table dw dw routine1routine1 dw dw routine2routine2 dw dw routine3 routine3 dw dw routine4 routine4 dw dw routine5 routine5 dw dw routine6 routine6 dw dw routine7 routine7 dw dw r

21、outine8routine8 cmp cmp al, 0 al, 0 ;AL;AL为逻辑尺为逻辑尺 je je continue continue lea lea bxbx, branch_table, branch_tableL: L: shr shr al, 1 al, 1 ;逻辑右移逻辑右移 jnc jnc add1add1 jmp jmp word word ptrptr bxbx ;段内间接转移add1: add add1: add bxbx, type branch_table , type branch_table ;add add bxbx,2,2 jmp jmp L Lco

22、ntinue: continue: routine1: routine1: routine2: routine2: (寄存器间接寻址寄存器间接寻址)(寄存器相对寻址寄存器相对寻址) cmp cmp al, 0al, 0 je je continue continue mov simov si, 0 , 0 L: L: shr shr al, 1 al, 1 ; ;逻辑右移逻辑右移 jnc jnc add1add1 jmp jmp branch_tablebranch_tablesisi ;段内间接转移add1:add1: add add sisi, type branch_table, typ

23、e branch_table jmp jmp L Lcontinue: continue: routine1: routine1: routine2: routine2: (基址变址寻址基址变址寻址) cmp cmp al, 0al, 0 je je continue continue lea lea bxbx, branch_table, branch_table mov simov si, 7 * type branch_table, 7 * type branch_table mov cxmov cx, 8, 8L: L: shl shl al, 1 al, 1 ;逻辑左移逻辑左移 jnc jnc sub1 sub1 jmp jmp wordword ptr ptr bxbxsisi ;段内间接转移sub1: sub sub1: sub sisi, type branch_table , type branch_table ;(;(sisi)-2)-2 loop L loop Lcontinue: continue: routine1: routine1: routine2: routine2: 第第5章作业章作业Page 193 5.5 5.7 5.12 5.18

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号