第四章程序流程控制语句及程序设计.ppt
《第四章程序流程控制语句及程序设计.ppt》由会员分享,可在线阅读,更多相关《第四章程序流程控制语句及程序设计.ppt(80页珍藏版)》请在课桌文档上搜索。
1、1,第4章 程序设计的基本方法,4.1 程序设计方法概述4.2 顺序程序设计4.3 分支程序设计 4.4 循环程序设计4.5 子程序设计4.6 程序设计中的注意事项,开始,2,4.1 概述,4.1.1 汇编语言程序设计的一般步骤4.1.2 流程图,返回本章首页,3,4.1.1 汇编语言程序设计的一般步骤,汇编语言程序设计一般有以下几个步骤:1、分析问题,确定算法2、根据具体问题,确定输入输出数据的格式3、分配存储区并给变量命名(包括寄存器)4、绘制流程图5、根据流程图编制程序6、调试程序,返回本节,4,4.1.2 流程图,1流程图的概念流程图是由特定的几何图形、指向线、文字说明来表示数据处理的
2、步骤,形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。,2流程图符号表示(1)起止框:表示程序的开始和结束。,起止框,5,(2)判断框,(3)处理框,(4)调用框,(5)指向线,(6)连接框,返回本节,6,4.2 顺序程序设计,顺序程序流程图组成:只有一个起始框、一个终止框和一至几个处理说明框。【例4.1】从键盘上输入0至9中任一自然数x,求其立方值。解题方法:采用构造一立方表,运行时查表实现。输入输出数据格式:输入:0-9任一自然数,字节单元存储 输出:输入数的立方数,字单元存储分配存储区:字节变量X:存放键入自然数x 字变量XXX:存放x的立方值 变量TAB:假
3、定立方表的首地址(TAB+2*x)=x的立方值,TAB,7,流程图:,开始,输入数字x,将x真值放入X,查表得x立方放入XXX,结束,8,STACK SEGMENT STACK DB 200 DUP(0)STACK ENDSDATASEGMENT INPUT DB PLEASE INPUT X(09):$TAB DW 0,1,8,27,64,125,216,343,512,729 X DB?XXX DW?DATAENDS,编程,9,CODESEGMENTASSUME DS:DATA,CS:CODE,SS:STACKBEGIN:MOV AX,DATA MOV DS,AX MOV DX,OFFSE
4、T INPUT MOV AH,9 INT 21H MOV AH,1 INT 21H AND AL,0FH MOV X,AL,显示输入提示符,接受键盘输入数字x放入AL,求x的真值放入X,10,ADD AL,AL MOV BL,AL MOV BH,0 MOV AX,TABBX MOV XXX,AX MOV AH,4CH INT 21H CODE ENDS END BEGIN,2*xBX,查表TAB+BX放入XXX,返回本章首页,11,4.3 分支程序设计,4.3.1 控制转移类指令4.3.2 分支程序设计,返回本章首页,12,4.3.1 控制转移类指令,1、条件转移指令2、无条件转移指令,返回本
5、章首页,无条件转移指令和条件转移指令区别:1、前者转移是无条件的,而后者有;2、前者转移范围不受限制,而后者只能在-128127个字节范围内转移。,13,简单条件转移指令 无符号数条件转移指令 有符号数条件转移指令 语句格式:标号:操作符 短标号短标号:即当前(IP)到某标号(即转移的目的地址)的位移量在-128127间。功能:如果条件满足,则(IP)位移量IP。,1、条件转移指令,返回本节,14,共有10条指令,根据五个标志位ZF、SF、OF、PF和CF的两种状态(0或1)分别进行转移。(1)JE/JZ;ZF=1则转移,测试前次操作结果是否等于0 JNE/JNZ;ZF=0则转移,测试前次操作
6、结果是否不等于0(2)JS;SF=1则转移,测试前次操作结果是否为负数 JNS;SF=0则转移,测试前次操作结果是否为正数(3)JO;OF=1则转移,测试前次操作结果是否有溢出 JNO;OF=0则转移,测试前次操作结果是否没有溢出(4)JC;CF=1则转移,测试前次操作结果是否有进(借)位 JNC;CF=0则转移,测试前次操作结果是否无进(借)位,简单条件转移指令,15,(5)JP;PF=1则转移,测试前次操作结果中1的个数是否为偶数 JNP;PF=0则转移,测试前次操作结果中1的个数是否为奇数例:下面程序段测试AX的低四位是否全0,如果均是0,那么使CX=0,否则使CX=-1。MOV CX,
7、-1 TEST AX,000FH JNZ NEXT MOV CX,0 NEXT:,16,无符号数条件转移指令,无符号数条件转移指令往往跟在比较指令之后,根据运算结果设置的条件标志状态确定转移方向。这类指令视比较对象为无符号数。(1)JA/JNBE;高于/不低于且不等于转移。转移条件:当CF=0且ZF=0时转移。(2)JAE/JNB;高于或等于/不低于转移。转移条件:当CF=0或ZF=1时转移。(3)JB/JNAE;低于/不高于且不等于转移。转移条件:当CF=1且ZF=0时转移。(4)JBE/JNA;低于或等于/不高于转移。转移条件:当CF=1或ZF=1时转移。,17,【例4.5】比较AX、BX
8、中无符号数大小,将较大的数存放AX寄存器。CMPAX,BX;(AX)(BX)JAENEXT;若AX=BX,转移到NEXT XCHGAX,BX;若AXBX,交换 NEXT:,18,有符号数条件转移指令,当比较判断两个有符号数的大小时,要选用有符号数条件转移指令。有符号数条件转移根据条件标志ZF、SF、OF的特定组合决定是否转移。(1)JG/JNLE;大于/不小于且不等于转移。转移条件:当SF=OF且ZF=0时转移。(2)JGE/JNL;大于或等于/不小于转移。转移条件:当SF=OF或ZF=1时转移。(3)JL/JNGE;小于/不大于且不等于转移。转移条件:当SF OF且ZF=0时转移。(4)JL
9、E/JNG;小于或等于/不大于转移。转移条件:当SF OF或ZF=1时转移。,19,【例4.6】比较AX、BX中有符号数大小,将较大的数存放在AX寄存器。CMPAX,BX;(AX)(BX)JGENEXT;若AX=BX,转移到NEXT XCHGAX,BX;若AXBX,交换 NEXT:,20,2、无条件转移指令,用途:在分支语句中常用于将各分支出口重新汇集到一起。段内转移:指在同一代码段的范围内进行转移,只需要改变IP寄存器的内容。(1)段内直接转移格式:JMP 标号名;该标号的属性为近标号例如:JMP NEXT;(2)段内间接转移格式:JMP OPD;将OPD的内容送IP寄存器例如:JMP WO
10、RD PTR 1234H;将字存储单元1234H中的内容送IP寄存器,21,段间转移:指要转移到另一个代码段去执行程序,此时不仅需要改变IP寄存器中的内容,还要修改CS段寄存器的内容才能达到转移的目的,因此段间转移需要修改两个寄存器中的内容。(1)段间直接转移格式:JMP 标号名;该标号的属性为远标号(2)段间间接转移格式:JMP OPD;(OPD)IP,(OPD+2)CS例如:JMP DWORD PTR 1234H;将双字存储单元的低字内容送IP寄存器,双字存储单元的高字内容送CS寄存器,返回本节,22,4.3.2 分支程序设计,【例4.7】编写计算下面函数值的程序:1X0Y=0X=0-1X
11、0设输入数据为X、输出数据Y,且皆为字节变量。程序流程图如图4.2所示。程序如下:,23,图4.2 分支运算程序流程图,24,DATASEGMENTX DB-10Y DB?DATAENDSSTACKSEGMENT STACK DB 200 DUP(0)STACKENDSCODESEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATA,25,MOVDS,AX CMPX,0;与0进行比较 JGEA1;X0转A1 MOVY,-1;X 0时,-1Y JMPEXITA1:JGA2;X0转A2 MOVY,0;X=0时,0Y JMPEXITA2:MOVY,
12、1;X0,1Y EXIT:MOVAH,4CH INT21H CODE ENDS ENDSTART,26,【例4.8】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。设三个带符号数分别在三个字变量X、Y、Z中存储。程序流程图如图4.3所示,27,图4.3例4.8程序流程图,28,程序如下:STACK SEGMENT STACK DB 200 DUP(0)STACK ENDSDATA SEGMENTX DW 00ABHY DW 5Z DW 200MAX DW?DATA ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODE START
13、:MOV AX,DATA MOV DS,AX,29,MOV AX,X CMP AX,Y;XY?JG L1 MOV AX,Y;YZ?CMP AX,Z JG EXITL2:MOV AX,Z JMP EXITL1:CMPAX,Z;XZ?JLE L2EXIT:MOVMAX,AX MOVAH,4CH INT21HCODE ENDS END START,30,分支程序设计注意事项:1、选择合适的转移指令,否则就不能转移到预定的程序分支;2、要为每个分支安排出口,否则易导致程序运行的混乱;3、应把各分支中的公共部分尽量提到分支前或分支后的公共程序段中,使程序简洁、清晰;4、在分支比较多时,流程图中对每个分支
14、判断的先后次序应尽量与问题提出的先后次序一致;5、在调试分支程序时,要假定各种可能的输入数据,沿着每一支路逐一检查,测试程序是否正确。,返回本节,31,4.4 循环程序设计,循环指令4.4.1 循环程序的结构4.4.2 单重循环程序设计4.4.3 多重循环程序设计,返回本章首页,32,1)循环指令LOOP2)相等/为零循环指令LOOPE/LOOPZ3)不相等/不为零循环指令LOOPNE/LOOPNZ,循环指令(不改变标志位),33,1计数循环指令LOOP语句格式:LOOP 短标号功能:寄存器CX的值减1后,其结果不等于0,则转移到短标号;否则,顺序执行。说明:使用LOOP指令可代替两条指令,D
15、EC CX JNE 短标号,34,2相等/全零循环指令LOOPE/LOOPZ语句格式:LOOPE 短标号 LOOPZ 短标号功能:寄存器CX的值减1后0且ZF=1,则程序转移到短标号;否则,顺序执行。,35,分析下面的例子,该程序完成什么功能?DATA SEGMENT BUF DB AAABBCD COUNT EQU$-BUFDATA ENDS MOV AL,A MOV DI,OFFSET BUF MOV CX,COUNT DEC DINEXT:INC DI CMP AL,DI LOOPE NEXT MOV BX,DI JNZ EXIT MOV BX,0FFFFH;EXIT:.,36,功能:在
16、字符串查找是否存在非A字符,若找到,将BX指针指向第一个非A字符,否则置BX为-1。,注意:有两种可能退出循环的执行。(1)计数结束(CX)=0,此时ZF=1,表示所有都是A字符。(2)ZF=0,表示找到非A字符。,37,3不相等/不为零循环指令LOOPNE/LOOPNZ语句格式:LOOPNE 短标号 LOOPNZ 短标号功能:寄存器CX的值减1后0且ZF=0,则程序转移到短标号;否则,顺序执行。,返回本节,38,4.4.1 循环程序的结构,1初始化部分2工作部分3修改部分4.控制部分,39,循环程序的常见结构形式如图4.5(a)、(b)所示。,返回本节,40,4.4.2 单重循环程序设计,常
17、见的两种循环控制方式:1计数控制 2条件控制,循环体内不再包含循环结构的循环结构称为单重循环。,返回本节,41,1计数控制,【例4.10】已知有COUNT个字节数据存放在以BUF为首址的存贮区中,编写程序统计负数和正数的个数分别送MINUS和PLUS单元。算法设计:用DL和BL分别统计正数和负数的个数,初值为0。将BUF区中的n个数逐次取出,判断其值是否大于等于0,若是,则DL加1,否则BL加1,最后将BL送到MINUS,将DL送到PLUS。,对于循环次数已知的情况,通常采用计数控制方法来实现循环。又分为倒计数法和正计数法。,42,存储器分配:BUF:存放n个有符号数COUNT:存放有符号个数
18、nMINUS:存放负数个数PLUS:存放正数个数寄存器分配:BL:暂存负数个数,初值为0DL:暂存正数个数,初值为0SI:BUF地址指针,初值指向BUFCX:循环计数器,初值为COUNTAL:暂存从BUF中取出待判断正负属性的数。,43,DATA SEGMENT BUF DB-32,25,36,-18,-46,0,-3 COUNT EQU$-BUF PLUS DB?MINUS DB?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV BL,0;统计负数个数的计数器 MOV DL,0;统计正数个数
19、的计数器 MOV SI,OFFSET BUF MOV CX,COUNT,44,LOP1:MOV AL,SI CMP AL,0;判断是否为正数 JGE NEXT0 INC BL;若为负数,(BL)+1(BL)JMP NEXT1NEXT0:INC DL;若为正数,(DL)+1(DL)NEXT1:INC SI LOOP LOP1 MOV MINUS,BL MOV PLUS,DL MOV AH,4CH INT 21HCODE ENDS END START,45,2条件控制,【例4.11】已知在以PROG为首址的字节存储区中存放着一段汇编源程序,最后以Ctrl-z(其ASCII码为1AH)作为结束标志。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第四 章程 流程 控制 语句 程序设计

链接地址:https://www.desk33.com/p-259761.html