汇编语言程序设计第8章80868088分支程序设计.ppt
2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,1,8086/8088和ARM核汇编语言程序设计,第8章 分支程序设计,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,2,8.1 分支程序的结构形式,8.2 分支结构程序设计,第8章 分支程序设计,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,3,掌握分支程序设计方法熟悉常见程序设计问题:数据范围判断(09、AZ、az)、字母大小写转换、;,教学要求,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,4,8.1 分支程序的结构形式,分支程序结构是根据条件转向不同程序分支的结果,有3种形式:单分支、双分支结构和多分支结构。,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,5,8.1 分支程序的结构形式,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,6,8.2 分支结构程序设计,分支程序设计首先要在分析实际问题的基础上确定若干个程序分支,然后在此基础上选用条件转移指令、或者是选用间接寻址无条件转移来转向不同的程序分支。前者是测试法分支程序设计,后者是跳跃表法分支程序设计。,分支程序根据条件是真或假决定执行与否判断的条件是各种指令,如CMP、TEST等执行后形成的状态标志转移指令Jcc和JMP可以实现分支控制,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,7,8.2 分支结构程序设计,分支结构是有若干个条件,每一个条件对应一个基本操作。分支程序就是判断产生的条件,哪个条件成立,就执行哪个条件对应操作的程序段。也就是说,从若干分支中选择一个分支执行。,8.2.1 测试法分支程序设计,例8.1 已知在内存中有一个字节单元NUM,存有带符号数据,要求计算出它的绝对值后,放入RESULT单元中。,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,8,8.2 分支结构程序设计,8.2.1 测试法分支程序设计,程序清单:,DATA SEGMENT X DB-25 RESULT DB?DATA ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODESTART:MOVAX,DATA MOVDS,AX;初始化 MOVAL,X;X取到AL中 TESTAL,80H;测试AL正负 JZNEXT;为正,转NEXT NEGAL;否则AL求补NEXT:MOVRESULT,AL;送结果 MOVAH,4CH INT21H;返回DOSCODE ENDS END START;汇编结束,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,9,8.2 分支结构程序设计,8.2.1 测试法分支程序设计,例8.2 试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。设三个带符号数分别在三个字变量X、Y、Z中存储。,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,10,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 21HCODE ENDS END START,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,11,第十五讲,1、阅读下列程序段,程序执行到HLT时,(AX)=(),(BX)=()。(4分)xor ax,ax mov bx,1 mov cx,5lop:add ax,bx inc bx loop lophlt,0FH或15,6,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,12,2、试分析下列程序段,程序执行后,num2字节单元的内容是什么?如果num1字节单元的值为39h,运行后,num2字节单元的内容又是什么?由此说明程序完成了什么操作。(6分)data segment num1 db 41h num2 db?data endsCode segment assume cs:code,ds:data start:mov ax,data mov ds,ax mov ah,num1,cmp ah,39h Jbe next sub ah,7next:sub ah,30h mov num2,ah mov ah,4ch int 21hcode ends end start,0AH,09H,此程序可将num1字节单元中的ascii字符09,AF转换成十六进制数09,AF,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,13,3、下列程序完成将BX寄存器的数值以十六进制显示输出,完成程序填空。(6分)code segment assume(1)start:mov bx,0DA12H mov ch,4 rotate:mov cl,4;设置移位指令的移位次数rol bx,cl mov al,bland al,0FH;取BX寄存器的高四位 add al,(2);将十六进制数值转换成对应的ASCII码cmp al,3ahjl printitadd al,(3);处理十六进制数A-F,printit:mov DL,al;调用系统功能,显示一位十六进制数对应的字符 Mov ah,(4)int 21h dec ch;循环次数-1 jnz rotate;处理BX后续四位二进制位 mov ah,4CH int(5)code ends end(6),cs:code,30H,07H,02,21H,start,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,14,8.2 分支结构程序设计,8.2.2 跳跃表法,例8.3 设某程序有8路分支,试根据给定的N值(18),将程序的执行转移到其中的一路分支。,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,15,8.2 分支结构程序设计,8.2.2 跳跃表法,DATA SEGMENT TAB DW P1,P2,P3,P4,P5,P6,P7,P8 N DB 5DATA ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODESTART: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,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,16,例:根据 AL 寄存器中哪一位为 1(从低位到高位),把程序转移到 8 个不同的程序分支,branch_table dw routine1 dw routine2 dw routine3 dw routine4 dw routine5 dw routine6 dw routine7 dw routine8,跳跃表法,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,17,cmp al,0;AL为逻辑尺 je continue lea bx,branch_tableL:shr al,1;逻辑右移 jnc add1 jmp word ptrbx;段内间接转移add1:add bx,type branch_table;add bx,2 jmp Lcontinue:routine1:routine2:,(寄存器间接寻址),2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,18,(寄存器相对寻址),cmp al,0 je continue mov si,0 L:shr al,1;逻辑右移 jnc add1 jmp branch_tablesi;段内间接转移add1:add si,type branch_table jmp Lcontinue:routine1:routine2:,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,19,(基址变址寻址),cmp al,0 je continue lea bx,branch_table mov si,7*type branch_table mov cx,8L:shl al,1;逻辑左移 jnc sub1 jmp word ptr bxsi;段内间接转移sub1:sub si,type branch_table;(si)-2 loop Lcontinue:routine1:routine2:,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,20,8.2 分支结构程序设计,举例,例8.4 在附加段中,有一个按从小到大顺序排列的无符号字节数组ARRAY,要求在数组中查找字节X,若找到则使CF=0,并在ADDR中给出该元素在数组中的偏移地址;如未找到则使CF=1。,算法分析:折半查找法是先取有序数组的中间元素与查找值相比较,如相等则查找成功;如查找值大于中间元素,则再取高半部的中间元素与查找值相比较;如查找值小于中间元素,则再取低半部的中间元素与查找值相比较;如此重复直到查找成功或者最终未找到该数(查找不成功)为止。对于长度为N的表格,折半查找法的平均比较次数为log2N,而顺序查找法平均要作N/2次比较。,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,21,8.2 分支结构程序设计,举例,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,22,8.2 分支结构程序设计,举例,DSEG SEGMENTARRAYDW 114H,128H,256H,259H,325H,14ADH,34DEH,4D34H,5FDAHXDW 256HADDR DW?LOW1 DW?HIGH1DW?LEN1=(X-ARRAY)/2DSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEG,ES:DSEGSTART:PUSH DS XOR AX,AX PUSH AX MOV AX,DSEG MOV DS,AX MOV ES,AX MOV AX,X,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,23,8.2 分支结构程序设计,举例,LEA DI,ARRAY CMP AX,ES:DI JA LAB1;大于最小数 LEA SI,ES:DI JE EXIT;找到,结束 STC;未找到 JMP EXIT1LAB1:MOV SI,LEN1-1 SHL SI,1 ADD SI,DI;使SI指向最后一个元素 CMP AX,ES:SI JB LAB2;小于最大数,则转去查询 JE EXIT STC JMP EXIT1LAB2:MOV LOW1,1 MOV BX,LEN1 MOV HIGH1,BX MOV BX,DI,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,24,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,1COMP:CMP AX,ES:BX+SI JE EXIT JA LABH DEC CX MOV HIGH1,CX JMP LABMLABH:INC CX MOV LOW1,CX JMP LABMNOFOUND:STC JMP EXIT1EXIT:MOV ADDR,SIEXIT1:RETCSEG ENDS END START,2023/9/12,第1章 汇编语言基础知识 8章分支程序设计,25,8.2 分支结构程序设计,举例,需要注意的是:用测试法进行多分支程序设计时,流程图中对各个条件的测试的先后次序应尽量和所涉及的具体问题的提出次序相符;编程中为形成多分支而使用的转移指令的先后次序也应尽量与流程图一致。这样可以使得编程思路更清晰,易于阅读和修改。要根据题意为每个程序分支安排出口,避免某个程序分支错误地顺序进入另一个程序分支,通常可以采用在程序分支的结束处使用无条件转移指令使程序转向正确的目的位置。对于既可以使用双分支,又可以使用单分支结构编写程序时,宜使用单分支,这样处理可以减少转移次数,程序结构简单。对于多分支的程序,选用跳转表法可以使程序具有转移次数少、结构简单。在对分支程序进行测试时,应该使用不同的实验数据来检查每一个程序分支是否正确,这样才能保证整个程序的正确性。,第8章:教学要求,掌握基分支程序设计方法熟悉常见程序设计问题:数据范围判断(09、AZ、az)、字母大小写转换、;作业:P130:一、1,2,3;三、3,4,