《分支循环结构部分》PPT课件.ppt
标号:,条件满足?,处理,4.4.3 分支程序,N,Y,IFTHEN结构,程序结构:测试/比较指令(TEST/CMP)条件转移指令(Jx 标号)处理体 标号:其他指令,程序结构:TEST/CMP指令 Jx 标号1 处理体P1 JMP 标号2标号1:处理体P2标号2:其他指令,条件满足?,处理P1,处理P2,标号1:,标号2:,条件1,条件2,IFTHENELSE结构,标号1:,条件1成立?,P1,N,Y,CASE结构,程序结构:TEST/CMP指令(测试条件1)Jx 标号1;不满足转标号1 处理体P1 JMP 标号n+1标号1:TEST/CMP指令(测试条件2)Jx 标号2;不满足转标号2 处理体P2 JMP 标号n+1标号2:TEST/CMP指令(测试条件3)Jx 标号3;不满足转标号3 处理体P3 JMP 标号n+1标号3:TEST/CMP指令(测试条件4)标号n+1:(公共出口),条件2成立?,条件n成立?,Pn+1,标号2:,标号n:,标号n+1:,P2,Pn,N,N,Y,Y,例:P178,例4-14,统计成绩。流程图中虚线框内,例题18:求某数X的绝对值,并送回原处。求X的绝对值,即要求完成下面的运算:X,X=0 Y=-X,X0显然,这是一个分支程序,程序将根据X的值不同完成不同的运算,其流程图如图4-3所示,程序如下:首先是各个段寄存器的初始化部分:,STACKSEGMENTSTACKDW256DUP(?)STACKENDSDATASEGMENTXADRDW3456H,8192H;定义变量XDATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKSTART:,MOVAX,DATA;数据段的段基址装入DSMOVDS,AXMOVAX,XADR;变量X送SX寄存器ANDAX,AX;(AX)=0?JNSDONE;若(AX)=0,则跳到DONENEGAX;否则求(AX)的补码MOVXADR,AX;存结果DONE:MOVAH,4CH;返回DOS INT 21HCODEENDSENDSTART,4.4.4 循环程序,1DOUNTIL 结构 先执行,再判断条件。工作部分至少执行一次。,初始化,循环体,循环控制,继续循环?,Y,N,2.DO WHILE 结构 先判断条件,再执行。工作部分有可能一次都不执行。,初始化,循环体,循环控制,继续循环?,Y,N,注意:循环可以嵌套(多重循环),但多个循环体之间不能交叉,控制条件不能混淆。例22:编制程序使S1+2X3+3X4+4X5+.+N(N+1),直到N(N+1)项大于200为止。首先绘制流程图:如图4-8所示根据流程图编制的程序如下所示:,TITLE ACCUMULATE SUMCODESEGMENT ASSUMECS:CODE,DS:CODE.SS:CODE ORG100HSTART:MOVDX,;DX-1 MOVBL,2;BL-2REPEAT:MOVAL,BL;乘积项的两个因子分别递增 INCBL MULBL;N(N+1)-AX,ADDDX,AX;计算累加和-AX CMPAX,200;N(N+1)=200存结果 MOVAH,4CH;返回DOS INT21H ORG200H RESULTDW?;存放结果单元CODEENDS ENDSTART,掌握以下几点:调用子程序用CALL指令,返回调用程序用RET指令。子程序允许嵌套调用。进入子程序后首先要保护主程序的运行状态(标志位)和使用的寄存器内容(称为保护现场),退出子程序前要恢复现场。调用前要预先确定子程序中要使用哪些寄存器,并定义入口参数和出口参数。参数传递可利用寄存器、存储单元或堆栈(要用BP寻址)。,4.4.5 子程序设计举例,例1:二进制数(0-F)转换成ASCII(0-F)的子程序。BIN2ASC PROC;要转换的数在AL的低四位;转换结果仍在AL中 CMP AL,9 JA A2F ADD AL,30H JMP DONE A2F:ADD AL,37H DONE:RETBIN2ASC ENDP调用方法:(在主程序中)MOV AL,0CH CALL BIN2ASC(AL中有0CH的ASCII码43H,C),作业:例题16、例题21、例题23、例题27,