版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章 循环与分支程序设计Assembly Language Programming编制汇编语言程序的步骤:编制汇编语言程序的步骤:(1) 分析题意,确定算法分析题意,确定算法(2) 根据算法画出程序框图根据算法画出程序框图(3) 根据框图编写程序根据框图编写程序(4) 上机调试程序(上机调试程序(自己完成自己完成)3 顺序结构顺序结构 循环结构循环结构 分支结构分支结构 子程序结构子程序结构 复合结构:复合结构:多种程序结构的组合多种程序结构的组合程序结构:程序结构:顺序程序完全按指令书写的前后顺序执行每一条指令,是最基本、最常见的程序结构例例1 1Data Data segmentsegm
2、ent X X dwdw 33 33 Y Y dwdw 47 47 Z Z dwdw 65 65 W W dwdw ? ?Data Data endsendsCodeCode segmentsegment assume assume cs:codecs:codeassume assume ds:datads:dataBeginBegin:mov:mov ax,X ax,X add ax,Y add ax,Y adcadc ax,Z ax,Z movmov W,ax W,ax movmov ah,4ch ah,4ch intint 21h 21hCodeCode endsends end end
3、 BeginBegin顺序程序设计顺序程序设计例例2 2qvarqvar dqdq 1234567887654321h 1234567887654321hmovmov al,byte al,byte ptrptr qvar6 qvar6movmov byte byte ptrptr qvar7,al qvar7,almovmov al,byte al,byte ptrptr qvar5 qvar5movmov byte byte ptrptr qvar6,al qvar6,almovmov al,byte al,byte ptrptr qvar4 qvar4movmov byte byte p
4、trptr qvar5,al qvar5,almovmov al,byte al,byte ptrptr qvar3 qvar3movmov byte byte ptrptr qvar4,al qvar4,almovmov al,byte al,byte ptrptr qvar2 qvar2movmov byte byte ptrptr qvar3,al qvar3,almovmov al,byte al,byte ptrptr qvar1 qvar1movmov byte byte ptrptr qvar2,al qvar2,almovmov al,byte al,byte ptrptr q
5、var0 qvar0movmov byte byte ptrptr qvar1,al qvar1,almovmov byte byte ptrptr qvar0,0 qvar0,012 34 56 78 87 65 43 21h34 56 78 87 65 43 21 00h移位后图示顺序程序设计顺序程序设计例例2 64位数据左移位数据左移8位的图示位的图示214365877856341200qvar7qvar6qvar5qvar4qvar3qvar2qvar1qvar07(1)逻辑尺控制)逻辑尺控制 (2)条件控制)条件控制(3)地址跳跃表)地址跳跃表 值与地址有对应关系的表值与地址有对应关
6、系的表case 1 case 2 case n?case 1 case 2 case 3 。5.1 分支程序设计分支程序设计IF-THEN-ELSE 结构CASE 结构8例例5.1 设有数组设有数组x(x1, , x10)和和y(y1, , y10),编编程计算程计算: 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 减
7、法减法 0 加法加法9x dw x1, x2, x3, x4, x5, x6, x7, x8, x9, x10y dw y1, y2, y3, y4, y5, y6, y7, y8, y9, y10z dw z1, z2, z3, z4, z5, z6, z7, z8, z9, z10logic_rule dw 00dch mov bx, 0mov cx, 10mov dx, logic_rule next: mov ax, xbxshr dx, 1jc subtractadd ax, ybxjmp short result ; 向前引用向前引用subtract: sub ax, ybx re
8、sult: mov zbx, axadd bx, 2loop next10例例5.2 根据根据AL寄存器中哪一位为寄存器中哪一位为1(从低位到高位)把程序(从低位到高位)把程序 转移到转移到8个不同的程序分支去个不同的程序分支去 。branch dw routine1 dw routine2 dw routine3 dw routine4 dw routine5 dw routine6 dw routine7 dw routine8 cmp al, 0 je continue lea bx, branchL: shr al, 1;逻辑右移逻辑右移 jnb add1;jnb=jnc jmp wo
9、rd ptr bx;段内间接转移段内间接转移add1: add bx, type branch jmp Lcontinue: routine1: routine2: (寄存器间接寻址(寄存器间接寻址)11(基址变址寻址基址变址寻址) cmp al, 0 je continue lea bx, branch mov si, 7* type branch mov cx, 8L: shl al, 1; 逻辑左移逻辑左移 jnb sub1; jnb=jnc jmp word ptr bxsi; 段内间接转移段内间接转移sub1: sub si, type branch loop Lcontinue:
10、routine1: routine2: 12(寄存器相对寻址寄存器相对寻址) cmp al, 0 je continue mov si, 0 L: shr al, 1; 逻辑右移逻辑右移 jnb add1; jnb=jnc jmp branch si ; 段内间接转移段内间接转移add1: add si, type branch jmp Lcontinue: routine1: routine2: data segmentdata segment array array dwdw 1212,11,22,33,44,55,66,11,22,33,44,55,66, 77,88,99,111,22
11、2,333 77,88,99,111,222,333 number number dwdw 55 55 low_idxlow_idx dwdw ? ? high_idxhigh_idx dwdw ? ?data endsdata ends例:折半查找算法例:折半查找算法 lea lea didi, array, array movmov ax, number ax, number cmpcmp ax, di+2 ax, di+2 ; (ax); (ax)与第一个元素比较与第一个元素比较 jaja chk_lastchk_last lea lea sisi, di+2, di+2 jeje ex
12、it exit ; (ax); (ax)第一个元素第一个元素, ,找到退出找到退出 stcstc jmpjmp exit exit ; (ax); (ax); (ax)最后一个元素最后一个元素, ,未找到退未找到退出出算法算法1 1compare:compare: cmpcmp ax, ax, bx+sibx+si jeje exit exit jaja higher higher decdec cxcx movmov high_idxhigh_idx, , cxcx jmpjmp mid midhigher:higher: inc inc cxcx movmov low_idxlow_idx
13、, , cxcx jmpjmp mid midno_match:no_match: stcstcexit:exit: search:search: movmov low_idxlow_idx, 1, 1 movmov bxbx, , didi movmov high_idxhigh_idx, , bxbx movmov bxbx, , didimid:mid: movmov cxcx, , low_idxlow_idx movmov dxdx, , high_idxhigh_idx cmpcmp cxcx, , dxdx jaja no_match no_match add add cxcx,
14、 , dxdx shrshr cxcx, 1, 1 movmov sisi, , cxcx shlshl sisi, 1, 1 1212 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)=55low_idxlow_idx 1 1 1 1 4 4 5 5 high_idxhigh_idx 12125 55 55 5( (sisi)=0ah)=0ahCfCf=0=0(ax)=90low_idxl
15、ow_idx 1 1 7 7 7 7 8 8 9 9 high_idxhigh_idx 121212128 88 88 8( (sisi)=10h)=10hCfCf=1=1算法算法2 2idx_okidx_ok: : shrshr sisi, 1, 1 test test sisi, 1, 1 jzjz sub_idxsub_idx inc inc sisisub_idxsub_idx: : sub sub didi, , sisi jmpjmp short compare short comparehigher:higher: cmpcmp sisi, 2, 2 jeje no_match
16、no_match shrshr sisi, 1, 1 jmpjmp short short even_idxeven_idxall_done:all_done: movmov sisi, , didiexit:exit: search:search: movmov sisi, , didi even_idxeven_idx: : test test sisi, 1, 1 jzjz add_idxadd_idx inc inc sisiadd_idxadd_idx: : add add didi, , sisicompare:compare: cmpcmp ax, ax, didi jeje a
17、ll_done all_done jaja higher higher cmpcmp sisi, 2, 2 jnejne idx_okidx_okno_match:no_match: stcstc jmpjmp exit exit 1212 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 didi 12 12 6 6 10 10sisi 12126 64 4( (sis
18、i)=0ah)=0ah( (didi)=0ah)=0ahCfCf=0=0(ax)=90(ax)=90 didi 12 12 18 18 14 14 16 16 sisi 12126 64 42 2( (sisi)=2)=2( (didi)=10h)=10hCfCf=1=119(1)DO-WHILE结构结构 (2)DO-UNTIL结构结构控制条件控制条件初始化初始化循环体循环体YN控制条件控制条件初始化初始化循环体循环体YN设置循环的设置循环的初始状态初始状态循环的工作部分循环的工作部分及修改部分及修改部分计数控制计数控制特征值控制特征值控制地址边界控制地址边界控制5.2 循环程序设计循环程序设
19、计 初始化初始化:设置循环的初始状态:设置循环的初始状态 循环体循环体:循环的工作部分及修改部分:循环的工作部分及修改部分 控制条件控制条件:计数控制:计数控制 特征值控制特征值控制 地址边界控制地址边界控制21例例5.1 把把BX中的二进制数以十六进制的形式显示在屏幕上。中的二进制数以十六进制的形式显示在屏幕上。 BX123422 mov ch, 4Label: mov cl, 4 rol bx, cl mov al, bl and al, 0fh add al, 30h ;0-9 ASCII 30H-39H cmp al, 3ah jl print add al, 7h ;A-F ASCI
20、I 41H-46Hprint: mov dl, al mov ah, 2 int 21h dec ch jnz Label movmov bxbx, 0, 0newcharnewchar: : movmov ah, 1 ah, 1 intint 21h 21h sub sub alal, 30h , 30h jljl exit exit ; ; 0 9 9 退出退出 cbwcbw xchgxchg ax, ax, bxbx movmov cxcx, 10, 10 mulmul cxcx xchgxchg ax, ax, bxbx add add bxbx, ax, ax jmpjmp newc
21、harnewcharexit: exit: 例:从键盘接收例:从键盘接收十进制十进制数并存入数并存入 BXBX movmov bxbx, 0, 0newcharnewchar: : movmov ah, 1 ah, 1 intint 21h 21h sub al, 30h sub al, 30h jljl exit exit ; ; 0 0 退出退出 cmpcmp al, 10 al, 10 jljl add_toadd_to sub al, 27h sub al, 27h ; af; af cmpcmp al, 0ah al, 0ah jljl exit exit ; ; a f f 退出退
22、出add_toadd_to: : movmov clcl, 4, 4 shlshl bxbx, , clcl movmov ah, 0 ah, 0 add add bxbx, ax, ax jmpjmp newcharnewcharexit: exit: 例:从键盘接收例:从键盘接收十六进制十六进制数并存入数并存入 BXBX.model small.model small.stack 256.stack 256.data.data sum sum dwdw ? ?.code.codebegin:begin: movmov ax,data ax,data movmov ds,axds,ax xo
23、rxor ax,ax ax,ax; ;被加数被加数AXAX清清0 0movmov cx, cx,100100 again: again:add add ax,cxax,cx; ;looploop again againmovmov sum,ax sum,ax; ;将累加和送入指定单元将累加和送入指定单元movmov ah,4ch ah,4ch intint 21h 21hend beginend begin例5.3 计算1100数字之和循环次数固定Begin:Begin:movmov bx,offsetbx,offset string stringagain:again:movmov al,b
24、xal,bx ; ;取一个字符取一个字符or al,alor al,al; ;是否为结尾符是否为结尾符0 0jzjz done done; ;是,退出循环是,退出循环cmpcmp al,A al,A; ;是否为大写是否为大写A AZ Zjbjb next nextcmpcmp al,Z al,Zjaja next nextor al,20hor al,20h; ;是,转换为小写字母(使是,转换为小写字母(使D5=1D5=1)movmov bx,albx,al; ;仍保存在原位置仍保存在原位置next:next:inc inc bxbxjmpjmp again again; ;继续循环继续循环d
25、one:done:movmov ah,4ch ah,4ch intint 21h 21h例5.5 大写字母改为小写字母循环次数不定,利用标志退出。操作27例例5.4 将正数将正数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, 0compare: cmp array_endsi, ax jle insert mov bx, array_end
26、si mov array_endsi+2, bx sub si, 2 jmp short compareinsert: mov array_endsi+2, ax -1 3 5 49 15 52 23 37 105 99 78 65 32xn28 a dw 100,30,78,99,15,-1,66,54,189,256 mov cx, 10 dec cxloop1: mov di, cx mov bx, 0loop2: mov ax, abx cmp ax, abx+2 jge continue xchg ax, abx+2 mov abx, axcontinue: add bx, 2 lo
27、op loop2 mov cx, di loop loop1例例5.7 将首地址为将首地址为a的字数组从大到小排序(起泡算法,多重循环)的字数组从大到小排序(起泡算法,多重循环)“冒泡法”是一种排序算法,不是最优的算法,但它易于理解和实现。冒泡法从第一个元素开始,依次对相邻的两个元素进行比较,使前一个元素不大于后一个元素;将所有元素比较完之后,最大的元素排到了最后;然后,除掉最后一个元素之外的元素依上述方法再进行比较,得到次大的元素排在后面;如此重复,直至完成就实现元素从小到大的排序。这是一个双重循环程序结构。外循环由于循环次数已知,可用loop指令实现;而内循环次数每次外循环后减少一次,我们用DX表示。内循环体比较两个元素大小,又是一个分支结构。冒 泡 法例:将首地址为例:将首地址为 a a 的字数组从大到小排序的字数组从大到小排序 (起泡排序算法,多重循环起泡排序算法,多重循环)100100 30 30 78 78 99 99 15 15 -1 -1 66 66 45 45189189256256100100 78 78 99 99 30 30 15 15 66 66 45 45189189256256
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 年产600吨多孔炭及超级电容炭材料项目可行性研究报告模板申批拿地用
- 2026浦发银行成都分行社会招聘(10月)笔试参考题库及答案解析
- 2026重庆市南川区人民法院招聘司法警务辅助人员2人笔试备考试题及答案解析
- 2026年福建泉州晋江市第五中学教师招聘顶岗教师1人笔试参考题库及答案解析
- 四川科瑞软件有限责任公司招聘人力综合岗笔试参考题库及答案解析
- 2026年10月上海中医药大学附属曙光医院业务科室副主任岗位招聘1人考试参考题库及答案解析
- 2026福建莆田城厢区壶兰实验小学招聘编外会计考试备考题库及答案解析
- 南通市城市建设档案馆招聘政府购买服务岗位人员1人考试模拟试题及答案解析
- 成都工业学院学报编辑部 校内公开招聘编辑人员(1人)笔试参考题库及答案解析
- 2026年和县统一战线服务中心公开选调工作人员5名笔试模拟试题及答案解析
- 甘肃张掖市肃南裕固族自治县马蹄学校2026-2027学年度第一学期七年级英语课后综合作业(一)(含答案)
- 2026年模具研发高级技术专家招聘笔试试卷 招录11人考试题库
- 2026年发展对象培训结业测试及答案解析
- 2026年新版预防未成年人犯罪法知识竞赛题库及参考答案
- 2026“弘扬长征精神 奋进新征程”知识竞赛题库(含答案解析)
- 2026年10月自考00323西方行政学说史模拟题及答案详解
- 2026年云南云上云大数据产业发展有限公司及下属子公司第一次社会招聘(32人)笔试模拟试题及答案详解
- GB/T 47962-2026移相变压器的应用、规范和试验导则
- QC/T 901-2026汽车发动机产品质量检验评定方法
- 4.1 整式(第1课时 单项式) 课件 七年级数学上册 (人教版2024)
- GB/T 25049-2024镍铁
评论
0/150
提交评论