微机原理 第8章汇编语言程序设计ppt课件_第1页
微机原理 第8章汇编语言程序设计ppt课件_第2页
微机原理 第8章汇编语言程序设计ppt课件_第3页
微机原理 第8章汇编语言程序设计ppt课件_第4页
微机原理 第8章汇编语言程序设计ppt课件_第5页
已阅读5页,还剩140页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微型计算机机原理及应用 程序设计的基本技术 1 2 3 5 顺序程序设计 分支程序设计 循环程序设计 子程序设计 4 串处理程序设计 注意 本书有关汇编语言程序设计只限于DOS环境下的实地址方式 该方式下字长为16位 顺序程序是最简单的程序 它的执行顺序和程序中指令的顺序完全一致 1顺序程序设计 格式 MULsourceIMULsource 符号整数乘法 1 1乘除法指令 1 乘法指令MUL和符号整数乘法指令IMUL 1 源操作数source可以是字节 字或双字 可为寄存器或存储器操作数 不能为立即数 2 目的操作数是隐藏的 为被乘数 放于AL AX或EAX 视source的类型属性决定是AL AX还是EAX3 在乘法指令之前必须将目的操作数送AL 字节乘 或AX 字乘 或EAX 双字乘 乘积的放法 8位或16位乘法指令所执行的操作是AL或AX乘以source 乘积放回到AX或DX和AX 如下图所示 AL sourc8 AX AX sourc16 AX DX 1 1乘除法指令 32位乘法指令所执行的操作是EAX乘以source 乘积放回到EDX和EAX 如下图所示 EAX sourc32 EAX EDX 注意 乘法指令对标志位CF和OF有影响 对其余标志位的影响不确定 1 1乘除法指令 例如 将AX中的3位BCD数转换为二进制数存入字节变量SB中 M0VCH 10MOVCL 4MOVSB AL 暂存十位和个位MOVAL AH 百位存入AL中MULCH 百位 10 AXMOVAH SB 百位 10的积小于255 所以只用AL存放即可SHRAH CL 取十位ADDAL AH 百位 10 十位 ALMULCH 百位 10 十位 10 AXANDSB 0FH 取个位ADDSB AL 百位 10 十位 10 个位 SB N2 102 N1 10 N0 N2 10 N1 10 N0 程序段如下 1 1乘除法指令 格式 IMULREG source REG REGXsourceIMULREG source imm REG sourceXimm 1 1乘除法指令 注 符号整数乘法指令IMUL 1 双操作数乘法指令是用源操作数乘目的操作数 乘积存入目的操作数 2 三操作数乘法指令是用源操作数乘立即数 乘积存入目的操作数 3 要求 其源操作数source可为寄存器或存储器操作数 目的操作数只能是16位和32位的寄存器 源 目的操作数的类型要求一致 格式 DIVsourceIDIVsource 符号整数除法注意 源操作数source可以是字 字节或双字 可为REG或MEM 不能为立即数目的操作数是隐藏的 放置被除数 可为AX或DX和AX或EDX和EAX 2 除法指令DIV和符号整数除法指令IDIV 1 1乘除法指令 8位或16位除法指令所执行的操作如下图所示 AL sourc8 AX AX sourc16 AH DX 1 1乘除法指令 32位除法指令所执行的操作如下图所示 EAX sourc32 EDX 可用除法运算 除10取余 将二进制数转换为BCD数 1 1乘除法指令 如 用除10取余法将8位二进制数FFH转换为BCD数255H的二进制运算如下图所示 1 1乘除法指令 方法 除10取余 法 例如将AL中的8位无符号二进制数转换为BCD数放入AX中 例如将AL中的8位无符号二进制数转换为BCD数放入AX中 MOVAL 0FFHMOVCL 10MOVAH 0 将8位二进制数扩展为16位DIVCL 商 AL 余数 AH 个位数 MOVCH AH 暂存BCD数个位MOVAH 0DIVCL 商 AL 余数 AH 十位数 MOVCL 4SHLAH CL BCD数十位移至高4位ORCH AH BCD数十位与个位拼合MOVAH 0MOVCL 10DIVCL AH中余数为BCD数的百位MOVAL CH BCD数十位与个位送AL 1 1乘除法指令 3 扩展指令CBW和CWD 扩展方法 要把一个8位二进制数除以另一个8位二进制数 要有一个16位二进制数在AX中 所以做8位除以8位的除法前先要把8位被除数扩展为16位 做16位除以16位的除法前要把16位被除数扩展为32位 做32位除以32位的除法前要把32位被除数扩展为64位 这种扩展对于无符号数除法只需将AH或DX或EDX清0 而对符号整数除法则要通过扩展符号位来把被除数扩展 1 1乘除法指令 指令都隐含操作数在做8位除以8位 16位除以16位 32位除以32位的符号整数除法之前 应先扩展AL或AX或EAX中的被除数 扩展指令和符号整数除法指令仅对补码数适用 格式 CBW AL的最高位符号位扩展至AHCWD AX的最高位扩展至DXCWDE AX的最高位扩展至EAX的高16位CDQ EAX的最高位扩展至EDX 1 1乘除法指令 如 有一符号字数组变量ARRAY 第1个字是被除数 第2个字是除数 接着存放商和余数 其程序段为 MOVSI OFFSETARRAYMOVAX SI CWDIDIVWORDPTR2 SI MOV4 SI AXMOV6 SI DX 1 1乘除法指令 1 2BCD数调整指令 分析 两个BCD数相加 其和仍应为BCD数 如不是BCD数则结果错误 正确 BCD数十进制数码加法器的和 错误 000000000 1001910010001 0000101010 0001 01011511110001 0110160001 0000 0010 0101250001 1001如何修正 1 2BCD数调整指令 造成此结果的原因 产生错误的原因是8421BCD码为十进制 逢十进一 而四位二进制是逢十六进一 二者进位关系不同 当和数大于9时 8421BCD应产生进位 而十六进制还不可能产生进位 为此 应对结果进行修正 当运算结果小于等于9时 不需修正或加 0 但当结果大于9时 应修正让其产生一个进位 加0110即可 如相加结果产生了进位位 其结果必定大于9 所以 也需修正 对BCD数使用二进制数算术运算指令进行运算 然后执行一条专用调整指令来处理BCD数的结果 1 BCD数加法调整指令DAA和AAA 格式 DAA功能 将AL中的数当作两个压缩BCD数相加之和调整为正确的压缩BCD数 调整规则 AL 0FH 9或AF 1 则AL加6 AL 0F0H 90H或CF 1 则AL加60H 1 2BCD数调整指令 1 压缩BCD数加法调整 注意 该指令操作数隐含为AL 即只能对AL中的操作数据进行调整 导致压缩BCD数的加减指令只能针对字节运算 对结果调整时要用到CF和AF两个标志位 所以调整指令应紧跟BCD数加法指令DAA指令会影响标志如 MOVAX 3456HADDAL AH AL 8AH AF 0 CF 0DAA AL 90H 1 2BCD数调整指令 例1求两个字变量W1和W2中压缩BCD数之和 存入字节变量SUM中 如 8931 5678 14609 程序段如下 W1DW8931HW2DW5678HSUMDB3DUP 0 MOVAL BYTEPTRW1 AL 31HADDAL BYTEPTRW2 31 78 A9H AL A9H CF 0 AF 0DAA AL 09H CF 1MOVSUM AL 存个位和十位MOVAL BYTEPTRW1 1 AL 89HADCAL BYTEPTRW2 1 89 56 CF AL E0H CF 0 AF 1DAA AL 46H CF 1MOVSUM 1 AL 存百位和千位MOVSUM 2 0 处理向万位的进位RCLSUM 2 1 1 2BCD数调整指令 格式 AAA功能 将AL中的数当作两个非压缩BCD数相加之和进行调整 得到正确的非压缩BCD数送AX 调整规则 AL 0FH 9或AF 1 则 AL 6 0FH AL AH 1 AH 否则 AL 0FH AL AH不变 2 非压缩BCD数加法调整 1 2BCD数调整指令 注意 同DAA指令 AAA指令的操作数也隐含为AL 且要紧跟加法指令 导致非压缩BCD数的加减指令只能针对字节运算 AAA调整后的存放规律可理解为调整后的个位数送AL 十位数 即进位 加到AH中 故执行该指令前应注意AH是否清0 如 将两个BCD数的ASCII码相加 得到和的ASCII码 MOVAL 35H 5 ADDAL 39H 9 AL 6EHMOVAH 0AAA AX 0104HORAX 3030H AX 3134H即 14 1 2BCD数调整指令 例2求两个字变量W1和W2中非压缩BCD数之和 存入字节变量SUM中 如 89 67 156 程序段如下 W1DW0809HW2DW0607HSUMDB3DUP 0 MOVAX W1 AX 0809HADDAL BYTEPTRW2 AL 10H AF 1AAA AX 0906HMOVSUM AL 存个位MOVAL AHADDAL BYTEPTRW2 1 AL 0FH AF 0MOVAH 0AAA AL 05H AH 01HMOVWORDPTRSUM 1 AX 存十位和百位 1 2BCD数调整指令 格式 DAS功能 将AL中的数当作两个压缩BCD数相减之差进行调整 得到正确的压缩BCD数 调整规则 AL 0FH 9或AF 1 则AL减6 AL 0F0H 90H或CF 1 则AL减60H 如 MOVAX 5643HSUBAL AH AL DEH 有借位DAS AL 78H 保持借位 即134 56 2 BCD数减法调整指令DAS和AAS 1 压缩BCD数减法调整 1 2BCD数调整指令 格式 AAS功能 将AL中的数当作两个非压缩BCD数相减之差进行调整 得到正确的非压缩BCD数送AX 调整规则 AL 0FH 9或AF 1 则 AL 6 0FH AL AH 1 AH 否则 AL 0FH AL AH不变 如 MOVAX 0806HSUBAL 07H AX 08FFHAAS AX 0709H 2 非压缩BCD数减法调整 1 2BCD数调整指令 格式 AAM功能 将AL中小于64H的二进制数变换为非压缩BCD数送AX调整规则 AL 0AH AH 十位 ALMOD0AH AL 个位 如 MOVAL 63HAAM AX 0909H 3 非压缩BCD数乘除法调整指令AAM和AAD 1 乘法调整 1 2BCD数调整指令 例3字变量W和字节变量B分别存放着两个非压缩BCD数 编写求两数之积 并将它存储到JJ字节变量中的程序 程序段如下 WDW0307HBDB9JJDB3DUP 0 MOVAL BYTEPTRW AL 07HMULB AX 003FHAAM AX 0603HMOVWORDPTRJJ AXMOVAL BYTEPTRW 1 AL 03HMULB AX 001BHAAM AX 0207HADDAL JJ 1 07H 06H 0DH 即AL 0DHAAA 进位直接加入AH AX 0303HMOVWORDPTRJJ 1 AX 1 2BCD数调整指令 格式 AAD功能 将AX中的两位非压缩BCD数变换成二进制数集中放在AL中 如 MOVAX 0906HMOVDL 06HAAD AX 0060HDIVDL AL 10H AH 0MOVDL AH 存余数AAM AX 0106H 2 除法调整 注 此指令可对被除数进行预调整加 减和乘法调整在相应运算操作之后进行 而除法的调整在除法操作之前进行 1 2BCD数调整指令 例3 4字变量W和字节变量B中分别存放着两个非压缩BCD数编程求二者的商和余数 并分别存放到字变量QUOT和字节变量REMA中 程序段如下 WDW0909HBDB5REMADB0QUOTDW0MOVAX WAAD 0909H 63HDIVB 63H 5 13H 4 AL 13H AH 04HMOVREMA AHAAM 13H 0109HMOVQUOT AX 1 2BCD数调整指令 例5从键盘键入0 9的任一自然数N 求其立方值并将其送显示器显示 INPUTDB PleaseInputN 0 9 LFBDB 0 1 8 27 64 DB 125 216 343 512 729 NDB0MOVDX OFFSETINPUTMOVAH 9INT21H 可用乘法运算实现 也可用查表法实现 查表法程序段如下 1 3顺序程序设计举例 MOVAH 1 输入并显示器显示N N送入ALINT21HMOVN ALMOVAH 2 2号系统功能调用 换行MOVDL 0AHINT21HMOVDL NANDDL 0FH 将 N 转换为N 将ASCII码转换为数字 MOVCL 2 将N乘以4SHLDL CLMOVDH 0 8位4N扩展为16位的地址偏移量ADDDX OFFSETLFB 4N 表的偏移地址MOVAH 9INT21H 1 3顺序程序设计举例 例6编写两个32位无符号数的乘法程序程序如下 386stacksegmentstackUSE16 stack dw32dup 0 stackends datasegmentUSE16ABDD12345678H CDDD12233445H ABCDDD2DUP 0 dataendscodesegmentUSE16startprocfar assumess stack cs code ds data 1 3顺序程序设计举例 pushdssubax axpushaxmovax datamovds axMOVEAX ABMULCDMOVABCD EAXMOVABCD 4 EDXretstartendpcodeendsendstart 1 3顺序程序设计举例 程序设计的基本技术 1 3 5 顺序程序设计 分支程序设计 循环程序设计 子程序设计 4 串处理程序设计 2 顺序程序是按指令的书写 存放 顺序执行 而实际情况需要根据不同的条件做不同的处理 形成分支 汇编中的分支的条件往往是通过标志的不同状态而反映的 常用改变标志指令和转移指令实现分支 分类 JMP JCOND两类 转移指令将控制程序转向其后的目的标号指定的地址 条件转移指令紧跟在能改变并设置状态的指令之后 由状态标志决定程序的走向 2分支程序设计 通用格式 Jcondshort lable操作 若满足条件 则OFFSETshort lable IP 实现转移 否则顺序执行 short lable 短标号 条件转移是相对转移指令 即从当前地址到目标地址的偏移量为 128 127 从本指令则为 126 129 因为条件转移指令均为双字节指令 故只能实现段内转移 80386以后 在实地址方式下 能够转移到代码段的任何位置 2 1条件转移指令 仅判断一个标志位实现转移 1 简单条件转移指令 2 1条件转移指令 如 JZ JES LAB 为零 相等转移操作 测试前面操作结果为0则转移 即判ZF 1转移 JZ JE为等价助记符 任写一种均可 可根据程序设计意图选择 如 MOVBX 0FFFFHINCBX ZF 1JZNEXT 为0转移到NEXT NEXT 2 1条件转移指令 如 MOVBL 1 CMPBL 5 ZF 0JENEXT 比较结果相等则转移到NEXT 不相等顺序执行NEXT 注意 此类指令 均只测试前面的操作结果所设标志 指令本身不影响标志 所以 在条件转移指令前 一定有一条能正确影响标志的指令 2 1条件转移指令 2 无符号数条件转移指令 条件转移常依据两个数的关系来决定 两个数的关系除相等与否 还有大小之分 比较大小时 要区分是无符号数还是符号数 否则答案不明确 如 0FFH 00H 视为无符号数0FFH 255 00H 视为符号数0FFH 1 00H 所以 应将两种类型的数分开比较 对无符号数使用术语 低于 高于Below Above 对带符号数使用术语 小于 大于Less Greater 2 1条件转移指令 无符号数条件转移指令有4条 P93 表3 2 指令助记符功能JB JNAE低于 不高于等于转移JNB JAE不低于 高于等于转移JA JNBE高于 不低于等于转移JNA JBE不高于 低于等于转移 2 1条件转移指令 3 符号数条件转移指令 有符号数条件转移指令有4条 P94 表3 3 指令助记符功能JL JNGE小于 不大于等于转移JNL JGE不小于 大于等于转移JG JNLE大于 不小于等于转移JNG JLE不大于 小于等于转移 2 1条件转移指令 格式 JMPtarget操作 将控制转向目的标号target target在段内 target的偏移地址 IPtarget在段外 target的偏移地址 IPtarget的段首址 CS 条件转移范围为 128 127 而无条件转移指令没有范围限制 在分支程序中往往需要它将各分支重新汇集到一起 如何实现条件转移指令的范围 2 2无条件转移指令 1 无条件直接转移指令 格式 JMPdest操作 转移的目的地址放于寄存器或存储器 目的操作数为寄存器 寄存器内容送IP目的操作数为字变量 字变量内容送IP目的操作数为双字变量 双字变量内容送CS和IP如 JMPNEXT 无条件转移转到NEXT NEXT 如 JMPWORDPTR BX 即 BX IP 2 无条件间接转移指令 2 2无条件转移指令 注意 分支实现的基本方法有两种 一种是利用比较转移指令实现分支 一种是利用跳转表实现分支 视比较对象 正确选择合适的转移指令 要为每个分支安排正确出口 凡是可共用的部分 应尽量放在公共程序段中以使程序简短 在调试分支程序时 应使用多组数据 分别对各种分支进行反复测试 2 3分支程序设计举例 例7编程计算下面函数值 X Y均为字节符号数 思路 1 如何确定X Y是同号 异号数 利用XORX Y的结果来确定 若同号 则异或的结果必为0 若异号 则异或的结果必为1 2 如何确定X Y是正数或负数 利用CMP指令 比较X Y 与0的大小来确定 2 3分支程序设计举例 例7编程计算下面函数值 X Y均为字节符号数 XDB 5YDB20ZDB0 MOVAL X XORAL Y 根据X Y的符号置S标志 相同为0JSDIFF 符号位S 1转移 相异为1 X Y相异结束MOVZ 1 Z赋1CMPX 0 相同后 判断其中某数的符号JNSNOCHA 大于等于0 结束NEGZ 小于0 求补得 1NOCHA RETDIFF MOVZ 0RET 2 3分支程序设计举例 例8从键盘上键入0 9中任一自然数N 将2的N次方值在显示器的下一行显示出来 思路 1 计算2N的方法 1左移N位 得到的结果为二进制数 2 求得的徝是一个二进制数 为了输出还要将二进制数转换为十进制数BCD数码 将二进制数转化为BCD数 采用 除10取余法 为了使用9号系统功能调用 还需将BCD数码的ASCII码存入内存 余数为BCD数 余数加上30H即可得到余数的ASCII码 3 2的N次方值对应的列表在存储器中的放法 其最大值是2的9次方 29 512 最大值的ASCII码占3个单元 再加上回车 换行和 所以输出数据区OBUF最多6个单元 除10操作一直进行到商等于0为止 本例中的最大商值为51 33H 故可以采用16位除以8位的除法操作 2 3分支程序设计举例 例8从键盘上键入0 9中任一自然数N 将2的N次方值在显示器的下一行显示出来 程序段如下 OBUFDB6DUP 0 MOVAH 1键盘键入的数的ASCII码送至ALINT21HANDAL 0FH 将 N 转换为NMOVCL ALMOVAX 1 1X2NSHLAX CLMOVBX 5MOVOBUF BX MOVCX 10 转换为十进制数的ASCII码 2 3分支程序设计举例 2 3分支程序设计举例 MOVCX 10 转换为十进制数的ASCII码AGAIN MOVDX 0DIVCXORDL 30HDECBXMOVOBUF BX DL 将转换结果 2 的ASCII码存入ANDAX AX 判断转换是否结束JNZAGAINSUBBX 2MOVWORDPTROBUF BX 0A0DH 存入回车换行MOVDX BXADDDX OFFSETOBUFMOVAH 9INT21HRET 例9从键盘上键入2位十六进制数将其拼合成一个字节存入字节变量SB中 思路 1 键入的二位十六进制数码 采用10号系统功能调用 输入并存好 存的是ASCII码 2 键入数码假设为56 则存入AX中 AX 3635H 且AH 36H AL 35H 3 如何将56的ASCII码转换为数码并合并到一个字节中去 注意 0 9和A F的ASCII码转换为数码的方法是不同的 2 3分支程序设计举例 例9从键盘上键入2位十六进制数将其拼合成一个字节存入字节变量SB中 IBUFDB3 0 3DUP 0 SBDB0MOVDX OFFSETIBUF 键入2位十六进制数MOVAH 10INT21HMOVAX WORDPTRIBUF 2 键入字符送AXSUBAX 3030H 字符变为十六进制数CMPAL 0AHJBLNSUB7SUBAL 7LNSUB7 CMPAH 0AHJBLNSUB7SUBAH 7 2 3分支程序设计举例 HNSUB7 MOVCL 4 将AX中的数拼合成一个字节SHLAL CLORAL AHMOVSB ALRET 2 3分支程序设计举例 例10某工厂的产品有8种不同的加工处理程序P0 P7 根据键盘输入 做不同的处理 若是0 7以外的键 则退出加工处理 此例可以用两种方法实现 一种是用逐一比较判断 逐次比较转移实现二叉分支 整体上实现多分支 另一种是跳转表法 直接实现多分支 2 3分支程序设计举例 2 3分支程序设计举例 方法一 逐一比较法 简单 条理清楚 易于实现 但转移范围只能是 128 127 要求 分支不能太多 INPUTDB Input 0 7 MOVDX OFFSETINPUT 显示提示MOVAH 9INT21HMOVAH 1 等待键入一个字符INT21HCMPAL 0 为0字符则转P0JEP0CMPAL 1 为1字符则转P1JEP1 2 3分支程序设计举例 CMPAL 2 JEP2CMPAL 3 JEP3CMPAL 4 JEP4CMPAL 5 JEP5CMPAL 6 JEP6CMPAL 7 JEP7RET 不是0 7则退出程序 2 3分支程序设计举例 P0 MOVDL 0 键入0则显示0以替代P0程序JMPEXITP1 MOVDL 1 键入1则显示1以替代P1程序JMPEXIT P7 MOVDL 7 JMPEXITEXIT MOVAH 2INT21HRET 分支程序一定要注意汇合到结束处 2 3分支程序设计举例 方法二 跳转表法利用无条件的间接转移指令可实现远距离的多分支 间接跳转至不同分支的入口处 在数据区造一地址表 存放不同的分支入口地址 设表的首地址为PTAB 每一个PTABP0入口地址占一个字单元 2P1 Pi的入口地址 PTAB 2 i 4P2若将2 i BX 则JMPPTAB BX 可转到Pi入口处 2 3分支程序设计举例 INPUTDB INPUT 0 7 PTABDWP0 P1 P2 P3 P4 P5 P6 P7 定义地址表MOVDX OFFSETINPUT 显示提示MOVAH 9INT21HMOVAH 1 等待键入0 7的数字INT21HCMPAL 0 检查输入数据 不是0 7则退出JBEXITCMPAL 7 JAEXITANDAX 0FH i 2 BXADDAX AX 2 3分支程序设计举例 MOVBX AXJMPPTAB BX PTAB 2 i Pi IPP0 MOVDL 0 键入0则显示0以替代P0程序JMPDOWNP1 MOVDL 1 键入1则显示1以替代P1程序JMPDOWN P7 MOVDL 7 DOWN MOVAH 2INT21HRET 键入的ASC 码为无符号数 所以 用JB JA等指令而不能用JG JL等 请思考 若为跨段标号 应修改哪些地方 注 只需修改 DW DD 存IP CS i 2 i 4即可 程序设计的基本技术 1 2 5 顺序程序设计 分支程序设计 循环程序设计 子程序设计 4 串处理程序设计 3 循环程序的四部分 1 循环准备 循环初始化 建地址指针 置计数初值 设置必要的常数 对工作寄存器及工作单元置初值或清0等 2 循环体重复执行的部分 循环的核心 3 循环的修改修改计数器 寄存器 地址指针 基址或变址寄存器 恢复某些参数 为下一轮循环做准备 4 循环控制修改计数器 判断控制循环是否结束或继续 3循环程序设计 循环程序的具体结构流程有两种 3 1循环程序的基本结构 例 编程统计字变量W中有多少位1 并将结果存入字节变量N中 方法一 先执行 后判断MOVN 0MOVCX 16LOP SHLW 1JNCNOINCINCNNOINC DECCXJNZLOPret 方法二 先判断 后执行MOVN 0LOP CMPW 0JZDONESHLW 1JNCLOPINCNJMPLOPDONE ret DECCXJNZLOP 3 1循环程序的基本结构 循环控制方法最常见的有两种 计数控制 循环次数已知 故可用某个寄存器或单元作为计数器 用计数器的值来控制循环的结束与否 条件控制 循环次数未知 即循环次数与循环体的执行情况有关 通过条件测试指令来测试是否满足循环条件 以控制循环是否结束 3 1循环程序的基本结构 此类指令的特点是 1 循环次数由CX计数器控制 循环指令本身不影响标志 2 同条件转移指令一样 重复控制指令也是相对转移指令 即段内转移 重复控制指令的目的地址必须在本指令地址的 126 129字节的范围之内 3 2重复控制指令 LOOP指令 无条件循环指令 格式 LOOPshort lable操作 CX 1 CX 当CX 0则转short lable所指指令 否则顺序执行 注意 在使用LOOP指令前 必须把循环次数送入CX LOOPshotr lable 若CX 0 则循环要进行65536次 3 2重复控制指令 LOOPZ LOOPE指令 格式 LOOPZ LOOPEshort lable操作 CX 1 CX 当CX 0 且ZF 1 相等 则转移 否则顺序执行 注意 本指令不影响ZF ZF由前面指令设定 即前面比较结果相等 3 2重复控制指令 格式 LOOPNZ LOOPNEshort lable操作 CX 1 CX 当CX 0 且ZF 0 不相等 则转移 否则顺序执行 格式 JCXZshort lable操作 CX 0转移 否则顺序执行 注意 指令本身不作减操作 本指令一般用在循环的开始处 当CX 0 则跳过循环 LOOPNZ LOOPNE指令 JCXZ指令 3 2重复控制指令 注意循环结构 防止死循环 下面通过几个例题介绍循环控制计数控制条件控制计数与条件双重控制对于某些问题 还有一些特殊控制 如 设开关变量等 可参其他教材 3 3单重循环程序设计举例 例11计算Z X Y 其中X Y为双字变量 32位系统 XDD72345678HYDD90ABCDEFHZDB5DUP 0 MOVEAX XADDEAX YMOVDWORDPTRZ EAXMOVZ 4 0RCLZ 4 1 思路 按照由低到高字节相加 最后的和可能占5个字节 用一个双字变量所占的字节数4作为循环体的控制条件 为计数控制 3 3单重循环程序设计举例 例11计算Z X Y 其中X Y为双字变量 XDD72345678HYDD90ABCDEFHZDB5DUP 0 MOVCX 4 设计数初值MOVSI 0 地址指针ANDAX AX 清CF 使CF 0AGAIN MOVAL BYTEPTRX SI ADCAL BYTEPTRY SI MOVZ SI ALINCSI 指下一个字节LOOPAGAIN 计数控制MOVZ SI 0 处理向RCLZ SI 1万位进位 3 3单重循环程序设计举例 例12编写将某数据区十六进制数加密的程序 每个数字占一个字节 分析 设加密数关系如下 十六数 0123456789ABCDEF加密数 A98EF10B25D3746C解密数 658BD9EC2107FA34即发0 则发A 发3 则发E 发A 则发D解密规律 解密数的位移量 加密数表的数值如 解密数0的位移量是 0AH如 解密数4的位移量是 0FH 3 3单重循环程序设计举例 HEXSDB1 2 0EH 待发数NEQU HEXS 统计待发数个数JMHDBNDUP 0 存加密数JMBDB0AH 9 8 0EH 0FH 1 0 0BH 2 5 0DH 3 7 4 6 0CHMOVCX NMOVBH 0初始化MOVSI 0AGAIN MOVBL HEXS SI 取十六进制数 其大小正好为该数码在加密表中的地址偏移量 MOVAL JMB BX BX AL ALMOVJMH SI AL 存加密数INCSI 指向下一数LOOPAGAIN 计数控制 加密表 3 3单重循环程序设计举例 JMHDB0FH 0EH 8 9 0AH 设加密数NEQU JMH 统计加密数个数KMBDB6 5 8 0BH 0DH 9 0EH 0CH 2 1 0 7 0FH 0AH 3 4KMHDBNDUP 0 存解密数MOVCX NMOVBX OFFSETKMBMOVSI 0NEXT MOVAL JMH SI XLATKMBMOVKMH SI ALINCSILOOPNEXT 解密表 3 3单重循环程序设计举例 例13将字节变量SB中的8位二进数送显示器显示 思路 把SB中的八位二进制数0或1 当成数码显示出来 八位数码加1 需预留9个单元 1 为了避免通过CF来传递二进制数 先将SB中的8位二进制数送入AL中 再左移AX 将1位二进制数直接移入AH中 即将字节变量中的1位二进制数移入AH中 再将移入的二进制数变为ASCII码 SBDB9AHOBUFDB9DUP 0 3 3单重循环程序设计举例 SBDB9AHOBUFDB9DUP 0 MOVCX 8MOVBX 0 BX为输出缓冲区的地址偏移量MOVAL SBAGAIN MOVAH 0SHLAX 1ADDAH 30HMOVOBUF BX AHINCBXLOOPAGAINMOV0BUF BX MOVDX OFFSETOBUFMOVAH 9INT21Hret 3 3单重循环程序设计举例 二进制数显示 SBDB8AHOBUFDB3DUP 0 MOVCX 0204H CH中为循环次数 CL中为移位次数MOVBX 0 BX为输出缓冲区的地址偏移量MOVAL SBAGAIN MOVAH 3 将数码转换为ASCII码SHLAX CLCMPAH 39H 确定数码介于0 9或A FJBENAD7ADDAH 7NAD7 MOVOBUF BX AHINCBXDECCHJNZAGAIN 3 3单重循环程序设计举例 十六进制数显示 MOV0BUF BX MOVDX OFFSETOBUFMOVAH 9INT21Hret 例14将键入的十进制数 32768 32767 转换为二进制数 思路 1 数码的输入采用10号系统功能调用 存入的是ASCII码 2 判断数码是正数或负数 若为正数则直接从第一个数码转至第3步进行转换 若为负数 则移至第2个数码开始转换 如何判断其正负 将该数码与 比较 若结果为0 则标志位Z 1 否则Z 0 判断时 保留其Z 因为若是负数 需取其补码 3 十进制数码转换为二进制数 采用乘10的方法 此部分采用循环程序 循环的次数为数码个数 具体为 3 3单重循环程序设计举例 算法 十进制数 二进制数 反复 10 Di 循环体D4D3D2D1D0 D4 104 D3 103 D0 0 10 D4 10 D3 10 D2 10 D1 10 D0循环次数输入负数 输入数码个数 1 输入正数 不带符号 输入数码个数循环体中对其绝对值转换为二进制数 若为负数还应求补 3 3单重循环程序设计举例 BINARYDW0OBUFDB INPUTADECIMAL 32768 32767 IBUFDB7 0 7DUP 0 MOVDX OFFSETIBUF 键入十进制数 存入的ASCII码MOVAH 10INT21HMOVCL IBUF 1 十进制数位数 含 送CXMOVCH 0MOVSI OFFSETIBUF 2 指向键入的第一个字符CMPBYTEPTR SI 判是否为负数PUSHF 保护零标志JNESININC 正数跳转至SININCINCSI 越过 指向数字DECCX 实际字符数少1 号 3 3单重循环程序设计举例 SININC MOVAX 0 开始十进制 二进制AGAIN MOVDX 10 0 10 a4 10 10 a0MULDXANDBYTEPTR SI 0FH 十进制数ASC 转换为BCD数 ADDAL SI ADCAH 0INCSI 指向下一位LOOPAGAIN 计数循环POPF 恢复零标志JNZNNEG 非0即为正数 则不求补NEGAX 负数对其绝对值求补NNEG MOVBINARY AX 存放结果 3 3单重循环程序设计举例 例15对多个字符号数求和 结果不超出双字符号数 以十六进制数的形式显示其结果 注意 其结果不超出双字符号数思路 1 求多个数累加的方法 以0为基础多次累加 2 累加的和即8位十六进制数如何转换为ASCII码 通过循环左移把最高1位 二进制数左移4位 移至最低位 并用AND指令取出来 再转换为ASCII码 循环8次 注意 转换过程中 若该数码大于9 则需进行加9修正 3 3单重循环程序设计举例 386stacksegmentstackUSE16 stack dw32dup 0 stackendsdatasegmentUSE16NUMDW1111H 2222H 3333H 4444H 5555HDW6666H 7777H 8888H 9999HCOUNTEQU NUM 2RESULTDD0OBUFDB10DUP 0 dataends 3 3单重循环程序设计举例 codesegmentUSE16beginprocfarassumess stack cs code ds datapushdssubax axpushaxmovax datamovds axMOVCX COUNTMOVEBX 0AGAIN1 MOVSXEAX NUM EBX 2 ADDRESULT EAXINCEBXLOOPAGAIN1MOVDI OFFSETOBUF 3 3单重循环程序设计举例 MOVCX 8 将十六进制数拆转为ASCII字符AGAIN2 ROLRESULT 4MOVAL 0FHANDAL BYTEPTRRESULTADDAL 30HCMPAL 39HJNANA7ADDAL 7NA7 MOV DI ALINCDILOOPAGAIN2 3 3单重循环程序设计举例 MOVWORDPTR DI H MOVBX OFFSETOBUF 1 去掉前面的0CONT INCBXCMPBYTEPTR BX 0 JECONTMOVDX BXMOVAH 9INT21Hretbeginendpcodeendsendbegin 3 3单重循环程序设计举例 例19将存储器中的16位无符号二进制数转换成BCD数 并以十进制数在显示器上显示出来 思路 1 N 10取其余数 则为十进制数 重复直到商为0 它是次数未知的循环 为条件控制循环 将余数 ASC 送显示缓冲区 用9号功能显示即可 2 因除10的中间商有可能大于255 所以应采用32位除以16位除法 BINARYDW55HOBUFDB6DUP 0 3 3单重循环程序设计举例 MOVBX OFFSETOBUF 5 BX指向低位字符地址MOVBYTEPTR BX MOVAX BINARYMOVCX 10AGAIN MOVDX 0 被除数扩展 无号符数扩展 DIVCX 余数 DX 实际上放于DL 商 AXADDDL 30H 十进制数转换为ASC DECBX 修改地址指针MOV BX DL 存十进制数字串 放置数码时从低位开始ORAX AX 商为0 JNZAGAINMOVDX BX 显示MOVAH 9INT21Hret 3 3单重循环程序设计举例 多重循环即循环体内再套有循环 例3 22对字节变量BUF中存放的n个字节符号数排序 3 4多重循环程序设计举例 将第1个单元中的数与其后n 1个单元中的数逐个比较 每次比较之后总是把较大的数放在一个寄存器中 经过n 1次比较之后得到n个数中的最大数 存入第1个单元 接着将第2个单元中的数与其后的n 2个单元中的数逐个比较 经过n 2次比较得到n 1个数的最大数 亦即n个数中的第2大数 存入第2个单元 BUFDB20 19 250COUNTEQU BUF MOVSI OFFSETBUFMOVDX COUNT 1 外循环初始化OUTSID MOVCX DX 内循环初始化PUSHSI 保存第一个数地址MOVAL SI 取第一个数INSIDE INCSICMPAL SI JNCNEXCHGXCHG SI ALNEXCHG LOOPINSIDE 内循环修改控制POPSIMOV SI AL 存max至第一单元INCSIDECDX 外循环修改控制JNZOUTSID 3 4多重循环程序设计举例 程序设计的基本技术 1 3 2 顺序程序设计 分支程序设计 循环程序设计 子程序设计 4 串处理程序设计 5 4串处理程序设计 循环程序的特点 利用基址或变址寄存器建立地址指针 设置循环计数器 循环体执行完后修改地址指针和计数器 判断循环是否结束 字符串操作指令推出的原因 由于循环程序的特点 为了方便这类程序的设计 提出了字符串操作指令和重复前缀 字符串操作指令的特点 设计好初始值 选择合适的字符串操作指令和重复前缀即可 而不需要地址指针的修改及循环次数的控制 4串处理程序设计 相关规定 SI或ESI 源串的偏移地址指针 段地址为DS DI或EDI 目的串的偏移地址指针 段地址为ES DF 0 源串和目的串的偏移地址指针SI或ESI DI或EDI增址传送 DF 1 源串和目的串的偏移地址指针SI或ESI DI或EDI减址传送 增量或减量的量值由串属性是字节 字等来确定 4串处理程序设计 一 方向标志置位和清除指令 方向标志置位指令格式 STD操作 DF 1 减址传送 方向标志清除指令格式 CLD操作 DF 0 增址传送二 串操作指令MOVS 串传送指令LODS 从源串中取数指令STOS 往目的串中存数指令CMPS 串比较指令SCAS 串收索指令 4串处理程序设计 1 串传送指令格式 MOVSdest string source stringMOVSBMOVSWMOVSD指令的意义 把DS段中以SI或ESI为偏移地址的源串中的一个字节 一个字 一个双字传送到ES段以DI或EDI为偏移地址的目的串中 自动修改SI或ESI及DI或EDI从而指向下一个字节 一个字 一个双字 注意 1 源串和目的串的属性要相同 2 SI或ESI及DI或EDI的修改方向由方向标志DF确定 修改值的大小由串的属性确定 4串处理程序设计 2 从源串中取数指令格式 LODSsource stringLODSBLODSWLODSD指令的意义 把DS段中以SI或ESI为偏移地址的源串中的一个字节 一个字 一个双字取出送AL AX EAX 自动修改SI或ESI从而指向下一个字节 一个字 一个双字 注意 1 源串和AL AX EAX的属性要相同 2 SI或ESI的修改方向由方向标志DF确定 修改值的大小由串的属性确定 4串处理程序设计 3 往目的串中存数指令格式 STOSdest stringSTOSBSTOSWSTOSD指令的意义 把AL AX EAX中的内容存放到ES数据段中以DI或EDI为偏移地址的目的串中 自动修改DI或EDI从而指向下一个字节 一个字 一个双字 注意 1 DI或EDI的修改方向由方向标志DF确定 修改值的大小由串的属性确定 4串处理程序设计 4 串比较指令格式 CMPSdest string source stringCMPSBCMPSWCMPSD指令的意义 把DS段中以SI或ESI为偏移地址的源串中的一个字节 一个字 一个双字减去ES段以DI或EDI为偏移地址的目的串中的一个字节 一个字 一个双字 相减的结果不需存放 只影响到标志位 并自动修改SI或ESI及DI或EDI从而指向下一个字节 一个字 一个双字 注意 1 源串和目的串的属性要相同 2 SI或ESI及DI或EDI的修改方向由方向标志DF确定 修改值的大小由串的属性确定 4串处理程序设计 5 串收索指令格式 SCASdest stringSCASBSCASWSCASD指令的意义 是用AL AX或EAX中的内容减去ES数据段中以DI或EDI为偏移地址的目的串中的一个字节 一个字 一个双字 相减的结果不需存放 只影响到标志位 自动修改DI或EDI从而指向下一个字节 一个字 一个双字 注意 1 DI或EDI的修改方向由方向标志DF确定 修改值的大小由串的属性确定 4串处理程序设计 三 重复前缀分类 REP 无条件重复REPE REPZ 相等 Z 1 结果为0 重复REPNE REPNZ 不相等 Z 0 结果不为0 重复注意 1 重复前缀只允许用在串操作指令之前 且与串操作指令之间用空格隔开 其作用是使其后的串操作指令重复执行 2 使用时先判断重复次数CX或ECX是否为0 从而确定其是否重复 若为0 则不再重复 反之 则重复 每重复一次 CX或ECX自动减1 4串处理程序设计 1 REP 无条件重复适用指令 MOVS串传送指令 STOS往目的串中存数指令作用 使传送操作无条件的重复执行 直到CX 0或ECX 0为止 2 REPE REPZ 相同或Z 1即重复 找到不同的即停止重复 适用指令 CMPS 串比较指令 SCAS 串收索指令作用 使比较或搜索操作重复进行 直到CX 0或ZF 0 ZF 0即停止重复 ECX 0或ZF 0 3 REPNE REPNZ 不相同或Z 0即重复 找到相同的即停止 适用指令 CMPS 串比较指令 SCAS 串收索指令作用 使比较或搜索操作重复进行 直到CX 0或ZF 1 ZF 1即停止重复 ECX 0或ZF 1 4串处理程序设计 使用注意事项 1 源串应用DS SI或DS ESI间址 目的串应用ES DI或ES EDI间址 通常情况下 把源串和目的串放于同一个数据段中 只需将DS和ES重合即可 2 串操作指令使用之前 务必要先设置方向标志DF 规定串操作的方向 3 若使用重复前缀 则应将串长度送CX或ECX寄存器 4串处理程序设计 例8 26 用串操作指令编写将source string传送到dest string的程序 stacksegmentstackUSE16 stack dw32dup 0 stackendsdatasegment 数据段SSTRINGDB FGDHFJGU COUNTEQU SSTRING 统计字符串中字符的个数dataendsDATAEsegment 附加数据段DSTRINGDBCOUNTDUP 0 DATAEends 4串处理程序设计 codesegmentUSE16beginprocfarassumess stack cs code ds data ES DATAEpushdssubax axpushaxmovax datam

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论