基本程序控制结构.ppt

上传人:小飞机 文档编号:6412177 上传时间:2023-10-28 格式:PPT 页数:43 大小:340.99KB
返回 下载 相关 举报
基本程序控制结构.ppt_第1页
第1页 / 共43页
基本程序控制结构.ppt_第2页
第2页 / 共43页
基本程序控制结构.ppt_第3页
第3页 / 共43页
基本程序控制结构.ppt_第4页
第4页 / 共43页
基本程序控制结构.ppt_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《基本程序控制结构.ppt》由会员分享,可在线阅读,更多相关《基本程序控制结构.ppt(43页珍藏版)》请在三一办公上搜索。

1、第五章 顺序、分支、循环程序设计(P160),1.概述一.汇编语言程序设计的基本步骤1.分析题意,确定算法(抽象出描述问题的数学模型或整理出若个 条规律,找出合理的解法。)2.绘出程序流程图3.编制程序(采用分段结构,合理分配存储单元,合理分配寄存器)4.调试程序 判断程序质量的标准(1)程序的执行时间(2)程序所占用的内存字节数(3)程序的语句行数二.程序的基本结构 顺序、分支、循环,每种结构只有一个入口和一个出口,三种结构任意组合和嵌套,可构成任何复杂的程序。,1.顺序结构的程序设计,1.顺序结构先执行A操作,再执行B操作。,A,B,流程图,N-S图,Ex1:按公式Y=X*X-50 mov

2、 al,mulbuf;(al)x mul al;(ax)x*x sub ax,50;(ax)x*x-50 mov dstbuf,ax;(desbuf)y,Ex:写一个把压缩存放的BCD码,转换为对应的十进制数字ASCII码的程序。,Data segmentBcd DB 86HASCII DB 2 dup(0)Data endsCode segment assume cs:code,ds:dataMain proc far start:mov ax,data mov ds,ax mov al,bcd and al,0fh add al,30h mov ASCII+1,al,Mov al,bcdM

3、ov cl,4Shr al,clAdd al,30hMov ASCII,alMov ah,4chInt 21h Main endpCode ends end start,86,38,36,ASCII,ASCII+1,2.分支程序设计分支结构:根据条件判断决定程序的走向,一.转移指令(P85)1.无条件转移指令 格式:JMP 说明:常用标号表示。EX:jmp lab1 mov ax,0 Lab1:mov ax,0ffh(1)段内转移-只改变IP,转移地址由新的IP取代。1)段内直接短转移 格式:JMP SHORT OPR 操作:(IP)(IP)+D8,无条件转移可在段内进行,也可在段间进行,寻址

4、有直接寻址和间接寻址,JMP不影响状态位。,说明:(1)Opr是一个带补码的带符号的数,以満足向前、向后转移(一般用符号地址),只允许在-128+127字节内转移。(2)两字节指令Ex:jmp short hello Hello:mov al,3,Jmp指令,E8,08,老 IP,B0,03,新 IP,MOV指令,D8,D8,Cs:0100,CPU一旦执行JMP,(IP)=0102H(老IP)D8=08H新的(IP)=0102+D8=010AH,2)段内直接近转移 格式:JMP near ptr opr 操作:(IP)(IP)+D16 说明:Opr是一个带符号数,32K内转移,3字节指令3)段

5、内间接转移 格式:JMP Word ptr opr 操作:(IP)(EA)说明:有效地址来自内存单元中的内容,或一个16位通用寄存器中的内容。Ex:JMP bx(IP)(BX)JMP WORD PTR BP+TABLE JMP BXSI 先计算PA,找出MEM中的内容送给IP,(2)段间转移 从一个代码段转移到另一个代码段同,JMP同时修改CS和IP内容。1)段间直接(远)转移 格式:JMP FAR PTR OPR 操作:(IP)OPR的段内偏移地址(CS)OPR的所在的段地址 说明:指令中直接指定要转向的IP和CS ex:JMP far ptr next_prog,50,EA,02,00,2

6、0,JMP,新IP,新CS,(IP)=0250H,(CS)=2000H,2)段间间接转移 格式:JMP DWORD PTR OPR 操作:(IP)(EA)(CS)(EA+2)ex:JMP DWORD PTR ALPHASPDI(EA)=(sp)+(di)+alpha 把(EA)单元中的内容送入(IP)把(EA+2)单元中的内容送入(CS),2.条件转移指令,以某些标志位的逻辑运算作依据,满足规定的 条件转移,否则顺序执行,转向的目标地址必须在-128+127之间。(1)格式:Jxx(2)说明:JXX-转移条件-标号 指令为2字节 使用条件转移指令之前,必须选择影响标志位的 指令(CMP、TES

7、T等)。,指令,转移条件,含义,JC JNC,CF=1 CF=0,有进位(借位)转移,无进位(借位)转移,JE/JZJNE/JNZ,ZF=1 ZF=0,相等(等于0)转移,不相等(不等于0)转移,JS JNS,SF=1 SF=0,负数转移,正数转移,JO JNO,OF=1 OF=0,有溢出转移,无溢出转移,JP/JPEJNP/JPO,PF=1 PF=0,有偶数个“1转移,有奇数个“1转移,(3)单条件 转移指令 1)单一标志位,2)JCXZ格式:JCXZ 操作:若(CX)=0,转至,否则顺序执行。(4)无符号数比较 用来判断无符号数的大小,判断条件:CF、ZF,指令,转移条件,含义,JA/JN

8、LE,CF=0 AND ZF=0,AB转移,JAE/JNB,CF=0 OR ZF=1,A=B转移,JB/JNAE,CF=1 AND ZF=0,AB转移,JBE/JNA,CF=1 OR ZF=1,A=B转移,(5)带符号数条件转移指令,指令,转移条件,含义,JG/JNLE,SF=OF AND ZF=0,AB转移,JGE/JNL,SF=OF OR ZF=1,A=B转移,JL/JNGE,CF=OF AND ZF=0,AB转移,JLE/JNG,A=B转移,CF=OF OR ZF=1,二.分支程序设计(P176),1.分支程序的结构形式,条件?,A,B,ture,flase,条件?,A1,A2,An,(

9、2)双分支结构,(3)多路分支结构,特点:运行方向向前,某一条件成立,执行其中的一个分支。,条件?,A,(1)单分支结构,ture,flase,2.分支的实现,(1)产生条件(执行指令CMP、SUB、AND、TEST和移位,影响Flags标志位ZF、CF、OF、SF等)(2)测试(用条件转移指令测试)(3)定向(4)标号,3.多分支程序设计(转移表方法、地址表方法、逻辑分解法),(1)转移表方法思想:在程序中建立一张多路分支的转移指令表(转移表),各分支转移指令在表中的位置,即离首址的位移量作为条件,当进行判断时,把当前条件的偏移量加上表首址作为转移地址。转移至表的相应位置,继续执行条件转移指

10、令,达到多分支目的。,JMP xx,JMP xx,JMP xx,表首址,JMP xx 段内为2字节,段间为3字节,转移表,程序实现:1)在代码段建立转移指令表2)建立分支处理程序段3)形成转移表偏移地址(BX:表首址,AX:偏移量)4)用无条件转移指令转至对应转移指令,实现分支:JMP BX,ex:根据从键盘输入的大写字母AZ,分别转向MA,MB,,MZ这26个分支程序之一。(用转移表实现。),Jmp MA,Jmp MB,Jmp MC,Jmp MZ,表首址,转移表,CS段,Code segment.lea bx,maddr;表首址存入BX xor ah,ah;AH清0 add ax,ax;序号

11、*2送AX(段内短转移)add bx,ax;转移入口地址送BX jmp bx;转移至相应模块的转移表位置去Maddr:jmp short ma jmp short mb jmp short mzMa:;Mb:;.Mz:;Code ends,转移表,模块程序段,2)地址表法,思想:与转移表类似,不同之处:表中存放的是各分支程序的入口地址。(可以是偏移地址或偏移+段地址),一般是段内转移。,程序实现:1)在数据段建立入口地址表2)建立分支处理程序段3)形成分支的入口地址4)用无条件转移指令转至对应的入口地址,实现分支:JMP BX,入口地址1,入口地址2,入口地址n,.,地址表,表首址,DS段,e

12、x:根据从键盘输入的大写字母AZ,分别转向MA,MB,,MZ这26个分支程序之一。(用地址表法实现。),Ma入口地址,Mb入口地址,Mz入口地址,地址表,DS段,Data segmentMaddr dw ma,mb,mc,md,mx,my,mzData endsCode segment assume cs:code,ds:dataMain proc farStart:mov ax,data mov ds,ax lea bx,maddr mov ah,1 int 21h sub al,A shl al,1 xor ah,ah add bx,ax jmp word ptr bx.Ma:;Mb:;M

13、z:.;.,从键盘输入一字符,计算入口地址,注意:转移表法和地址表法的异同!,算法类似:核心问题-查表不同的是:(1)地址表中存放的是分支程序的入口地址,已直接可以转入分支程序的入口,而转移表中存放的是转入分支程序的转移指令。转移表法先得转移到转移表的相应位置,继续再执行一次转移指令,才能到达分支程序的入口。(2)地址表存在DS段,而转移表存在CS段。,(3)逻辑分解法,前面介绍的两种方法:用于分支条件是一种线性规律的场合,即条件是连续有序的或基本是连续有序的整数。(条件相异:即当前只能有一种条件成立)实际问题中还有一种分支:分支条件不満足线性规律,即分支条件是一些跳跃性很大的离散值。另外,还

14、有相容性条件的情况,针对这些情况,无法采用前面介绍的方法,现采用逻辑分解法。,思想:按条件的先后,依次分解成一串双分支结构,通过双分支的方法进行程序设计。(将条件转为逻辑值0和1,通过程序轮询的方式产生分支。),ex:若AL寄存器中存放了当前外部是否有中断请求的情况。AL的每一位对应一个中断源的中断请求情况。若有中断请求,该位为1,否则,无中断请求。当某一中断源有中断请求,就转向相应的中断处理程序,各位所对应的中断处理程序的入口地址如下表所示。,B0=1,中断处理R0,B1=1,中断处理R1,B6=1,中断处理R6,B7=1,中断处理R7,Y,Y,Y,Y,N,N,N,N,.,逻辑分解,.ROR

15、 AL,1;AL的B0位送CFJC R0;B0=1,转R0ROR AL,1;AL的B1位送CFJC R1;B1=1,转R1ROR AL,1;AL的B2位送CFJC R2;B2=1,转R2ROR AL,1;AL的B3位送CFJC R3;B3=1,转R3ROR AL,1;AL的B4位送CFJC R4;B4=1,转R4ROR AL,1;AL的B5位送CFJC R5;B5=1,转R5ROR AL,1;AL的B6位送CFJC R6;B6=1,转R6ROR AL,1;AL的B7位送CFJC R7;B7=1,转R7,Ex1:符号函数,1 x0 if:(ax)x0 x=0(bx)y-1 x0,Y=,X=0?,

16、N,Y=-1,Y=0,Y=1,X=0?,Y,Y,N,流程图,.mov ax,x cmp ax,0 jge biger mov bx,-1 jmp nextBiger:jz equl mov bx,1 jmp nextEqul:mov bx,0Next:,ex:已知两个整数变量A和B,编程:(1)若两个数中有一个奇数,则将奇数存入ABUF单元,偶数存入BBUF单元。(2)若两个数中均为奇数,则两数分别加1,并存回原变量处。(3)若两个数中均为偶数,则两数不变,A、B同类?,N,Y,B偶?,N,B+1 BA+1 A,B偶?,Y,Y,A B,Data segmentAbuf db x1Bbuf db

17、 x2Data endsCode segmentAssume cs:code,ds:dataMain proc farStart:mov ax,data mov ds,ax mov al,abuf mov bl,bbuf xor al,bl test al,01h jz class test bl,01h jz exit xchg bl,abuf mov bbuf,bl,jmp exitClass:test bl,01h jz exit inc abuf inc bbufExit:mov ah,4cH int 21H Main endpCode ends end start,3.循环程序设计(

18、P160),在应用中,往往要求某一段程序重复执行多次,这时要用循环结构。一.循环控制命令(P95)1.LOOP指令 格式:LOOP OPR 测试条件(CX)0,循环 操作:(1)(CX)(CX)-1(2)检测条件,若满足,转移至标号,否则,顺序执行 说明:(1)使用LOOP前,循环次数送入CX(2)本命令等价于:DEC CX JNZ 2.LOOPZ/LOOPE指令(为0或相等时循环)格式:LOOPZ/LOOPE OPR 测试条件ZF=1且(CX)0,循环 操作同上。本指令可以提前结束循环。3.LOOPNZ/LOOPNE指令(不为0或不相等时循环)格式:LOOPNZ/LOOPNE OPR 测试条

19、件ZF=0且(CX)0,循环 操作同上。本指令可以提前结束循环。,二.循环程序的结构,1.循环程序的组成(1)初始化:设置循环计数值,设置变量等(2)循环体:程序的处理部分(3)循环控制部分:对循环是否结束加以判定,修改变量、指针,为下一次循环作准备。(4)结束处理:分析、存放程序的结果。,2.循环程序有两种结构形式(1)DOwhile(当型),循环初始状态,循环控制条件?,循环体,结束处理,N,Y,循环体,条件?,先判断条件,可能循环体一次也不执行,又称“零迭代次循环”,(2)DOUntil(直到型),循环初始状态,循环控制条件?,循环体,结束处理,N,Y,循环体,条件?,先执行后判断,循环

20、体至少执行一次。,三.循环程序的设计方法,1.计数器控制循环(若循环次数有可能为0,用DO WHILE结构)(可正计数或负计数!)ex5.1(P161):把BX寄存器内的二进制数用十六进制形式在屏幕上显示出来。(1)算法分析:BX内容从左向右每四位为一组在屏幕上显示(循环),循环次数为4(四位二进制数一组),屏幕上显示的是ASCII码。,(AL)(BL),保留低四位,(AL)(AL)+30H,(AL)=3A,(AL)(AL)+7形成AF的ASCII码,Y,(DL)(AL),调DOS功能显示,初始化,Bx循环左移四位,(CH)(CH)-1,(CH)=0?,N,end,Y,N,(CH)=4,赋值给

21、BX(负计数),(2)流程图,Data segment Number dwData endsCode segment assume cs:code,ds:dataMain proc farStart:mov ax,data mov ds,ax lea si,number mov bx,si mov ch,4Rotate:mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30h cmp al,3ah,Jl printit add al,7hPrintit:mov dl,al mov ah,2 int 21h dec ch jnz rotate mov

22、ah,4ch int 21hMain endpCode ends end start,Mov cx,4Rotate:push cx mov cl,4,POP CXLOOP ROTATE,2.条件控制法(循环次数不能确定,満足某个条件可继续循环。),ex:设在内存某一数据区以string地址开始存放了一字符串,其最后一个字符为“$”(24H),要求检查该字符串中所有字符的奇偶性,规定每个字符对应的一个字节中必须有偶数个“1”,则为正确。若奇偶性正确,结果为0,否则结果为-1。分析:循环结束的条件有两个(“或”的关系)(1)只要有一个字符奇偶性错,就退出循环并置结果单元为-1。(2)测试到结束标志

23、“$”时也退出循环。此时所有字符奇偶性正确,结果为0。,取串首址送BX,结果单元地址送DI,取一字符送AL,(BX)(BX)+1,(AL)=“$”,PF=0?(奇),N,Y,(AH)0,(AH)1,RESULT(AH),END,Y,N,Data segmentString db This is a string,$Result db?Data ends;Code segment assume cs:code,ds:dataMain proc far Start:mov ax,data mov ds,ax lea bx,string lea di,resultLop1:mov al,bx inc

24、 bx cmp al,24h jz done or al,al jpo error jmp lop1,Done:mov ah,0 jmp next Error:mov ah,-1Next:mov di,ah mov ah,4ch int 21hMain endpCode ends end start,3.逻辑尺控制法,在实际应用的循环程序中,有时循环体内具有多分支结构的循环程序,每执行循环一次,程序应按照规定好的次序去执行其他分支或重复执行某个分支。对于这种结构的循环程序,我们采用逻辑尺控制方法来实现。逻辑尺控制法首先应设计一把逻辑“尺”,即将字节、字或双字甚至将根据需要所设置的多字节中的各位

25、表示不同的操作。若在循环中执行更多分支,也可采用多位组合,如:2位组合表示4个分支,3位组合表示8个分支。最简单的逻辑尺是用一位“0”和“1”表示 两种不同的分支。,P167.ex5.5 设有数组X和Y,X中有X1,,X10,Y中有Y1,,Y10,试编程计算,结果存入Z中.z1=x1+y1 z5=x5-y5 z8=x8-y8 z2=x2+y2 z6=x6+y6 z9=x9+y9 z3=x3-y3 z7=x7-y7 z10=x10+y10 z4=x4-y4 分析:可用循环十次,每次取数,操作加、减 为了区别,设立标志位 0:加 1:减 逻辑尺:0000000011011100(前6位无意义!),

26、置循环计数值,I=0,(下标),测试尺第i位?,Xi-Yi,Xi+Yi,结果送Zi,I=I+1,计数值-1,计数值为0,N,END,Y,data segment x dw 1,2,3,4,5,6,7,8,9,10Y dw 10,6,7,4,5,3,2,1,7,3Z dw 10 dup(?)Logic_rule dw 00dcHData endsCode segment assume cs:code,ds:dataMain proc farStart:mov ax,data mov ds,ax mov bx,0 mov cx,10 mov dx,logic_ruleNext:mov ax,xbx

27、 shr dx,1 jc subs add ax,ybx jmp short resultSubs:sub ax,ybxResult:mov zbx,ax add bx,2 loop next,Mov Ax,4c00H Int 21HMain:endpCode ends end satrt,采用静态逻辑尺!,(P170)ex5.6 从键盘上输入一行字符,要求第一个字符为空格,不是,退出。若是,开始接受字符,并存入BUFFER为首址的缓冲区(空格符不存入),直至第二个空格符时,退出程序。分析:(1)是第一个字符,不是空格,flag=0,退出。(2)是第一个字符,是空格,flag=1,输入下一个字

28、符。(3)不是第一个字符,是空格,flag=1,退出。(4)不是第一个字符,不是空格,flag=1,存入Buffer。falg:是一逻辑尺,开始时flag=0,空格开始时,flag=1,空格结束时,flag=1。(动态逻辑尺),置缓冲区首址及标志位,接受一字符,首字符?,Space?,Y,Y,END,Space?,Y,N,存入,接 受下一字符,N,N,Flag=1,Data segmentBuffer db 80 dup(?)Flag db?Data endsCode segment assume cs:code,ds:dataMain proc far start:mov ax,data m

29、ov ds,ax lea bx,buffer mov flag,0Next:mov ah,01 int 21h test flag,01h jnz follow cmp al,20h jnz exit mov flag,1 jmp nextFollow:cmp al,20h jz exit,mov bx,al inc bx jmp nextExit:mov ah,4ch int 21hMain endpCode ends end start,四.多重循环程序设计,一个循环程序的循环体中又包含着循环结构这就是多重循环。Ex:5.8 附加段有一个字数组,首址在DI中,第一个字为数组长度,使数组整序

30、(从大到小)。分析:(用冒泡法)原算法为:从第一个数开始依次对相邻两个数比较,次序不对交换位置,次序对,不作任何操作,N个数,进行N-1次比较,最小的数已放到最后。(要比较N-1遍)比较遍数 1 2 3 N-3 N-2 N-1 比较次数:(N-1)+(N-2)+(N-3)+3+2+1=O(n2)EX:8 5 16 84 32 一遍 8 16 84 32 5 二遍 16 84 32 8 5 三遍 84 32 16 8 5,缺陷:大多数情况,数组未比较N-1遍已达到目的,而程序必须进行N-1遍操作。,改进:设一个标志位,外循环为1,进入内循环时,每交换一次置0,每次内循环结束,标志位若为0,进入下

31、一次外循环,若为1,表示 已有序,立即结束外循环。,外循环SAVE_CNT N,标志 1,SAVE_CNT SAVE_CNT-1,SAVE_CNT=0?,CX SAVE_CNT,DI 首址,Ai+1=Ai,Ai Ai+1,标志 0,(CX)-1=0?,标志=0?,END,Y,N,N,N,Y,Y,N,data segmentSave_cnt dw?Start_addr dw?Data endsExtra segmentX dw 10,34,45,67,21,38,98,120,31,53,44Extra endsCode segment assume cs:code,ds:data,es:ext

32、raMain proc farStart:push bx mov ax,data mov ds,ax mov ax,extra mov es,ax lea di,x mov start_addr,di mov cx,es:di mov save_cnt,cxInit:mov bx,1 dec save_cnt jz stored mov cx,save_cnt,mov di,start_addr next:add di,2 mov ax,es:di cmp es:di+2,ax jle cont xchg es:di+2,ax mov es:di,ax sub bx,bxCont:loop n

33、ext cmp bx,0 je initStored:mov di,start_addr pop bx mov ah,4ch int 21hMain endpCode ends end start,Lesson:5.1,5.7,5.17,5.24,3.38 补充作业1.有以下程序段FIBONA DW 40H DUP(?)NUM DB 10.MOV CX,0 MOV CL,NUM MOV AX,0 MOV BX,1 MOV DI,0LOP:MOV FIBONADI,AX ADD AX,BX XCHG AX,BX ADD DI,TYPE FIBONA LOOP LOP上述程序段执行后,试给出FINONA前10个单元的内容,2.有以下程序段 aryb db 3 dup(1,3,5,7)mov si,offset aryb mov cx,10 mov ax,0Again:add al,si and al,0Fh cmp al,9 jbe le1 inc ah sub al,9Le1:loop again上述程序段执行后,(AX)=?,若用指令loopne代替LOOP,那么上述程序段(AX)=?,(CX)=?,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号