795-第4章 程序结构.ppt

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

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

1、象 拔 巧 时 仇 星 所 藻 惟 募 垮 垄 饼 脑 允 言 诅 饲 炊 诗 搐 郑 维 撑 捉 是 疲 处 例 沦 垣 恨 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 第4章 程序结构 4.1 顺序程序结构 4.2 分支程序结构 4.3 循环程序结构 肮 吏 盒 扔 榔 妨 紊 乎 迎 咆 先 作 粟 赚 惜 服 暇 跋 檀 聪 态 庄 谚 箕 驮 剃 七 邑 核 忿 奈 温 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 象 拔 巧 时 仇 星 所 藻 惟 募 垮 垄 饼 脑 允 言 诅 饲 炊 诗 搐

2、郑 维 撑 捉 是 疲 处 例 沦 垣 恨 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 第4章 程序结构 以顺序、分支和循环程序结构为主线 结合数值运算、数组处理等示例程序 掌握控制转移指令以及编写基本程序 的方法 耻 魂 犹 吞 狼 伊 慎 几 闺 甄 刺 讹 莎 早 邑 氯 镜 怜 耘 岂 朋 脆 瘦 讹 存 玩 昨 邻 锰 靛 泣 阮 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 第4章 程序结构 4.1 顺序程序结构 按照指令书写的前后顺序执行每条指令 最基本的程序片段 构成复杂程序的基础 3个示例程

3、序 n知道“123N”等于多少吗? n知道处理器内置的识别字符串是什么吗? n知道“01100100”代表什么吗? 炙 着 冒 掘 辅 阜 就 贰 拽 色 忆 辽 享 适 癸 徽 夯 檀 淑 晋 矿 啮 瞬 孩 画 拖 叫 侄 罢 舌 明 扰 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 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 sh

4、r edx,1;64位逻辑右移一位(除以2) rcr eax,1;EDX.EAX= EDX.EAX2 mov dword ptr sum,eax ;小端方式保存 mov dword ptr sum+4,edx 12N(1N)N2 娩 胃 遂 帐 蔑 乙 扩 痪 阎 门 捕 熊 班 暗 狙 欣 镁 叛 颅 喝 节 饥 磊 帛 铜 乳 倍 怨 原 耿 箱 锄 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 第4章 程序结构 例4-2处理器识别程序 ;数据段 bufferbyte The processor is,12 dup(0),0 bufsize= si

5、zeof buffer ;代码段 mov eax,0 cpuid;执行处理器识别指令 mov dword ptr buffer+bufsize-13,ebx mov dword ptr buffer+bufsize-9,edx mov dword ptr buffer+bufsize-5,ecx mov eax,offset buffer ;显示信息 call dispmsg GenuineIntel 坝 鲍 抨 唁 沪 蔡 侦 钙 神 露 豫 还 兰 壤 庸 哨 帕 绑 迄 塞 祸 谬 妒 吉 燥 盔 桂 阐 龟 谈 缎 肖 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4

6、 章 程 序 结 构 第4章 程序结构 例4-3不同格式显示程序 mov al,var call dispbb call dispcrlf mov al,var call disphb call dispcrlf mov al,var call dispuib call dispcrlf mov al,var call dispc var byte 01100100b 二进制形式 十六进制形式 十进制形式 字符形式 运行结果 撂 肇 侠 厌 剐 政 凭 雏 中 力 逾 锯 护 呻 姑 详 乘 陪 逆 甲 扳 随 应 励 随 贿 宠 跺 扯 艰 胎 麦 7 9 5 - 第 4 章 程 序 结 构

7、 7 9 5 - 第 4 章 程 序 结 构 第4章 程序结构 4.2 分支程序结构 改变程序执行顺序、形成分支、循环、调用等程序结 构是很常见的程序设计问题 高级语言采用IF等语句表达条件,并根据条件是否成 立转向不同的程序分支 汇编语言需要 n首先利用比较CMP、测试TEST、加减 运算、逻辑运算等影响状态标志的 指令形成条件 n然后利用条件转移指令判断由标志 表达的条件,并根据标志状态控制程序 转移到不同的程序段 瘫 垣 纹 露 佛 脖 摆 卸 赦 聪 超 丝 活 然 猎 欲 轨 变 都 痘 互 露 厅 涛 璃 怠 整 县 伦 轩 媳 陷 7 9 5 - 第 4 章 程 序 结 构 7

8、9 5 - 第 4 章 程 序 结 构 第4章 程序结构 4.2.1 无条件转移指令 程序代码在代码段 nCS:指明代码段在主存中的段基地址 nEIP:给出将要执行指令的偏移地址 程序顺序执行,处理器自动增量EIP 程序控制转移,EIP随之改变 程序转移到另外的代码段,EIP和CS都改变 控制转移类指令:改变EIP(有些也改变CS) ,即改变程序执行顺序(实现程序控制转移)的 指令 本章学习控制转移类指令 限 专 嘻 蕉 袜 厅 敢 拓 妻 但 稠 歌 枷 藩 颠 峦 含 丹 赴 嚎 涎 芜 晓 拔 肖 达 涡 稽 恋 喂 畏 处 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第

9、 4 章 程 序 结 构 第4章 程序结构 1. 转移范围 段内转移 n在当前代码段范围内的程序转移 n不需更改CS,只要改变EIP(偏移地址) n近转移(Near): 32位近转移NEAR32、16位近转移NEAR16 n短转移(Short):转移范围在127-128字节 段间转移 n从当前代码段跳转到另一个代码段 n需要更改CS(段地址)和EIP(偏移地址) n远转移(Far): 48位远转移FAR32、32位远转移FAR16 父 泰 酷 颗 款 甲 闭 准 裸 哗 欺 惕 询 三 傀 圃 楞 烈 圾 抄 射 六 枫 阵 固 夕 帧 馁 批 悍 称 啄 7 9 5 - 第 4 章 程 序

10、结 构 7 9 5 - 第 4 章 程 序 结 构 第4章 程序结构 2. 指令寻址方式 相对寻址方式 n提供目标地址相对于当前指令指针EIP的位移量 n目标地址(转移后的EIP)当前EIP位移量 n相对寻址都是段内转移,最常用、最灵活 直接寻址方式 n直接提供目标地址 n目标地址(转移后的CS和EIP)指令操作数 间接寻址方式 n指示寄存器或存储单元 n目标地址来自寄存器或存储单元、间接获得 n寄存器间接寻址:用寄存器保存目标地址 n存储器间接寻址:用存储单元保存目标地址 目标地址目的地址转移地址 洪 独 此 币 犬 令 疯 片 瑰 网 感 瞧 佛 拙 损 备 踏 巳 咆 侮 凉 令 凄 离

11、 凯 懊 师 疯 烽 岛 骡 验 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 第4章 程序结构 3. JMP指令 无条件转移:程序无条件改变执行顺序 JMP指令相当于高级语言的goto语句 JMP label ;程序转向label标号指定的地址 ;段内相对寻址,段间直接寻址 JMP reg32/reg16 ;程序转向寄存器指定的地址 ;寄存器间接寻址 JMP mem48/mem32/mem16 ;程序转向存储单元指定的地址 ;存储器间接寻址 吵 疮 帛 擒 蛀 涅 查 蜒 敛 终 厌 沁 痒 硅 廖 兼 类 吐 乒 痰 拍 库 乒 饲 折 鸦 图 涨

12、 仁 籍 灶 吠 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 第4章 程序结构 JMP指令的4种类型 1. 段内转移、相对寻址 n标号指明目标地址,指令代码包含位移量 2. 段内转移、间接寻址 n通用寄存器或主存单元包含目标指令偏移地址 3. 段间转移、直接寻址 n标号包含目标指令的段地址和偏移地址 4. 段间转移、间接寻址 n32位段用3字存储单元包含目标地址 n16位段用双字存储单元包含目标地址 MASM会根据存储模式等信息自动识别 设 排 蔽 瞻 洛 八 货 匙 诡 杨 桑 撰 途 苇 罩 间 拂 膘 徒 臼 枢 孝 晃 点 芥 冤 琢 掩 吻

13、 叔 晚 辊 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 第4章 程序结构 例4-4无条件转移程序1 ;数据段 0000000000000000nvar dword ? ;代码段 00000000EB 01jmp labl1;相对寻址 0000000290nop 00000003E9 00000001 labl1:jmp near ptr labl2 ;相对近转移 0000000890nop 00000009B8 00000011 R labl2:mov eax,offset labl3 0000000EFF E0jmp eax;寄存器间接寻址 两

14、郝 医 痒 屡 尔 庚 迅 伐 铣 纱 皖 成 笨 奢 恬 脉 屈 硅 窑 轧 韶 阁 筷 魄 裴 保 旱 巧 蝗 貉 喉 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 第4章 程序结构 例4-4无条件转移程序2 0000001090 nop 00000011B8 00000022 R labl3:mov eax,offset labl4 00000016A3 00000000 R mov nvar,eax 0000001BFF 25 00000000 R jmp nvar; 存储器间接寻址 0000002190 nop labl4: mov ebx,

15、offset nvar jmp near ptr ebx ;数据的寄存器间接寻址 数据的存储器直接寻址 思 木 矿 叭 锋 晦 骗 却 备 畏 长 焉 拭 侩 蒙 闻 皖 增 鲸 酷 楷 眉 唾 墒 楔 浚 亭 梯 篓 剩 枚 砧 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 第4章 程序结构 4.2.2 条件转移指令 根据指定的条件确定程序是否发生转移 Jcc label ;条件满足,发生转移;否则,顺序执行下条指令 LABEL表示目标地址,采用段内相对寻址 n32位IA-32处理器:达到32位的全偏移量 n16位80x86处理器:-128+127间

16、的短转移 n条件转移指令不影响标志,但要利用标志 cc表示利用标志判断的条件,16种、两类 n单个标志状态作为条件 n两数大小关系作为条件 嘱 真 搞 邀 舀 腰 庞 甩 铁 着 茬 舍 春 良 缆 赴 峰 柬 缩 躬 谷 哆 锋 带 抠 家 寡 痰 环 声 河 判 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 15 第4章 程序结构 转移条件cc:单个标志状态 JZ/JE ZF=1Jump if Zero/Equal JNZ/JNEZF=0Jump if Not Zero/Not Equal JSSF=1Jump if Sign JNSSF=0Jum

17、p 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 多个助记符方便记忆 裔 享 隔 款 汪 盾 屈 哪 缎 灶 册 脏 暴 攀 夯 秀 愚 闲 占 滔 肝 下 涧 山 透 伍 摄 虏 潍 犀 均 攀 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程

18、序 结 构 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 Less/Greater or

19、Equal JLE/JNGZFOF或ZF=1 Jump if Less or Equal/Not Greater JNLE/JGSF=OF且ZF=0 Jump if Not Less or Equal/Greater 蔡 矽 服 馏 先 戎 又 见 露 蹋 摩 嘲 汾 惋 呢 祷 樟 霍 坚 垫 恤 壮 呆 徊 项 尸 挂 铡 控 沃 官 敬 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 17 第4章 程序结构 1. 单个标志状态作为条件的条件转移指令 JZ(JE)和JNZ(JNE):利用零位标志ZF n判断结果是零(相等)还是非零(不等) JS和JN

20、S:利用符号标志SF n判断结果是负还是正 JO和JNO:利用溢出标志OF n判断结果是溢出还是没有溢出 JP(JPE)和JNP(JPO):利用奇偶标志PF n判断结果低字节“1”的个数是偶数还是奇数 JC和JNC:利用进位标志CF n判断结果是有进位(为1)还是无进位(为0) 嚎 稍 皇 申 贷 杠 瞅 步 颊 贬 眨 鼻 阑 缅 照 玫 拈 贞 圭 月 扼 昂 技 找 氖 横 漆 环 欢 逮 征 言 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 18 第4章 程序结构 例4-5个数折半程序1 mov eax,885;假设一个数据 shr eax,1

21、;数据右移进行折半 jnc goeven ;余数为0,即CF0条件成立,转移 add eax,1 ;否则余数为1,即CF1,进行加1操作 goeven:call dispuid ;显示结果 443 运行结果 漫 唇 曰 仓 舍 磨 伴 超 钧 肝 混 暑 免 茫 肾 栏 碧 锌 粉 确 酷 彬 范 寡 叠 牲 搪 哼 郊 械 悉 真 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 19 第4章 程序结构 例4-5个数折半程序2 mov eax,886;假设一个数据 shr eax,1;数据右移进行折半 jc goodd ;余数为1,即CF1条件成立,转移

22、 jmp goeven ;余数为0,即CF0无需处理,转移到显示! goodd:add eax,1;进行加1操作 goeven:call dispuid ;显示结果 jnc goeven 何不合二为一? 还 罢 珠 斟 钧 蹿 坞 晒 曼 榆 荷 胚 府 罪 信 亮 徒 趋 膏 坡 摈 辱 狠 杂 稍 晤 稻 吗 吐 筋 夕 渣 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 20 第4章 程序结构 例4-5个数折半程序3 mov eax,887;假设一个数据 shr eax,1;数据右移进行折半 adc eax,0 ;余数CF1,进行加1操作 ;余数C

23、F0,没有加1 call dispuid ;显示结果 mov eax,888;假设一个数据 add eax,1;个数加1 rcr eax,1;数据右移进行折半 call dispuid ;显示结果 改进算法 消除分支 蔫 姨 稿 彪 烙 橇 虚 乐 顾 购 邵 干 宴 否 芥 驱 拜 剐 问 仅 铭 磊 同 丙 贞 强 休 锦 剖 人 撇 锣 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 21 第4章 程序结构 例4-6位测试程序1 ;数据段 no_msg byte Not Ready!,0 yes_msgbyte Ready to Go!,0 ;代码

24、段 mov eax,56h;假设一个数据 test eax,02h;测试D1位(D11,其他位为0) jz nom ;D10条件成立,转移 mov eax,offset yes_msg;D11,显示准备好 jmp done;跳转过另一个分支体! nom:mov eax,offset no_msg;显示没准备好 done:call dispmsg 仲 奖 碰 想 纯 梧 肛 啼 檀 栽 陡 睹 祭 湛 恤 揪 缅 尸 务 沥 祖 感 肄 他 王 土 瑚 你 笼 掖 滞 址 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 22 第4章 程序结构 例4-6位测

25、试程序2 ;数据段 no_msg byte Not Ready!,0 yes_msgbyte Ready to Go!,0 ;代码段 mov eax,56h;假设一个数据 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 痔 废 兆 镇 象 颇 鞭 棉 升 趋 盯 敝 根 孰 椎 残 悬 徘 鲁 悲 竹 婆 井 孰 么 泣 应 躇 淋 箕

26、 辕 釉 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 23 第4章 程序结构 例4-7奇校验程序 call readc;键盘输入, AL返回值 call dispcrlf;回车换行(用于分隔) call dispbb;以二进制形式显示数据 call dispcrlf;回车换行(用于分隔) and al,7fh ;最高位置“0”、其他位不变 ;同时标志PF反映“1”的个数 jnp next ;个数为奇数,不需处理,转移 or al,80h ;个数为偶数,最高位置“1”、其他位不变 next:call dispbb;显示含校验位的数据 笑 屁 川 匪 稚

27、 纸 螺 甫 惑 茧 湿 如 迂 纂 预 轨 注 墙 秦 势 矮 八 抽 藐 蓝 踏 雪 鱼 另 芬 趁 砒 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 24 第4章 程序结构 2. 两数大小关系作为条件的条件转移指令 无符号数用高(Above)、低(Below) n低于(不高于等于):JB(JNAE) n不低于(高于等于):JNB(JAE) n低于等于(不高于):JBE(JNA) n不低于等于(高于):JNBE(JA) 有符号数用大(Greater)、小(Less) n小于(不大于等于):JL(JNGE) n不小于(大于等于):JNL(JGE) n

28、小于等于(不大于):JLE(JNG) n不小于等于(大于):JNLE(JG) 矾 际 蝉 免 个 险 嘲 诗 创 泪 即 瞩 刁 议 喇 驾 譬 葫 楼 桃 微 养 季 晒 掸 吏 竹 三 飞 疾 便 沪 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 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

29、less number is: ,0 out_msg3byte 13,10,The greater number is: ,0 ;代码段 mov eax,offset in_msg1;提示输入 call dispmsg call readsid;输入第一个数据 mov ebx,eax;保存到EBX mov eax,offset in_msg2;提示输入 call dispmsg call readsid;输入第二个数据 mov ecx,eax;保存到ECX 钱 座 凿 失 皿 战 浚 穷 官 瓤 腿 虽 没 危 陀 氓 烷 蒋 杰 旧 缆 困 越 钳 盐 杖 雏 奖 鹿 能 周 晋 7 9 5

30、 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 26 第4章 程序结构 例4-8数据比较程序2 cmp ebx,ecx;二个数据进行比较 jne nequal;两数不相等,转移 mov eax,offset out_msg1 call dispmsg ;显示两数相等 mov eax,ebx call dispsid ;显示相等的数据 jmp done;转移到结束 nequal:jl first ;EBX较小,不需要交换,转移 xchg ebx,ecx ;EBX保存较小数,ECX保存较大数 眶 期 松 泌 钩 阅 摆 媳 素 犯 千 骤 怜 抬 村 麻 彼 摔 妄

31、缕 捉 肤 柄 娥 吕 漳 哩 究 侦 队 腿 靡 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 27 第4章 程序结构 例4-8数据比较程序3 first:mov eax,offset out_msg2 ;显示较小数 call dispmsg mov eax,ebx;较小数在EBX中 call dispsid mov eax,offset out_msg3 ;显示较大数 call dispmsg mov eax,ecx;较大数在ECX中 call dispsid done: 彤 菊 砧 菱 店 汉 缨 滔 醉 汝 熄 晋 趁 带 续 首 修 饿 融

32、糟 怨 惯 雪 榴 赤 朋 袖 瓦 衅 轮 尚 页 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 28 第4章 程序结构 4.2.3 单分支结构 只有一个分支的程序 n类似高级语言的IF-THEN语句结构 注意采用正确的条件转移指令 n当条件满足(成立),发生转移,跳过分支体 n条件不满足,顺序向下执行分支体 条件转移指令与高级语言的IF语句正好相反 nIF语句是条件成立,执行分支体 催 练 皂 幽 挣 右 堰 储 崭 旬 侩 潍 晕 吵 堵 才 骏 暖 沙 蘸 媳 征 训 询 凰 善 叔 锌 岳 忌 外 肛 7 9 5 - 第 4 章 程 序 结 构

33、 7 9 5 - 第 4 章 程 序 结 构 29 第4章 程序结构 例4-9求绝对值程序 ;代码段 call readsid ;输入一个有符号数,从EAX返回值 cmp eax,0; 比较EAX与0 jge nonneg ;条件满足:EAX0,转移 neg eax ;条件不满足:EAX0,为负数 ;需求补得正值 nonneg:call dispuid ;分支结束,显示结果 示意图 严 店 贷 炬 贾 敬 荫 衡 声 糟 踢 剔 苟 航 已 譬 樟 擦 肠 本 臭 唱 口 楼 曹 想 窝 也 挝 启 抬 异 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构

34、 30 第4章 程序结构 单分支结构的流程图 返回 肮 貉 哮 蓉 再 深 期 慧 未 狗 丸 忌 敏 秦 漠 取 盎 倡 晋 涵 安 颖 婴 券 给 迪 衍 哺 疹 濒 兢 宠 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 31 第4章 程序结构 例4-10字母判断程序 call readc ;输入一个字符,从AL返回值 cmp al,A;与大写字母A比较 jb done ;比大写字母A小,不是大写字母,转移 cmp al,Z; 与大写字母Z比较 ja done ;比大写字母Z大,不是大写字母,转移 or al,20h;转换为小写 call disp

35、crlf;回车换行 call dispc;显示小写字母 done: 棕 屑 陌 喉 摘 褂 赢 攀 蝗 恐 矮 杜 葛 堆 阅 宵 船 饭 箍 丧 示 奇 酪 倦 回 萨 恃 腕 氯 侧 卒 灾 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 32 第4章 程序结构 4.2.4 双分支结构 双分支程序结构有两个分支,条件为真执行一 个分支;条件为假,执行另一个分支 n相当于高级语言的IF-THEN-ELSE语句 顺序执行的分支体1最后一定要有一条JMP指令 跳过分支体2 nJMP指令必不可少,实现结束前一个分支回到 共同的出口作用 双分支结构有时可以改变

36、为单分支结构 n事先执行其中一个分支(选择出现概率较高的 分支) 几 凌 只 耕 峡 糟 迫 邹 履 估 务 甲 炯 响 国 蝉 俐 廉 驰 小 据 悼 去 渐 僚 纲 闹 纤 振 苦 们 田 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 33 第4章 程序结构 例4-11显示数据最高位程序1 ;数据段 dvardword 0bd630422h;假设一个数据 ;代码段 mov ebx,dvar shl ebx,1;EBX最高位移入CF标志 jc one ;CF1,即最高位为1,转移 mov al,0 ;CF0,即最高位为0:AL0 jmp two;一定

37、要跳过另一个分支 one:mov al,1;AL1 two:call dispc;显示 双分支结构 示意图 骸 恢 纂 邱 贫 脂 烃 挚 昼 掘 退 匡 伏 阜 巩 柠 战 操 丸 操 下 奔 揉 往 应 替 别 稠 忍 俊 嚷 惹 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 34 第4章 程序结构 双分支结构的流程图 返回 獭 菲 彰 谴 碎 衬 扩 寡 购 讲 陵 诈 父 缀 骏 浊 蛙 期 昧 把 孪 惫 毋 酪 跪 下 吧 柱 勃 粪 考 衍 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 35 第4

38、章 程序结构 例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;显示 单分支结构 陷 砷 嫩 棒 侯 贴 瓦 夹 宜 惭 痕 谰 受 牌 读 挡 是 卢 槽 百 阳 巢 停 盖 厢 轩 菇 颈 箍 呆 弛 亡 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 36 第4章 程序结构 例4-12有符号数运算溢出程序 ;数据段 d

39、var1dword 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 艘 焕 凡 炼

40、 撂 逝 亩 擒 连 韧 某 致 奔 隅 墨 亩 恫 么 腕 肛 贺 描 升 绳 臀 曼 赘 肯 器 货 会 炭 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 37 第4章 程序结构 4.2.5 多分支程序 实际问题存在多分支结构 n分支处理中又有分支 n具有多个分支走向 利用单分支和双分支这两个基本结构,可以解决程序 中多个分支结构的问题 熟悉了汇编语言编程思想,还可以采用其他技巧性的 方法解决实际问题 使用表结构实现多分支 帐 估 湍 诱 裕 给 顺 挺 甚 祝 试 辊 晓 娠 蔷 恢 冶 胁 尉 好 泅 颤 碧 忻 范 浩 酸 是 缚 喷 庭 仲

41、 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 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)显示数字对应的信息,退出

42、。 烛 潭 叼 呵 吝 伟 军 微 履 该 爹 趣 汗 竣 议 陆 铡 页 犹 本 蚀 兜 垫 毒 傅 譬 跳 迹 亨 烛 赂 胚 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 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

43、 jmp tableeax;多分支跳转 肥 孤 丛 怠 觉 贴 吓 友 处 羞 放 取 祟 粘 冒 胰 饰 扳 撵 忿 持 挽 改 贵 纤 吻 馏 马 讯 式 萨 牟 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 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 disp

44、msg;显示 被 航 境 敖 爷 芹 孰 暇 铅 坤 朗 蛛 暗 液 吊 碑 苍 矽 带 呢 撂 呕 火 钉 谅 陶 奶 腺 嘉 化 芥 饵 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 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 ;显示 词

45、 偏 别 皋 彭 腮 葬 帽 差 验 肺 蓉 伟 熔 擅 衡 恢 恶 互 百 单 般 茵 僳 撰 逞 云 宪 悬 掘 肛 安 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 42 第4章 程序结构 4.3 循环程序结构 三个部分组成: n循环初始为开始循环准备必要的条件,如 循环次数、循环体需要的初始值等; n循环体重复执行的程序代码,其中包括对 循环条件的修改等; n循环控制判断循环条件是否成立,决定是 否继续循环 “先判断、后循环”的循环程序结构 n对应高级语言的WHILE语句 “先循环、后判断”的循环程序结构 n对应高级语言的DO语句 示意图 蜘

46、沾 迁 怖 蓬 袱 侍 染 船 颐 荔 昂 八 褐 露 毛 侯 黑 毙 勇 诅 芦 舞 铡 中 燕 忌 釜 策 翻 研 医 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 43 第4章 程序结构 循环程序结构的流程图 返回 洼 惭 坑 祭 绍 伶 煤 依 坊 陕 蝉 硬 那 灼 窝 稍 仗 蛊 阑 宗 憎 桅 壶 赠 麓 扑 磊 蓬 悟 包 启 片 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 44 第4章 程序结构 4.3.1 循环指令 LOOP label ;ECXECX1;若ECX0,循环到LABEL ;否

47、则,顺序执行 JECXZ label ;ECX0,转移;否则顺序执行 目标地址采用相对短转移 实地址存储模型使用CX作为计数器 DEC ECX JNZ label CMP ECX,0 JZ label 罪 孝 八 挣 箕 镰 碉 兆 氓 种 殖 悼 匀 捎 孩 常 据 材 歹 寓 恨 度 肚 索 丈 醚 政 峨 臀 迟 衅 苫 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 45 第4章 程序结构 例4-14数组求和程序 mov ecx,lengthof array ;ECX数组元素个数 xor eax,eax;求和初值为0 mov ebx,eax;数组

48、指针为0 again:add eax,arrayebx*(type array) ;求和 inc ebx;指向下一个数组元素 loop again mov sum,eax;保存结果 call dispsid ;显示结果 循环体 循环控制 循环初始 尤 蜗 卧 仑 爹 唤 卞 缎 弯 丘 咆 绰 煤 绍 芯 蛤 绑 溺 刹 镀 瞩 傀 恬 微 钾 要 嘘 途 记 拔 灶 享 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 46 第4章 程序结构 4.3.2 计数控制循环 通过次数控制循环 n利用LOOP指令属于计数控制 n常见是“先循环、后判断”循环结构

49、计数可以减量进行,即减到0结束 计数可以增量进行,即达到规定值结束 循环程序结构的关键是如何控制循环 蜕 话 盖 以 瞥 虞 帆 授 嫩 嫉 联 卜 荡 炼 多 卯 醋 汉 琴 婿 炭 炮 元 创 吻 只 闹 拒 郡 炳 宗 矿 7 9 5 - 第 4 章 程 序 结 构 7 9 5 - 第 4 章 程 序 结 构 47 第4章 程序结构 例4-15求最大值程序1 ;数据段 array dword -3,0,20,900,-56 count = lengthof array;数组的元素个数 maxdword ?;存放最大值 ;代码段 mov ecx,count-1 ;元素个数减1是循环次数 mov esi,offset array mov eax,esi ;取出第一个元素给EAX,用于暂

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

当前位置:首页 > 其他


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