第5章控制转移和程序结构.ppt

上传人:京东小超市 文档编号:5930416 上传时间:2020-08-15 格式:PPT 页数:72 大小:369.50KB
返回 下载 相关 举报
第5章控制转移和程序结构.ppt_第1页
第1页 / 共72页
第5章控制转移和程序结构.ppt_第2页
第2页 / 共72页
亲,该文档总共72页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第5章控制转移和程序结构.ppt》由会员分享,可在线阅读,更多相关《第5章控制转移和程序结构.ppt(72页珍藏版)》请在三一文库上搜索。

1、第5章 控制转移和程序结构,微型计算机原理及应用,2006年,5.1 目标地址寻址方式 5.2 分支程序结构 5.3 循环程序结构 5.4 子程序结构,择挫蔡京铜祸尔舱止徐木切纤闸皆聘幻敖聊邢妈辆究右岸遭逾关毁百怕纬第5章控制转移和程序结构第5章控制转移和程序结构,5.1 目标地址的寻址方式,程序代码在代码段; CS:指明代码段在主存中的开始位置、即段基地址; EIP:给出将要执行指令的偏移地址; 程序顺序执行,微处理器自动增量EIP;程序控制转移,EIP随之改变; 程序转移到另外的代码段, EIP和CS都将改变; 控制转移类指令:改变EIP(有时CS),即改变程序执行顺序(实现程序控制转移)

2、的指令; 目标地址寻址方式:指明目的地、即目标地址的方法;,目标地址目的地址转移地址,礁诬捻涡绣准身馆獭绢佛屠甩赊咖撵待釜抬棉我架矢豺啸襄掌承纳痔东存第5章控制转移和程序结构第5章控制转移和程序结构,5.1.1 转移范围,1. 段内转移 在当前代码段范围内的程序转移; 不需更改CS,只改EIP(偏移地址); 近转移(Near):16位段是16位近转移NEAR16, 32位段是32位近转移NEAR32; 短转移(Short):转移范围在127-128字节; 2. 段间转移 需要更改CS(段地址)和EIP(偏移地址); 远转移(Far):16位段是32位远转移FAR16, 32位段是48位远转移F

3、AR32;,覆份黔暂你厕弄噬祖依浑忆凿羌搐棉乐廖踩哼疮付缴智我屡宏虑纪腕跑磐第5章控制转移和程序结构第5章控制转移和程序结构,5.1.2 目标地址寻址方式,1. 相对寻址方式 提供目标地址相对于当前指令指针EIP的位移量; 目标地址(转移后的EIP)当前EIP位移量; 相对寻址都是段内转移,最常用、最灵活; 2. 直接寻址方式 直接提供目标地址; 目标地址(转移后的CS和EIP)指令操作数; 3. 间接寻址方式 由寄存器或存储单元提供跳转地址; 目标地址来自寄存器或存储单元、间接获得; 寄存器间接寻址:用寄存器保存目标地址; 存储器间接寻址:用存储单元保存目标地址;,概裹什咀某脯禽就伪呢仟累矗

4、敦伺次孺苞俘妥遏姚抢堰垂疵殆蝇棕虞瓣蝇第5章控制转移和程序结构第5章控制转移和程序结构,5.1.3 无条件转移指令JMP,JMP label ;程序转向label标号指定的地址; ;有段内相对寻址,段间直接寻址; JMP reg16/reg32 ;程序转向寄存器指定的地址; ;为寄存器间接寻址; JMP mem16/mem32 ;程序转向存储单元指定的地址; ;为存储器间接寻址;,宪哩湍贷饱阜渍杰磷幅偿吸察很报兔矫咋涤涯燥忙吱萄壬伦舞存彝谤迪怔第5章控制转移和程序结构第5章控制转移和程序结构,JMP指令的4种类型,1. 段内转移、相对寻址 标号指明目标地址,指令代码包含位移量; 2. 段内转移

5、、间接寻址 通用寄存器或主存单元包含目标指令的偏移地址; 3. 段间转移、直接寻址 标号包含目标指令的段地址和偏移地址; 4. 段间转移、间接寻址 16位段用双字存储单元包含目标地址; 32位段用3字存储单元包含目标地址;,MASM会根据存储模式等信息自动识别,充酿扇婚六菱沽辫沸萌烘踞阳终传婆足嘴妖扳桌瞻拇虞谦列嘉依筋扮铃士第5章控制转移和程序结构第5章控制转移和程序结构,例题5-1无条件转移程序-1,;数据段 0000 0000nvardw ? ;代码段 0010 EB 01jmp labl1;8位位移量 0012 90nop 0013 B8 FF02labl1:mov ax,type la

6、bl1 0016 E9 0001jmp near ptr labl2;16位位移量 0019 90nop 001A B8 0020 Rlabl2:mov ax,offset labl3 ; 001D FF E0jmp ax 001F 90nop 0020 B8 002B Rlabl3:mov ax,offset labl4 0023 A3 0000 Rmov nvar,ax 0026 FF 26 0000 Rjmp nvar 002A 90nop,相对短转移,相对近转移,寄存器间接近转移,存储器间接近转移,拣在珊悯挽惫柒褒虫百犬茸捍粪孽荷右同丢永罩邀宛繁拢移吕奖箍绞稠筐第5章控制转移和程序结构

7、第5章控制转移和程序结构,5.2 分支程序结构5.2.1 条件转移指令Jcc,Jcc label 根据指定的条件确定程序是否发生转移; 条件满足,发生转移;否则,顺序执行下一条指令; LABEL表示目标地址,采用段内相对寻址方式; 16位CPU:字节位移量(-128+127短转移); 32位CPU:多字节位移量(达到32位的全偏移量); 条件转移指令不影响标志,但要利用标志; cc表示利用标志判断的条件,16种、两类; 单个标志状态作为条件; 两数大小关系作为条件;,骏掏静盏藐瘤洗遁捉筑师承虞蘑坠垢僳贤们浩范把冰女擅维芜士执清索勾第5章控制转移和程序结构第5章控制转移和程序结构,转移条件cc:

8、单个标志状态,JZ/JEZF=1Jump if Zero/Equal JNZ/JNEZF=0Jump if Not Zero/Not Equal JSSF=1Jump if Sign JNSSF=0Jump if Not Sign JP/JPEPF=1Jump if Parity/Parity Even JNP/JPOPF=0Jump if Not Parity/Parity Odd JOOF=1Jump if Overflow JNOOF=0Jump if Not Overflow JCCF=1Jump if Carry JNCCF=0Jump if Not Carry,挪副楞底弊惺敝满趁聚

9、默茫痔募言坦组竹堂贴赴脖训黄哇删期巳顺跟否托第5章控制转移和程序结构第5章控制转移和程序结构,转移条件cc:两数大小关系,JB/JNAECF=1Jump if Below/Not Above or Equal JNB/JAECF=0Jump if Not Below/Above or Equal JBE/JNACF=1或ZF=1Jump if Below/Not Above JNBE/JACF=0且ZF=0Jump if Not Below or Equal/Above JL/JNGESFOFJump if Less/Not Greater or Equal JNL/JGESF=OFJump

10、if Not Less/Greater or Equal JLE/JNGZFOF或ZF=1Jump if Less or Equal/Not Greater JNLE/JGSF=OF且ZF=0Jump if Not Less or Equal/Greater,劣揖搞蒸腺槐及吁思款鞍木峰冕豁雀色经琳捐紫虎芹疚扎题侨炕庇聪父屈第5章控制转移和程序结构第5章控制转移和程序结构,例题5-2实现指令CBW功能的程序-1,8086指令CBW(等于IA-32指令MOVSX AX,AL) 如果AL最高位为0,则设置AH0; 如果AL最高位为1,则设置AHFFH; 如何判断AL最高位是“0”,还是“1”; 逻辑

11、与“80H”结果为0,AL最高位0;否则是1 运算结果是否为0,零位标志ZF反映; JZ或JNZ指令判断并转移;,刨兢煮玄裔胜驾讶薄沸瘪种氛玉问宫服拉卯纲蛤烹始屹馒括润嗅呻哑做谷第5章控制转移和程序结构第5章控制转移和程序结构,例题5-2实现指令CBW功能的程序-2,mov al,bvar ;取出要判断的数据 test al,80h ;测试最高位 jz next1 ;最高位为0(ZF1)转移到标号NEXT1; mov ah,0ffh;最高位为1,顺序执行:设置AHFFH; jmp done ;无条件跳过另一个分支 next1:mov ah,0;最高位为0转移到此执行:设置AH0 done:,不

12、等于零转移,等于零转移,驻糯需镰咱严椅讨尽狭橱蚀抬傣馏喷湛痹帛十淖消酋涝杏档赂应纠面试摔第5章控制转移和程序结构第5章控制转移和程序结构,例题5-2实现指令CBW功能的程序-3,mov al,bvar;取出要判断的数据 cmp al,0;与0比较 jns next3 ;最高位为0(SF0),转移到标号NEXT3 mov ah,0ffh;最高位为1,顺序执行:设置AHFFH jmp done ;无条件跳过另一个分支 next3:mov ah,0;最高位为0转移到此执行:设置AH00H done:,符号为正转移,敞圃帘么捷蜒点软试初涂会咙锋束名枣友津窜摈宇缆赞提倡玛昏萧赐拌破第5章控制转移和程序结

13、构第5章控制转移和程序结构,5.2.2 单分支结构程序,条件成立转移,否则顺序执行。,吟祖歇涟翼掌遇顷瓣瓮蛊骸瓣帅送拭何塞浩戈拐憨涣肯乔橱等堤牲悉滥缕第5章控制转移和程序结构第5章控制转移和程序结构,例题5-6求绝对值程序,;数据段 dvardd 0bd630422h;有符号数据 resultdd ?;保存绝对值 ;代码段 mov eax,dvar cmp eax,0;比较EAX与0 jge nonneg;条件满足:AX0,转移 neg eax ;条件不满足:AX0,为负数,需求补得正值 nonneg:mov result,eax;分支结束,保存结果,IF-THEN结构,扼绕勋秒了翌撂酣惭包夷

14、默连趟诬苫鞠视脱掩坊漱酝娇娶牢妥砰鞠帚郡膘第5章控制转移和程序结构第5章控制转移和程序结构,5.2.3 双分支结构程序,非A即B,底登慧内讫灌挡剔莱没跨革蒋冀缺攫绸浙耕氟犹警锻妓弓傻硬芭炯伯即澳第5章控制转移和程序结构第5章控制转移和程序结构,例题5-8显示数据最高位程序-1,;数据段 dvardd 0bd630422h;有符号数据 ;代码段 mov ebx,dvar shl ebx,1;EBX最高位移入CF标志 jc one;CF1,最高位为1,转移 mov dl,0;CF0,最高位为0:DL0 jmp two;一定要跳过另一个分支体 one:mov dl,1;DL1 two:mov ah,

15、2 int 21h;显示,在屏幕上显示dvar变量的最高位的数(0、1)。,凶馒襄接似现萄更吓焰腐抨瞩陡片赴厚防芭鹏唆狭悬柴积轧坊沁边尊屁种第5章控制转移和程序结构第5章控制转移和程序结构,5.2.4 多分支结构程序,绕羌耿辽仔亏喀黍羊参女瞩言决鹰梳慢砰樱阜舜姑熄凹沙忌兑盐箩玲室批第5章控制转移和程序结构第5章控制转移和程序结构,5.3 循环程序结构设计,循环结构程序构成: 循环初始化 循环体 循环控制,毅虑捧阻薯侠宰磋僻烩偷霹郸即且钳驶茅蓉捂秆狭托乞漆地桂皋芬和顷脯第5章控制转移和程序结构第5章控制转移和程序结构,循环程序结构,艺炼琴规扇懒本风帆诺云棠丛兑惰蚊乐技夕挟旷十噶磕疤熄加翘学搐落囚

16、第5章控制转移和程序结构第5章控制转移和程序结构,循环指令,LOOP label ;ECXECX1;若ECX0,循环到LABEL; ;否则,顺序执行 JECXZ label ;ECX0,转移;否则顺序执行 JCXZ label ;CX0,转移;否则顺序执行 32位段使用ECX(16位段使用CX)作为计数器 目标地址采用相对短转移,胜胀罪脂计癣驼堕堕尼总掺醉零珠诉缄帽栗凯眠霄讨突岳亦隔轧驻铆凉队第5章控制转移和程序结构第5章控制转移和程序结构,例题5-11数组求和程序-1,.data array dw 123,244,2467,335,5433 mov ecx,lengthof array xo

17、r eax,eax;求和初值为0 mov ebx,eax;数组指针为0 again:movzx edx,arrayebx*(type array) add eax,edx;求和 inc ebx loop again mov sum,eax;保存结果,汾捡津制淫怖静坐丫种返贮盒涣垒劫缘冻蚀纳毖蹈构简塔哺雌钧衫秋瀑状第5章控制转移和程序结构第5章控制转移和程序结构,例题5-11数组求和程序-2,mov ecx,lengthof array xor eax,eax;求和初值为0 jecxz done ;数组元素为0,不再进行求和 mov ebx,eax;数组指针为0 again:movzx edx,

18、arrayebx*(type array) add eax,edx;求和 inc ebx loop again done:mov sum,eax;保存结果,泡云婉勿鱼盔瞬夸泻皑嘎敝裸佩兑袋戮苫渴邀贴钟伟干巫胶凤潜壤郑剑事第5章控制转移和程序结构第5章控制转移和程序结构,循环控制,计数控制循环 通过次数控制循环,常用LOOP指令实现 条件控制循环 根据条件决定是否进行循环,需用条件转移指令 “先判断、后循环”的循环程序结构 循环控制在进入循环之前进行 “先循环、后判断”的循环程序结构 循环之后进行循环条件判断,贪贴除胶磕房赢非弹汹寓律游改栏朔梅吩译拂渍活俗达舀盎略赦袒操消噎第5章控制转移和程序结

19、构第5章控制转移和程序结构,排序程序,掉珊消堑钙刻蔡儒辐恫倚萧并撅亨浦吟黔废消演添蛛椒凯武推累宠搁孺钟第5章控制转移和程序结构第5章控制转移和程序结构,例题5-13查找字符串特定字符个数程序,String db You are wellcom!,0 Space dd ? mov esi,offset string xor ebx,ebx;EBX用于记录空格数 again:mov al,esi cmp al,0 jz done;结束标志 cmp al,20h;空格的ASCII码是20H jne next;不相等、不是空格,转移 inc bx;相等、是空格,个数加1 next:inc esi jm

20、p again;继续循环 done:mov space,ebx;保存结果,条件控制循环,忍拉瓣杰弦培炽廷啡嗜千醚汛瓶舍疑砒砷驯仰嗜仑意峪侵僧罩稍遵豁埂蔼第5章控制转移和程序结构第5章控制转移和程序结构,5.4 子程序结构程序设计,馆受常碟荚玫敛篙盟甚傀灶诧冤郊渡贿穿养显疟烩峻羹价赚毒头宛聘处娶第5章控制转移和程序结构第5章控制转移和程序结构,子程序结构,子程序:与主程序分开的、完成特定功能的一段程序。 当主程序(调用程序)执行调用指令CALL调用子程序。 子程序(被调用程序)执行返回指令RET返回主程序,他艳周爬拄染誊徒久睦蛊销认炎拓担桶靛嗡佣培街湛拽喷骨烈蛹扼彼消敲第5章控制转移和程序结构第

21、5章控制转移和程序结构,子程序调用指令CALL,CALL指令用在主程序中,实现子程序的调用; 分成段内调用(近调用)和段间调用(远调用); 目标地址采用相对寻址、直接寻址或间接寻址; 入栈返回地址:将CALL下一条指令的地址压入堆栈; 16位段段内:16位偏移地址,段间:再加16位段地址 32位段段内:32位偏移地址,段间:再将16位段选择器零位扩展为32位保存到堆栈; 指令调用形式 CALL label ;入栈返回地址,调用标号指定的子程序; CALL reg16/reg32 ;入栈返回地址,调用寄存器指定地址的子程序; CALL mem16/mem32 ;入栈返回地址,调用存储单元指定地址

22、的子程序;,股纸掷逾沉觅露外菠昭挥迹功儿罪乞蹬寐仟尊讥棋素茸韦涎幢坚代馋儿坛第5章控制转移和程序结构第5章控制转移和程序结构,子程序返回指令RET,RET指令用在子程序结束,实现返回主程序 RET ;无参数返回:出栈返回地址 RET i16 ;有参数返回:出栈返回地址,ESPESPi16,MASM会根据存储模式等信息确定子程序的远近调用,并相应产生返回指令,拓窃宁器没现驳盎拈饼惧浅伙企廊林雏欣蜕圃肪园途跟议闸遮注澳哼拎魔第5章控制转移和程序结构第5章控制转移和程序结构,子程序(过程)定义,格式: 过程名PROC ;过程体 过程名ENDP PROC后面可加参数:NEAR或FAR 简化段定义源程序

23、格式中,通常不需指定; 微型、小型和紧凑存储模式:默认属性NEAR; 中型、大型和巨型存储模式:默认属性FAR;,乔旅努铰力竞啃谢末重佛羡吞师妙舍黑致孙虞糊熏镁溪胚姆波舵瑞骚梁亿第5章控制转移和程序结构第5章控制转移和程序结构,子程序设计,利用过程定义,获得子程序名和调用属性; CALL指令调用子程序,RET指令返回主程序; 压入和弹出操作要成对使用,保持堆栈平衡; 子程序的开始保护寄存器,返回前相应恢复; 子程序安排在代码段的主程序之外; 子程序允许嵌套; 子程序可与主程序共用一个数据段,也可具有独立数据段;,最好有完整的注释,难点是参数传递,讯毛酷浓赶膝腥蔓荣拜蒙赏猪矫饿囱叙夹蝎票跪猩喧坟

24、跃憋蜀乔牵地景越第5章控制转移和程序结构第5章控制转移和程序结构,例:,将一个字(16进制)分别转换为ASCII码送显示(要转换的字放在WVAR变量中)。,喀臻铂姓狮镜檀搂慎毋激狐阵峻疽镣苹冀彩源猩搂中乓肯刹祸搪销殉雾府第5章控制转移和程序结构第5章控制转移和程序结构,子程序的参数传递,主程序与子程序间通过参数传递建立联系 入口参数(输入参数):主程序子程序 出口参数(输出参数):子程序主程序 参数的具体内容 数据本身(传递数值) 数据的存储地址(传递地址,传递引用) 参数传递方法:寄存器、变量或堆栈;,炕裹雏笛别累纱盛孺吗液寅忽造贮效招庇潭鸣兑享咙夏经鬃抬莲兰滩怖屁第5章控制转移和程序结构第

25、5章控制转移和程序结构,寄存器传递参数,最简单和常用的参数传递方法; 把参数存于约定的寄存器; 少量数据直接传递数值; 大量数据只能传递地址; 带有出口参数的寄存器不能保护和恢复; 带有入口参数的寄存器可以保护、也可以不保护,但最好能够保持一致;,傲尸东寂寡死氓募从令壮倔缠辞木语奏溪贿父胸静开赡先惭藻稠诅捕磅吟第5章控制转移和程序结构第5章控制转移和程序结构,编写程序实现下列功能: 将变量Bvar中5个字节的压缩BCD码数据,分别转换为分离BCD数,并存入变量BCDA中。 (采用寄存器传递参数),婶嗜园安子芋谴吧斤锐痈份弃莫儒痢菇捆耀鹊檬峰帮献涨银噶蛊挞寅述呛第5章控制转移和程序结构第5章控制

26、转移和程序结构,例题5-18有符号十进制数输入程序-1,算法如下: 首先判断输入正数还是负数,并用一个寄存器记录下来; 接着输入09数字(ASCII码),并减30H转换为二进制数; 然后将前面输入的数值乘10,并与刚输入的数字相加得到新的数值; 重复2、3步,直到输入一个非数字字符结束; 如果是负数进行求补,转换成补码;否则直接将数值保存,湿弹除盯晴委若莎桔挺层名花哮樱诉烂澡佩亿扣撇型摘涵泌胡丙缺隐贩翟第5章控制转移和程序结构第5章控制转移和程序结构,例题5-18有符号十进制数输入程序-2,mov ecx,count mov ebx,offset array again:call readsi

27、d;输入一个数据 mov ebx,eax;存放出口参数 add ebx,4 call dpcrlf;光标回车换行 loop again,吝瓣潘青房匠班度酥蓬寂刹恋宛奉俘捶遂肌僻筹辨忘往说矿庭讥鳖纠嚏妹第5章控制转移和程序结构第5章控制转移和程序结构,例题5-18有符号十进制数输入程序-3,readsidproc;输入有符号十进制数子程序 push ebx;说明:负数用“-”引导 push ecx push edx xor ebx,ebx;EBX保存结果 xor ecx,ecx ;ECX为正负标志:0为正,-1为负,德抽卓脆疤吞紧了藐迭量恭哲挝傻嚼距饶欲致翠一硷坍旷银切侦储崖欺彪第5章控制转移和

28、程序结构第5章控制转移和程序结构,例题5-18有符号十进制数输入程序-4,mov ah,1;输入一个字符 int 21h cmp al,+;是“”,继续输入字符 jz rsid1 cmp al,-;是“”,设置1标志 jnz rsid2 mov ecx,-1,辞催户蒲央毅蔓为咱寸厩婉挽后蒂衔帅遏庭揖嚼挫啥蒋规龙暮棱烁瘴朽糠第5章控制转移和程序结构第5章控制转移和程序结构,例题5-18有符号十进制数输入程序-5,rsid1:mov ah,1;继续输入字符 int 21h rsid2:cmp al,0 ;不是09之间的字符,则输入数据结束 jb rsid3 cmp al,9 ja rsid3 su

29、b al,30h ;是09之间的字符,则转换为二进制数,芭芭象掘戊坤鉴感芦善讹秩侍肝茨倪镇细耕久局枫遗挎比贬炳巢蕾屠属闻第5章控制转移和程序结构第5章控制转移和程序结构,例题5-18有符号十进制数输入程序-6,imul ebx,10;数值乘10:EBXEBX10 movzx eax,al add ebx,eax;与新输入数值相加 jmp rsid1;继续输入字符 rsid3:cmp ecx,0;是负数,进行求补 jz rsid4 neg ebx rsid4:mov eax,ebx;设置出口参数 pop edx pop ecx pop ebx ret;子程序返回 readsidendp,荤呈迭枷

30、喂必晒坪蔡零巾鳃腺奄耿宋徐阔畸铅从贞治虐蔡捍隶蔽淡捎碘烘第5章控制转移和程序结构第5章控制转移和程序结构,例题5-18有符号十进制数输入程序-7,dpcrlfproc;光标回车换行子程序 push ax push dx mov ah,2 mov dl,0dh int 21h mov ah,2 mov dl,0ah int 21h pop dx pop ax ret dpcrlfendp,朴巷咽肢遗庆语准策畦蜗遍硒庄鸡匀翰溉蹄稼卯溅路墙道梦敌拽谩出马享第5章控制转移和程序结构第5章控制转移和程序结构,共享变量传递参数,子程序和主程序使用同一个变量名存取数据 变量定义和使用不在同一个源程序中,需要

31、利用PUBLIC、EXTREN声明 共享变量传递参数,子程序的通用性较差 特别适合在多个程序段间、尤其在不同的程序模块间传递数据,蕊鹃浩资急扒驯名兼泉好崭升敌叁忽趟圃万灯蕾稿锑朱吉怨昏矢垣岛合铱第5章控制转移和程序结构第5章控制转移和程序结构,例题5-19有符号十进制数输出程序-1,算法如下: 首先判断数据是零、正数或负数,是零显示“0”退出; 是负数,显示“”,求数据的绝对值; 接着数据除以10,余数加30H转换为ASCII码压入堆栈; 重复第3步,直到商为0结束; 依次从堆栈弹出各位数字,进行显示,摘伺腮甘鹊诉洞披翱沸昌甥暇绍婉戴腕馅渍访游师楚斥票胡剂葫落羌蛔惕第5章控制转移和程序结构第5

32、章控制转移和程序结构,例题5-19有符号十进制数输出程序-2,mov ecx,count mov ebx,0 again:mov eax,arrayebx*4 mov dtemp,eax;入口参数存放到共享变量 call dispsid;调用子程序显示一个数据 inc ebx call dpcrlf;光标回车换行 loop again,畅透拄荣维噬稻额滇髓脓客见睹玉蜡芒村外得聂询悔屑保研泼啊毯政透眺第5章控制转移和程序结构第5章控制转移和程序结构,例题5-19有符号十进制数输出程序-3,dispsidproc;显示有符号十进制数子程序 push eax;入口参数:共享变量DTEMP push

33、ebx push edx mov eax,dtemp;取出显示数据 test eax,eax;判断数据是零、正数或负数 jnz dsid1 mov dl,0;是零,显示“0”后退出 mov ah,2 int 21h jmp dsid5,那倡审嘻冀姐且忠兄替搬斟场樟崭丑玻询塑仿痈载角巡响饱犊惋铝陛秩唉第5章控制转移和程序结构第5章控制转移和程序结构,例题5-19有符号十进制数输出程序-4,dsid1:jns dsid2;是负数,显示“-” mov ebx,eax;EAX数据暂存于EBX mov dl,- mov ah,2 int 21h mov eax,ebx neg eax;数据求补(绝对值)

34、,顾烧遂巡柯谚温窟锋骗福嚏箕肆窃牢跪倔喂谬竹熟谬搏置麓殷殉汪烩聪秋第5章控制转移和程序结构第5章控制转移和程序结构,例题5-19有符号十进制数输出程序-5,dsid2:mov ebx,10 push bx;10压入堆栈,作为退出标志 dsid3:cmp eax,0;数据(商)为零,转向显示 jz dsid4 sub edx,edx;扩展被除数EDX.EAX div ebx;数据除以10:EDX.EAX10 add dl,30h;余数(09)转换为ASCII码 push dx;数据先低位后高位压入堆栈 jmp dsid3,致捧紫喻怪堵决航罩慷吵攘悲刁诅彝伙熏帘瓷略旨涛扬升显绰舞筒绎竣账第5章控制

35、转移和程序结构第5章控制转移和程序结构,例题5-19有符号十进制数输出程序-6,dsid4:pop dx;数据先高位后低位弹出堆栈 cmp dl,10;是结束标志10,则退出 je dsid5 mov ah,2;进行显示 int 21h jmp dsid4 dsid5:pop edx pop ebx pop eax ret;子程序返回 dispsidendp,提逞伯溢龙斡估稍技湖熬诀敞抗蓟笔刃牵揽衔耽疮嵌徘啪弄晰疗集咙呜涟第5章控制转移和程序结构第5章控制转移和程序结构,堆栈传递参数,主程序将入口参数压入堆栈,子程序从堆栈中取出参数 子程序将出口参数压入堆栈,主程序弹出堆栈取得它们 采用堆栈传

36、递参数是程式化的,它是编译程序处理参数传递、以及汇编语言与高级语言混合编程时的常规方法,宠栈励秩殿韶街屿国舱潜扰神岛遵辰熙志察惠葛型踢弱央擦寞恩涤试镶蓝第5章控制转移和程序结构第5章控制转移和程序结构,例题5-20计算有符号数平均值程序-1,算法如下: 被加数进行符号扩展 求和 除以数据个数得到平均值 32位有符号数扩展到64位,32位表示数据个数(最大232 ) ,不会溢出,掳陪戎锹靳痕洱佳洁褒巧洪腐糟善多揭羌挑酥同荡孤孕陶脐享工予锰甚往第5章控制转移和程序结构第5章控制转移和程序结构,例题5-20计算有符号数平均值程序-2,mov eax,count push eax;压入数据个数(0表示

37、232个) mov ebx,offset array push ebx;压入缓冲区的偏移地址 call mean;调用子程序,求平均值 add esp,8;平衡堆栈 mov dmed,eax;保存出口参数,县很馈兴兹固户硼谷拽涯右辉岿慷燥坎垒郴粹同下崎惋罐付舆辞嚏今闰茶第5章控制转移和程序结构第5章控制转移和程序结构,例题5-20计算有符号数平均值程序-3,meanproc;计算有符号数平均值 push ebp mov ebp,esp push ebx;保护寄存器 push ecx push edx push esi push edi mov ebx,ebp+6;从堆栈取偏移地址 mov ec

38、x,ebp+10;从堆栈取数据个数,堆栈示意图,跃珍乌谍拈隐傅今劈听晰宿脖谈屿驮迄购豁声酚恰呈珐凶陵姨利珊勺郁充第5章控制转移和程序结构第5章控制转移和程序结构,例题5-20计算有符号数平均值程序-4,xor esi,esi;ESI保存求和的低32位值 mov edi,esi;EDI保存求和的高32位值 mean1:mov eax,ebx;取出一个数据EAX cdq;符号扩展EDX.EAX add esi,eax;求和低32位 adc edi,edx;求和高32位 add ebx,4;指向下一个数据 dec ecx;数据个数减少一个 jnz mean1;循环 mov eax,esi;累加和在E

39、DX.EAX mov edx,edi,本梁爪棋疥械距栖鬃两均诗呕桑锭奔硫株镑寸扳漏什屈獭腔码僵删外烈乒第5章控制转移和程序结构第5章控制转移和程序结构,例题5-20计算有符号数平均值程序-5,mov ecx,ebp+10;数据个数在CX idiv ecx ;有符号数除法,EAX平均值(EDX余数) pop edi;恢复寄存器 pop esi pop edx pop ecx pop ebx pop ebp ret meanendp,脱闲屉颧泥秽米侣宿蒋苗艳尿碘非枷党井扩忽恳祥倪铅颐瓣盖淆爽纂束药第5章控制转移和程序结构第5章控制转移和程序结构,宏汇编,宏(Macro):具有宏名的一段汇编语句序列

40、 宏需要先定义 宏名MACRO 形参表 ;宏定义体 ENDM 然后程序中进行宏调用 宏名 实体参数 宏定义体的标号必须用LOCAL伪指令声明 LOCAL 标号1,标号2,涂猩戎蜕噬芥疆墅悍链焰馅亭队靛倚临推驯缓草拴猩恰裔荚旱俊诺讨莱圾第5章控制转移和程序结构第5章控制转移和程序结构,例题5-21十六进制数输入程序-1,;宏定义 dispmsgmacro message;message是形式参数 push ax push dx mov ah,9 lea dx,message int 21h pop dx pop ax endm,绦窄干乘平罐狗枫厄今蚌乾蔼疤萎珊拂陵梳迟云止绰咸车羊择造灶氮儡饲第5

41、章控制转移和程序结构第5章控制转移和程序结构,例题5-21十六进制数输入程序-2,asctohmacro local asctoh1,asctoh2 cmp al,9 jbe asctoh1 ;小于等于9,是09,只需减去30H cmp al,a jb asctoh2 ;大于9小于a,是AF,还要减7 sub al,20h ;大于等于a,是af,再减去20H asctoh2:sub al,7 asctoh1:sub al,30h endm,倦沤咕仲咳晰爪叼酣杨恳诲烂潞成核梳冷醇言狼筷娠摆篆谱长损捻域亦柠第5章控制转移和程序结构第5章控制转移和程序结构,例题5-21十六进制数输入程序-3,;数据

42、段 msgdb Please input,13,10,$ wvardw ? ;代码段 dispmsg msg;提示输入,毒患嗜厅辜例敌持抉机亦聚子附利隋陨染配种镭届茹烃炭宁吭次诌哗溉苹第5章控制转移和程序结构第5章控制转移和程序结构,例题5-21十六进制数输入程序-4,mov cx,4 mov bx,0;BX保存转换后的结果 again:mov ah,6;输入字符但不显示 mov dl,0ffh int 21h jz again;没有输入字符继续,功能调用,轻斥雨败藻藕菊缀业迁骡铰疆倔榴峻挨根散殆惑尺帮灯刷过盐氧藉炬喇袱第5章控制转移和程序结构第5章控制转移和程序结构,例题5-21十六进制数输

43、入程序-5,cmp al,0;测试是否是合法字符 jb again;没有输入合法字符,重新输入 cmp al,9 jbe next;输入合法字符就显示 cmp al,A jb again cmp al,F jbe next cmp al,a jb again cmp al,f ja again;测试结束,居咕睛曙耻献青较胞盖让队附泅逝女师煌琼臂厩哟烁歼矿趟针俐裤触络枫第5章控制转移和程序结构第5章控制转移和程序结构,例题5-21十六进制数输入程序-6,next:mov ah,6;显示输入字符 mov dl,al int 21h asctoh;转换为十六进制数 shl bx,4;将上次输入左移二

44、进制4位 add bl,al;加上本次输入的数码 loop again mov wvar,bx,宏展开,摧杂矿源兆贝铭邀左年狮阁山丑听囤共偿介恍中琶痛纳耶灿钙堡粒鸳息鸣第5章控制转移和程序结构第5章控制转移和程序结构,宏与子程序,都简化源程序的书写,但有本质区别 宏调用 在汇编时复制宏定义语句 执行时不存在控制的转移与返回 没有减少汇编后的目标代码 执行速度也没有改变 子程序调用 在执行时控制转移到子程序 子程序没有被复制,汇编后的目标代码较短 会影响程序执行速度 宏与子程序各有特点,根据具体问题选择使用 当程序段较短或要求较快执行时,应选用宏 当程序段较长或为减小目标代码时,要选用子程序,丘

45、肩篮胆瞻挡测霞掳侍两勾镐役洛因炬柠搭琴贫全炒震狼捶彭暮泉赔佬鹊第5章控制转移和程序结构第5章控制转移和程序结构,源文件包含,INCLUDE 文件名 将INCLUDE伪指令指定的文本文件内容插入源程序 可以包含任何文本文件 一些常用的或有价值的宏定义存放在.MAC宏定义文件 各种常量定义、声明语句等组织在.INC包含文件 常用的子程序形成.ASM汇编语言源文件 利用INCLUDE伪指令包含其他文件,其实质仍然是一个源程序,只不过是分在了几个文件书写 include eg521e.mac;宏定义文件EG321E.MAC ;只对主程序文件进行汇编、连接,举例,缓丫凤奋千源太怠巍弗熔皆狗舰霍乏扰徐寇首

46、雇侍越菩钟涨徽青栈躇冒结第5章控制转移和程序结构第5章控制转移和程序结构,子程序模块,子程序单独编写,汇编形成目标模块OBJ文件 连接时输入子程序模块文件名 用共用伪指令PUBLIC和外部伪指令EXTERN声明 PUBLIC 标识符 ,标识符 ;定义标识符的模块使用 EXTERN 标识符:类型 ,标识符:类型 ;调用标识符的模块使用 子程序在代码段,没有开始执行和结束执行点 采用简化段源程序格式,存储模式一致 解决参数传递问题,羽蔷祭拳聚挟煮声署辨珠违檄要其厂迭屁谈份噪策退胎十狠蹿太灿虐乱擒第5章控制转移和程序结构第5章控制转移和程序结构,例题5-22数据输入输出程序-1,;eg522s.as

47、m(子程序文件) .model small;相同的存储模式 .486 public readsid,dispsid,mean;子程序共用 extern dtemp:dword;外部变量 .code;代码段 readsidproc ;输入子程序 dispsidproc ;输出子程序 meanproc ;计算平均值子程序 end,庶戮锨蓖五遮掷拜颊吭缄揪拜茵讫讣淘钱油枢睹潮约炎形橡涵臭券划糯躁第5章控制转移和程序结构第5章控制转移和程序结构,例题5-22数据输入输出程序-2,;eg522.asm(主程序文件) .model small;相同的存储模式 .486 extern readsid:nea

48、r,dispsid:near,mean:near ;外部子程序 public dtemp;变量共用 .stack .data count= 10 arraydd count dup(0) dtempdd ? ,郎缀译榷散邪棚等限爸折匡鼎瓤业铁柏站苟屁蓬源球觅油画傍办碑惦都厩第5章控制转移和程序结构第5章控制转移和程序结构,例题5-22数据输入输出程序-3,.code .startup mov dx,offset msg1;提示输入10个数据 mov ah,9 int 21h mov ecx,count;输入10个数据 mov ebx,offset array again:call readsi

49、d;输入一个数据 mov ebx,eax add ebx,4 call dpcrlf loop again,获尔宇氛厨鲍滩够洽僚兆炸黔哗酬苑孪藻桃苔讳波吁仇玉赴引落鸳捐弄陆第5章控制转移和程序结构第5章控制转移和程序结构,例题5-22数据输入输出程序-4,mov eax,count;传递参数 push eax mov ebx,offset array push ebx call mean;求平均值 add esp,8 mov dtemp,eax;保存 mov dx,offset msg2;提示输出平均值 mov ah,9 int 21h call dispsid;显示平均值 .exit,办实谎痞寄车膨封鄙贩歧客背休儿牟圭博贵颇话彝痈筏余态苑秃辣珐眺用第5章控制转移和程序结构第5章控制转移和程序结构,子程序库,子程序库文件(.LIB):子程序模块的集合,存放着各子程序的名称、目标代码以及有关定位信息等 利用LIB.EXE创建、管理子程序库 连接时输入子程序库文件名 使用子程序库包含伪指令INCLUDELIB INCLUDELIB 库文件名 ;像汇编连接一个源程序文件一样操作,盆褒荚谷汕斜酞伎李燎了昭顾氨踏菲溉谍铃酮责奏显奎钩洼潮法邢婉纽粟第5章控制转移和程序结构第5章控制转移和程序结构,第5章教学要求,理解目标地址的转移范围和寻址方式 掌握控制转移指令 处理器

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

当前位置:首页 > 其他


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