《程序设计的基本结构.ppt》由会员分享,可在线阅读,更多相关《程序设计的基本结构.ppt(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、顺序程序设计顺序程序设计分支程序设计分支程序设计循环程序设计循环程序设计顺序程序设计顺序程序设计P853.1 汇编语言程序设计汇编语言程序设计分支结构程序分支结构程序分支程序是利用条件转移指令,使程序执行分支程序是利用条件转移指令,使程序执行到某一指令后,根据运算状态标志条件是否到某一指令后,根据运算状态标志条件是否满足,来改变程序执行的次序。分支程序的满足,来改变程序执行的次序。分支程序的结构如图所示。结构如图所示。条件条件程序段程序段1程序段程序段2YN二、分支程序设计二、分支程序设计无条件转移无条件转移:转移发生不需要状态信息,执行到JMP处则发生转移。Part1JMP AAPart2A
2、A XXXXPart3无条件转移指令转移跳过的地址下一条执行指令条件转移条件转移:当条件满足是发生转移,否则顺序执行下一条指令。Part1JCC AAXXXXPart2AA XXXPart3条件转移指令转移跳过的地址下一条执行指令条件成立?NoYes程序转移指令程序转移指令无条件转移无条件转移1、JMP 指令指令格式:格式:JMP dest功能:无条件功能:无条件转移到操作数转移到操作数(dest)dest)所指示的地址,不影响标志。所指示的地址,不影响标志。段内转移段内转移:直接转移直接转移:JMP START(IP)START16位立即数NERA 标号例如例如:JMP 1234H指令跳转到
3、指令跳转到 CS:1234H执行。执行。Part1JMP1234HPart21234H XXXPart3CS:0100H跳过1134HCS:1234H程序转移指令程序转移指令无条件转移无条件转移执行操作:执行操作:(IP)DEST段内转移段内转移:间接转移间接转移:JMP DESTDEST为为 16寄存器或内存操作数寄存器或内存操作数例如例如:(SI)=0100HJMP SI指令跳转到指令跳转到 CS:0100H执行。执行。例如例如,(BX)=100H,DS:0100H=1234HJMP BX指令跳转到指令跳转到 CS:1234H执行。执行。Part1JMP BXPart21234H XXXP
4、art3CS:0100H跳过1134HCS:1234H12H34HDS:0100HIP=1234H例如例如:JMP 12345678H指令跳转到指令跳转到 1234:5678H执行执行五、程序转移指令五、程序转移指令无条件转移无条件转移段间转移段间转移:32位立即数直接转移直接转移:JMP DEST(IP)低低1616位位(CS)高高16位位FAR 标号32内存操作数例如:例如:DI=200H双字(双字(DS:0200H)=12345678HJMPDWORD PTR DI指令执行指令执行:低位字:低位字:(IP)=5678H高位字高位字(CS)=1234HPart1JMP DWORD PTR
5、DIPart2 XXXPart3CS:0100H1234H:5678H34H56HDS:0200HIP=5678H78H12HCS=1234H 程序转移指令程序转移指令条件转移条件转移复杂转移:复杂转移:由多个标志的状态决定的转移由多个标志的状态决定的转移,分为分为有符号数和无符号数有符号数和无符号数转移转移无符号数转移指令无符号数转移指令 比较两个无符号数,并根据比较结果转移比较两个无符号数,并根据比较结果转移JA标号标号;两数比较,高于则转移;两数比较,高于则转移(JNBE)JNA标号标号;两数比较,不高于则转移(;两数比较,不高于则转移(JBE)JB标号标号;两数比;两数比较,较,低于则
6、转移低于则转移(JNAE)JNB标号标号;两数比较,不低于则转移(;两数比较,不低于则转移(JAE)有符号数转移指令有符号数转移指令 比较两个带符号数,并根据比较结果转移比较两个带符号数,并根据比较结果转移JG标号标号;两数比较,大于则转移;两数比较,大于则转移(JNLE)JNG标号标号;两数比较,不大于则转移(;两数比较,不大于则转移(JLE)JL标号标号;两数比;两数比较,较,小于则转移小于则转移(JNGE)JNL标号标号;两数比较,不小于则转移(;两数比较,不小于则转移(JGE)循环程序设计循环程序设计 重复执行某一段程序的程序结构称为循环程序。用来处理带重复性的问题。循环程序由五部分组
7、成循环程序由五部分组成:初始化部分为程序操作、地址指针、循环计数、结束条件等设置初始值。循环工作部分循环程序主体,完成基本操作。循环修改部分修改循环工作部分的变量地址等,为重复操作作准备。循环控制部分修改计数器或判断循环结束条件,决定是否终止循环。循环体循环结束部分循环终止后,对循环结果的处理部分。循环程序的几种结构形式循环程序的几种结构形式循环程序设计循环程序设计 终 止起 始初始化部分循环工作部分循环修改部分循环控制完完未完未完终 止起 始初始化部分循环工作部分循环修改部分循环控制完完未完未完终 止起 始初始化部分循环工作部分循环修改部分循环控制完完未完未完基本结构形式基本结构形式工作部分
8、放在循环控制部分之后,这样工作部分放在循环控制部分之后,这样可以允许循环次数为零的循环程序或不可以允许循环次数为零的循环程序或不需要循环时不进入循环工作部分。需要循环时不进入循环工作部分。循环程序分类循环程序分类按循环控制条件分类按循环控制条件分类循环程序设计循环程序设计 计数循环计数循环重复次数已知,用计数值控制循环的开始与终止。重复次数已知,用计数值控制循环的开始与终止。条件控制循环条件控制循环重复次数未知或不确定,需找出循环控制的条件。重复次数未知或不确定,需找出循环控制的条件。按循环体内结构分类按循环体内结构分类单重循环单重循环循环体内只是顺序程序或分支程序,不再有循环程序。循环体内只
9、是顺序程序或分支程序,不再有循环程序。多重循环多重循环循环体内再套有循环程序。循环体内再套有循环程序。循环程序设计要点循环程序设计要点(1)怎样把求解的问题变为循环结构的程序类型怎样把求解的问题变为循环结构的程序类型怎样实现重复。循环工作怎样实现重复。循环工作部分的设计尤为重要,因为这是多次重复的部分,注意程序的精练,以及循部分的设计尤为重要,因为这是多次重复的部分,注意程序的精练,以及循环体头部的确定。环体头部的确定。(2)怎样使循环准确地执行完毕,注意循环控制部分的设计。特别是对条件控怎样使循环准确地执行完毕,注意循环控制部分的设计。特别是对条件控制的循环,注意设置循环结束标志。制的循环,
10、注意设置循环结束标志。计数循环的控制方法:当循环次数已知时常用该方法。减1循环MOVCX,NL:DECCXJNZL加1循环MOVCX,-NL:INCCXJNZL循环程序设计循环程序设计 循环指令LOOP 短标号MOVCX,NL:LOOPL 4.2 汇编语言程序设计汇编语言程序设计循环程序举例循环程序举例:MOVAX,3578HMOVCL,0L:ORAX,AX ;当AX=0时OR操作为0JZEXIT ;AX=0结束SALAX,1 ;算术左移最高位进CFJNCL ;无进位转移到LINCCLJMPLEXIT:INT21H 循环程序设计循环程序设计 起 始AX=3578H,CL=0左移AX 1位终 止
11、AX=0?YN例如,统计AX中1 的个数DEBUG演示CF=1?NYCL=CL+1循环程序举例循环程序举例:例2、BUF中有N个有符号数,分离其中的正负数,分别送入BUF1和BUF2中。这是一个循环次数已知的程序设计,用计数循环完成。DATASEGMENTBUFDB 12H,34H,-56H,-98H,096H,68H,56H,80H循环程序设计循环程序设计 INCBXJMPCCBB:MOVDI,ALINCDICC:DECCXJNZAAMOVAH,4CHINT21HCODEENDSENDSTARTN=$-BUFBUF1DB N DUP(0)BUF2DB N DUP(?)DATAENDSCODE
12、SEGMENTASSUME CS:CODE,DS:DATASTART:MOVDX,DATAMOVDS,AXLEASI,BUFLEADI,BUF1LEABX,BUF2MOVCX,NAA:MOVAL,SIINCSICMPAL,0JGEBBMOVBX,AL(1)若DW定义BUF怎样修改?(2)能改为条件控制循环吗?汇编连接演示X42 一般是有公用性、重复性或有相对独立性的程序应设计成子程序 子程序设计子程序设计 子程序结构子程序结构:PUSHAXPUSHBXPOPBXPOPAX现场保护现场保护程序部分程序部分RETNAME ENDP必须必须RET结束结束NAME PROCNEAR(FAR)过程名过程
13、名过程类型过程类型子程序设计子程序设计 调用与返回调用与返回:调用CALL过程名(子程序地址)功能:(1)下条指令的地址压入堆栈。对于段内调用只将IP的值压入堆栈对于段间调用先将CS的值压入堆栈,再将IP的值压入堆栈。(2)子程序的地址送入CS:IP从而转入子程序运行。返回指令RET 子程序的最后一条指令,用于返回CALL指令的下条指令继续执行。无论对那一种调用方式其返回指令都相同。功能:(1)对于段内调用只将当前SP弹进IP,从而使程序正常返回。(2)对于段间调用则先弹IP,再弹CS。子程序设计子程序设计 子程序的设计与应用应注意的问题子程序的设计与应用应注意的问题(1)现场的保护 PUSH
14、AXPUSHBXPUSH SIPOPSIPOPBXPOPAXRET(2)参数的传递主调用子程序必须传递入口参数,子程序返回必须传递出口参数。常用的方法有:寄存器适用于参数少的情况。约定单元适用于参数多的情况。要事先建立参数数据缓冲区。堆栈适用于参数较多,且子程序嵌套,递归调用的情况。2组8位无符号数,每组中有N个无符号数,分别找出每一组中的最大数,并将最大数存放在每组数的开绐地址。CODESEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,BUF1 ;入口参数INCSI ;指向数据开始MOVCX,N1 ;入口参数CALLSUBR
15、OTMOVBUF1,ALLEASI,BUF2INCSI ;指向数据开始MOVCX,N2CALLSUBROTMOVBUF2,ALMOVAH,04CHINT21HSUBROTPROCPUSHCX;子程序开始PUSHSIDECCX;循环次数为N-1MOVAL,SI;取第一个数LOOP1:INCSI;指向被比较的数CMPAL,SIJANEXTMOVAL,SINEXT:DECCXJNZLOOP1POPSIPOPCXRETSUBROTENDPDATASEGMENTBUF1DB?,12H,45HN1=$-BUF1BUF2DB?,65H,ACHN2=$-BUF2DATAENDS;子程序的入口参数:;SI=数据区的首地址,CX=数据个数;出口参数:AL为最大的数;用到的寄存器:AX,CX,SICODEENDSENDSTART汇编连接X43