版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 循环程序设计循环程序设计 分支程序设计分支程序设计第第5章章 循环与分支程序设计循环与分支程序设计分支结构分支结构 子程序结构子程序结构程序结构:程序结构: 复合结构:多种程序结构的组合复合结构:多种程序结构的组合 顺序结构顺序结构 循环结构循环结构编制汇编语言程序的步骤:编制汇编语言程序的步骤:(1) 分析题意,确定算法(2) 根据算法画出程序框图(3) 根据框图编写程序(4) 上机调试程序1. 循环程序设计循环程序设计DO-WHILE 结构结构 DO-UNTIL 结构结构控制条件控制条件初始化初始化循环体循环体YN控制条件控制条件初始化初始化循环体循环体YN初始化初始化:设置循环的初始状
2、态设置循环的初始状态循环体循环体:循环的工作部分及修改部分循环的工作部分及修改部分控制条件控制条件:计数控制计数控制 特征值控制特征值控制 地址边界控制地址边界控制 BXBX1234例:把例:把 BX BX 中的二进制数以十六进制的形式显示在屏幕上中的二进制数以十六进制的形式显示在屏幕上 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
3、 30H39H; 09 ASCII 30H39H cmp al, 3ah cmp al, 3ah jl printit jl printit add al, 7h add al, 7h ; AF ASCII 41H46H; AF ASCII 41H46Hprintit: mov dl, alprintit: mov dl, al mov ah, 2 mov ah, 2 int 21h int 21h dec ch dec ch jnz rotate jnz rotate mov bx, 0 mov bx, 0newchar: mov ah, 1 newchar: mov ah, 1 ;键盘输入
4、;键盘输入 int 21hint 21h sub al, 30h sub al, 30h jl exit ; jl exit ; 099退出退出 cbw cbw xchg ax, bx xchg 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: 例:从键盘接收十进制数并存入例:从键盘接收十进制数并存入 BXBX( ( 010)+1 )10+2 )10+5 1 2 531 32 35 mov bx,
5、0 mov bx, 0newchar: mov ah, 1 newchar: mov ah, 1 ;键盘输入;键盘输入 int 21hint 21h sub al, 30h sub al, 30h jl exit jl exit ; ; 00退出退出 cmp al, 10 cmp al, 10 jl add_to jl add_to sub al, 27h sub al, 27h ; af; af cmp al, 0ah cmp al, 0ah jl exit jl exit ; ; f f退出退出add_to: mov cl, 4add_to: mov cl, 4 shl bx, cl sh
6、l bx, cl mov ah, 0 mov ah, 0 add bx, ax add bx, ax jmp newchar jmp newcharexit: exit: 例:从键盘接收十六进制数并存入例:从键盘接收十六进制数并存入 BXBX 1 a f31 61 66(016)+1) 16+0a) 16+0fx dw ?x dw ?array_head 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 例:
7、将正数例:将正数 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, 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 su
8、b 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 例例: 将首地址为将首地址为A的字数组从小到大排序的字数组从小到大排序(气泡算法,多重循环)(气泡算法,多重循环) 32,85,16,15, 832,85,16,15, 8 序号序号 地址地址 数数比比 较较 遍遍
9、 数数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, 0mov bx, 0loop2: loop2: mov ax, Abx mov ax, Abx ; ;相邻两数相邻两数 cmp ax, Abx+2 cmp ax, Abx+2 ; ; 比较比较 jle conti
10、nuejle continue xchg ax, Abx+2 xchg ax, Abx+2 ; ;交换位置交换位置 mov Abx, axmov Abx, axcontinue:continue: add bx, 2 add bx, 2 loop loop2 loop loop2 mov cx, di mov cx, di loop loop1 loop loop12. 分支程序设计分支程序设计 case 1 case 2 case n? case 1 case 2 case n CASE 结构结构 IF-THEN-ELSE 结构结构(1) 逻辑尺控制逻辑尺控制(2) 条件控制条件控制(3)
11、地址跳跃表地址跳跃表(值与地址有对应关系的表)(值与地址有对应关系的表)例:有数组例:有数组 x(x1,x2,x10) x(x1,x2,x10) 和和 y(y1,y2,y10)y(y1,y2,y10), 编程计算编程计算 z(z1,z2,z10)z(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 -
12、 y7z8 = x8 - y8z8 = 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 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
13、,z4,z5,z6,z7,z8,z9,z10 z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_rule dw 00dch logic_rule dw 00dch ;0000,0000,1101,1100;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
14、ax, ybx add ax, ybx jmp short result jmp short result ; ; 向前引用向前引用subtract: subtract: sub ax, ybx sub ax, ybxresult: mov zbx, axresult: mov zbx, ax add bx, 2 add bx, 2 loop next loop next data segmentdata segment array dw 12,11,22,33,44,55,66, array dw 12,11,22,33,44,55,66, 77,88,99,111,222,333 77,8
15、8,99,111,222,333 number dw 55 number dw 55 low_idx dw ? low_idx dw ? high_idx dw ? high_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 1
16、2555(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折半算法折半算法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 m
18、ov si, cx shl si, 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 9101011111212(ax)=55(ax)=55 di 12 6 10si 1264(si)=0ah(si)=0ah(di)=0ah(di)=0ahCf=0Cf=0(ax)=90(ax)=90 di 12 18 14 16 si 12642(si)=2(si)=2(di)=10h(di)=10hCf=1Cf=1折半算法折
19、半算法2算法算法2 2idx_ok: 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 s
20、i, 2 jne idx_okno_match: stc jmp exit例:根据例:根据 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
21、 routine7 dw routine8 dw routine8 cmp al, 0 cmp al, 0 ;AL;AL为逻辑尺为逻辑尺 je continueje continue lea bx, branch_table lea bx, branch_tableL: shr al, 1 L: shr al, 1 ;逻辑右移逻辑右移 jnc add1jnc add1 jmp word ptrbx jmp word ptrbx ;段内间接转移add1: add bx, type branch_table add1: add bx, type branch_table ;add bx,2add bx,2 jmp L jmp Lcontinue: continue: routine1: routine1: routine2: routine2: (寄存器间接寻址寄存器间接寻址)(寄存器相对寻址寄存器相对寻址) cmp al, 0 cmp al, 0 je continue je continue
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- QC/T 1206.5-2026电动汽车动力蓄电池热管理系统第5部分:直冷直热系统
- 2026事业单位工勤技能-江西-江西有线广播电视机务员四级(中级工)历年参考题库含答案详解3套试卷
- 颅脑损伤后遗症的护理
- 兴仁县中医院绩效方案
- 高血压的健康教育宣传
- 医院运营管理体系升级与核心指标提升年度总结(2篇)
- 心包疾病诊疗进展 课件
- AI女友体验测评
- 潍柴工程就业前景指南
- 非师范专业就业分析
- 2025年海南三沙市事业单位公开招聘笔试试卷(含完整答案解析)
- 江苏盐城东台市2026年专职网格员招聘考试试卷-含答案解析
- 绿色简约风新能源汽车充电桩模板
- 浙江省杭州市富阳区共同体学校2026-2027学年六上数学期末调研模拟试题含解析
- 2026年公务员遴选本土实务笔试习题及答案
- 湖南省2026年高考招生计划-历史类
- 2026年1月浙江省选考物理试题(纯答案版)
- 护理文书书写质量评价标准
- 2026年郑州财税金融职业学院教师招聘考试参考题库及答案解析
- 译林版三年级英语下册Unit2 Clean our classroom作业单
- 高一新生分班考试数学试卷含答案
评论
0/150
提交评论