资源描述
*,第1章 汇编语言基础知识 8章分支程序设计,*,计算机科学与技术系,汇编语言程序设计,8086/8088和ARM核汇编语言程序设计,第8章,分支程序设计,11/19/2024,1,8.1 分支程序的结构形式,8.2,分支结构程序设计,第8章,分支程序设计,11/19/2024,2,8.1,分支程序的结构形式,分支程序结构,是根据条件转向不同程序分支的结果,有3种形式:,单分支、双分支结构和多分支结构,。,11/19/2024,3,8.1 分支程序的结构形式,11/19/2024,4,8.2,分支结构程序设计,分支程序设计首先要在分析实际问题的根底上确定假设干个程序分支,然后在此根底上选用条件转移指令、或者是选用间接寻址无条件转移来转向不同的程序分支。前者是测试法分支程序设计,后者是跳跃表法分支程序设计。,分支结构是有假设干个条件,每一个条件对应一个根本操作。分支程序就是判断产生的条件,哪个条件成立,就执行哪个条件对应操作的程序段。也就是说,从假设干分支中选择一个分支执行。,8.2.1 测试法分支程序设计,例8.1 在内存中有一个字节单元NUM,存有带符号数据,要求计算出它的绝对值后,放入RESULT单元中。,11/19/2024,5,8.2,分支结构,程序设计,8.2.1 测试法分支程序设计,程序清单:,DATA SEGMENT,X DB -25,RESULT DB ?,DATA ENDS,CODE SEGMENT,ASSUME DS:DATA,CS:CODE,START:MOVAX,DATA,MOVDS,AX ;初始化,MOVAL,X ;X取到AL中,TESTAL,80H ;测试AL正负,JZNEXT ;为正,转NEXT,NEGAL ;否那么AL求补,NEXT: MOVRESULT,AL ;送结果,MOVAH,4CH,INT21H ;返回DOS,CODE ENDS,END START ;汇编结束,11/19/2024,6,8.2,分支结构,程序设计,8.2.1 测试法分支程序设计,程序清单:,DATA SEGMENT,X DB -25,RESULT DB ?,DATA ENDS,CODE SEGMENT,ASSUME DS:DATA,CS:CODE,START:MOVAX,DATA,MOVDS,AX ;初始化,MOVAL,X ;X,取到,AL,中,TESTAL,80H ;,测试,AL,正负,JNZMAKENEG ;,为负,转求补,JMP NEXT,MAKENEG: NEGAL ;AL,求补,NEXT: MOVRESULT,AL ;,送结果,MOVAH,4CH,INT21H ;返回DOS,CODE ENDS,END START ;汇编结束,11/19/2024,7,8.2,分支结构,程序设计,8.2.1 测试法分支程序设计,例8.2,试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。设三个带符号数分别在三个字变量X、Y、Z中存储。,11/19/2024,8,8.2,分支结构,程序设计,8.2.1 测试法分支程序设计,DATA SEGMENT,X DW -0ABH,Y DW 205,Z DW 200,MAX DW ?,DATA ENDS,CODE SEGMENT,ASSUME DS:DATA,CS:CODE,START:,MOV AX,DATA,MOV DS,AX,MOV AX,X,CMP AX,Y,JGE L1,MOV AX,Y,L1: CMP AX,Z,JGE EXIT,MOV AX,Z,EXIT: MOV MAX,AX,MOV AH,4CH,INT 21H,CODE ENDS,END START,11/19/2024,9,8.2,分支结构,程序设计,8.2.2 跳跃表法,例8.3 设某程序有8路分支,试根据给定的N值18,将程序的执行转移到其中的一路分支。,符合条件2,符合条件1,符合条件8,N=?,程序段8,图8.3 例8.3流程图,开始,查表地址TAB+(N-1)*2,程序段1,程序段2,设有假设干段分支程序,将每段分支程序的入口地址也称跳转地址组成一个连续存放在内存中的表,称为跳转表。,跳转表便于实现多路分支,11/19/2024,10,8.2,分支结构,程序设计,8.2.2 跳跃表法,DATA SEGMENT,TAB DW P1,P2,P3,P4,P5,P6,P7,P8,N DB 5,DATA ENDS,CODE SEGMENT,ASSUME DS:DATA,CS:CODE,START: MOV AX,DATA,MOV DS,AX,MOV AL,N,DEC AL,ADD AL,AL,MOV BL,AL,MOV BH,0,JMP TABBX,P1:,JMP EXIT,P2:,JMP EXIT,P8:,EXIT:,MOV AH,4CH,INT 21H,CODE ENDS,END START,注意:每个分支程序的最后要有一条转移语句,以便跳过其他的分支。,11/19/2024,11,8.2,分支结构,程序设计,举例,例8.4在附加段中,有一个按从小到大顺序排列的无符号字节数组ARRAY,要求在数组中查找字节X,假设找到那么使CF=0,并在ADDR中给出该元素在数组中的偏移地址;如未找到那么使CF=1。,算法分析:,折半查找法是先取有序数组的中间元素与查找值相比较,如相等那么查找成功;如查找值大于中间元素,那么再取高半部的中间元素与查找值相比较;如查找值小于中间元素,那么再取低半部的中间元素与查找值相比较;如此重复直到查找成功或者最终未找到该数查找不成功为止。对于长度为N的表格,折半查找法的平均比较次数为log2N,而顺序查找法平均要作N/2次比较。,11/19/2024,12,8.2,分支结构,程序设计,举例,11/19/2024,13,8.2,分支结构,程序设计,举例,DSEG SEGMENT,ARRAYDW 114H,128H,256H,259H,325H,14ADH,34DEH,4D34H,5FDAH,XDW 256H,ADDR DW ?,LOW1 DW ?,HIGH1DW ?,LEN1=(X-ARRAY)/2,DSEG ENDS,CSEG SEGMENT,ASSUME CS:CSEG,DS:DSEG,ES:DSEG,START:PUSH DS,XOR AX,AX,PUSH AX,MOV AX,DSEG,MOV DS,AX,MOV ES,AX,11/19/2024,14,8.2,分支结构,程序设计,举例,MOV AX,X,LEA DI,ARRAY,CMP AX,ES:DI,JA LAB1;大于最小数,LEA SI ,ES:DI,JE EXIT;找到,结束,STC;未找到,JMP EXIT1,LAB1: MOV SI,LEN1-1,SHL SI,1,ADD SI,DI;使SI指向最后一个元素,CMP AX,ES:SI,JB LAB2;小于最大数,那么转去查询,JE EXIT,STC,JMP EXIT1,LAB2: MOV LOW1,1,MOV BX,LEN1,MOV HIGH1,BX,MOV BX,DI,11/19/2024,15,8.2,分支结构,程序设计,举例,LABM:,MOV CX,LOW1,MOV DX,HIGH1,CMP CX,DX,JA NOFOUND,ADD CX,DX,SHR CX,1,MOV SI,CX,SHL SI,1,COMP: CMP AX,ES:BX+SI,JE EXIT,JA LABH,DEC CX,MOV HIGH1,CX,JMP LABM,LABH: INC CX,MOV LOW1,CX,JMP LABM,NOFOUND:STC,JMP EXIT1,EXIT: MOV ADDR,SI,EXIT1: RET,CSEG ENDS,END START,11/19/2024,16,8.2,分支结构,程序设计,举例,需要注意的是:, 用测试法进行多分支程序设计时,流程图中对各个条件的测试的先后次序应尽量和所涉及的具体问题的提出次序相符;编程中为形成多分支而使用的转移指令的先后次序也应尽量与流程图一致。这样可以使得编程思路更清晰,易于阅读和修改。, 要根据题意为每个程序分支安排出口,防止某个程序分支错误地顺序进入另一个程序分支,通常可以采用在程序分支的结束处使用无条件转移指令使程序转向正确的目的位置。, 对于既可以使用双分支,又可以使用单分支结构编写程序时,宜使用单分支,这样处理可以减少转移次数,程序结构简单。, 对于多分支的程序,选用跳转表法可以使程序具有转移次数少、结构简单。, 在对分支程序进行测试时,应该使用不同的实验数据来检查每一个程序分支是否正确,这样才能保证整个程序的正确性。,11/19/2024,17,常用的,DOS,系统功能调用,1单字符输入1号调用,2单字符显示2号调用,3打印输出 5号调用,4结束调用4CH号调用,5显示字符串9号调用,6字符串输入10号调用,11/19/2024,18,1单字符输入1号调用,格式:MOVAH,1,INT21H,功能:从键盘输入字符的ASCII码送入存放器AL中,并送显示器显示。,2单字符显示2号调用,格式:MOV DL,待显示字符的ASCII码,MOV AH,2,INT 21H,功能:将DL存放器中的字符送显示器显示.,11/19/2024,19,3打印输出5号调用,格式:MOVDL,待打印字符的ASCII码,MOVAH,5,INT21H,功能:将DL存放器中的字符送打印机打印。,4结束调用4CH号调用,格式:MOVAH,4CH,INT21H,功能:终止当前程序并返回调用程序。,11/19/2024,20,5显示字符串9号调用,格式:LEADX,待显示字符串首偏移地址,MOVAH,9,INT21H,功能:将当前数据区中以结尾的字符串送显示器显示。,6字符串输入10号调用,格式:LEADX,缓冲区首偏移地址,MOVAH,10,INT21H,功能:从键盘上输入一字符串到用户定义的输入缓冲区中,并送显示器显示。,maxlen db 32,actlen db ?,string db 32 dup(?),lea dx , maxlen,mov ah,0ah,int 21h,说明:缓冲区的第一个字节保存最大字符数,这个最,大字符数由用户程序给出。如果键入的字符数,比此数大,机器发出嘟嘟声。第二个字节存放,实际输入的字节数,这个不是由用户填入的而,由功能A自行填入的。在这两个字节之后,才,是我们输入的字符串。,11/19/2024,21,
展开阅读全文