第5章分支与循环程序设计.ppt
第5章分支与循环程序设计 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望5.1 转移 转移指令分:n无条件转移指令n条件转移指令 5.1.1 无条件转移指令 n无条件转移指令JMP 作用相当于goto语句,但使用频繁。n分为:n段内转移 n段内短转移n段间转移 1段内转移 n格式:JMP SRCn功能:跳转到SRC指定的位置继续执行 nSRC可以是:n程序标号 如:JMP _Donen寄存器 如:JMP EAXn内存操作数 如:JMP EBX 2段内短转移 格式:JMP SHORT SRCnJMP指令仅占2字节nSRC必须是一个程序标号n同JMP SRC相比,短转移跳转的范围较小 3段间转移 在保护模式下,段间转移指令用来n切换任务n跳转到调用门指定的程序入口n执行另一个代码段内的程序 例如:JMP 0060:005B5E205.1.2 条件转移指令 格式:JCC LABELX功能:如果条件CC为真,则转移到LABELX处执行,否则顺序执行下一条指令。nLABELX是程序中的一个标号;nCC是条件标志位,指定了转移的条件。条件转移指令分类1依据单个标志位的条件转移指令2依据有符号数比较结果的条件转移指令3依据无符号数比较结果的条件转移指令4依据CX/ECX是否为0的条件转移指令1依据单个标志位的条件转移指令 例如,求DIST|AB|。MOV EAX,A SUB EAX,B JNS A10 NEG EAXA10:MOV DIST,EAX JNS比较SF的值,如果EAX是正数或0,就跳转到A10,否则执行下一句。2依据有符号数比较结果的条件转移指令例如,求有符号数A和B的较大值MAXAB。MOV EAX,A CMP EAX,B JGE a20 MOV EAX,Ba20:MOV MAXAB,EAXA大于等于B时,跳转到a20处,此时EAXA;A小于B时,不跳转,EAXB。3依据无符号数比较结果的条件转移指令例如,求无符号数A和B的最大值MAXAB MOV EAX,A cmp EAX,B JAE a30 MOV EAX,Ba30:MOV MAXAB,EAX和前面程序的区别只在于条件跳转指令的选择。有符号数判断使用JGE,而无符号数判断使用JAE。4依据CX/ECX是否为0的条件转移指令n格式1:JCXZ LABELXn格式2:JECXZ LABELXn功能:如果CX/ECX等于0,则转移到LABELX处执行,否则顺序执行下一条指令。5.2 分支结构程序设计 n5.2.1 单分支结构和双分支结构 n5.2.2 多分支结构n5.2.3 折半查找程序 n5.2.4 有序表插入5.2.1 单分支结构和双分支结构n单分支结构n双分支结构 对于单分支结构的程序,由条件转移指令来判断条件是否满足:n条件满足时,跳过分支程序n条件不满足时,继续向下执行,执行完分支后汇合。这点与C语言if语句不同。5.2.2 多分支结构 n以双分支结构为基础可以写出多分支结构的程序。n下面是求X的符号的函数的C程序和汇编程序的片段:sign.c sign.asmn判断是否为闰年的程序片段leapyear.asm n比较日期大小的程序片段 date.asm5.2.3 折半查找程序 n流程图(数组为R,元素个数n,数为a)折半查找执行过程 n(1)设定一个查找范围,下界为L和上界为hn(2)如果下界L大于上界h,则查找范围为空,查找结束。算法结束。n(3)取下界L和上界h的中点 m(L+h)/2n(4)从数组的中点m处取出一个数Rm,和a进行比较。折半查找执行过程(续)n(5)如果Rm等于a,则在数组中找到a,下标为m。算法结束。n(6)如果Rm大于a,则修改上界h为m1。然后跳转到第2步。n(7)如果Rm小于a,则修改下界l为m+1。然后跳转到第2步。实现折半查找的程序样例:split.asm结果为:Index=5 Count=3 Element=6805.2.4 有序表插入 要插入一个数到有序表中n找到插入位置n把数组的元素逐个向后移动n将这个数写到空出的位置实现有序表插入的程序 样例:insert.asm 5.3 循环程序设计 循环程序包含3部分:n循环初始化部分n循环体n循环控制部分 常见的循环控制结构:nwhile-do结构ndo-while结构 while-do结构和do-while结构 5.3.1 循环指令 nLOOP指令n循环次数放在ECX中,一般用于固定次数n格式:LOOP 标号n功能:ECX先减1,再检查ECX:nECX的值不为0,则跳转到标号处继续循环;n如果ECX的值为0,则循环结束。LOOP指令循环的格式为:MOV ECX,循环次数 标号:循环体 LOOP 标号举例:计算n!的递归程序 factoria.asm 结果:factorial(5)=120LOOPZ和LOOPNZ指令LOOPZ和LOOPNZ指令:循环体执行一次后,不仅要检查ECX的值,还会检查ZF。n格式:LOOPZ(LOOPNZ)标号n功能:ECX先减1,再检查ECX和ZF标志位:n如果ECX的值不为0,并且ZF为1(0),则跳转到标号处继续循环;n否则继续执行LOOPZ后面的下一条指令,循环结束。样例:数值转换convert.asm结果:hex format=18ef1365hdec format=0418321253dbin format=00011000111011110001001101100101bbits of 1 =165.3.2 不定次数的循环某些循环的执行次数预先并不能完全确定,而是根据执行的情况来决定是否继续循环或退出循环。这时,就不再适合用LOOP指令来构造循环了,而应该利用条件跳转指令来构造和控制循环。5.3.3 循环体中操作的控制n可以用数据来描述循环体内部的操作:每次循环过程中取出数据来决定循环要做的操作。n例如:由X和Y数组计算数组Z的计算公式为:Z0X0+Y0 Z1X1+Y1 Z2X2-Y2 Z3X3-Y3 Z4X4-Y4Z5X5+Y5 Z6X6+Y6 Z7X7-Y7 Z8X8+Y8 Z9X9-Y9则再设定一个数组OP,用0和1表示加法和减法。当计算Z的元素时,取出OP数组中的对应元素,来决定是做加法还是减法。5.3.4 多重循环循环嵌套构成多重循环 例如:将数组中的7个元素从小到大排列好,冒泡排序例子bubble.asm,过程如下5.4 跳转表适合程序中分支很多的情况 nC语言使用switch语句n汇编程序使用跳转表要实现一个简易的计算程序,输入两个操作数和一个运算符,计算结果并显示出来。C语言举例:equation.c 汇编语言举例:equation.asm