收藏 分销(赏)

循环与分支设计.pptx

上传人:快乐****生活 文档编号:10108118 上传时间:2025-04-22 格式:PPTX 页数:53 大小:279.29KB 下载积分:14 金币
下载 相关 举报
循环与分支设计.pptx_第1页
第1页 / 共53页
循环与分支设计.pptx_第2页
第2页 / 共53页


点击查看更多>>
资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,#,单击此处编辑母版标题样式,1,第五章 循环与分支程序设计,5.1,循环与转移指令,5.2,循环程序设计,5.3,分支程序设计,2,编写汇编语言程序步骤,1,分析题意,确定算法,2,根据算法,画出程序流程图,3,根据框图编写程序,4,上机调试程序,3,5.1,循环与转移指令,一、循环控制指令,二、转移指令,控制转移类指令通过,改变,IP(,和,CS),值,实现程序执行顺序的改变,4,一、循环控制指令,8086指令系统的循环控制指令均为二字节指令,一字节为转移的相对位移量(8位带符号的二进制数),IP,IP+,相对位移量,隐含使用,CX,作为循环计数器,程序中的某段需反复执行若干次时,用循环来实现,小范围转移,5,一、循环控制指令,LOOP label,;CXCX1,CX0,,循环到标号,label,LOOPE/LOOPZ label,;CXCX1,CX0,且,ZF1,,循环到标号,label,LOOPNE/NZ label,;CXCX1,,CX0,且,ZF0,,循环到标号,label,等于时循环,不等于时循环,6,一、循环控制指令,(例),mov cx,count,;,设置循环次数,mov si,offset string,xor bx,bx,;bx,清0,用于记录空格数,mov al,20h,again:cmp al,si,jnz next,;ZF=0,,非空格,转移,inc bx,;ZF=1,,是空格,个数加1,next:inc si,loop again,;,计数器减1,不为0继续循环,dec cx,jnz again,7,二、转移指令,无条件转移指令,条件转移指令,8,无条件转移指令,JMP label,;,程序转向,label,标号指定的地址,NEAR,FAR,只要执行无条件转移指令,JMP,,就使程序转到指定的目标地址处,从目标地址处开始执行那里的指令,JMP,指令分成4种类型:,段内转移、直接寻址,段内转移、间接寻址,段间转移、直接寻址,段间转移、间接寻址,目的地址与,JMP,属同一逻辑段,只修改,IP,值,从一个代码段转移到另一个代码段,,CS,和,IP,都会被修改,9,1.无条件转移指令,目标地址的寻址方式,直接寻址方式,转移地址象立即数一样,直接在指令的机器代码中,就是直接寻址方式,间接寻址方式,转移地址在寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式,用标号表达,用寄存器或存储器操作数表达,10,1.无条件转移指令,目标地址的范围:段内,段内转移,近转移(,near),在当前代码段64,KB,范围内转移(32,KB,范围),不需要更改,CS,段,基值,,只要改变,IP,偏移地址,段内转移,短转移(,short),转移范围可以用一个字节表达,在段内128127范围的转移,代码段,代码段,11,1.无条件转移指令,目标地址的范围:段间,段间转移,远转移(,far),从当前代码段跳转到另一个代码段,可以在1,MB,范围,需要更改,CS,段,基值,和,IP,偏移地址,目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址,代码段,代码段,实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移,程序员可用操作符,short、near ptr,或,far ptr,强制,12,段内直接寻址转移,JMP label,;IPIP+,位移量,位移量是紧接着,JMP,指令后的那条指令的偏移地址到目标指令的偏移地址的地址差,当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负,实际为相对寻址,again:dec cx,;,标号,again,的指令,jmp again,;,转移到,again,处继续执行,jmp output,;,转向,output,output:mov result,al,;,标号,output,的指令,13,段内间接寻址转移,JMP r16/m16,;IPr16/m16,将一个16位寄存器或主存字单元内容送入,IP,寄存器,作为新的指令指针,但不修改,CS,寄存器的内容,jmp ax,;IPAX,jmp word ptr bx,;IPBX,14,段间直接寻址转移,JMP far ptr label,;IPlabel,的偏移地址,;,CSlabel,的段基值,将标号所在段的段,基值,作为新的,CS,值,标号在该段内的偏移地址作为新的,IP,值;程序跳转到新的代码段执行,jmp far ptr otherseg,;,远转移到代码段2的,otherseg,15,段间间接寻址转移,JMP far ptr mem,;IPmem,CSmem+2,用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个字单元中的,低位字送,IP,寄存器,高位字送,CS,寄存器,mov word ptr bx,0,mov word ptr bx+2,1500h,JMP far ptr bx,;,转移到1500,h:0,16,2.条件转移指令,Jcc label,;,条件满足,发生转移:,IPIP8,位位移量,;条件不满足,顺序执行,指定的条件,cc,如果成立,程序转移到由标号,label,指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令,操作数,label,是采用短转移,称为相对寻址方式,17,2.条件转移指令,Jcc,指令的操作数,label,是一个标号,一个8位位移量是相对于当前,IP,的,且距当前,IP,地址128127个单元的范围之内,属于段内短距离转移,Jcc,指令为2个字节,条件不满足时的顺序执行就是当前指令偏移指针,IP,加2,18,2.条件转移指令,指令的分类,Jcc,指令不影响标志,但要利用标志。,根据利用的标志位不同,19条指令分成4种情况:,判断单个标志位状态,比较无符号数高低,比较有符号数大小,判断计数器,CX,为0,19,2.条件转移指令,无符号数的比较,无符号数的大小用高(,Above,),低(,Below,),表示,利用,CF,确定高低、利用,ZF,标志确定相等(,Equal,),两数的高低分成4种关系:,高于(不低于等于):,JA,(JNBE),高于等于(不低于):,JAE,(JNB),低于(不高于等于):,JB(JNAE),低于等于(不高于):,JBE(JNA),20,2.条件转移指令,有符号数的比较,有符号数的大(,Greater,),小(,Less,),需要组合,OF、SF,标志,并利用,ZF,标志确定相等(,Equal,),两数的大小分成4种关系:,小于(不大于等于):,JL(JNGE),小于等于(不大于):,JLE(JNG),大于(不小于等于):,JG,(JNLE),大于等于(不小于):,JGE,(JNL),21,助记符,标志位,助记符,标志位,JC,CF=1,JA/JNBE,CF=0,且,ZF=0,JNC,CF=0,JAE/JNB,CF=0,或,ZF=1,JZ/JE,ZF=1,JB/JNAE,CF=1,且,ZF=0,JNZ/JNE,ZF=0,JBE/JNA,CF=1,或,ZF=1,JS,SF=1,JG/JNLE,SF=OF,且,ZF=0,JNS,SF=0,JGE/JNL,SF=OF,或,ZF=1,JP/JPE,PF=1,JL/JNGE,SF,OF,且,ZF=0,JNP/JPO,PF=0,JLE/JNG,SF,OF,或,ZF=1,JO,OF=1,JCXZ,CX=0,JNO,OF=0,实际虽然指令只有19条,但却有31个助记符,采用多个助记符,只是为了方便记忆和使用,22,判断单个标志位状态,这组指令单独判断5个状态标志之一,JZ,/,JE,和,JNZ,/,JNE,:,利用零标志,ZF,,,判断结果是否为零(或相等),JS,和,JNS,:,利用符号标志,SF,,,判断结果是正是负,JO,和,JNO,:,利用溢出标志,OF,,,判断结果是否产生溢出,JP,/,JPE,和,JNP,/,JPO,:,利用奇偶标志,PF,,,判断结果中“1”的个数是偶是奇,JC,和,JNC,:,利用进位标志,CF,,,判断结果是否进位或借位,例 题,例 题,例 题,例 题,例 题,23,2.条件转移指令,JZ/JNZ,指令,mov cx,0,mov bx,addr,mov ax,bx,repeat:test ax,0ffffh,jz exit,jns shift,inc cx,shift:shl ax,1,jmp repeat,exit:mov count,cx,24,2.条件转移指令,JS/JNS,指令,计算|,XY|(,绝对值)。,X,和,Y,为存放于,X,单元和,Y,单元的16位操作数,结果存入,result。,mov ax,X,sub ax,Y,jns nonneg,neg ax,nonneg:mov result,ax,25,2.条件转移指令,JO/JNO,指令,计算,XY。X,和,Y,为存放于,X,单元和,Y,单元的16位操作数,若溢出,则转移到,overflow,处理,mov ax,X,sub ax,Y,jo overflow,.,;,无溢出,结果正确,overflow:.,;,有溢出处理,26,2.条件转移指令,JP/JNP,指令,设字符的,ASCII,码在,AL,寄存器中。将字符加上奇校验位:在字符,ASCII,码中为“1”的个数为奇数时令其最高位为“0”,否则令最高位为“1”,and al,7fh,;,最高位置,“,0,”,,同时判断,“,1,”,的个数,jnp next,;,个数已为奇数,则转向,next,or al,80h,;,否则,最高位置,“,1,”,next:.,27,2.条件转移指令,JC/JNC,指令,记录,BX,中1的个数,xor al,al,;AL0,CF0,again:test bx,0ffffh,;,等价于,cmp bx,0,jz next,shl bx,1,jnc again,inc al,jmp again,next:.,;AL,保存1的个数,28,2.条件转移指令,无符号数的比较(例),cmp ax,bx,;,比较,ax,和,bx,jae next,;,若,ax,bx,,转移,xchg ax,bx,;,若,axbx,,交换,next:.,结果:,AX,保存较大的无符号数,29,2.条件转移指令,有符号数的比较(例),cmp ax,bx,;,比较,ax,和,bx,jge next,;,若,ax,bx,,转移,xchg ax,bx,;,若,axbx,,交换,next:.,结果:,AX,保存较大的有符号数,30,2.条件转移指令,计数器,CX,为0转移,JCXZ label,;CX0,,发生转移:,IPIP8,位位移量,;,CX0,,顺序执行,CX,寄存器通常在程序中用做计数器,JCXZ,指令用来判断计数是否为0,31,5.2,循环程序设计,一、循环程序的结构形式,二、循环程序设计,三、多重循环程序设计,32,一、循环程序的结构形式,结束,初始化,循环的初始状态,循环体,循环的工作部分,及修改部分,计数控制循环,条件控制循环,修改部分,控制条件,Y,N,先循环,后判断,33,一、循环程序的结构形式,结束,初始化,循环的初始状态,循环体,循环的工作部分,及修改部分,计数控制循环,条件控制循环,修改部分,控制条件,Y,N,先判断,后循环,34,二、循环程序设计,(例),例5.1 试编写一程序把,BX,寄存器内的2进制数用16进制数的形式在屏幕上显示出来。,分析:1、四位2进制数对应一位16进制数;,2、,BX,从左到右四位为一组分别显示;,3、0-9的,ASCII,码为30-39,H,A-F,的,SCII,码为41-46,H;,(0-9,加30,H)(A-F,加37,H),4、,屏幕显示:,(,DL),中放入要显示的字符的,ASCII,码;,MOV AH,02H,INT 21H,35,开始,初始化循环计数值(4次),BX,循环左移4位,取出,BX,的低4位,显示一个字符,循环计数值-1,循环计数值=,0?,结束,Y,N,转换为,ASCII,码,程序见,P162-163,rotate:,36,例5.2 在,ADDR,单元存放着数,Y,的地址,试编制一程序把,Y,中1的个数存入,COUNT,单元中,37,开始,1的个数计数器,0,循环次数计数器,CX,16,Y,左移一次,CF=1,1的个数计数器,+1,CX,CX-1=0,COUNT,1的个数计数器,结束,N,Y,N,Y,Y=0,N,Y,例5.2,38,DATA SEGMENT,YDW 1234H,ADDRDW Y,COUNTDB?,DATAENDS,CODESEGMENT,ASSUME CS:CODE,DS:DATA,START:MOV AX,DATA,MOV DS,AX,MOV DL,0,MOV BX,ADDR,MOV AX,BX,MOV CX,16,REPEAT:,SHL AX,1,JNC NEXT,INC DL,NEXT:LOOP REPEAT,EXIT0:MOV COUNT,DL,MOV AH,4CH,INT 21H,CODEENDS,END START,CMP AX,0,JZ EXIT0,例5.2,JMP REPEAT,39,例5.,4,将正数,N,插入一个已升序排列的字数组的正确位置。该数组的首地址和末地址分别为,ARRAY_ HEAD,和,ARRAY_ END,,其中所有的数均为正数。,解法一:,从数组的尾部开始比较,N,较大,则在比较对象后插入,结束循环,N,较小,则把比较对象及其后元素后移一个字,循环结束的控制:,执行插入操作后结束循环,若,N,比所有元素都小,扫描整个数组后仍无法结束循环,将-1加在数组前可解决该问题,23,37,49,52,32,END,HEAD,-1,23,37,49,52,32,-1,40,开始,(,ARRAY_HEAD-2),-1,初始化变址寄存器,SI,将,N,放在,K,的位置,Kb,或,a,high,b:,数组中无,b,,转到数组无,b,的处理;,若,a,low,b,b:high=mid-1,,继续下一步;,若,a,mid,high,,数组中无,b,,转到数组无,b,的处理;,否则:重复第3步。,50,开始,CX,DI,AX=DI?,BX,(DI+SI)/2,结束,N,Y,N,DI,DI+2,SIDI+2*CX,AXSI?,Y,N,N,N,AX=BX?,Y,AXBX?,Y,N,SI,BX-2,DI,BX+2,DISI?,Y,N,找到的处理,无要找的数时处理,流程图,:,51,程序:,Data segment,array dw ,Data ends,Code segment,Main proc far,assume cs:code,ds:data,Start:push ds,xor ax,ax,push ax,mov ax,data,mov ds,ax,lea di,array,mov cx,di,add di,2,shl cx,1,mov si,cx,add si,di,cmp,ax,di,je match1,jb no_match,cmp ax,si,je match2,ja no_match,Next:Mov bx,di,Add bx,si,shr bx,1,cmp ax,bx,je match3,ja higher,Lower:mov si,bx,Sub si,2,jmp compare,Higher:mov di,bx,add bx,2,Compare:cmp di,si,jbe next,No_match:clc,jmp exit0,Match1:stc,mov si,di,jmp exit0,Match2:stc,jmp exit0,Match3:stc,mov si,bx,exit0:ret,.,52,用跳转表实现多路分支,【例5.10】设某程序有8路分支,试根据键盘输入的数,(18),,将程序的执行转移到其中的一路分支。,53,程序如下:,DATASEGMENT,TAB DW P1,P2,P3,P4,P5,P6,P7,P8,DATAENDS,CODESEGMENT,ASSUME DS:DATA,CS:CODE,START:MOV AX,DATA,MOV DS,AX,MOV AH,01H,INT 21H ;,从键盘上输入一个字符至,AL,SUB AL,30H,DEC AL,SHL AL,1,MOV AH,00H,MOV BX,AX,JMP WORD PTR TAB,BX,P1:,P2:,P7:,P8:,RET,MAIN ENDP,CODE ENDS,END START,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服