第五章循环与分支程序设计.ppt
第五章第五章 循环与分支程序设计循环与分支程序设计12/20/2022ch5学习重点学习重点1.掌掌握握基基本本程程序序结结构构(顺顺序序结结构构、循循环环结结构构、分支结构)分支结构)及其汇编语言程序设计方法及其汇编语言程序设计方法2.熟悉常见程序设计熟悉常见程序设计问题:问题:数据范围判断数据范围判断数据范围判断数据范围判断(09、AZ、az)字母大小写转换字母大小写转换字母大小写转换字母大小写转换;字符串传送、比较等操作字符串传送、比较等操作字符串传送、比较等操作字符串传送、比较等操作求最大最小值、数据求和、统计字符个数求最大最小值、数据求和、统计字符个数求最大最小值、数据求和、统计字符个数求最大最小值、数据求和、统计字符个数数组排序,查找,插入,删除数组排序,查找,插入,删除数组排序,查找,插入,删除数组排序,查找,插入,删除12/20/2022ch5 (3 3)分支结构)分支结构 (4 4)子程序结构子程序结构 程序结构程序结构(5)复合结构:多种程序结构的组合)复合结构:多种程序结构的组合 (1 1)顺序结构顺序结构 (2 2)循环结构循环结构12/20/2022ch5 编写汇编语言程序的步骤编写汇编语言程序的步骤(1)分析题意,确定算法分析题意,确定算法(2)根据算法画出程序框图根据算法画出程序框图(3)根据框图编写程序根据框图编写程序(4)上机调试程序上机调试程序12/20/2022ch55.0 顺序程序设计顺序程序设计顺顺序序程程序序完完全全按按指指令令书书写写的的前前后后顺顺序序执执行行每每一一条条指指令令,是是最最基基本本、最最常见的程序结构常见的程序结构一一般般纯纯粹粹的的顺顺序序结结构构的的程程序序设设计计较较少。少。12/20/2022ch5例例例例0 0 0 0data segmentdata segment X X dwdw 5 5 Y Y dwdw 6 6 Z Z dwdw 7 7 W W dwdw?data endsdata endscode segmentcode segmentmain proc farmain proc far assume assume cs:code,ds:datacs:code,ds:datastart:start:push push dsds xorxor ax,ax ax,ax push ax push ax movmov ax,data ax,data movmov ds,axds,ax movmov ax,X ax,X add ax,Y add ax,Y add ax,Z add ax,Z movmov W,ax W,ax ret retmain main endpendpcode endscode ends end startend startWX+Y+Z12/20/2022ch5例例00:查表法,实现一位:查表法,实现一位16进制数转换为进制数转换为ASCII码显示码显示data segment ASCII db 30h,31h,32h,33h,34h,35h db 36h,37h,38h,39h;09的的ASCII码码 db 41h,42h,43h,44h,45h,46h;AF的的ASCII码码 hex db 0bh;任意设定一个待转换的一位任意设定一个待转换的一位16进制数进制数data endscode segmentmain proc farassume cs:code,ds:datastart:push ds xor ax,ax push ax mov ax,data mov ds,ax ;-mov bx,offset ASCII;BX指向指向ASCII码表码表mov al,hex;AL取取得得一一位位16进进制制数数,正正是是ASCII码码表表中中位位移移and al,0fh;只有低只有低4位是有效的,高位是有效的,高4位清位清0 xlat ;换码:换码:ALDS:BXALmov dl,al;入口参数:入口参数:DLALmov ah,2;02号号DOS功能调用功能调用int 21h;显示一个显示一个ASCII码字符码字符retmain endpcode ends end start12/20/2022ch55.1 5.1 循环程序设计循环程序设计循循环环结结构构一一般般是是根根据据某某一一条条件件判判断断为为真或假来确定是否重复执行循环体真或假来确定是否重复执行循环体循循环环指指令令和和转转移移指指令令可可以以实实现现循循环环控控制制12/20/2022ch5 循环程序结构形式循环程序结构形式DO-WHILE 结构结构 DO-UNTIL 结构结构控制条件件控制条件件初始化初始化循环体循环体YN控制条件控制条件初始化初始化循环体循环体YN12/20/2022ch5初始化初始化:设置循环的初始状态设置循环的初始状态循环体循环体:循环的工作部分及修改部分循环的工作部分及修改部分控制条件控制条件:计数控制(:计数控制(LOOP)特征值控制特征值控制(LOOPZ/LOOPNZ/条件跳转指令条件跳转指令)循环程序结构说明循环程序结构说明12/20/2022ch5例例1:把:把 BX BX 中的二进制数以十六进制的形式显示在屏幕上中的二进制数以十六进制的形式显示在屏幕上 如:如:1011 0010 1111 1010 B B2FAB2FAH BXBX123412/20/2022ch5分析:分析:(1)程序结构的确定程序结构的确定 由题意由题意应该把应该把应该把应该把BXBX的内容从左到右每的内容从左到右每的内容从左到右每的内容从左到右每4 4位为一组在屏幕位为一组在屏幕位为一组在屏幕位为一组在屏幕上显示出来上显示出来上显示出来上显示出来,显然这可以用循环结构来完成,每次显示,显然这可以用循环结构来完成,每次显示一个十六进制数位,因而循环次数是已知的,计数值为一个十六进制数位,因而循环次数是已知的,计数值为4。(2)循环体的构成(算法确定)循环体的构成(算法确定)循环体应该包括:循环体应该包括:二进制到所显示字符的二进制到所显示字符的二进制到所显示字符的二进制到所显示字符的ASCIIASCII之间之间之间之间的转换,以及每个字符的显示的转换,以及每个字符的显示的转换,以及每个字符的显示的转换,以及每个字符的显示。需要了解相关知识需要了解相关知识:字符和其字符和其ASCII码之间的关系?码之间的关系?“0”“9”30H39H,“A”F”41H5AH如何显示一个字符?如何显示一个字符?(a)将显示字符的将显示字符的ASCII码放入码放入DL寄存器;寄存器;(b)将将AH的内的内容置为容置为2(功能号(功能号););(c)执行执行INT 21H(DOS 功能调用)功能调用)。12/20/2022ch5(3)循环控制条件分析)循环控制条件分析因为循环次数已知,可以使用因为循环次数已知,可以使用LOOPLOOPLOOPLOOP指令指令指令指令实现,但是必须注意:实现,但是必须注意:由于循由于循由于循由于循环移位指令中使用环移位指令中使用环移位指令中使用环移位指令中使用CLCLCLCL寄存器作为移寄存器作为移寄存器作为移寄存器作为移位次数寄存器,而位次数寄存器,而位次数寄存器,而位次数寄存器,而LOOP LOOP LOOP LOOP 指令的循环指令的循环指令的循环指令的循环次数隐含在次数隐含在次数隐含在次数隐含在CXCXCXCX寄存器中,因此,必寄存器中,因此,必寄存器中,因此,必寄存器中,因此,必须注意这两者之间的冲突须注意这两者之间的冲突须注意这两者之间的冲突须注意这两者之间的冲突。除了可以使用除了可以使用LOOPLOOP指令之外,还指令之外,还可以使用可以使用条件跳转指令条件跳转指令条件跳转指令条件跳转指令来实现。来实现。LOOP AGAIN DEC 计数器计数器 JNZ AGAIN12/20/2022ch5 movmov cxcx,4 ,4 ;初始化初始化rotate:rotate:push push push push cxcxcxcx movmov clcl,4,4 rolrol bxbx,clcl movmov al,al,blbl and al,0fh and al,0fh add al,30h add al,30h ;09 ASCII 30H39H;09 ASCII 30H39H cmpcmp al,3ah al,3ah jljl printitprintit add al,7h add al,7h ;AF ASCII 41H46H;AF ASCII 41H46Hprintitprintit:movmov dl,al dl,al movmov ah,2 ah,2 intint 21h 21h pop pop pop pop cxcxcxcx loop rotate loop rotate 方法方法1(LOOP)12/20/2022ch5 movmov chchchch,4 ,4 ;初始化初始化rotate:rotate:movmov clclclcl,4,4 rolrol bxbx,clcl movmov al,al,blbl and al,0fh and al,0fh add al,30h add al,30h ;09 ASCII 30H39H;09 ASCII 30H39H cmpcmp al,3ah al,3ah jljl printitprintit add al,7h add al,7h ;AF ASCII 41H46H;AF ASCII 41H46Hprintitprintit:movmov dl,al dl,al movmov ah,2 ah,2 intint 21h 21h decdecdecdec chchchch jnzjnzjnzjnz rotate rotate rotate rotate 方法方法2(条件跳转指令条件跳转指令)12/20/2022ch5DATA SEGMENTDATA SEGMENT addr dw number addr dw number number dw Y;number dw Y;上机时,上机时,Y Y必须为具体数必须为具体数 count dw?count dw?DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENTMAIN PROC FARMAIN PROC FAR ASSUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATAstart:PUSH DSstart:PUSH DS XOR AX,AX XOR AX,AX PUSH AX PUSH AX MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX MOV CX,0MOV CX,0 MOV MOV bx,addrbx,addr MOV MOV ax,bxax,bxRepeat:test ax,0ffffhRepeat:test ax,0ffffh Jz quit Jz quit Jns shift Jns shift Inc cx Inc cxShift:shl ax,1Shift:shl ax,1 Jmp repeat Jmp repeatquit:mov count,cxquit:mov count,cx RET RETMAIN MAIN ENDPENDPCODE CODE ENDSENDS END startEND start例2:在ADDR单元存放数Y的地址,编程把Y中1的个数存放到COUNT单元中12/20/2022ch5例3:在附加段中,有一个首地址为LIST和未经排序的字数组。在数组中的第一字中,存放该数组的长度,数组的首地址已存放在DI寄存器中,AX寄存器中存放着一个数,编程:在数组中查找该数,如果找到,则把它从数组中删除。cld push di mov cx,es:di add di,2 repne scasw je delete pop di jmp short quitdelete:jcxz dec_cntnext_el:mov bx,es:di mov es:di-2,bx add di,2 loop next_eldec_cnt:pop di dec word ptr es:diquit:.12/20/2022ch5例例4:将正数:将正数 n n 插入一个已整序的正数字数组。该数组的插入一个已整序的正数字数组。该数组的首地址和末地址分别为首地址和末地址分别为ARRAY_HEAD,ARRAY_END。分析:题目要求在已经排好序的正数数组中插入一个分析:题目要求在已经排好序的正数数组中插入一个分析:题目要求在已经排好序的正数数组中插入一个分析:题目要求在已经排好序的正数数组中插入一个正数正数正数正数n n,因此,解决问题的关键是找到要出入正数因此,解决问题的关键是找到要出入正数因此,解决问题的关键是找到要出入正数因此,解决问题的关键是找到要出入正数n n的的的的位置。需要考虑如下问题?位置。需要考虑如下问题?位置。需要考虑如下问题?位置。需要考虑如下问题?(1 1)如何找到插入位置?)如何找到插入位置?)如何找到插入位置?)如何找到插入位置?(2 2)如何插入正数)如何插入正数)如何插入正数)如何插入正数n?n?(3 3)数组边界问题考虑?数组边界问题考虑?数组边界问题考虑?数组边界问题考虑?12/20/2022ch512/20/2022ch5x x dwdw?array_head array_head dwdw 3,5,15,23,37,49,52,65,78,99 3,5,15,23,37,49,52,65,78,99array_end array_end dwdw 105 105n n dwdw 32 32 movmov ax,n ax,n movmov array_head-2,0ffffh array_head-2,0ffffh movmov si si,0,0compare:compare:cmpcmp array_end array_end si si,ax,ax jlejle insert insert movmov bxbx,array_end,array_end si si movmov array_end si+2,array_end si+2,bxbx sub sub si si,2,2 jmpjmp short compare short compareinsert:insert:movmov array_end si+2,ax array_end si+2,ax 3 35 51515232337374949525265657878999910510532323232-1-1-1-1array_headarray_endn n x x 12/20/2022ch5例例5 5:有数组:有数组 x(x1,x(x1,x2,x2,x10),x10)和和 y(y1,y2,y10)y(y1,y2,y10),编程计算编程计算 z z(z1,(z1,z2,z2,z10),z10)z1=x1 +y1z1=x1 +y1z2=x2 +y2z2=x2 +y2z3=x3 -y3z3=x3 -y3z4=x4 -y4z4=x4 -y4z5=x5 -y5z5=x5 -y5z6=x6 +y6z6=x6 +y6z7=x7 -y7z7=x7 -y7z8=x8 -y8z8=x8 -y8z9=x9 +y9z9=x9 +y9z10=x10+y10z10=x10+y10 逻辑尺:逻辑尺:0 0 1 1 0 1 1 1 0 00 0 1 1 0 1 1 1 0 01 1 1 1 减法减法减法减法0 0 0 0 加法加法加法加法12/20/2022ch512/20/2022ch5 x x dwdw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 y y dwdw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 z z dwdw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10 z1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_rule logic_rule dwdw 00dch 00dch ;0000,0000,1101,1100;0000,0000,1101,1100 movmov bxbx,0,0 movmov cxcx,10,10 movmov dxdx,logic_rule,logic_rulenext:next:movmov ax,ax,xbxxbx shrshr dxdx,1,1 jcjc subtract subtract add ax,add ax,ybxybx jmpjmp short result short result ;向前引用向前引用subtract:subtract:sub ax,sub ax,ybxybx result:result:movmov zbxzbx,ax,ax add add bxbx,2,2 loop next loop next 12/20/2022ch5例6 编程:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不是则退出程序,否则开始接收键入的字符,并顺序存放到首地址为BUFFER的缓冲区,直到接收到第二个空格键时退出程序。data segment buffer db 80 dup(?)flag db?data endscode segment ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX LEA BX,BUFFER MOV FLAG,0NEXT:MOV AH,1 INT 21H TEST FLAG,1 JNZ FOLLOW CMP AL,20H JNZ QUIT MOV FLAG,1 JMP NEXTFOLLOW:CMP AL,20H JZ QUIT MOV BX,AL INC BX JMP NEXTQUIT:MOV AH,4CH INT 21H code ends END START12/20/2022ch5例例7:将首地址为将首地址为A的字数组从小到大排序的字数组从小到大排序32,85,16,15,832,85,16,15,8 (冒泡算法,多重循环)(冒泡算法,多重循环)5.1.3 多重循环多重循环 多重循环程序设计的基本方法和单重循多重循环程序设计的基本方法和单重循多重循环程序设计的基本方法和单重循多重循环程序设计的基本方法和单重循环程序设计是一致的,应分别考虑各重循环环程序设计是一致的,应分别考虑各重循环环程序设计是一致的,应分别考虑各重循环环程序设计是一致的,应分别考虑各重循环的控制条件及其程序实现,相互之间不能混的控制条件及其程序实现,相互之间不能混的控制条件及其程序实现,相互之间不能混的控制条件及其程序实现,相互之间不能混淆。特别注意的是淆。特别注意的是淆。特别注意的是淆。特别注意的是在每次通过外循环再次进在每次通过外循环再次进在每次通过外循环再次进在每次通过外循环再次进入内循环时,初始条件必须重新设置入内循环时,初始条件必须重新设置入内循环时,初始条件必须重新设置入内循环时,初始条件必须重新设置。12/20/2022ch5冒泡法冒泡法“冒冒泡泡法法”是是一一种种排排序序算算法法,不不是是最最优优的的算算法法,但但它它易易于理解和实现于理解和实现冒冒泡泡法法从从从从第第第第一一一一个个个个元元元元素素素素开开开开始始始始,依依依依次次次次对对对对相相相相邻邻邻邻的的的的两两两两个个个个元元元元素素素素进进进进行行行行比比比比较较较较,使使使使前前前前一一一一个个个个元元元元素素素素不不不不大大大大于于于于后后后后一一一一个个个个元元元元素素素素;将将所所有有元元素素比比较较完完之之后后,最最大大的的元元素素排排到到了了最最后后;然然然然后后后后,除除除除掉掉掉掉最最最最后后后后一一一一个个个个元元元元素素素素之之之之外外外外的的的的元元元元素素素素依依依依上上上上述述述述方方方方法法法法再再再再进进进进行行行行比比比比较较较较,得得得得到到到到次次次次大大大大的的的的元元元元素素素素排排排排在在在在后后后后面面面面;如如如如此此此此重重重重复复复复,直直直直至至至至完完完完成成成成就就就就实实实实现现现现元元元元素素素素从从从从小小小小到到到到大大大大的的的的排排排排序序序序。n n个个数数需需要要n-1n-1遍遍比比较较,第第一一遍遍比比较较出出一一个个最最大大(或或最最小小)数数,第第二二遍遍对对剩剩下下的的数数进进行行比比较较,得得到到一一个个次次最最大大(或或次次最最小小)数数 ,第第n-1n-1遍遍比比较较出出最最后后两两个个数数的的大大小小顺顺序序,至至此此整整个个数数组组全全部部排排好好序序。每每一一遍遍比比较较需需要要比比较较的的次次数数为为要要比比较较数数减减一一。如如n=5,n=5,第第一一遍遍比比较较次次数数为为4 4(内内循循环环),第第二二遍遍比比较较次次数数为为3 3(内内循循环环),第第三三遍遍比比较较次次数数为为2 2(内内循循环环),第第四四遍遍比比较较次次数数为为1 1(内循环)(内循环)。12/20/2022ch5 movmov cxcx,n n ;元素个数元素个数 decdec cxcx ;比较遍数比较遍数loop1loop1loop1loop1:movmovmovmov didididi,cxcxcxcx ;比较次数比较次数比较次数比较次数 movmov bxbx,0,0loop2loop2loop2loop2:movmov ax,ax,AbxAbx ;相邻两数相邻两数 cmpcmp ax,Abx+2 ax,Abx+2;比较比较 jgejge continue continue xchgxchg ax,Abx+2 ax,Abx+2;交换位置交换位置 movmov AbxAbx,ax,ax add add bxbx,2,2 loop loop loop2loop2loop2loop2 movmovmovmov cxcxcxcx,didididi loop loop loop1loop1loop1loop112/20/2022ch5例8 在附加段中有一个字数组,其首地址已放在DI寄存器中,在数组的第一个字中存放着该数组的长度,编程实现该数组从小到大排序data segmentdata segment save_cnt dw?save_cnt dw?start_addr dw?start_addr dw?data endsdata endscode segmentcode segmentbubble proc farbubble proc far assume cs:code,ds:data assume cs:code,ds:datago:push dsgo:push ds push cx push cx push ax push ax push bx push bx mov ax,data mov ax,data mov ds,ax mov ds,ax mov start_addr,di mov start_addr,di mov cx,es:di mov cx,es:di mov save_cnt,cx mov save_cnt,cxInit:Init:mov bx,1 mov bx,1 dec save_cnt dec save_cnt jz sorted jz sorted mov cx,save_cnt mov cx,save_cnt mov di,start_addr mov di,start_addr next:next:add di,2 add di,2 mov ax,es:di mov ax,es:di cmp es:di+2,ax cmp es:di+2,ax jae cont jae cont xchg es:di+2,ax xchg es:di+2,ax mov es:di,ax mov es:di,ax sub bx,bx sub bx,bxcont:cont:loop next loop next cmp bx,0 cmp bx,0 je init je initsorted:sorted:mov di,start_addr mov di,start_addr pop bx pop bx pop ax pop ax pop cx pop cx pop ds pop ds ret retbubble endpbubble endpCode endsCode ends end go end go12/20/2022ch55.2 分支程序设计分支程序设计分支程序根据条件是真或假决定执行与否分支程序根据条件是真或假决定执行与否判判断断的的条条件件是是各各种种指指令令,如如CMP、TEST等执行后形成的状态标志等执行后形成的状态标志12/20/2022ch5 5.2.1 5.2.1 分支程序结构形式分支程序结构形式 case 1 case 2 case n?CASE 结构结构 IF-THEN-ELSE 结构结构?12/20/2022ch5(1)(1)逻辑尺控制逻辑尺控制逻辑尺控制逻辑尺控制(2)(2)条件控制条件控制条件控制条件控制(3)(3)地址跳跃表地址跳跃表地址跳跃表地址跳跃表(值与地址有对应关系的表)(值与地址有对应关系的表)(值与地址有对应关系的表)(值与地址有对应关系的表)5.2.2 5.2.2 分支程序设计方法分支程序设计方法程序的分支用条件转移指令程序的分支用条件转移指令Jxx和和JMP可以实现分支控制;可以实现分支控制;常用的控制方法有常用的控制方法有12/20/2022ch5逻辑尺:逻辑尺:0 0 1 1 0 1 1 1 0 00 0 1 1 0 1 1 1 0 01 1 减法减法0 0 加法加法(1)逻辑尺控逻辑尺控制制(2)条件控制条件控制例例5.95.9:折半查找算法折半查找算法.在数据段中,有一个按从小到大在数据段中,有一个按从小到大顺序排列的无符号数字数组顺序排列的无符号数字数组ARRAYARRAY,数组中的第一个单元数组中的第一个单元存放着数组的长度。在存放着数组的长度。在AXAX中有一个无符号数,要求在数组中有一个无符号数,要求在数组中查找中查找numbernumber,如果找到,则使如果找到,则使CF=0CF=0,并在并在SISI中给出该元中给出该元素在数组中的偏移地址;如未找到,则使素在数组中的偏移地址;如未找到,则使CF=1CF=1。12/20/2022ch5在一个长度为在一个长度为在一个长度为在一个长度为n n 的有序数组的有序数组的有序数组的有序数组r r中,查找元素中,查找元素中,查找元素中,查找元素k k的折半查找算法可的折半查找算法可的折半查找算法可的折半查找算法可描述如下:描述如下:描述如下:描述如下:(1 1)初始化被查找数组的首尾下标,)初始化被查找数组的首尾下标,)初始化被查找数组的首尾下标,)初始化被查找数组的首尾下标,lowlow1 1,highhighn n;(2 2)若)若)若)若lowhighlowhigh,则查找失败,置则查找失败,置则查找失败,置则查找失败,置CF=1CF=1,退出程序。否则,退出程序。否则,退出程序。否则,退出程序。否则,计算中点计算中点计算中点计算中点midmid(low+high)/2(low+high)/2;(3 3)k k与中点元素与中点元素与中点元素与中点元素rmidrmid比较。若比较。若比较。若比较。若k=rmidk=rmid,则,则,则,则查找成功,程查找成功,程查找成功,程查找成功,程序结束;若序结束;若序结束;若序结束;若krmidkrmidkrmid,则转(则转(则转(则转(5 5);(4 4)低半部分查找,)低半部分查找,)低半部分查找,)低半部分查找,highhighmid-1mid-1,返回(返回(返回(返回(2 2),继续查找;),继续查找;),继续查找;),继续查找;(5 5)高半部分查找,)高半部分查找,)高半部分查找,)高半部分查找,lowlowmid+1mid+1,返回(返回(返回(返回(2 2),继续查找。),继续查找。),继续查找。),继续查找。12/20/2022ch5 1212 11 11 22 22 33 33 44 44 55 55 66 66 77 77 88 88 99 99111111222222333333 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9101011111212(ax)=55(ax)=55low_idxlow_idxlow_idxlow_idx 1 1 1 1 1 1 1 1 4 4 4 4 5 5 5 5 high_idxhigh_idxhigh_idxhigh_idx 121212125 5 5 55 5 5 55 5 5 5(sisi)=0ah)=0ahCfCf=0=0(ax)=90(ax)=90low_idxlow_idxlow_idxlow_idx 1 1 1 1 7 7 7 7 7 7 7 7 8 8 8 8 9 9 9 9 high_idxhigh_idxhigh_idxhigh_idx 12121212121212128 8 8 88 8 8 88 8 8 8(sisi)=10h)=10hCfCf=1=1折半算法折半算法12/20/2022ch5data segmentdata segment array array dwdw 12,11,22,33,44,55,66 12,11,22,33,44,55,66 dwdw 77,88,99,111,222,333 77,88,99,111,222,333 number number dwdw 55 55 low_idxlow_idx dwdw?high_idxhigh_idx dwdw?data endsdata ends12/20/2022ch5 lea lea didi,array,array movmov ax,number ax,number ;要查找数要查找数 cmpcmp ax,di+2 ax,di+2 ;(ax);(ax)与第一个元素比较与第一个元素比较 jaja chk_lastchk_last lea lea sisi,di+2,di+2 jeje quitquit ;(ax);(ax)第一个元素第一个元素,找到退出找到退出 stcstc jmpjmp quitquit ;(ax);(ax);(ax)最后一个元素最后一个元素,未找到退出未找到退出核心代码:核心代码:12/20/2022ch5compare:compare:cmpcmp ax,es:ax,es:bx+sibx+si jeje quitquit jaja higher higher decdec cxcx movmov high_idxhigh_idx,cxcx jmpjmp mid midhigher:higher:inc inc cxcx movmov low_idxlow_idx,cxcx jmpjmp mid midno_match:no_match:stcstcquit:quit:search:search:movmov low_idxlow_idx,1,1 movmov bxbx,didi ;个数个数 movmov high_idxhigh_idx,bxbx movmov bxbx,didimid:mid:movmov cxcx,low_idxlow_idx movmov dxdx,high_idxhigh_idx cmpcmp cxcx,dxdx jaja no_match no_match add add cxcx,dxdx shrshr cxcx,1,1 movmov sisi,cxcx shlshl sisi,1,112/20/2022ch5(3)地址跳跃表地址跳跃表(值与地址有对应关系的表)(值与地址有对应关系的表)例:根据例:根据例:根据例:根据 AL AL AL AL 寄存器中哪一位为寄存器中哪一位为寄存器中哪一位为寄存器中哪一位为 1 1 1 1(从低位到高位),(从低位到高位),(从低位到高位),(从低位到高位),把程序转移到把程序转移到把程序转移到把程序转移到 8 8 8 8 个不同的程序分支个不同的程序分支个不同的程序分支个不同的程序分支branch_tablebranch_table dwdw routine1 routine1 dwdw routine2 routine2 dwdw routine3 routine3 dwdw routine4 routine4 dwdw routine5 routine5 dwdw routine6 routine6 dwdw routine7 routine7 dwdw routine8 routine812/20/2022ch5 cmpcmp al,0 al,0 ;AL;AL为逻辑尺为逻辑尺 jeje continue continue lea lea lea lea bxbxbxbx,branch_table,branch_table,branch_table,branch_tableL:L:shrshr al,1 al,1 ;逻辑右移逻辑右移 jncjnc add1 add1 jmpjmpjmpjmp word word word word ptrptrptrptr bxbxbxbx ;段内间接转移段内间接转移段内间接转移段内间接转移add1:add add1:add bxbx,typetype branch_table branch_table ;add bx,2add bx,2 jmpjmp L Lcontinue:continue:routine1:routine1:routine2:routine2:(寄存器间接寻址寄存器间接寻址寄存器间接寻址寄存器间接寻址)12/20/2022ch5(寄存器相对寻址)寄存器相对寻址)寄存器相对寻址)寄存器相对寻址)cmpcmp al,0 al,0 jeje continue continue movmov sisi,0 ,0 L:L:shrshr al,1 ;al,1 ;逻辑右移逻辑右移 jncjnc add1 add1 jmpjmpjmpjmp branch_tablesibranch_tablesibranch_tablesibranch_tablesi ;段内间接转移段内间接转移add1:add1:add add sisi,typetype branch_table branch_table jmpjmp L Lcontinue:continue:routine1:routine1:routine2:routine2:12/20/2022ch5(基址变址寻址基址变址寻址基址变址寻址基址变址寻址)cmpcmp al,0 al,0 jeje continue continue lea lea lea lea bxbxbxbx,branch_table,branch_table,branch_table,branch_table movmov sisi,7*,7*typetype branch_table branch_table movmov cxcx,8,8L:L:shlshl al,1 al,1 ;逻辑左移逻辑左移 jncjnc sub1 sub1 jmpjmpjmpjmp word word word word ptrptrptrptr bxsibxsibxsibxsi ;段内间接转移段内间接转移sub1:sub