第4章程序结构.ppt

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

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

1、渝 馁 蔷 砧 缄 椅 勇 售 絮 臀 瓤 硼 应 扛 杜 宫 炬 慑 壤 兔 乾 惟 殷 意 控 郊 谓 敝 愤 萄 锗 萨 第 4 章 程 序 结 构 第 4 章 程 序 结 构 第4章 程序结构 4.1 顺序程序结构 4.2 分支程序结构 4.3 循环程序结构 棋 疮 网 滋 赌 游 剖 住 封 艺 冰 睛 苔 批 榷 瘤 娘 努 毋 质 邱 蹬 涝 扮 抒 级 悉 于 睛 吝 郡 银 第 4 章 程 序 结 构 第 4 章 程 序 结 构 渝 馁 蔷 砧 缄 椅 勇 售 絮 臀 瓤 硼 应 扛 杜 宫 炬 慑 壤 兔 乾 惟 殷 意 控 郊 谓 敝 愤 萄 锗 萨 第 4 章 程 序

2、结 构 第 4 章 程 序 结 构 第4章 程序结构 以顺序、分支和循环程序结构为主线 结合数值运算、数组处理等示例程序 掌握控制转移指令以及编写基本程序 的方法 救 岗 哦 擎 滞 璃 随 拦 的 键 颂 息 朵 譬 篷 眺 权 综 貌 驯 腆 杉 柠 爆 诚 忆 垢 析 刹 另 饰 帆 第 4 章 程 序 结 构 第 4 章 程 序 结 构 第4章 程序结构 4.1 顺序程序结构 按照指令书写的前后顺序执行每条指令 最基本的程序片段 构成复杂程序的基础 3个示例程序 n知道“123N”等于多少吗? n知道处理器内置的识别字符串是什么吗? n知道“01100100”代表什么吗? 窝 鳞 顽

3、矽 努 弘 研 么 松 哎 褒 四 僵 苯 停 牡 艘 摹 那 苛 亡 帆 柞 铂 硕 炊 茂 搓 学 晦 掏 感 第 4 章 程 序 结 构 第 4 章 程 序 结 构 第4章 程序结构 例4-1自然数求和程序 ;数据段 numdword 3456;假设一个N值(小于232-1) sumqword ? ;代码段 mov eax,num;EAX=N add eax,1;EAX=N+1 imul num;EDX.EAX=(1+N)N shr edx,1;64位逻辑右移一位(除以2) rcr eax,1;EDX.EAX= EDX.EAX2 mov dword ptr sum,eax ;小端方式保存

4、 mov dword ptr sum+4,edx 12N(1N)N2 馆 蹬 懈 帽 涨 菜 棠 污 高 妈 霞 钒 钎 篱 笔 钉 翅 炙 钵 滤 兄 山 凿 捞 蛹 砌 惭 胡 蔓 戌 唁 敌 第 4 章 程 序 结 构 第 4 章 程 序 结 构 第4章 程序结构 例4-2处理器识别程序 ;数据段 bufferbyte The processor is,12 dup(0),0 bufsize= sizeof buffer ;代码段 mov eax,0 cpuid;执行处理器识别指令 mov dword ptr buffer+bufsize-13,ebx mov dword ptr buf

5、fer+bufsize-9,edx mov dword ptr buffer+bufsize-5,ecx mov eax,offset buffer ;显示信息 call dispmsg GenuineIntel 孩 浚 澜 飘 浮 斩 鼠 柜 生 溢 痈 终 馈 转 恒 泉 连 馋 侥 辟 颓 苔 匹 蛔 铁 呆 雅 绳 表 热 妓 有 第 4 章 程 序 结 构 第 4 章 程 序 结 构 第4章 程序结构 例4-3不同格式显示程序 mov al,var call dispbb call dispcrlf mov al,var call disphb call dispcrlf mov a

6、l,var call dispuib call dispcrlf mov al,var call dispc var byte 01100100b 二进制形式 十六进制形式 十进制形式 字符形式 运行结果 筐 嫌 牙 暮 院 疤 碰 琢 倘 拷 儒 亥 氓 矣 乌 换 某 输 烘 湍 溜 种 堪 廉 懈 挑 藏 余 晴 标 命 慕 第 4 章 程 序 结 构 第 4 章 程 序 结 构 第4章 程序结构 4.2 分支程序结构 改变程序执行顺序、形成分支、循环、调用等程序结 构是很常见的程序设计问题 高级语言采用IF等语句表达条件,并根据条件是否成 立转向不同的程序分支 汇编语言需要 n首先利用

7、比较CMP、测试TEST、加减 运算、逻辑运算等影响状态标志的 指令形成条件 n然后利用条件转移指令判断由标志 表达的条件,并根据标志状态控制程序 转移到不同的程序段 揍 章 购 袋 盛 议 吴 世 蠕 萄 郧 给 箕 敌 他 油 竭 禽 躬 栽 典 弗 同 怎 充 疯 糊 恐 摹 哺 蒂 汇 第 4 章 程 序 结 构 第 4 章 程 序 结 构 第4章 程序结构 4.2.1 无条件转移指令 程序代码在代码段 nCS:指明代码段在主存中的段基地址 nEIP:给出将要执行指令的偏移地址 程序顺序执行,处理器自动增量EIP 程序控制转移,EIP随之改变 程序转移到另外的代码段,EIP和CS都改变

8、 控制转移类指令:改变EIP(有些也改变CS) ,即改变程序执行顺序(实现程序控制转移)的 指令 本章学习控制转移类指令 去 淳 滋 嘶 边 缉 献 磕 蚌 妊 曰 陀 梨 妒 存 雀 提 螟 谚 荡 棚 奉 选 追 索 身 裔 抢 甲 佣 几 毒 第 4 章 程 序 结 构 第 4 章 程 序 结 构 第4章 程序结构 1. 转移范围 段内转移 n在当前代码段范围内的程序转移 n不需更改CS,只要改变EIP(偏移地址) n近转移(Near): 32位近转移NEAR32、16位近转移NEAR16 n短转移(Short):转移范围在127-128字节 段间转移 n从当前代码段跳转到另一个代码段

9、n需要更改CS(段地址)和EIP(偏移地址) n远转移(Far): 48位远转移FAR32、32位远转移FAR16 抱 揩 程 殴 纹 拽 初 糖 西 纬 错 竣 嘲 裙 姻 雍 黍 翔 闰 兜 磕 餐 萄 骨 椅 缕 命 付 嗣 摈 押 筐 第 4 章 程 序 结 构 第 4 章 程 序 结 构 第4章 程序结构 2. 指令寻址方式 相对寻址方式 n提供目标地址相对于当前指令指针EIP的位移量 n目标地址(转移后的EIP)当前EIP位移量 n相对寻址都是段内转移,最常用、最灵活 直接寻址方式 n直接提供目标地址 n目标地址(转移后的CS和EIP)指令操作数 间接寻址方式 n指示寄存器或存储单

10、元 n目标地址来自寄存器或存储单元、间接获得 n寄存器间接寻址:用寄存器保存目标地址 n存储器间接寻址:用存储单元保存目标地址 目标地址目的地址转移地址 你 蓝 代 萧 卧 绣 熙 贾 粘 颗 廖 厢 手 哺 逊 精 壮 筑 础 击 俗 声 段 码 碧 宗 誉 溃 藻 圃 佑 币 第 4 章 程 序 结 构 第 4 章 程 序 结 构 第4章 程序结构 3. JMP指令 无条件转移:程序无条件改变执行顺序 JMP指令相当于高级语言的goto语句 JMP label ;程序转向label标号指定的地址 ;段内相对寻址,段间直接寻址 JMP reg32/reg16 ;程序转向寄存器指定的地址 ;寄

11、存器间接寻址 JMP mem48/mem32/mem16 ;程序转向存储单元指定的地址 ;存储器间接寻址 封 驮 湛 馒 酝 笋 佯 谋 澈 改 逛 哈 轩 才 羚 卑 奴 翁 枉 忆 唉 颓 荚 法 钙 鳞 竭 惶 络 妄 酣 寞 第 4 章 程 序 结 构 第 4 章 程 序 结 构 第4章 程序结构 JMP指令的4种类型 1. 段内转移、相对寻址 n标号指明目标地址,指令代码包含位移量 2. 段内转移、间接寻址 n通用寄存器或主存单元包含目标指令偏移地址 3. 段间转移、直接寻址 n标号包含目标指令的段地址和偏移地址 4. 段间转移、间接寻址 n32位段用3字存储单元包含目标地址 n16

12、位段用双字存储单元包含目标地址 MASM会根据存储模式等信息自动识别 烈 煎 肠 敛 牢 勘 诸 斯 牺 罚 既 羊 鸭 剥 扼 馒 瀑 族 杆 篆 止 葛 华 密 参 负 油 癣 颂 与 彩 耙 第 4 章 程 序 结 构 第 4 章 程 序 结 构 第4章 程序结构 例4-4无条件转移程序1 ;数据段 0000000000000000nvar dword ? ;代码段 00000000EB 01jmp labl1;相对寻址 0000000290nop 00000003E9 00000001 labl1:jmp near ptr labl2 ;相对近转移 0000000890nop 0000

13、0009B8 00000011 R labl2:mov eax,offset labl3 0000000EFF E0jmp eax;寄存器间接寻址 八 饶 痒 笨 挨 播 羹 擎 厦 蔗 食 报 晰 宠 瞥 骋 光 叙 矛 檄 留 厚 漓 锈 影 搬 每 绎 烙 若 鸦 戊 第 4 章 程 序 结 构 第 4 章 程 序 结 构 第4章 程序结构 例4-4无条件转移程序2 0000001090 nop 00000011B8 00000022 R labl3:mov eax,offset labl4 00000016A3 00000000 R mov nvar,eax 0000001BFF 25

14、 00000000 R jmp nvar; 存储器间接寻址 0000002190 nop labl4: mov ebx,offset nvar jmp near ptr ebx ;数据的寄存器间接寻址 数据的存储器直接寻址 沼 闲 锋 亨 琼 归 圆 竖 的 优 非 摈 妖 六 悯 话 刺 泽 熬 漠 钥 瘁 敞 远 余 翁 磕 仍 尿 食 季 丰 第 4 章 程 序 结 构 第 4 章 程 序 结 构 第4章 程序结构 4.2.2 条件转移指令 根据指定的条件确定程序是否发生转移 Jcc label ;条件满足,发生转移;否则,顺序执行下条指令 LABEL表示目标地址,采用段内相对寻址 n3

15、2位IA-32处理器:达到32位的全偏移量 n16位80 x86处理器:-128+127间的短转移 n条件转移指令不影响标志,但要利用标志 cc表示利用标志判断的条件,16种、两类 n单个标志状态作为条件 n两数大小关系作为条件 脓 侍 浑 诊 义 抿 剂 谚 吵 差 殿 午 崖 经 煽 沿 等 叮 潦 炸 枉 沁 隅 贡 宾 传 好 陪 祸 洒 另 吩 第 4 章 程 序 结 构 第 4 章 程 序 结 构 15 第4章 程序结构 转移条件cc:单个标志状态 JZ/JE ZF=1Jump if Zero/Equal JNZ/JNEZF=0Jump if Not Zero/Not Equal

16、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 多个助记符方便记忆 吁 腕 缝 杰 狐 车 公 要 床 冲 稿 介 宜 桃 眩 树 庭 锡 奥 椎 俏 一 嚎 貌 币 蟹 烫 桨 弃 版 踌 卸 第 4 章 程 序

17、 结 构 第 4 章 程 序 结 构 16 第4章 程序结构 转移条件cc:两数大小关系 JB/JNAECF=1 Jump if Below/Not Above or Equal JNB/JAECF=0 Jump if Not Below/Above or Equal JBE/JNACF=1或ZF=1 Jump if Below/Not Above JNBE/JACF=0且ZF=0 Jump if Not Below or Equal/Above JL/JNGESFOF Jump if Less/Not Greater or Equal JNL/JGESF=OF Jump if Not Les

18、s/Greater or Equal JLE/JNGZFOF或ZF=1 Jump if Less or Equal/Not Greater JNLE/JGSF=OF且ZF=0 Jump if Not Less or Equal/Greater 急 帽 津 崇 格 典 谣 脑 钟 陆 盖 负 藤 困 靖 甸 受 蜘 呀 冶 力 瘪 价 谎 撂 卧 叫 镑 状 骆 隆 窥 第 4 章 程 序 结 构 第 4 章 程 序 结 构 17 第4章 程序结构 1. 单个标志状态作为条件的条件转移指令 JZ(JE)和JNZ(JNE):利用零位标志ZF n判断结果是零(相等)还是非零(不等) JS和JNS:利

19、用符号标志SF n判断结果是负还是正 JO和JNO:利用溢出标志OF n判断结果是溢出还是没有溢出 JP(JPE)和JNP(JPO):利用奇偶标志PF n判断结果低字节“1”的个数是偶数还是奇数 JC和JNC:利用进位标志CF n判断结果是有进位(为1)还是无进位(为0) 堂 狈 橙 锑 思 爷 玖 蜘 减 弱 觅 涟 趣 篡 勋 蜕 狮 碟 痞 溃 桐 谣 神 跑 耗 琳 啃 芦 蒸 圈 缉 阎 第 4 章 程 序 结 构 第 4 章 程 序 结 构 18 第4章 程序结构 例4-5个数折半程序1 mov eax,885;假设一个数据 shr eax,1;数据右移进行折半 jnc goeve

20、n ;余数为0,即CF0条件成立,转移 add eax,1 ;否则余数为1,即CF1,进行加1操作 goeven:call dispuid ;显示结果 443 运行结果 迫 眉 贰 姆 仑 灯 推 蔫 梦 咎 拾 悲 趣 搬 撩 娃 辜 枚 竟 梁 殉 畴 鲸 坑 掘 祁 湍 悠 纠 税 纂 歇 第 4 章 程 序 结 构 第 4 章 程 序 结 构 19 第4章 程序结构 例4-5个数折半程序2 mov eax,886;假设一个数据 shr eax,1;数据右移进行折半 jc goodd ;余数为1,即CF1条件成立,转移 jmp goeven ;余数为0,即CF0无需处理,转移到显示! g

21、oodd:add eax,1;进行加1操作 goeven:call dispuid ;显示结果 jnc goeven 何不合二为一? 蚁 凳 约 糠 暴 任 掣 杏 饰 贾 絮 则 卡 遥 呛 弧 魁 振 争 权 驴 限 稳 棘 女 南 姆 畸 呛 憋 撩 书 第 4 章 程 序 结 构 第 4 章 程 序 结 构 20 第4章 程序结构 例4-5个数折半程序3 mov eax,887;假设一个数据 shr eax,1;数据右移进行折半 adc eax,0 ;余数CF1,进行加1操作 ;余数CF0,没有加1 call dispuid ;显示结果 mov eax,888;假设一个数据 add e

22、ax,1;个数加1 rcr eax,1;数据右移进行折半 call dispuid ;显示结果 改进算法 消除分支 腺 唱 践 蠕 曳 澄 垂 滁 五 檬 坞 卯 他 晦 雨 色 盛 野 降 胸 烹 杉 淀 芽 阀 层 业 住 代 缆 戍 些 第 4 章 程 序 结 构 第 4 章 程 序 结 构 21 第4章 程序结构 例4-6位测试程序1 ;数据段 no_msg byte Not Ready!,0 yes_msgbyte Ready to Go!,0 ;代码段 mov eax,56h;假设一个数据 test eax,02h;测试D1位(D11,其他位为0) jz nom ;D10条件成立,

23、转移 mov eax,offset yes_msg;D11,显示准备好 jmp done;跳转过另一个分支体! nom:mov eax,offset no_msg;显示没准备好 done:call dispmsg 驱 歇 励 稍 怎 育 冻 膀 代 蔑 贴 顾 梆 材 兴 再 钟 摊 版 愿 姥 宵 饥 痒 沼 逛 慢 据 蚊 痴 雍 屯 第 4 章 程 序 结 构 第 4 章 程 序 结 构 22 第4章 程序结构 例4-6位测试程序2 ;数据段 no_msg byte Not Ready!,0 yes_msgbyte Ready to Go!,0 ;代码段 mov eax,56h;假设一个

24、数据 test eax,02h;测试D1位(D11,其他位为0) jnz yesm;D11条件成立,转移 mov eax,offset no_msg;D10,显示没准备好 jmp done;跳转过另一个分支体! yesm:mov eax,offset yes_msg;显示准备好 done:call dispmsg 谆 佰 灭 夷 倍 莱 豆 叠 赚 梁 复 谍 鼎 垒 拭 慨 辖 祝 岸 联 笋 朔 撇 梦 供 奇 淹 洪 盯 率 炼 剔 第 4 章 程 序 结 构 第 4 章 程 序 结 构 23 第4章 程序结构 例4-7奇校验程序 call readc;键盘输入, AL返回值 call

25、dispcrlf;回车换行(用于分隔) call dispbb;以二进制形式显示数据 call dispcrlf;回车换行(用于分隔) and al,7fh ;最高位置“0”、其他位不变 ;同时标志PF反映“1”的个数 jnp next ;个数为奇数,不需处理,转移 or al,80h ;个数为偶数,最高位置“1”、其他位不变 next:call dispbb;显示含校验位的数据 液 礼 邯 族 炭 锹 孽 例 趋 勒 熊 冀 钡 隐 锡 仕 丹 拷 乌 腑 搓 毙 吁 汉 峭 已 邪 训 知 笑 哈 颁 第 4 章 程 序 结 构 第 4 章 程 序 结 构 24 第4章 程序结构 2. 两

26、数大小关系作为条件的条件转移指令 无符号数用高(Above)、低(Below) n低于(不高于等于):JB(JNAE) n不低于(高于等于):JNB(JAE) n低于等于(不高于):JBE(JNA) n不低于等于(高于):JNBE(JA) 有符号数用大(Greater)、小(Less) n小于(不大于等于):JL(JNGE) n不小于(大于等于):JNL(JGE) n小于等于(不大于):JLE(JNG) n不小于等于(大于):JNLE(JG) 十 肝 墨 耕 毯 拢 庆 廉 重 拷 弹 牲 钒 竭 携 营 峡 焰 碎 挝 呼 险 添 莎 诉 侈 肉 切 母 宦 卧 墩 第 4 章 程 序 结

27、构 第 4 章 程 序 结 构 25 第4章 程序结构 例4-8数据比较程序1 ;数据段 in_msg1byte Enter a number: ,0 in_msg2byte Enter another number: ,0 out_msg1byte Two numbers are equal: ,0 out_msg2byte The less number is: ,0 out_msg3byte 13,10,The greater number is: ,0 ;代码段 mov eax,offset in_msg1;提示输入 call dispmsg call readsid;输入第一个数据

28、mov ebx,eax;保存到EBX mov eax,offset in_msg2;提示输入 call dispmsg call readsid;输入第二个数据 mov ecx,eax;保存到ECX 柯 购 轴 虏 仰 卜 晶 耗 懦 赚 卜 末 屠 甘 闷 蹄 谭 仿 泼 服 个 锈 衫 端 昨 兄 疲 漠 野 袍 垄 躺 第 4 章 程 序 结 构 第 4 章 程 序 结 构 26 第4章 程序结构 例4-8数据比较程序2 cmp ebx,ecx;二个数据进行比较 jne nequal;两数不相等,转移 mov eax,offset out_msg1 call dispmsg ;显示两数相

29、等 mov eax,ebx call dispsid ;显示相等的数据 jmp done;转移到结束 nequal:jl first ;EBX较小,不需要交换,转移 xchg ebx,ecx ;EBX保存较小数,ECX保存较大数 妨 墨 遇 邪 剥 援 漓 疗 烽 抡 钱 碘 亭 钠 阎 懦 概 慕 肖 僻 崔 浦 绰 庭 汰 玲 飘 谣 奉 抉 狼 缴 第 4 章 程 序 结 构 第 4 章 程 序 结 构 27 第4章 程序结构 例4-8数据比较程序3 first:mov eax,offset out_msg2 ;显示较小数 call dispmsg mov eax,ebx;较小数在EBX

30、中 call dispsid mov eax,offset out_msg3 ;显示较大数 call dispmsg mov eax,ecx;较大数在ECX中 call dispsid done: 洛 眨 划 钱 概 馒 亲 桥 妓 算 碉 搔 盘 逮 殊 殊 辑 茨 楞 巫 平 卤 索 论 过 迄 蛙 价 丑 蔑 弊 醚 第 4 章 程 序 结 构 第 4 章 程 序 结 构 28 第4章 程序结构 4.2.3 单分支结构 只有一个分支的程序 n类似高级语言的IF-THEN语句结构 注意采用正确的条件转移指令 n当条件满足(成立),发生转移,跳过分支体 n条件不满足,顺序向下执行分支体 条件

31、转移指令与高级语言的IF语句正好相反 nIF语句是条件成立,执行分支体 惕 仁 么 重 泰 讹 咎 聚 姿 梧 靛 轴 淹 挥 滚 劈 喧 馒 迹 丹 胞 馆 猛 很 尿 颜 徐 君 削 取 陨 倦 第 4 章 程 序 结 构 第 4 章 程 序 结 构 29 第4章 程序结构 例4-9求绝对值程序 ;代码段 call readsid ;输入一个有符号数,从EAX返回值 cmp eax,0; 比较EAX与0 jge nonneg ;条件满足:EAX0,转移 neg eax ;条件不满足:EAX0,为负数 ;需求补得正值 nonneg:call dispuid ;分支结束,显示结果 示意图 撇

32、扒 兹 键 戒 什 每 嘎 皋 泵 昌 担 峭 蹬 喇 醋 鞘 臣 吗 骚 企 斧 挡 耐 坦 瞎 俐 椭 饼 蜒 荐 瞥 第 4 章 程 序 结 构 第 4 章 程 序 结 构 30 第4章 程序结构 单分支结构的流程图 返回 迁 扦 滚 用 胞 胁 韦 悠 洲 十 抉 顿 桃 何 艾 屋 迹 摩 翘 轨 救 核 酚 晓 成 泡 谷 焰 轧 笺 是 紧 第 4 章 程 序 结 构 第 4 章 程 序 结 构 31 第4章 程序结构 例4-10字母判断程序 call readc ;输入一个字符,从AL返回值 cmp al,A;与大写字母A比较 jb done ;比大写字母A小,不是大写字母,转

33、移 cmp al,Z; 与大写字母Z比较 ja done ;比大写字母Z大,不是大写字母,转移 or al,20h;转换为小写 call dispcrlf;回车换行 call dispc;显示小写字母 done: 矾 渔 棚 涎 莉 矽 蠕 啦 坦 控 片 吏 逢 第 涤 蝶 猜 氦 师 鹿 嗓 姑 术 床 钱 啄 辫 姬 威 喷 顺 倔 第 4 章 程 序 结 构 第 4 章 程 序 结 构 32 第4章 程序结构 4.2.4 双分支结构 双分支程序结构有两个分支,条件为真执行一 个分支;条件为假,执行另一个分支 n相当于高级语言的IF-THEN-ELSE语句 顺序执行的分支体1最后一定要有

34、一条JMP指令 跳过分支体2 nJMP指令必不可少,实现结束前一个分支回到 共同的出口作用 双分支结构有时可以改变为单分支结构 n事先执行其中一个分支(选择出现概率较高的 分支) 添 腋 旅 胚 犀 钟 鹰 辜 墅 啊 歧 战 辈 贿 匿 鞘 事 绅 绑 痰 瓤 撒 嘘 封 胃 充 睹 键 又 富 瞅 掸 第 4 章 程 序 结 构 第 4 章 程 序 结 构 33 第4章 程序结构 例4-11显示数据最高位程序1 ;数据段 dvardword 0bd630422h;假设一个数据 ;代码段 mov ebx,dvar shl ebx,1;EBX最高位移入CF标志 jc one ;CF1,即最高位

35、为1,转移 mov al,0 ;CF0,即最高位为0:AL0 jmp two;一定要跳过另一个分支 one:mov al,1;AL1 two:call dispc;显示 双分支结构 示意图 叛 右 琅 宏 轨 慷 担 煤 渍 雍 锐 杭 边 炙 适 垫 吩 炯 赃 幻 挚 妹 专 佯 铲 晃 煮 拎 棺 面 令 挫 第 4 章 程 序 结 构 第 4 章 程 序 结 构 34 第4章 程序结构 双分支结构的流程图 返回 瘦 藏 蚀 究 灰 唤 旷 贱 勋 垮 缔 谓 瘁 笨 氛 寨 膏 炭 狈 夫 躯 肥 黔 剂 阂 跃 聊 省 隅 命 顶 靛 第 4 章 程 序 结 构 第 4 章 程 序

36、结 构 35 第4章 程序结构 例4-11显示数据最高位程序2 ;代码段 mov ebx,dvar mov al,0 ;假设最高位为0:AL0 shl ebx,1;EBX最高位移入CF标志 jnc two ;CF0,即最高位为0,转移 mov al,1 ;CF1,即最高位为1,AL1 two:call dispc;显示 单分支结构 钱 炽 服 肇 招 侗 吕 忘 库 策 受 填 般 禄 蔚 桃 淹 疑 辟 逗 蔷 盔 雇 旁 毖 翘 资 铲 凉 宋 呸 雁 第 4 章 程 序 结 构 第 4 章 程 序 结 构 36 第4章 程序结构 例4-12有符号数运算溢出程序 ;数据段 dvar1dwo

37、rd 1234567890 ;假设两个数据 dvar2dword -999999999 dvar3dword ? okmsgbyte Correct!,0 ;正确信息 errmsg byte ERROR ! Overflow!,0 ;错误信息 ; 代码段 mov eax,dvar1 sub eax,dvar2;求差 jo error;有溢出,转移 mov dvar3,eax;无溢出,保存差值 mov eax,offset okmsg ;显示正确 jmp disp error: mov eax,offset errmsg;显示错误 disp:call dispmsg 羡 浸 录 针 烹 擦 洪

38、窃 饿 悍 筛 琶 厉 祖 赃 旺 绵 第 嫡 冲 庆 猿 垮 诉 虱 杰 控 吃 颤 钦 籍 殷 第 4 章 程 序 结 构 第 4 章 程 序 结 构 37 第4章 程序结构 4.2.5 多分支程序 实际问题存在多分支结构 n分支处理中又有分支 n具有多个分支走向 利用单分支和双分支这两个基本结构,可以解决程序 中多个分支结构的问题 熟悉了汇编语言编程思想,还可以采用其他技巧性的 方法解决实际问题 使用表结构实现多分支 铂 易 升 蕾 蜒 娠 铰 粥 估 搓 姜 鹏 亲 暖 忠 潦 栅 岛 要 班 体 象 辗 镐 蚌 禁 暴 批 泣 爪 凉 删 第 4 章 程 序 结 构 第 4 章 程

39、序 结 构 38 第4章 程序结构 例4-13地址表程序1 ;数据段 msg1byte Chapter 1: Fundamentals,0dh,0ah,0 ;10个信息 msgbyte Input number(110): ,0dh,0ah,0 table dword disp1,disp2,disp3,disp4,disp5 dword disp6,disp7,disp8,disp9,disp10 1)提示输入数字,并输入数字; 2)判断数字是否在规定的范围内 ,不在范围内、重新输入; 3)显示数字对应的信息,退出。 篙 陨 玄 声 嗜 钨 敝 轨 侗 阜 恭 忽 偿 厚 蕊 疚 氢 呛 勇

40、 姑 匆 力 浓 各 净 此 甩 漠 傀 界 烷 硷 第 4 章 程 序 结 构 第 4 章 程 序 结 构 39 第4章 程序结构 例4-13地址表程序2 ;代码段 again:mov eax,offset msg call dispmsg ;提示输入 call readuid ;接收输入:EAX=数字 cmp eax,1;判断范围 jb again cmp eax,10 ja again;不在范围内,重新输入 dec eax;EAX=EAX-1 shl eax,2;EAX=EAX4 jmp tableeax;多分支跳转 埠 傲 做 皂 震 淬 沙 劲 蚜 每 亡 杏 匪 遇 巴 闪 焚 肮

41、 搀 掌 考 娘 枕 某 染 阅 箕 串 绿 队 楚 贤 第 4 章 程 序 结 构 第 4 章 程 序 结 构 40 第4章 程序结构 例4-13地址表程序3 disp1:mov eax,offset msg1 jmp disp disp2:mov eax,offset msg2 jmp disp disp9:mov eax,offset msg9 jmp disp disp10:mov eax,offset msg10 disp: call dispmsg;显示 歌 膜 帆 怔 廓 帐 傈 敲 蔗 汇 殴 泊 抿 馅 唐 寂 盲 刹 惶 靶 军 直 策 托 译 瞧 酞 争 司 趴 祭 耿

42、第 4 章 程 序 结 构 第 4 章 程 序 结 构 41 第4章 程序结构 例4-13地址表程序4 ;数据段 table dword msg1,msg2,msg3,msg4,msg5 dword msg6,msg7,msg8,msg9,msg10 ;代码段 dec eax;EAX=EAX-1 shl eax,2;EAX=EAX4 mov eax,tableeax;获得信息字符串地址 call dispmsg ;显示 显 置 角 参 岁 阶 减 碉 醇 亡 婿 伺 瘁 谬 脏 筏 铁 啃 堂 端 酞 眺 温 呻 朵 福 抢 阁 艺 狠 冤 掐 第 4 章 程 序 结 构 第 4 章 程 序

43、结 构 42 第4章 程序结构 4.3 循环程序结构 三个部分组成: n循环初始为开始循环准备必要的条件,如 循环次数、循环体需要的初始值等; n循环体重复执行的程序代码,其中包括对 循环条件的修改等; n循环控制判断循环条件是否成立,决定是 否继续循环 “先判断、后循环”的循环程序结构 n对应高级语言的WHILE语句 “先循环、后判断”的循环程序结构 n对应高级语言的DO语句 示意图 茨 联 矗 葱 斜 砍 钒 繁 撤 笼 檄 噶 孩 档 鞭 烙 裂 彰 隧 夕 揉 诈 瘸 苛 恤 鄂 都 札 丢 雪 芋 掳 第 4 章 程 序 结 构 第 4 章 程 序 结 构 43 第4章 程序结构 循

44、环程序结构的流程图 返回 吵 约 糕 鞋 忌 糙 监 樟 卷 鼎 诽 里 貌 条 贷 固 澄 乡 谨 慕 炒 授 兵 术 陛 塑 醋 窜 惜 校 昨 奥 第 4 章 程 序 结 构 第 4 章 程 序 结 构 44 第4章 程序结构 4.3.1 循环指令 LOOP label ;ECXECX1;若ECX0,循环到LABEL ;否则,顺序执行 JECXZ label ;ECX0,转移;否则顺序执行 目标地址采用相对短转移 实地址存储模型使用CX作为计数器 DEC ECX JNZ label CMP ECX,0 JZ label 坟 捻 映 八 拣 筑 徐 姓 澎 彝 嘿 拘 警 趾 次 疾 芳

45、浪 里 帮 煞 脊 痊 玄 悍 贸 庇 迟 耿 铃 规 斤 第 4 章 程 序 结 构 第 4 章 程 序 结 构 45 第4章 程序结构 例4-14数组求和程序 mov ecx,lengthof array ;ECX数组元素个数 xor eax,eax;求和初值为0 mov ebx,eax;数组指针为0 again:add eax,arrayebx*(type array) ;求和 inc ebx;指向下一个数组元素 loop again mov sum,eax;保存结果 call dispsid ;显示结果 循环体 循环控制 循环初始 砰 涎 柯 垛 悉 眩 华 痈 禁 绑 转 颠 讽 钙

46、 炕 囚 韵 恬 郊 洒 畴 馈 帅 辑 挡 炕 退 焉 森 甲 佃 夹 第 4 章 程 序 结 构 第 4 章 程 序 结 构 46 第4章 程序结构 4.3.2 计数控制循环 通过次数控制循环 n利用LOOP指令属于计数控制 n常见是“先循环、后判断”循环结构 计数可以减量进行,即减到0结束 计数可以增量进行,即达到规定值结束 循环程序结构的关键是如何控制循环 龙 搓 浚 豫 鲸 喜 水 汁 茅 捍 咏 端 苫 钩 郑 峡 闽 歧 沼 酮 豪 辙 兽 拖 恫 长 锚 犬 线 氮 绣 部 第 4 章 程 序 结 构 第 4 章 程 序 结 构 47 第4章 程序结构 例4-15求最大值程序1

47、 ;数据段 array dword -3,0,20,900,-56 count = lengthof array;数组的元素个数 maxdword ?;存放最大值 ;代码段 mov ecx,count-1 ;元素个数减1是循环次数 mov esi,offset array mov eax,esi ;取出第一个元素给EAX,用于暂存最大值 煌 穗 堑 氟 蒋 照 肯 淆 沛 彪 甄 哑 磺 栈 枯 加 嘿 静 助 赠 篆 死 顶 谓 爷 僻 嘶 吭 山 帽 忽 柒 第 4 章 程 序 结 构 第 4 章 程 序 结 构 48 第4章 程序结构 例4-15求最大值程序2 again:add esi

48、,4 cmp eax,esi;与下一个数据比较 jge next ;已经是较大值,继续下一个循环比较 mov eax,esi;EAX取得更大的数据 next: loop again;计数循环 mov max,eax;保存最大值 墙 衣 妮 寸 醇 枫 烽 社 层 谐 掳 僚 脱 莎 囱 跑 佩 教 没 谎 撬 越 敌 拴 昭 堑 好 派 姨 三 作 少 第 4 章 程 序 结 构 第 4 章 程 序 结 构 49 第4章 程序结构 例4-16简单加密解密程序1 ;数据段 keybyte 234 bufnum = 255 buffer byte bufnum+1 dup(0) ;定义键盘输入需要

49、的缓冲区 msg1byte Enter messge: ,0 msg2byte Encrypted message: ,0 msg3byte 13,10,Original messge: ,0 ;代码段 mov eax,offset msg1;提示输入字符串 call dispmsg mov eax,offset buffer;设置入口参数EAX call readmsg;调用输入字符串子程序 push eax;字符个数保存进入堆栈 务 歪 诡 煤 聊 揩 番 通 申 蜡 孟 警 曲 缸 邹 跺 搁 肩 菱 待 眶 码 造 悉 剧 陋 媒 撕 秘 郴 撒 荤 第 4 章 程 序 结 构 第 4 章 程 序 结 构 50 第4章 程序结构 例4-16简单加密解密程序2 mov ecx,eax ;ECX实际输入的字符个数,作为循环的次数 xor ebx,ebx;EBX指向输入字符 mov al,key;AL加密关键字 encrypt:xor bufferebx,al;异或加密 inc ebx dec ecx;等同于:loop encrypt jnz encrypt;处理下一个字符 mov eax,offset msg2 call dispmsg mov eax,

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

当前位置:首页 > 其他


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