第6章1分支结构程序设计_第1页
第6章1分支结构程序设计_第2页
第6章1分支结构程序设计_第3页
第6章1分支结构程序设计_第4页
第6章1分支结构程序设计_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章分支结构程序分支程序常用的有两种结构形式:6.1比较/测试分支结构6.2跳转表多路分支结构控制转移类指令1无条件转移指令2条件转移指令3循环控制指令4子程序调用指令1无条件转移指令JMPSTAT(段内直接转移)JMPBX(段内间接转移)JMPFARPRTADD2(段间直接转移)JMPDWODPTR[BX+ADDR3](段间间接转移)2条件转移指令(1)简单条件转移指令(2)无符号数条件转移指令(3)有符号数条件转移指令它们都有通用的语句格式和功能。语句格式:[标号:]操作符短标号功能:如果条件满足,则(IP)+位移量→IP。(1)简单条件转移指令(2)无符号数条件转移指令(3)有符号数条件转移指令6.1比较/测试分支结构程序设计

P={先要对处理的问题进行比较、测试或者进行算术运算、逻辑运算,以产生有效的状态标志。然后选择条件转移指令产生分支转移。通常一条条件转移指令只能产生两路分支。若要实现多路分支,必须使用多条转移指令。n条条件转移指令可以产生n+l路分支。图6.1比较/测试分支结构的两种程序流程(a)相当于高级语言中的IF—THEN—ELSE语句,根据条件成立与否,分两种情况分别处理。(b)相当于高级语言中的IF—THEN语句,仅当某种条件成立才执行一段程序,否则跳过它。例6.1内存ADR单元开始存放两个带符号字数据,编制程序,若两数同号将FLAG单元置0,否则置全1。问题分析:判断两数是否同号,即判断两个数的最高位是否相同,若相同即为同号。判断的方法有两种:第一种方法:先取出一个数,判断符号是否为正,若为正,再判断另一个数的符号是否正,也为正,则两数同号,否则为异号;若第一个数的符号为负,判断另一个数的符号是否为负,也为负,则两数同号,否则为异号。图6.2测试两数符号程序流程图DSEGSEGMENT ADRDW73A5H,924BH FLAGDB?DSEGENDSCSEGSEGMENT ASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVAX,ADRANDAX,AX;置标志JNSPLUS;正转MOVAX,ADR+2ANDAX,AX;第二个数置标志JSSAME;同为负UNSAME:MOVAL,0FFH;异号标志JMPLOADPLUS:TESTADR+2,8000H;第二个数置标志JSUNSAME ;异号SAME:XORAL,AL;同号标志LOAD:MOVFLAC,AL;存标志MOVAH,4CHINT21HCSEGENDSENDSTART第二种方法:利用XOR指令,将两个数异或,异或结果的最高位状态为1,则说明两数异号,否则两数同号。异或结果的最高位状态反应到符号标志SF位上。如:0111011010011010⊕10011010⊕100101101110110000001100符号位为:1,SF=1符号位为0,SF=0DSEGSEGMENTARGDW7654H,8A32HFLAGDB?DGECENDSCSEGSEGMENTASSUMEDS:DSEC,CS:CSEGSTART:MOVAX,DSEGMOVDS,AXMOVAX,ARGX0RAX,ARG+2;两数异或MOVAL,0;同号标志JNSLOAD;同号DECAL;异号标志LOAD:MOVFLAG,AL;存标志MOVAH,4CHINT21HCSEGENDSENDSTARTEvenOdd例6.2设ASC单元存放两个字符的ASCII码,编制程序检查其奇偶性,并将它们配制成奇校验存入原单元。问题分析:字符的ASCII码是用七位二进制表示的,当用一个字节单元保存一个字符的ASCII码时,字节单元的第7位(最高位)空闲,因此,常对ASCII码字节的空闲位作如下利用:1)作为奇偶校验位;2)为1,表示是扩充ASCII码,即128种特殊字符或图形代码(在西文状态下);3)作为汉字代码的标志位(在中文状态下)。本题要求将字符代码配置为奇校验。方法是先检查代码的奇偶性,然后根据测试结果PF标志状态决定是否将最高位置1。在字符I/O时,常把第7位做为奇偶校验位,其意义在于字符在传输过程中,可能由于某种原因,产生数位传输错,通过设置奇偶校验位可以检查字符传输中是否出错。所谓字符代码的奇偶性系指代码中含1的个数是奇数还是偶数。例如,字符A的ASCII码为41H(01000001B),其中含有2个1,即为偶性,要使之为奇性,则将最高位0变为1;同理字符C的ASCII码为43H(01000011B),其中含有3个1,即为奇性。把字符代码配制成奇校验,即使字符代码连同最高位共含有奇数个1;配制成偶校验,即使字符代码连同最高位共含有偶数个1。图6.3配奇校验位程序流程图DSEGSEGMENTASCDB‘AC’DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGMKODD:MOVAX,DSEGMOVDS,AXMOVAX,WORDPTRASC;取两字符ANDAL,AL;置奇偶标志 JPONEXT;奇转ORAL,80H;配为奇性NEXT:ANDAH,AH;置奇偶标志JPOLOAD;奇转ORAH,80H;配为奇性LOAD:MOVWORDPTRASC,AXMOVAH,4CHINT21HCSEGENDSENDMKODD例6.3设X为单字节带符号整数,且存于ARGX单元,计算结果Y存入RLT单元。X+10(0<X≤8)5X-2(8<X<15)|X|(其它){Y=1:;*****EXAM6.3*****2:SSEG SEGMENTSTACK3:STK DB 50DUP(0)4:SSEG ENDS5:DSEG SEGMENT6:ARGX DB -57:RLT DB ?8:DSEG ENDS9:CSEG SEGMENT10: ASSUME CS:CSEG,DS:DSEG11: ASSUME SS:SSEG12:BEGIN: MOV AX,DSEG13: MOV DS,AX14: MOV AX,SSEG15: MOV SS,AX16: MOV SP,SIZESTK17: MOV AL,ARGX ;取X值18: AND AL,AL ;置标志位19: JS ABSL ;X<0转20: JZ MOVE ;X=0转21: CMP AL,8 ;X≤8?22: JLE ONE ;是,转23: CMP AL,15 ;X≥15?24: JGE MOVE ;是,转25: SAL AL,1 ;计算5X-226: SAL AL,127: ADD AL,ARGX28: SUB AL,229: JMP MOVE30:ONE: ADD AL,10 ;X≤8,计算X+1031: JMP MOVE32:ABSL: NEG AL ;取补33:MOVE:MOV RLT,AL ;保存结果34: MOV AH,4CH35: INT 21H36:CSEG ENDS37: END BEGIN例6.4设内存中有三个互不相等的无符号字数据,分别存放在ARG开始的字单元,编制程序将其中最大值存入MAX单元。A,B,C大大1:;*****EXAM6.5*****2:SSEG SEGMENT STACK3:STK DB 20 DUP(0)4:SSEG ENDS5:DSEG SEGMENT6:ARG DW 7138H,84A6H,29EH7:MAXDW ?8:DSEG ENDS9:CSEG SEGMENT10: ASSUME CS:CSEG,DS:DSEG11: ASSUME SS:SSEG12:FMAX:MOV AX,DSEG13: MOV DS,AX14: MOV AX,SSEG15: MOV SS,AX16: MOV SP,SIZESTK17: LEA SI,ARG ;取数据首址18: MOV AX,[SI] ;取第1个数19: MOV BX,[SI+2] ;取第2个数20: CMP AX,BX ;两数比较21: JAE FMAX1 ;AX中的数大22: MOVAX,BX ;大数送AX23:FMAX1:CMP AX,[SI+4] ;大数与第3个数比较24: JAE FMAX2 ;AX中的数大25: MOV AX,[SI+4] ;第3个数大大值26:FMAX2:MOVMAX,AX ;保存最大值27: MOV AH,4CH28: INT 21H29:CSEGENDS30:ENDFMAX6.2多分支结构程序设计利用计算机解决实际问题时,常遇到这样的情况:处理某个问题时有多种选择方案,根据实际情况选择其中一种。每种处理方案由一段程序完成,每一段程序可以看作一个分支,程序在执行过程中根据当前的状况,决定下一步应执行哪一个分支,这就构成了多个分支的程序。如用计算机控制一台电动机,该电动机有正转、逆转,在每种转动方式下又有几种转速的档次控制,这些控制可以通过键盘0~9的数字键进行选择,进入某种档次选择后,执行相应分支程序,使电机以最佳方式由一个状态进入所选状态。假设程序的十个分支的起始地址分别为ADR0,ADR1,...ADR9。1:;*****EXAM6.5.1*****2:SSEG SEGMENTSTACK3:STK DB20DUP(0)4:SSEG ENDS5:DSEG SEGMENT6:DSEG ENDS7:CSEG SEGMENT8: ASSUME CS:CSEG,DS:DSEG9: ASSUME SS:SSEG10:MOTOR:MOV AX,DSEG11: MOV DS,AX12: MOV AX,SSEG13: MOV SS,AX14: MOV SP,SIZESTK15: MOV AH,0116: INT 21H17: CMP AL,’0’18: JZ ADR019: CMP AL,’1’20: JZ ADR121: :22: CMP AL,’8’23: JZ ADR824:ADR9: :25: ::ADR0: :: ::ADR1 :: ::ADR8 ::::CSEG ENDS: END MOTOR-为了实现多路分支,常用跳转表。-例如某程序需n路分支,每路程序的入口地址分别为SUB1、SUB2、……SUBn。把这些转移的入口地址组成一个表,叫跳转表(如图6.4(a))。表内每两个字节存放一个入口地址的偏移量,跳转表也可由若干跳转指令组成(如图6.4(b)),这时用无条件转移指令,且每条指令的目标代码长度要一致,否则分支程序的编制非常麻烦。用跳转表形成多路分支的程序设计图6.4跳转表例6.5现有若干个程序段,每一程序段的入口地址分别是SUB1、SUB2、……SUBn。试编制一程序,根据指定的参数转入相应的程序段。问题分析:首先组成由入口地址构造的跳转表。设指定的参数是1、2、3、……n,且当参数为‘1’时,转移到SUB1,当参数为‘2’转移到SUB2,依次类推。这样,跳转表内的地址按照SUB1、SUB2、……SUBn的顺序排列。程序中,只需把取出的参数减‘1’乘以2,再加上跳转表首址就可以实现转移。DATASEGMENTTABLEDWSUB1,SUB2,SUB3,…SUBnPARAMDB3DAIAENDSCSEGSEGMENTASSUMECS:CSEG,DS:DATABEING:MOVAX,DATAMOVDS,AXMOVAL,PARAM图6.4跳转表DATASEGMENTTABLEDWSUB1,SUB2,SUB3,…SUBnPARAMDB3DATAENDSCSEGSEGMENTASSUMECS:CSEG,DS:DATABEING:MOVAX,DATAMOVDS,AXMOVAL,PARAMX0RAH,AHDECALSHLAL,1MOVBX,OFFSETTABLEADDBX,AXJMPWORDPTR「BX」SUB1:┊JMPEND0SUB2:┊JMPEND

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论