《第5章分支与循环程序设计.ppt》由会员分享,可在线阅读,更多相关《第5章分支与循环程序设计.ppt(33页珍藏版)》请在三一文库上搜索。
1、第5章 分支与循环程序设计,5.1 转移 5.2 分支结构程序设计 5.3 循环程序设计 5.4 跳转表,5.1 转移,转移指令分: 无条件转移指令 条件转移指令,5.1.1 无条件转移指令,无条件转移指令JMP 作用相当于goto语句 ,但使用频繁。 分为: 段内转移 段内短转移 段间转移,1段内转移,格式:JMP SRC 功能:跳转到SRC指定的位置继续执行 SRC可以是: 程序标号 如: JMP _Done 寄存器 如: JMP EAX 内存操作数 如: JMP EBX,2段内短转移,格式:JMP SHORT SRC JMP指令仅占2字节 SRC必须是一个程序标号 同JMP SRC相比,
2、短转移跳转的范围较小,3段间转移,在保护模式下,段间转移指令用来 切换任务 跳转到调用门指定的程序入口 执行另一个代码段内的程序 例如:JMP 0060:005B5E20,5.1.2 条件转移指令,格式:JCC LABELX 功能:如果条件CC为真,则转移到LABELX处执行,否则顺序执行下一条指令。 LABELX是程序中的一个标号; CC是条件标志位 ,指定了转移的条件 。,条件转移指令分类,1依据单个标志位的条件转移指令 2依据有符号数比较结果的条件转移指令 3依据无符号数比较结果的条件转移指令 4依据CX/ECX是否为0的条件转移指令,1依据单个标志位的条件转移指令,例如,求DIST|A
3、B|。 MOV EAX, A SUB EAX, B JNS A10 NEG EAX A10: MOV DIST, EAX JNS比较SF的值,如果EAX是正数或0,就跳转到A10,否则执行下一句。,2依据有符号数比较结果的条件转移指令,例如,求有符号数A和B的较大值MAXAB。 MOV EAX, A CMP EAX, B JGE a20 MOV EAX, B a20: MOV MAXAB, EAX A大于等于B时,跳转到a20处,此时EAXA; A小于B时,不跳转,EAXB 。,3依据无符号数比较结果的条件转移指令,例如,求无符号数A和B的最大值MAXAB MOV EAX, A cmp EAX
4、, B JAE a30 MOV EAX, B a30: MOV MAXAB, EAX 和前面程序的区别只在于条件跳转指令的选择。 有符号数判断使用JGE,而无符号数判断使用JAE。,4依据CX/ECX是否为0的条件转移指令,格式1:JCXZ LABELX 格式2:JECXZ LABELX 功能:如果CX/ECX等于0,则转移到LABELX处执行,否则顺序执行下一条指令。,5.2 分支结构程序设计,5.2.1 单分支结构和双分支结构 5.2.2 多分支结构 5.2.3 折半查找程序 5.2.4 有序表插入,5.2.1 单分支结构和双分支结构,单分支结构,双分支结构,对于单分支结构的程序, 由条件
5、转移指令来判断条件是否满足: 条件满足时,跳过分支程序 条件不满足时,继续向下执行,执行完分支后汇合。 这点与C语言if语句不同。,5.2.2 多分支结构,以双分支结构为基础可以写出多分支结构的程序。 下面是求X的符号的函数的C程序和汇编程序的片段:sign.c sign.asm 判断是否为闰年的程序片段leapyear.asm 比较日期大小的程序片段 date.asm,5.2.3 折半查找程序,流程图(数组为R,元素个数n,数为a ),折半查找执行过程,(1)设定一个查找范围,下界为L和上界为h (2)如果下界L大于上界h,则查找范围为空,查找结束。算法结束。 (3)取下界L和上界h的中点
6、m(L+h)/2 (4)从数组的中点m处取出一个数Rm,和a进行比较。,折半查找执行过程(续),(5)如果Rm等于a,则在数组中找到a,下标为m。算法结束。 (6)如果Rm大于a,则修改上界h为m1。然后跳转到第2步。 (7)如果Rm小于a,则修改下界l为m+1。然后跳转到第2步。 实现折半查找的程序样例:split.asm 结果为:Index=5 Count=3 Element=680,5.2.4 有序表插入,要插入一个数到有序表中 找到插入位置 把数组的元素逐个向后移动 将这个数写到空出的位置 实现有序表插入的程序 样例:insert.asm,5.3 循环程序设计,循环程序包含3部分: 循
7、环初始化部分 循环体 循环控制部分 常见的循环控制结构: while-do结构 do-while结构,while-do结构和do-while结构,5.3.1 循环指令,LOOP指令 循环次数放在ECX中,一般用于固定次数 格式:LOOP 标号 功能:ECX先减1,再检查ECX: ECX的值不为0,则跳转到标号处继续循环; 如果ECX的值为0,则循环结束。,LOOP指令,循环的格式为: MOV ECX, 循环次数 标号: 循环体 LOOP 标号 举例:计算n!的递归程序 factoria.asm 结果:factorial(5) =120,LOOPZ和LOOPNZ指令,LOOPZ和LOOPNZ指令
8、: 循环体执行一次后,不仅要检查ECX的值,还 会检查ZF。 格式:LOOPZ(LOOPNZ) 标号 功能:ECX先减1,再检查ECX和ZF标志位: 如果ECX的值不为0,并且ZF为1(0),则跳转到标号处继续循环; 否则继续执行LOOPZ后面的下一条指令,循环结束。,样例:数值转换convert.asm 结果: hex format = 18ef1365h dec format = 0418321253d bin format = 00011000111011110001001101100101b bits of 1 = 16,5.3.2 不定次数的循环,某些循环的执行次数预先并不能完全确定
9、,而是根据执行的情况来决定是否继续循环或退出循环。 这时,就不再适合用LOOP指令来构造循环了,而应该利用条件跳转指令来构造和控制循环。,5.3.3 循环体中操作的控制,可以用数据来描述循环体内部的操作:每次循环过程中取出数据来决定循环要做的操作。 例如:由X和Y数组计算数组Z的计算公式为: Z0X0+Y0 Z1X1+Y1 Z2X2-Y2 Z3X3-Y3 Z4X4-Y4 Z5X5+Y5 Z6X6+Y6 Z7X7-Y7 Z8X8+Y8 Z9X9-Y9 则再设定一个数组OP,用0和1表示加法和减法。 当计算Z的元素时,取出OP数组中的对应元素,来决定是做加法还是减法。,5.3.4 多重循环,循环嵌套构成多重循环 例如:将数组中的7个元素从小到大排列好,冒泡排序例子bubble.asm,过程如下,5.4 跳转表,适合程序中分支很多的情况 C语言使用switch语句 汇编程序使用跳转表 要实现一个简易的计算程序,输入两个操 作数和一个运算符,计算结果并显示出来。 C语言举例:equation.c 汇编语言举例:equation.asm,
链接地址:https://www.31doc.com/p-2577914.html