您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 32程序设计的基本结构
3.2程序设计的基本结构•顺序程序设计•分支程序设计•循环程序设计•顺序程序设计•P85例3.63.1汇编语言程序设计•分支结构程序分支程序是利用条件转移指令,使程序执行到某一指令后,根据运算状态标志条件是否满足,来改变程序执行的次序。分支程序的结构如图所示。条件程序段1程序段2YN二、分支程序设计无条件转移:转移发生不需要状态信息,执行到JMP处则发生转移。Part1JMPAAPart2AAXXXXPart3无条件转移指令转移跳过的地址下一条执行指令条件转移:当条件满足是发生转移,否则顺序执行下一条指令。Part1JCCAAXXXXPart2AAXXXPart3条件转移指令转移跳过的地址下一条执行指令条件成立?NoYes程序转移指令—无条件转移1、JMP指令格式:JMPdest功能:无条件转移到操作数(dest)所指示的地址,不影响标志。•段内转移:•直接转移:JMPSTART(IP)←START16位立即数NERA标号例如:JMP1234H指令跳转到CS:1234H执行。Part1JMP1234HPart21234HXXXPart3CS:0100H跳过1134HCS:1234H程序转移指令—无条件转移•执行操作:(IP)←DEST•段内转移:•间接转移:JMPDEST——DEST为16寄存器或内存操作数例如:(SI)=0100HJMPSI指令跳转到CS:0100H执行。例如,(BX)=100H,DS:0100H=1234HJMP[BX]指令跳转到CS:1234H执行。Part1JMP[BX]Part21234HXXXPart3CS:0100H跳过1134HCS:1234H12H34HDS:0100HIP=1234H例如:JMP12345678H指令跳转到1234:5678H执行五、程序转移指令—无条件转移•段间转移:32位立即数•直接转移:JMPDEST(IP)←低16位(CS)←高16位FAR标号32内存操作数例如:DI=200H双字(DS:0200H)=12345678HJMPDWORDPTR[DI]指令执行:低位字:(IP)=5678H高位字(CS)=1234HPart1JMPDWORDPTR[DI]Part2XXXPart3CS:0100H1234H:5678H34H56HDS:0200HIP=5678H78H12HCS=1234H程序转移指令—条件转移复杂转移:由多个标志的状态决定的转移,分为有符号数和无符号数转移•无符号数转移指令比较两个无符号数,并根据比较结果转移JA标号;两数比较,高于则转移(JNBE)JNA标号;两数比较,不高于则转移(JBE)JB标号;两数比较,低于则转移(JNAE)JNB标号;两数比较,不低于则转移(JAE)•有符号数转移指令比较两个带符号数,并根据比较结果转移JG标号;两数比较,大于则转移(JNLE)JNG标号;两数比较,不大于则转移(JLE)JL标号;两数比较,小于则转移(JNGE)JNL标号;两数比较,不小于则转移(JGE)循环程序设计重复执行某一段程序的程序结构称为循环程序。用来处理带重复性的问题。循环程序由五部分组成:初始化部分——为程序操作、地址指针、循环计数、结束条件等设置初始值。循环工作部分——循环程序主体,完成基本操作。循环修改部分——修改循环工作部分的变量地址等,为重复操作作准备。循环控制部分——修改计数器或判断循环结束条件,决定是否终止循环。循环体循环结束部分——循环终止后,对循环结果的处理部分。循环程序的几种结构形式循环程序设计终止起始初始化部分循环工作部分循环修改部分循环控制完未完终止起始初始化部分循环工作部分循环修改部分循环控制完未完终止起始初始化部分循环工作部分循环修改部分循环控制完未完基本结构形式工作部分放在循环控制部分之后,这样可以允许循环次数为零的循环程序或不需要循环时不进入循环工作部分。•循环程序分类•按循环控制条件分类循环程序设计计数循环——重复次数已知,用计数值控制循环的开始与终止。条件控制循环——重复次数未知或不确定,需找出循环控制的条件。•按循环体内结构分类单重循环——循环体内只是顺序程序或分支程序,不再有循环程序。多重循环——循环体内再套有循环程序。•循环程序设计要点(1)怎样把求解的问题变为循环结构的程序类型——怎样实现重复。循环工作部分的设计尤为重要,因为这是多次重复的部分,注意程序的精练,以及循环体头部的确定。(2)怎样使循环准确地执行完毕,注意循环控制部分的设计。特别是对条件控制的循环,注意设置循环结束标志。计数循环的控制方法:当循环次数已知时常用该方法。减1循环MOVCX,NL:……DECCXJNZL加1循环MOVCX,-NL:……INCCXJNZL循环程序设计循环指令LOOP短标号MOVCX,NL:……LOOPL4.2汇编语言程序设计循环程序举例:MOVAX,3578HMOVCL,0L:ORAX,AX;当AX=0时OR操作为0JZEXIT;AX=0结束SALAX,1;算术左移最高位进CFJNCL;无进位转移到LINCCLJMPLEXIT:INT21H循环程序设计起始AX=3578H,CL=0左移AX1位终止AX=0?YN例如,统计AX中1的个数DEBUG演示CF=1?NYCL=CL+1循环程序举例:例2、BUF中有N个有符号数,分离其中的正负数,分别送入BUF1和BUF2中。这是一个循环次数已知的程序设计,用计数循环完成。DATASEGMENTBUFDB12H,34H,-56H,-98H,096H,68H,56H,80H循环程序设计INCBXJMPCCBB:MOV[DI],ALINCDICC:DECCXJNZAAMOVAH,4CHINT21HCODEENDSENDSTARTN=$-BUFBUF1DBNDUP(0)BUF2DBNDUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVDX,DATAMOVDS,AXLEASI,BUFLEADI,BUF1LEABX,BUF2MOVCX,NAA:MOVAL,[SI]INCSICMPAL,0JGEBBMOV[BX],AL(1)若DW定义BUF怎样修改?(2)能改为条件控制循环吗?汇编连接演示X42一般是有公用性、重复性或有相对独立性的程序应设计成子程序子程序设计子程序结构:PUSHAXPUSHBX………………POPBXPOPAX现场保护程序部分RETNAMEENDP必须RET结束NAMEPROCNEAR(FAR)过程名过程类型子程序设计调用与返回:调用CALL过程名(子程序地址)功能:(1)下条指令的地址压入堆栈。对于段内调用只将IP的值压入堆栈对于段间调用先将CS的值压入堆栈,再将IP的值压入堆栈。(2)子程序的地址送入CS:IP从而转入子程序运行。返回指令RET子程序的最后一条指令,用于返回CALL指令的下条指令继续执行。无论对那一种调用方式其返回指令都相同。功能:(1)对于段内调用只将当前[SP]弹进IP,从而使程序正常返回。(2)对于段间调用则先弹IP,再弹CS。子程序设计子程序的设计与应用应注意的问题(1)现场的保护PUSHAXPUSHBXPUSHSI……………………POPSIPOPBXPOPAXRET(2)参数的传递主调用子程序必须传递入口参数,子程序返回必须传递出口参数。常用的方法有:寄存器——适用于参数少的情况。约定单元——适用于参数多的情况。要事先建立参数数据缓冲区。堆栈——适用于参数较多,且子程序嵌套,递归调用的情况。2组8位无符号数,每组中有N个无符号数,分别找出每一组中的最大数,并将最大数存放在每组数的开绐地址。CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,BUF1;入口参数INCSI;指向数据开始MOVCX,N1;入口参数CALLSUBROTMOV[BUF1],ALLEASI,BUF2INCSI;指向数据开始MOVCX,N2CALLSUBROTMOV[BUF2],ALMOVAH,04CHINT21HSUBROTPROCPUSHCX;子程序开始PUSHSIDECCX;循环次数为N-1MOVAL,[SI];取第一个数LOOP1:INCSI;指向被比较的数CMPAL,[SI]JANEXTMOVAL,[SI]NEXT:DECCXJNZLOOP1POPSIPOPCXRETSUBROTENDPDATASEGMENTBUF1DB?,12H,45H………N1=$-BUF1BUF2DB?,65H,ACH……N2=$-BUF2DATAENDS;子程序的入口参数:;SI=数据区的首地址,CX=数据个数;出口参数:AL为最大的数;用到的寄存器:AX,CX,SICODEENDSENDSTART汇编连接X43
本文标题:32程序设计的基本结构
链接地址:https://www.777doc.com/doc-3456342 .html