网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计18086/8088和ARM核汇编语言程序设计第8章8086/8088分支程序设计网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计28.1分支程序的结构形式8.2分支结构程序设计第8章8086/8088分支程序设计网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计3•掌握分支程序设计方法•熟悉常见程序设计问题:数据范围判断(0~9、A~Z、a~z)、字母大小写转换、……;教学要求网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计48.1分支程序的结构形式分支程序结构是根据条件转向不同程序分支的结果,有3种形式:单分支、双分支结构和多分支结构。网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计58.1分支程序的结构形式网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计68.2分支结构程序设计分支程序设计首先要在分析实际问题的基础上确定若干个程序分支,然后在此基础上选用条件转移指令、或者是选用间接寻址无条件转移来转向不同的程序分支。前者是测试法分支程序设计,后者是跳跃表法分支程序设计。•分支程序根据条件是真或假决定执行与否•判断的条件是各种指令,如CMP、TEST等执行后形成的状态标志•转移指令Jcc和JMP可以实现分支控制网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计78.2分支结构程序设计分支结构是有若干个条件,每一个条件对应一个基本操作。分支程序就是判断产生的条件,哪个条件成立,就执行哪个条件对应操作的程序段。也就是说,从若干分支中选择一个分支执行。8.2.1测试法分支程序设计例8.1已知在内存中有一个字节单元NUM,存有带符号数据,要求计算出它的绝对值后,放入RESULT单元中。网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计88.2分支结构程序设计8.2.1测试法分支程序设计程序清单:DATASEGMENTXDB-25RESULTDB?DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AX;初始化MOVAL,X;X取到AL中TESTAL,80H;测试AL正负JZNEXT;为正,转NEXTNEGAL;否则AL求补NEXT:MOVRESULT,AL;送结果MOVAH,4CHINT21H;返回DOSCODEENDSENDSTART;汇编结束网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计98.2分支结构程序设计8.2.1测试法分支程序设计例8.2试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。设三个带符号数分别在三个字变量X、Y、Z中存储。网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计108.2分支结构程序设计8.2.1测试法分支程序设计DATASEGMENTXDW-0ABHYDW205ZDW200MAXDW?DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAX,XCMPAX,YJGEL1MOVAX,YL1:CMPAX,ZJGEEXITMOVAX,ZEXIT:MOVMAX,AXMOVAH,4CHINT21HCODEENDSENDSTART网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计11第十五讲1、阅读下列程序段,程序执行到HLT时,(AX)=(),(BX)=()。(4分)xorax,axmovbx,1movcx,5lop:addax,bxincbxlooplophlt0FH或156网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计122、试分析下列程序段,程序执行后,num2字节单元的内容是什么?如果num1字节单元的值为39h,运行后,num2字节单元的内容又是什么?由此说明程序完成了什么操作。(6分)datasegmentnum1db41hnum2db?dataendsCodesegmentassumecs:code,ds:datastart:movax,datamovds,axmovah,num1cmpah,39hJbenextsubah,7next:subah,30hmovnum2,ahmovah,4chint21hcodeendsendstart0AH,09H,此程序可将num1字节单元中的ascii字符‘0’~‘9’,‘A’~‘F’转换成十六进制数0~9,A~F网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计133、下列程序完成将BX寄存器的数值以十六进制显示输出,完成程序填空。(6分)•codesegment•assume(1)•start:•movbx,0DA12H•movch,4•rotate:•movcl,4•;设置移位指令的移位次数•rolbx,cl•moval,bl•andal,0FH•;取BX寄存器的高四位•addal,(2)•;将十六进制数值转换成对应的ASCII码•cmpal,3ah•jlprintit•addal,(3)•;处理十六进制数A-Fprintit:movDL,al;调用系统功能,显示一位十六进制数对应的字符Movah,(4)int21hdecch;循环次数-1jnzrotate;处理BX后续四位二进制位movah,4CHint(5)codeendsend(6)cs:code30H07H0221Hstart网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计148.2分支结构程序设计8.2.2跳跃表法例8.3设某程序有8路分支,试根据给定的N值(1~8),将程序的执行转移到其中的一路分支。符合条件2┅┅符合条件1符合条件8N=?程序段8图8.3例8.3流程图开始查表地址=TAB+(N-1)*2程序段1程序段2网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计158.2分支结构程序设计8.2.2跳跃表法DATASEGMENTTABDWP1,P2,P3,P4,P5,P6,P7,P8NDB5DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AX┆MOVAL,NDECALADDAL,ALMOVBL,ALMOVBH,0JMPTAB[BX]P1:……┆JMPEXITP2:……┆JMPEXITP8:……┆EXIT:MOVAH,4CHINT21HCODEENDSENDSTART网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计16例:根据AL寄存器中哪一位为1(从低位到高位),把程序转移到8个不同的程序分支branch_tabledwroutine1dwroutine2dwroutine3dwroutine4dwroutine5dwroutine6dwroutine7dwroutine8跳跃表法网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计17……cmpal,0;AL为逻辑尺jecontinueleabx,branch_tableL:shral,1;逻辑右移jncadd1jmpwordptr[bx];段内间接转移add1:addbx,typebranch_table;addbx,2jmpLcontinue:……routine1:……routine2:……(寄存器间接寻址)网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计18(寄存器相对寻址)……cmpal,0jecontinuemovsi,0L:shral,1;逻辑右移jncadd1jmpbranch_table[si];段内间接转移add1:addsi,typebranch_tablejmpLcontinue:……routine1:……routine2:……网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计19(基址变址寻址)……cmpal,0jecontinueleabx,branch_tablemovsi,7*typebranch_tablemovcx,8L:shlal,1;逻辑左移jncsub1jmpwordptr[bx][si];段内间接转移sub1:subsi,typebranch_table;(si)-2loopLcontinue:……routine1:……routine2:……网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计208.2分支结构程序设计8.2.3举例例8.4在附加段中,有一个按从小到大顺序排列的无符号字节数组ARRAY,要求在数组中查找字节X,若找到则使CF=0,并在ADDR中给出该元素在数组中的偏移地址;如未找到则使CF=1。算法分析:折半查找法是先取有序数组的中间元素与查找值相比较,如相等则查找成功;如查找值大于中间元素,则再取高半部的中间元素与查找值相比较;如查找值小于中间元素,则再取低半部的中间元素与查找值相比较;如此重复直到查找成功或者最终未找到该数(查找不成功)为止。对于长度为N的表格,折半查找法的平均比较次数为log2N,而顺序查找法平均要作N/2次比较。网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计218.2分支结构程序设计8.2.3举例网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计228.2分支结构程序设计8.2.3举例DSEGSEGMENTARRAYDW114H,128H,256H,259H,325H,14ADH,34DEH,4D34H,5FDAHXDW256HADDRDW?LOW1DW?HIGH1DW?LEN1=(X-ARRAY)/2DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEG,ES:DSEGSTART:PUSHDSXORAX,AXPUSHAXMOVAX,DSEGMOVDS,AXMOVES,AXMOVAX,X网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计238.2分支结构程序设计8.2.3举例LEADI,ARRAYCMPAX,ES:[DI]JALAB1;大于最小数LEASI,ES:[DI]JEEXIT;找到,结束STC;未找到JMPEXIT1LAB1:MOVSI,LEN1-1SHLSI,1ADDSI,DI;使SI指向最后一个元素CMPAX,ES:[SI]JBLAB2;小于最大数,则转去查询JEEXITSTCJMPEXIT1LAB2:MOVLOW1,1MOVBX,LEN1MOVHIGH1,BXMOVBX,DI网络工程系《汇编语言程序设计》安徽工业大学2020/2/24第8章8086/8088分支程序设计248.2分支结构程序设计8.2.3举例LABM:MOVCX,LOW1MOVDX,HIGH1CMPCX,DXJANOFOUNDADDCX,DXSHRCX,1MOVSI,CXSHLSI,1COMP:CMPAX,ES:[BX+SI]JEEXITJALABHDECCXMOVHIG