现代微机原理与接口技术(第3版)1第3章80x86汇编语言程序设计(下)现代微机原理与接口技术(第3版)2分支结构是指计算机根据实际情况或条件,作出判断和选择,转而执行不同的程序段的一种程序结构。条件程序段条件程序段A程序段BYNYN3.5分支结构程序设计现代微机原理与接口技术(第3版)3多路分支结构根据某个控制字的各“位”状态实行多路转移多路条件测试程序段1程序段2程序段n……现代微机原理与接口技术(第3版)3.5.1无条件转移指令JMP1、段内转移格式1:JMPSHORTOPR;段内相对短转移操作1:IP--(IP)+disp8说明:转移范围-128字节至+127字节,操作数OPR为段内某个标号。段内相对短转移示例指令JMPSHORTADDT存放在CS:0200H中,标号ADDT对于IP指针的偏移量为1DH,则转移地址为0202H+001DH=021FHJMPSHORTADDT0200E8…11DADDT:MOVAL,40H2ADDAL,BL+1DH021FB002201D4现代微机原理与接口技术(第3版)格式2:JMPOPRJMPNEARPTROPR;段内相对近转移操作2:IP--(IP)+disp16说明:转移范围-32KB至+32KB,操作数OPR为段内某个标号。格式3:JMPWORDPTROPR;段内间接转移操作3:IP--(OPR)说明:OPR是基址/变址寄存器或存储器操作数。段内间接转移示例ADDRESSDW2000H;定义转移地址...LEASI,ADDRESS;偏移量--SI...JMPWORDPTR[SI];转移到CS:20005现代微机原理与接口技术(第3版)2、段间转移格式4:JMPFARPTROPR;段间直接转移操作4:IP--OAoprCS--(CS)opr段间直接转移示例50新IP=0250H;代码段C102……00新CS=2000HJMPFARPTRNEXT20……;代码段C2C2段20000H……NEXT:MOVAL,10H…NEXT20250HEAOP码C1段6现代微机原理与接口技术(第3版)格式5:JMPDWORDPTROPR;段间间接转移操作5:IP--((DS)*16+OPR)CS--((DS)*16+OPR+2)段间间接转移示例JMPDWORDPTR[4000H]设(DS)=1000H(14000H)=0010H(14002H)=5000H执行后(CS)=5000H(IP)=0010H7现代微机原理与接口技术(第3版)3.5.2条件转移指令格式:J条件标号操作:测试条件,若满足,则跳转到标号处执行,即IP--(IP)+disp8;否则,执行后续指令说明:根据上一条指令所设置的条件码判别测试条件转移范围在-128到+127字节8现代微机原理与接口技术(第3版)条件转移指令(1)操作符功能测试条件JC进位标志为1转移CF=1JNC进位标志为0转移CF=0JZ/JE等于0/相等转移ZF=1JNZ/JNE不等于0/不相等转移ZF=0JS符号标志为1转移SF=1JNS符号标志为0转移SF=0JO溢出转移OF=1JNO无溢出转移OF=0JP/JPE偶状态转移PF=1JNP/JPO奇状态转移PF=0JCXZCX=0转移CX=0JECXZECX=0转移ECX=09现代微机原理与接口技术(第3版)条件转移指令(2)A-B比较情况无符号数有符号数指令判断条件指令判断条件ABJAZF=0,CF=0JGSF=OFJNBEJNLE且ZF=0A=BJAEZF=1或JGESF=OFJNBCF=0JNL或ZF=1ABJBZF=0,CF=1JLSFOFJNAEJNGE且ZF=0A=BJBEZF=1或JLESFOFJNACF=1JNG或ZF=110现代微机原理与接口技术(第3版)条件转移指令示例1将X中十六进制的ASCII码转换成其所对应的数值,存放到HEX中。如‘A’应转换为10。MOVAH,XCMPAH,39HJBENEXT;≤39H则转SUBAH,7;是‘A’--’F’,减7NEXT:SUBAH,30H;减30HMOVHEX,AH注意ASCII中‘0’~‘9’是30H~39H,’A’~’F’是41H~46H11现代微机原理与接口技术(第3版)条件转移指令示例2CMPAX,0FFFFHJLEP3CMPAX,1JLP2MOVAX,1JMPDONEP2:MOVAX,0JMPDONEP3:MOVAX,-1DONE:AX≤(-1)AX1AX--1AX--0AX--(-1)YNNY如果条件转移目标地址超出-128~+127的范围怎么办?12现代微机原理与接口技术(第3版)131、比较/转移利用比较和条件转移指令实现两路分支。比较结果记录在某些标志位中,条件转移指令根据约定的条件进行对照,满足条件时转移,不满足条件时不转移。2、跳转表转移利用跳转表实现多路分支。比较/转移指令可嵌套,但程序结构复杂,跳转表可使程序结构清晰。3.5.3分支结构程序设计教材上的例子请看P99中的例3.18和例3.19,上机实现例3.18程序。现代微机原理与接口技术(第3版)有一个首地址为ARRAY的N字数组,将其中正数的个数放在DI中,0的个数放在SI中,负数个数放在AX中14注意:负数个数=N-DI-SI现代微机原理与接口技术(第3版)MOVCX,NMOVBX,0;初始化MOVDI,BX;正数个数计数器初始化MOVSI,BX;0的个数计数器初始化AGAIN:CMPWORRDPTRARRAY[BX],0;数组当前元素与0比较JLELEEQ;小于等于0转移INCDI;正数计数JMPNEXTLEEQ:JLNEXT;小于0转移INCSI;0计数NEXT:ADDBX,2;数组表指针指向下一元素DECCXJNZAGAINMOVAX,N;负数个数=N-DI-SISUBAX,DISUBAX,SI15现代微机原理与接口技术(第3版)16设字节单元N1、N2中存放无符号数(1)若两个均是偶数,则分别加1后送D1、D2中(2)若两个均是奇数,则直接送D1、D2中(3)若一个是奇数,一个是偶数,则把奇数送D1,偶数送D2中AL--(N1),AH--(N2)(AL)0=0(AH)0=0AL--(AL)+1AH--(AH)+1(AL)(AH)D1--(AL),D2--(AH)奇偶偶奇注意:根据条件,当N1是奇数时,无论N2是奇数还是偶数,都只需直接送D1、D2现代微机原理与接口技术(第3版)17程序如下:MOVAL,N1MOVAH,N2TESTAL,01H;测试N1的奇偶JNEENDO;N1为奇数TESTAH,01H;测试N2的奇偶JNEL1;N2是奇数,转移INCAL;两个均是偶数INCAHJMPENDOL1:XCHGAL,AH;N1是偶数,N2是奇数ENDO:MOVD1,AL;存放结果MOVD2,AH转上页现代微机原理与接口技术(第3版)18利用跳转表实现多路分支跳转表是在某一内存区域顺序排列的一组有规律的入口地址。如是段内分支,每个地址占两个单元(IP的值)如是段间分支,每个地址占4个单元(CS:IP的值)TABLESUB1TABLESUB1SUB2SUB3SUB2IPIPIPIPCSIPCS段内转移段间转移现代微机原理与接口技术(第3版)19根据AL中哪一位为1(从低位到高位)把程序转移到8个不同的程序分支去.DATATABLEDWROUTINE_1DWROUTINE_2DWROUTINE_3DWROUTINE_4DWROUTINE_5DWROUTINE_6DWROUTINE_7DWROUTINE_8.CODE……ROUTINE_1:MOVAX,0……ROUTINE_2:CMPAL,3…………ROUTINE_8:CLI现代微机原理与接口技术(第3版)20用变址寻址方式CMPAL,0JEDONEMOVSI,0L:SHRAL,1JNBNOT_YET;CF=0或ZF=1跳转JMPTABLE[SI]NOT_YET:JZDONEADDSI,TYPETABLE;TypeTable=2JMPLDONE:……现代微机原理与接口技术(第3版)21在附加段中有一个从小到大排序的无符号数字数组,其首地址在DI中,数组的第一个单元存放数组长度。要求在数组中查找(AX),如找到,CF=0,并在SI中给出该元素在数组中的偏移地址;如未找到,CF=1。算法:在R数组中查找K,采用折半查找法(1)LOW1,HIGHN;(2)若LOWHIGH,则查找失败,置CF=1,退出程序。否则,计算中点:MID(LOW+HIGH)/2;(3)K与R[MID]比较。若=R[MID],则查找成功,程序结束;若KR[MID]则转(4);若KR[MID],则转(5);(4)HIGHMID-1,转(2);(5)LOWMID+1,转(2)。现代微机原理与接口技术(第3版)22CMPAX,ES:[DI+2];与第一个数比较JACHK_LAST;(AX)(ES:[DI+2])转LEASI,ES:[DI+2]JEEXIT;相等,找到,就是第一个数STC;小于第一个数,失败JMPEXITCHK_LAST:MOVSI,ES:[DI];取数组长度SHLSI,1;长度*2(DW型)ADDSI,DICMPAX,ES:[SI];与最后的数比较JBSEARCH;小于则转JEEXIT;相等则结束STC;大于最后一个,失败JMPEXIT现代微机原理与接口技术(第3版)23SEARCH:MOVLOW_IDX,1;给LOW赋初值MOVBX,ES:[DI];取数组长度MOVHIGH_IDX,BX;给HIGH赋初值MOVBX,DI;BX中放首地址MID:MOVCX,LOW_IDXMOVDX,HIGH_IDXCMPCX,DXJANO_MATCH;LOWHIGH,失败ADDCX,DXSHRCX,1;折半MOVSI,CXSHLSI,1;*2(DW型)COMPARE:CMPAX,ES:[BX+SI];与中间数比较JEEXIT;相等,找到现代微机原理与接口技术(第3版)24JAHIGHER;大于中间数,转DECCXMOVHIGH_IDX,CX;调整查找区间到前半部分JMPMIDHIGHER:INCCXMOVLOW_IDX,CX;调整查找区间到后半部分JMPMIDNO_MATCH:STCEXIT:……现代微机原理与接口技术(第3版)25任务需要重复执行某一程序段,这种情况采用循环结构来实现。初始化循环体初始化修改部分NYYN修改部分控制部分循环体控制部分3.6循环结构程序设计