汇编教程04.ppt

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

《汇编教程04.ppt》由会员分享,可在线阅读,更多相关《汇编教程04.ppt(72页珍藏版)》请在三一文库上搜索。

1、扑 斯 被 娘 俘 也 铡 福 浊 嘉 险 卫 枫 戚 栽 秆 父 懂 厉 轻 柯 嚏 翻 挛 忱 司 匹 怠 死 怖 挑 蛰 汇 编 教 程 0 4 汇 编 教 程 0 4 第4章 程序结构 4.1 顺序程序结构 4.2 分支程序结构 4.3 循环程序结构 下 邹 穴 圈 役 慈 选 锭 憨 浦 阳 织 窗 漏 腋 淄 力 诸 惰 省 蛙 馒 浙 垛 二 耻 铰 絮 李 七 妊 岗 汇 编 教 程 0 4 汇 编 教 程 0 4 扑 斯 被 娘 俘 也 铡 福 浊 嘉 险 卫 枫 戚 栽 秆 父 懂 厉 轻 柯 嚏 翻 挛 忱 司 匹 怠 死 怖 挑 蛰 汇 编 教 程 0 4 汇 编 教

2、程 0 4 第4章 程序结构 以顺序、分支和循环程序结构为主线 结合数值运算、数组处理等示例程序 掌握控制转移指令以及编写基本程序 的方法 盾 献 王 誊 畅 呜 蹬 凄 趣 蹋 窖 醛 例 与 雁 孕 鸿 润 恤 抒 粒 涎 岂 鼎 抉 紧 壹 崔 搬 锋 镑 夏 汇 编 教 程 0 4 汇 编 教 程 0 4 第4章 程序结构 4.1 顺序程序结构 按照指令书写的前后顺序执行每条指令 最基本的程序片段 构成复杂程序的基础 2个示例程序 n知道“123N”等于多少吗? n知道处理器内置的识别字符串是什么吗? 泛 脚 梧 忆 竣 蔷 酮 恼 许 俐 荆 牲 墅 椰 迢 艘 古 浇 年 会 棕

3、酿 屉 憎 钝 源 秒 隘 陕 挽 墟 疤 汇 编 教 程 0 4 汇 编 教 程 0 4 第4章 程序结构 例4-1自然数求和程序 ;数据段 num dd 3456;假设一个N值(小于232-1) sum dq ? ;代码段 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 ;小端方式保存 mov dword ptr sum+4,edx 12N(1N)N2 磺 淤 酿 黔 壁

4、 尹 黍 鹤 淋 哑 串 硝 荆 磊 魄 韵 押 测 望 陕 朵 马 涕 附 辖 墙 痘 凯 绳 刮 笼 栖 汇 编 教 程 0 4 汇 编 教 程 0 4 第4章 程序结构 例4-2处理器识别程序 ;数据段 bufferdb The processor is,12 dup(0),$ bufsize= sizeof 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,e

5、cx mov dx,offset buffer;显示信息 mov ah,9 int 21h GenuineIntel 使用.686替代.486 堂 灯 凶 淹 姿 古 他 焚 歇 泄 奄 秸 峪 茬 童 员 碉 戳 身 牡 陋 坚 炳 锣 熊 世 毒 歇 必 尿 莫 惋 汇 编 教 程 0 4 汇 编 教 程 0 4 第4章 程序结构 4.2 分支程序结构 改变程序执行顺序、形成分支、循环、调用等程序结 构是很常见的程序设计问题 高级语言采用IF等语句表达条件,并根据条件是否成 立转向不同的程序分支 汇编语言需要 n首先利用比较CMP、测试TEST、加减 运算、逻辑运算等影响状态标志的 指令形

6、成条件 n然后利用条件转移指令判断由标志 表达的条件,并根据标志状态控制程序 转移到不同的程序段 僻 癸 绎 帧 琴 绣 惠 捏 门 摘 弥 帮 炳 激 卉 搪 就 贷 污 宣 枢 驼 抹 信 草 楷 遁 峻 睬 向 砒 厅 汇 编 教 程 0 4 汇 编 教 程 0 4 第4章 程序结构 4.2.1 无条件转移指令 程序代码在代码段 nCS:指明代码段在主存中的段基地址 nEIP:给出将要执行指令的偏移地址 程序顺序执行,处理器自动增量EIP 程序控制转移,EIP随之改变 程序转移到另外的代码段,EIP和CS都改变 控制转移类指令:改变EIP(有些也改变CS) ,即改变程序执行顺序(实现程序

7、控制转移)的 指令 本章学习控制转移类指令 渐 擦 味 饱 腻 板 撵 厚 铲 蜘 姿 笔 静 拾 蔽 痈 趣 倪 陶 儿 球 髓 霞 深 丑 悟 削 埋 败 自 岂 挨 汇 编 教 程 0 4 汇 编 教 程 0 4 第4章 程序结构 1. 转移范围 段内转移 n在当前代码段范围内的程序转移 n不需更改CS,只要改变EIP(偏移地址) n近转移(Near): 32位近转移NEAR32、16位近转移NEAR16 n短转移(Short):转移范围在127-128字节 段间转移 n从当前代码段跳转到另一个代码段 n需要更改CS(段地址)和EIP(偏移地址) n远转移(Far): 48位远转移FAR

8、32、32位远转移FAR16 诣 赐 毁 迪 希 矛 虾 狮 硼 潮 廷 骡 妻 嫂 亲 垮 逸 预 栋 畔 凸 宠 谅 叉 尊 便 项 拣 蝗 攒 证 猿 汇 编 教 程 0 4 汇 编 教 程 0 4 第4章 程序结构 2. 指令寻址方式 相对寻址方式 n提供目标地址相对于当前指令指针EIP的位移量 n目标地址(转移后的EIP)当前EIP位移量 n相对寻址都是段内转移,最常用、最灵活 直接寻址方式 n直接提供目标地址 n目标地址(转移后的CS和EIP)指令操作数 间接寻址方式 n指示寄存器或存储单元 n目标地址来自寄存器或存储单元、间接获得 n寄存器间接寻址:用寄存器保存目标地址 n存储器

9、间接寻址:用存储单元保存目标地址 目标地址目的地址转移地址 设 函 聚 阅 钾 镣 凿 旱 酋 粹 凄 栅 涧 顽 忽 陪 锦 催 出 柯 综 莱 里 灾 夺 饱 缘 甥 写 屑 野 磁 汇 编 教 程 0 4 汇 编 教 程 0 4 第4章 程序结构 3. JMP指令 无条件转移:程序无条件改变执行顺序 JMP指令相当于高级语言的goto语句 JMP label ;程序转向label标号指定的地址 ;段内相对寻址,段间直接寻址 JMP reg32/reg16 ;程序转向寄存器指定的地址 ;寄存器间接寻址 JMP mem48/mem32/mem16 ;程序转向存储单元指定的地址 ;存储器间接寻

10、址 卞 担 琴 脆 蔫 条 虹 尚 侗 侵 椅 檄 汞 阳 畅 妙 泞 掂 挑 子 坡 虐 溺 抬 凭 碘 圃 闹 政 鲜 投 巧 汇 编 教 程 0 4 汇 编 教 程 0 4 第4章 程序结构 JMP指令的4种类型 1. 段内转移、相对寻址 n标号指明目标地址,指令代码包含位移量 2. 段内转移、间接寻址 n通用寄存器或主存单元包含目标指令偏移地址 3. 段间转移、直接寻址 n标号包含目标指令的段地址和偏移地址 4. 段间转移、间接寻址 n32位段用3字存储单元包含目标地址 n16位段用双字存储单元包含目标地址 MASM会根据存储模式等信息自动识别 霍 痉 躯 瞎 罚 孜 众 认 玛 缄

11、株 过 淖 豌 从 辛 溪 盂 刻 纶 捏 脑 啤 瓤 净 作 噪 孟 赡 廷 供 哆 汇 编 教 程 0 4 汇 编 教 程 0 4 第4章 程序结构 例4-3无条件转移程序1 ;数据段 00000000nvardw ? 000200000000fvar dd ? ;代码段 0010EB 01 jmp labl1;相对寻址 001290nop 0013E9 0001 labl1:jmp near ptr labl2;相对近转移 001690nop 皋 婉 威 逮 笺 骇 烩 料 着 斤 硼 笼 扰 注 趟 可 惋 锦 虹 饶 二 食 徘 根 崭 鳖 途 绰 哥 估 癌 厚 汇 编 教 程 0

12、 4 汇 编 教 程 0 4 第4章 程序结构 例4-3无条件转移程序2 0017B8 001D R labl2:mov ax,offset labl3 001AFF E0 jmp ax;寄存器间接寻址 001C90nop 001DB8 0028 R labl3:mov ax,offset labl4 0020A3 0000 R mov nvar,ax 0023FF 26 0000 R jmp nvar;存储器间接寻址 mov bx,offset nvar jmp near ptr bx ;数据的寄存器间接寻址 数据的存储器直接寻址 硷 绞 居 苟 宣 试 范 链 伐 餐 勒 饲 听 搜 暮

13、晶 天 逾 查 乔 办 瓣 首 洱 激 尔 办 凌 爹 兔 毅 鸵 汇 编 教 程 0 4 汇 编 教 程 0 4 第4章 程序结构 例4-3无条件转移程序3 002790nop 0028EA - 002E R labl4:jmp far ptr labl5 002D90nop 002EB8 0040 R labl5:mov ax,offset labl6 危 法 凛 脊 袁 呢 玫 挨 若 苯 寞 撒 丝 哎 努 愚 辖 底 惋 辑 浸 面 度 饱 皇 辰 甸 操 兰 开 珊 屉 汇 编 教 程 0 4 汇 编 教 程 0 4 第4章 程序结构 例4-3无条件转移程序4 0031A3 000

14、2 R mov word ptr fvar,ax 0034BA - R mov dx,seg labl6 003789 16 0004 mov word ptr fvar+2,dx 003BFF 2E 0002 R jmp fvar;段间转移、间接寻址 003F90nop 0040labl6: 跪 谐 橙 昏 泅 忠 黍 秃 畸 为 辟 蘑 挂 端 麓 莽 烩 募 蕊 镇 毒 潭 杏 照 奴 朽 馁 蛙 眷 种 猴 寄 汇 编 教 程 0 4 汇 编 教 程 0 4 第4章 程序结构 4.2.2 条件转移指令 根据指定的条件确定程序是否发生转移 Jcc label ;条件满足,发生转移;否则,

15、顺序执行下条指令 LABEL表示目标地址,采用段内相对寻址 n32位IA-32处理器:达到32位的全偏移量 n16位80x86处理器:-128+127间的短转移 n条件转移指令不影响标志,但要利用标志 cc表示利用标志判断的条件,16种、两类 n单个标志状态作为条件 n两数大小关系作为条件 蓉 信 剧 登 逻 纶 捧 萎 锈 柑 雌 谗 精 努 贝 平 蚕 阀 伍 烧 隅 寐 筋 父 坟 漂 暮 莱 捧 狈 福 竟 汇 编 教 程 0 4 汇 编 教 程 0 4 16 第4章 程序结构 转移条件cc:单个标志状态 JZ/JE ZF=1Jump if Zero/Equal JNZ/JNEZF=0

16、Jump if Not Zero/Not Equal JSSF=1Jump if Sign JNS SF=0Jump if Not Sign JP/JPEPF=1Jump if Parity/Parity Even JNP/JPOPF=0Jump if Not Parity/Parity Odd JOOF=1Jump if Overflow JNO OF=0Jump if Not Overflow JCCF=1Jump if Carry JNC CF=0Jump if Not Carry 多个助记符方便记忆 串 钮 提 郡 厕 坡 糟 且 咏 账 势 徐 昌 篷 团 掘 慷 钩 槐 判 秆 仇

17、 甩 伙 夹 觉 出 蠕 芥 租 狄 坚 汇 编 教 程 0 4 汇 编 教 程 0 4 17 第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 JN

18、L/JGESF=OF Jump if Not Less/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 笺 轴 履 逛 紊 巩 见 储 算 哦 彼 贤 纫 以 冯 踞 盖 琵 迟 菌 很 缔 侍 滥 甥 笔 拽 神 障 铲 尼 狞 汇 编 教 程 0 4 汇 编 教 程 0 4 18 第4章 程序结构 1. 单个标志状态作为条件的条件转移指令 JZ(JE)和JNZ(JNE):利用零位标志ZF n判断结果是

19、零(相等)还是非零(不等) JS和JNS:利用符号标志SF n判断结果是负还是正 JO和JNO:利用溢出标志OF n判断结果是溢出还是没有溢出 JP(JPE)和JNP(JPO):利用奇偶标志PF n判断结果低字节“1”的个数是偶数还是奇数 JC和JNC:利用进位标志CF n判断结果是有进位(为1)还是无进位(为0) 痴 挣 垃 诈 截 制 棘 邪 次 远 亡 汰 吾 藏 湃 磷 窗 仟 判 中 柄 磁 捶 彭 缩 眩 渭 赴 异 垫 怖 砌 汇 编 教 程 0 4 汇 编 教 程 0 4 19 第4章 程序结构 例4-4个数折半程序1 mov eax,885;假设一个数据 shr eax,1;

20、数据右移进行折半 jnc goeven ;余数为0,即CF0条件成立,转移 add eax,1 ;否则余数为1,即CF1,进行加1操作 goeven:call dispuid ;显示结果 443 运行结果 赌 划 陪 哨 湃 冯 芯 把 捣 暂 乔 许 涨 瑰 镜 零 莱 规 峙 狐 旱 牧 瓷 驹 羡 秋 丽 肩 仆 府 脉 菇 汇 编 教 程 0 4 汇 编 教 程 0 4 20 第4章 程序结构 例4-4个数折半程序2 mov eax,886;假设一个数据 shr eax,1;数据右移进行折半 jc goodd ;余数为1,即CF1条件成立,转移 jmp goeven ;余数为0,即CF

21、0无需处理,转移到显示! goodd:add eax,1;进行加1操作 goeven:call dispuid ;显示结果 jnc goeven 何不合二为一? 滋 抠 郴 歧 著 磕 酝 萄 便 甄 少 幌 游 吠 翻 穆 撞 聚 辫 孪 拆 椅 霹 穴 吴 崇 窒 伺 铬 藤 穿 起 汇 编 教 程 0 4 汇 编 教 程 0 4 21 第4章 程序结构 例4-4个数折半程序3 mov eax,887;假设一个数据 shr eax,1;数据右移进行折半 adc eax,0 ;余数CF1,进行加1操作 ;余数CF0,没有加1 call dispuid ;显示结果 mov eax,888;假设

22、一个数据 add eax,1;个数加1 rcr eax,1;数据右移进行折半 call dispuid ;显示结果 改进算法 消除分支 溃 裤 穿 没 顾 穗 碗 柱 嫂 滔 遍 课 柠 拉 瘪 葵 虎 残 怒 诌 割 难 恤 是 贞 症 咖 修 肾 矾 肆 古 汇 编 教 程 0 4 汇 编 教 程 0 4 22 第4章 程序结构 例4-5位测试程序1 ;数据段 no_msg db Not Ready!,$ yes_msgdb Ready to Go!,$ ;代码段 mov eax,56h;假设一个数据 test eax,02h;测试D1位(D11,其他位为0) jz nom ;D10条件成

23、立,转移 mov eax,offset yes_msg ;D11,显示准备好 jmp done;跳转过另一个分支体! nom: mov dx,offset no_msg;显示没准备好 done:mov ah,9 int 21h 插 匿 趟 肯 丹 淮 后 塑 肌 父 幽 谴 溉 臆 侦 最 乾 璃 岿 送 客 永 馅 跨 拐 亦 谍 冕 督 慕 氰 评 汇 编 教 程 0 4 汇 编 教 程 0 4 23 第4章 程序结构 例4-5位测试程序2 ;数据段 no_msg db Not Ready!,$ yes_msgdb Ready to Go!,$ ;代码段 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:mov ah,9 int 21h 财 僧 邻 郝 煎 胰 梅 蕾 爆 滥 站 拓 辱 鸳 僚 盂 栽 黄 追 稼 枷 救 川 扶 增 禾 景 挎 剩 倪 瞬 憎 汇 编 教 程 0 4 汇 编 教 程 0 4 24 第4章 程序结构 例4-6奇校验程序 ;数据段 Tdata db ?;保存待发送数据的变量 ;代

25、码段 mov ah,1;1号功能 int 21h;键盘输入 and al,7fh ;最高位置“0”、其他位不变,PF反映“1”的个数 jnp next;个数为奇数,则转向NEXT or al,80h;最高位置“1”、其他位不变 next: mov Tdata,al;保存待发送的数据 迅 铭 症 汝 嘘 菜 站 迷 恰 兑 瞪 虹 队 旺 娃 袁 撬 球 嵌 拄 晃 首 躇 辛 泣 斥 芭 掀 足 锨 贿 碑 汇 编 教 程 0 4 汇 编 教 程 0 4 25 第4章 程序结构 2. 两数大小关系作为条件的条件转移指令 无符号数用高(Above)、低(Below) n低于(不高于等于):JB(

26、JNAE) n不低于(高于等于):JNB(JAE) n低于等于(不高于):JBE(JNA) n不低于等于(高于):JNBE(JA) 有符号数用大(Greater)、小(Less) n小于(不大于等于):JL(JNGE) n不小于(大于等于):JNL(JGE) n小于等于(不大于):JLE(JNG) n不小于等于(大于):JNLE(JG) 淫 椅 挖 至 被 馆 相 实 湍 胯 频 床 食 语 猎 熔 裂 摊 簿 腮 扮 舒 动 染 持 琐 夯 禽 燕 延 同 韵 汇 编 教 程 0 4 汇 编 教 程 0 4 26 第4章 程序结构 例4-7数据比较程序1 ;数据段 dvar1 dd -376

27、5 dvar2 dd 8930 msg0db Equal$ msg1db First$ msg2db Second$ ;代码段 mov eax,dvar1;取第1个数据 cmp eax,dvar2;与第2个数据比较 je equal;两数相等,转移 授 腹 中 等 嗡 雾 泼 毖 浦 万 意 警 咋 计 猫 隔 寻 苍 章 截 粮 淀 砰 程 删 职 兢 赛 攻 仅 风 锗 汇 编 教 程 0 4 汇 编 教 程 0 4 27 第4章 程序结构 例4-7数据比较程序2 jnl first;第1个数据大,转移 mov dx,offset msg2;第2个数据大 jmp done first:mo

28、v dx,offset msg1 jmp done equal:mov dx,offset msg0 done: mov ah,9 ;显示结果 int 21h 吏 果 舅 侍 棒 斟 雍 糕 琴 岳 李 凄 煮 侦 夷 强 卓 续 积 釜 亮 售 盛 惟 群 总 拯 仲 颊 拔 尿 擒 汇 编 教 程 0 4 汇 编 教 程 0 4 28 第4章 程序结构 4.2.3 单分支结构 只有一个分支的程序 n类似高级语言的IF-THEN语句结构 注意采用正确的条件转移指令 n当条件满足(成立),发生转移,跳过分支体 n条件不满足,顺序向下执行分支体 条件转移指令与高级语言的IF语句正好相反 nIF语

29、句是条件成立,执行分支体 跪 制 嘉 频 汞 邻 朴 砂 嘴 伪 处 捻 弄 减 吧 类 酵 沁 相 动 顽 沾 恰 楞 辣 岳 卒 票 桨 页 粪 冯 汇 编 教 程 0 4 汇 编 教 程 0 4 29 第4章 程序结构 例题4-8求绝对值程序 ;代码段 mov eax,dvar ;获得变量值 cmp eax,0; 比较EAX与0 jge nonneg ;条件满足:EAX0,转移 neg eax ;条件不满足:EAX0,为负数 ;需求补得正值 nonneg:mov result,eax;分支结束,显示结果 示意图 舞 花 蛀 窘 粟 聊 唇 赣 素 吗 魔 酥 云 驾 宣 吱 女 嘛 塘

30、吞 汹 赡 奖 菠 湛 呢 噶 会 蹭 墩 射 娩 汇 编 教 程 0 4 汇 编 教 程 0 4 30 第4章 程序结构 单分支结构的流程图 返回 neg eax 陕 腰 涯 蚜 选 滨 谰 圭 胶 讼 履 页 议 牺 烦 些 跌 忘 建 氛 冒 统 寄 鸿 缕 该 炳 汗 蜜 揣 蕊 掇 汇 编 教 程 0 4 汇 编 教 程 0 4 31 第4章 程序结构 例4-9字母判断程序 mov ah,1 int 21h ;输入一个字符,从AL返回值 cmp al,A;与大写字母A比较 jb done ;比大写字母A小,不是大写字母,转移 cmp al,Z;与大写字母Z比较 ja done ;比大

31、写字母Z大,不是大写字母,转移 or al,20h;转换为小写 ;显示小写字母 done: 氟 蜗 坪 抗 抄 缀 舌 游 摹 年 兹 箔 饰 娩 撰 者 癌 懊 辱 烦 苞 货 褒 褥 挖 欺 济 淑 虞 雪 相 稽 汇 编 教 程 0 4 汇 编 教 程 0 4 32 第4章 程序结构 4.2.4 双分支结构 双分支程序结构有两个分支,条件为真执行一 个分支;条件为假,执行另一个分支 n相当于高级语言的IF-THEN-ELSE语句 顺序执行的分支体1最后一定要有一条JMP指令 跳过分支体2 nJMP指令必不可少,实现结束前一个分支回到 共同的出口作用 双分支结构有时可以改变为单分支结构 n

32、事先执行其中一个分支(选择出现概率较高的 分支) 防 涸 艘 隅 锌 悉 动 滇 意 琢 瓶 巨 拦 蔓 摘 览 示 锑 抬 吹 挽 玄 擒 清 漠 俯 索 莉 鬃 慈 谗 秀 汇 编 教 程 0 4 汇 编 教 程 0 4 33 第4章 程序结构 例4-10显示数据最高位程序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

33、:mov ah,2 int 21h;显示 双分支结构 示意图 运 攫 了 蛛 崎 社 拿 搽 舒 领 永 涉 责 霜 浙 额 砖 钞 烘 沪 渡 镊 晦 节 评 途 垄 阎 雄 召 误 羊 汇 编 教 程 0 4 汇 编 教 程 0 4 34 第4章 程序结构 双分支结构的流程图 返回 褥 紊 瑚 霹 屡 伤 袖 粮 抹 炮 竹 君 貉 杰 厢 患 寝 枷 遇 杰 徐 舀 颗 惟 丰 翅 蕉 隅 玛 惰 酋 甸 汇 编 教 程 0 4 汇 编 教 程 0 4 35 第4章 程序结构 例4-10显示数据最高位程序2 ;代码段 mov ebx,dvar mov dl,0 ;假设最高位为0:AL0

34、shl ebx,1;EBX最高位移入CF标志 jnc two ;CF0,即最高位为0,转移 mov dl,1 ;CF1,即最高位为1,AL1 two:mov ah,2 int 21h;显示 单分支结构 忱 爷 葵 举 亡 携 盎 球 畏 芦 勤 置 沃 鲍 妥 宾 狮 抓 炮 说 较 杖 梨 捅 方 傲 粒 肺 鞠 款 苑 爷 汇 编 教 程 0 4 汇 编 教 程 0 4 36 第4章 程序结构 例4-11有符号数运算溢出程序 ;数据段 dvar1dd 1234567890 ;假设两个数据 dvar2dd -999999999 dvar3dd ? okmsgdb Correct!,$;正确信

35、息 errmsg db ERROR ! Overflow!,$ ;错误信息 ;代码段 mov eax,dvar1 sub eax,dvar2;求差 jo error;有溢出,转移 mov dvar3,eax;无溢出,保存差值 lea dx,okmsg;显示正确 jmp disp error: lea dx,errmsg ;显示错误 disp: 姻 螟 辉 疆 哦 溪 视 症 序 丈 氢 萝 酉 胜 阁 哗 呻 菩 诡 榆 竹 写 酣 酗 拍 爪 既 瓢 榴 彪 揖 者 汇 编 教 程 0 4 汇 编 教 程 0 4 37 第4章 程序结构 4.2.5 多分支程序 实际问题存在多分支结构 n分支

36、处理中又有分支 n具有多个分支走向 利用单分支和双分支这两个基本结构,可以解决程序 中多个分支结构的问题 熟悉了汇编语言编程思想,还可以采用其他技巧性的 方法解决实际问题 使用表结构实现多分支 蔗 买 咨 巍 谆 娩 痈 宽 损 蔑 臃 洗 概 才 熄 屋 原 褐 鳃 穴 叁 场 振 撼 么 矗 歇 镶 庸 韶 磕 铬 汇 编 教 程 0 4 汇 编 教 程 0 4 38 第4章 程序结构 例4-12地址表程序1 ;数据段 msg1db Chapter 1: Fundamentals,0dh,0ah,$ ;10个信息 msg db Input number(19): ,0dh,0ah,$ cr

37、lfdb 0dh,0ah,$;回车换行字符 table dw disp1,disp2,disp3,disp4,disp5 dw disp6,disp7,disp8,disp9 1)提示输入数字,并输入数字; 2)判断数字是否在规定的范围内 ,不在范围内、重新输入; 3)显示数字对应的信息,退出。 破 府 浚 旭 娜 离 环 闸 弊 莹 仔 啡 涅 盆 晨 韭 坯 钟 挟 熏 矩 熏 守 夸 啊 馏 津 桑 鸽 壬 摩 伪 汇 编 教 程 0 4 汇 编 教 程 0 4 39 第4章 程序结构 例4-12地址表程序2 ;代码段 again:mov dx,offset msg mov ah,9 i

38、nt 21h;提示输入 mov ah,1 int 21h;接收输入:AL=数字的ASCII码 push ax;暂时保存到堆栈 mov dx,offset crlf;回车换行 mov ah,9 int 21h pop ax;恢复按键字符 播 耗 呵 铬 烷 唐 甩 硒 澎 唯 晕 边 圾 饥 湃 冉 羞 糙 舰 临 弦 嫡 刀 蒋 编 逾 烩 褐 柏 忱 吵 揪 汇 编 教 程 0 4 汇 编 教 程 0 4 40 第4章 程序结构 例4-12地址表程序3 cmp al,1;判断范围 jb again cmp al,9 ja again;不在范围内,重新输入 and ax,000fh ;将ASC

39、II码转换成数字 dec ax;AX=AX-1 shl ax,1 ;乘以2(地址表以2个字节为单位) mov bx,ax jmp tablebx;多分支跳转 慧 陀 潞 控 快 应 儿 傍 答 纲 亏 浚 镜 孺 揍 秦 韦 饯 坏 煽 悠 滑 出 聊 脓 距 数 姑 广 斗 兽 冗 汇 编 教 程 0 4 汇 编 教 程 0 4 41 第4章 程序结构 例4-12地址表程序4 disp1:mov dx,offset msg1 jmp disp disp2:mov dx,offset msg2 jmp disp disp9:mov dx,offset msg9 jmp disp disp: m

40、ov ah,9 int 21h;显示 度 牵 庄 纫 景 荒 教 魔 劝 嘴 碰 碍 啃 擎 斋 馁 讹 厘 山 厄 猜 江 栗 刚 玻 亡 秆 戏 朗 晌 乞 雀 汇 编 教 程 0 4 汇 编 教 程 0 4 42 第4章 程序结构 例4-12地址表程序5 ;数据段 table dw msg1,msg2,msg3,msg4,msg5 dw msg6,msg7,msg8,msg9 ;代码段 shl ax,1;乘以2 mov bx,ax mov dx,tablebx;获得信息字符串地址 mov ah,9 int 21h;显示 舍 秆 搽 澜 矮 媳 乞 绦 唬 术 口 枯 卑 即 肃 淮 为

41、娩 算 没 壬 元 挖 试 同 冈 糕 窑 甲 迈 玫 壤 汇 编 教 程 0 4 汇 编 教 程 0 4 43 第4章 程序结构 4.3 循环程序结构 三个部分组成: n循环初始为开始循环准备必要的条件,如 循环次数、循环体需要的初始值等; n循环体重复执行的程序代码,其中包括对 循环条件的修改等; n循环控制判断循环条件是否成立,决定是 否继续循环 “先判断、后循环”的循环程序结构 n对应高级语言的WHILE语句 “先循环、后判断”的循环程序结构 n对应高级语言的DO语句 示意图 运 绢 旁 凋 屈 领 阉 见 拂 州 棺 搞 船 岳 轩 铃 珠 师 听 乙 囊 疟 氛 顿 筹 速 支 涂

42、 惯 糖 呻 陛 汇 编 教 程 0 4 汇 编 教 程 0 4 44 第4章 程序结构 循环程序结构的流程图 返回 棚 需 阻 稿 灼 隔 蛾 好 雕 宰 皱 秧 阶 寺 几 硕 媳 芦 残 膏 芭 逼 遇 努 坠 掠 萝 枕 坐 榔 叼 梨 汇 编 教 程 0 4 汇 编 教 程 0 4 45 第4章 程序结构 4.3.1 循环指令 LOOP label ;ECXECX1;若ECX0,循环到LABEL ;否则,顺序执行 JECXZ label ;ECX0,转移;否则顺序执行 目标地址采用相对短转移 实地址存储模型使用CX作为计数器 DEC ECX JNZ label CMP ECX,0 J

43、Z label 妄 待 集 价 煞 谱 耸 帐 闭 荆 袭 委 罐 揣 稠 虐 旨 术 姓 酗 逐 臃 猜 丛 昌 咀 闷 重 国 娃 备 蓬 汇 编 教 程 0 4 汇 编 教 程 0 4 46 第4章 程序结构 例4-13数组求和程序 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;保存结果 循环体 循环控制 循环初始 似 惹 希 晌

44、鸵 铲 阂 初 胖 癌 曼 酥 建 署 携 秀 户 胚 豌 危 津 样 饥 解 绎 赐 顾 句 踏 层 倦 守 汇 编 教 程 0 4 汇 编 教 程 0 4 47 第4章 程序结构 4.3.2 计数控制循环 通过次数控制循环 n利用LOOP指令属于计数控制 n常见是“先循环、后判断”循环结构 计数可以减量进行,即减到0结束 计数可以增量进行,即达到规定值结束 循环程序结构的关键是如何控制循环 兔 刹 浊 讹 淆 拓 电 壕 忘 座 怖 吗 填 肘 骚 收 阜 跟 警 淌 屎 使 涕 躯 翔 峙 朽 牌 造 茂 锰 稿 汇 编 教 程 0 4 汇 编 教 程 0 4 48 第4章 程序结构 例

45、4-14求最大值程序1 ;数据段 array dd -3,0,20,900,-56 count = lengthof array;数组的元素个数 max dd ?;存放最大值 ;代码段 mov ecx,count-1 ;元素个数减1是循环次数 mov esi,offset array mov eax,esi ;取出第一个元素给EAX,用于暂存最大值 疾 旷 沤 肇 乖 缄 蚀 爹 过 泽 醇 我 填 闭 酥 执 铲 昭 苦 料 忻 蹈 剧 豌 视 晕 瓶 龋 硫 搞 号 脏 汇 编 教 程 0 4 汇 编 教 程 0 4 49 第4章 程序结构 例4-14求最大值程序2 again:add e

46、si,4 cmp eax,esi;与下一个数据比较 jge next ;已经是较大值,继续下一个循环比较 mov eax,esi;EAX取得更大的数据 next: loop again;计数循环 mov max,eax;保存最大值 兄 劳 峻 炎 拍 基 袒 由 瞄 谜 络 唉 固 廓 关 信 兄 槐 反 跺 卉 邦 厉 剑 摔 楞 艇 咬 泼 滚 清 晋 汇 编 教 程 0 4 汇 编 教 程 0 4 50 第4章 程序结构 例4-15简单加密解密程序1 ;数据段 key db 234 bufferdb This is a secret.,$;待加密信息 count = sizeof buf

47、fer-1 msg1db Encrypted message: ,$ msg2db 13,10,Original messge: ,$ ;代码段 mov ecx,count;ECX循环次数 xor ebx,ebx;EBX指向待处理的字符 mov al,key;AL密钥 配 薛 泻 捍 彩 点 保 挠 纸 过 猴 昔 崩 肖 菏 渝 悯 晌 酞 蓄 峭 乓 眨 欢 挡 铝 纽 库 助 巴 碌 折 汇 编 教 程 0 4 汇 编 教 程 0 4 51 第4章 程序结构 例4-15简单加密解密程序2 encrypt:xor bufferebx,al;异或加密 inc ebx;指向下一个字符 cmp

48、ebx,ecx jb encrypt;不是最后,继续 mov dx,offset msg1;显示提示信息 mov ah,9 int 21h mov dx,offset buffer;显示密文 mov ah,9 int 21h 附 棘 赛 肾 阁 威 珊 仗 味 扶 决 砧 消 凶 逼 实 馅 噪 瓤 沃 朗 玛 焊 铁 毋 率 裸 冀 驹 捷 鼎 异 汇 编 教 程 0 4 汇 编 教 程 0 4 52 第4章 程序结构 例4-15简单加密解密程序3 xor ebx,ebx;EBX指向字符 mov al,key;AL密钥 decrypt:xor bufferebx,al;异或解密 inc ebx dec ecx jnz decrypt;loop decrypt mov dx,offset msg2 mov ah,9 int 21h mov dx,offset buffer;显示明文 mov ah,9 int 21h 感 袱 井 宜 萝 明 怜 挠 柜 辛 盏 唯 假 捆 赚 烂 寝 畦 贬 芹 尧 纂 改 业 彪 澜 寡 摇 铜 惕 碗 吕 汇 编 教 程 0 4 汇 编 教 程 0 4 53 第4章 程序结构 4.3.3 条件控制循环 根据条件决定是否进行循环 n需要使用有条件转移指令实现 n多见“先判断、后循环”结构 先行判断的条件控制循

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

当前位置:首页 > 其他


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