《《基本程序控制结构》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《基本程序控制结构》PPT课件.ppt(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第五章第五章 顺序、分支、循环程序设计顺序、分支、循环程序设计(P(P160160)1.概述概述一一.汇编语言程序设计的基本步骤汇编语言程序设计的基本步骤1.分析题意,确定算法分析题意,确定算法(抽象出描述问题的数学模型或整理出若抽象出描述问题的数学模型或整理出若个个 条规律,找出合理的解法。条规律,找出合理的解法。)2.绘出程序流程图绘出程序流程图3.编制程序编制程序(采用分段结构,合理分配存储单元,合理分配寄存采用分段结构,合理分配存储单元,合理分配寄存器器)4.调试程序调试程序 判断程序质量的标准判断程序质量的标准(1)程序的执行时间程序的执行时间(2)程序所占用的内存程序所占用的内存字
2、节数字节数(3)程序的语句行数程序的语句行数二二.程序的基本结构程序的基本结构 顺序、分支、循环,每种结构只有一个入口和一个出口,三顺序、分支、循环,每种结构只有一个入口和一个出口,三种结构任意组合和嵌套,可构成任何复杂的程序。种结构任意组合和嵌套,可构成任何复杂的程序。1.顺序结构的程序设计1.1.顺序结构顺序结构先执行先执行A A操作,再执行操作,再执行B B操作操作。A BAB流程图流程图N-S图图Ex1:按公式按公式Y=X*X-50 mov al,mulbuf;(al)x mul al ;(ax)x*x sub ax,50 ;(ax)x*x-50 mov dstbuf,ax;(desb
3、uf)y Ex:Ex:写一个把压缩存放的写一个把压缩存放的BCDBCD码,转换为对应的十进制数码,转换为对应的十进制数字字ASCIIASCII码的程序。码的程序。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,bcdMov cl,4Shr al,clAdd al,30hMov ASCII
4、,alMov ah,4chInt 21h Main endpCode ends end start863836ASCIIASCII+12.分支程序设计分支结构:根据条件判断决定程序的走向分支结构:根据条件判断决定程序的走向一一.转移指令转移指令 (P85)1.无条件转移指令无条件转移指令 格式:格式:JMP 说明:说明:常用标号表示。常用标号表示。EX:jmpjmp lab1 mov ax,0 Lab1:mov ax,0ffh (1)段内转移段内转移-只改变只改变IP,转移地址由新的,转移地址由新的IP取代。取代。1)段内直接短转移段内直接短转移 格式:格式:JMP SHORT OPR 操作:
5、操作:(IP)(IP)+D8 无条件转移可在段内进行,也可无条件转移可在段内进行,也可无条件转移可在段内进行,也可无条件转移可在段内进行,也可无条件转移可在段内进行,也可无条件转移可在段内进行,也可在段间进行,寻址有直接寻址和间接在段间进行,寻址有直接寻址和间接在段间进行,寻址有直接寻址和间接在段间进行,寻址有直接寻址和间接在段间进行,寻址有直接寻址和间接在段间进行,寻址有直接寻址和间接寻址,寻址,寻址,寻址,寻址,寻址,JMPJMPJMP不影响状态位。不影响状态位。不影响状态位。不影响状态位。不影响状态位。不影响状态位。说明:(1)Opr是一个带补码的带符号的数,以満足向前、是一个带补码的带
6、符号的数,以満足向前、向后转移向后转移(一般用符号地址一般用符号地址),只允许在,只允许在-128+127字节内字节内转移。转移。(2)两字节指令两字节指令Ex:jmp short hello Hello:mov al,3 Jmp指令指令E8 08老 IP B0 03新 IPMOV指令指令D8D8Cs:0100CPU一旦执行一旦执行JMP,(IP)=0102H(老老IP)D8=08H新的新的(IP)=0102+D8=010AH2)2)段内直接近转移段内直接近转移 格式:格式:JMP near ptr opr JMP near ptr opr 操作操作:(IP):(IP)(IP)+D(IP)+D
7、1616 说明:说明:OprOpr是一个带符号数,是一个带符号数,32K32K内转移,内转移,3 3字节指令字节指令3)3)段内间接转移段内间接转移 格式:格式:JMP Word ptr opr JMP Word ptr opr 操作操作:(IP):(IP)(EA)(EA)说明说明:有效地址来自内存单元中的内容,或一个有效地址来自内存单元中的内容,或一个1616位通用位通用寄存器中的内容寄存器中的内容。Ex:JMP bx (IP)Ex:JMP bx (IP)(BX)(BX)JMP WORD PTR BP+TABLE JMP BXSI JMP WORD PTR BP+TABLE JMP BXSI
8、 先计算先计算PAPA,找出,找出MEMMEM中的内容送给中的内容送给IPIP(2)(2)段间转移段间转移 从一个代码段转移到另一个代码段同,从一个代码段转移到另一个代码段同,JMPJMP同时修改同时修改CSCS和和IPIP内容。内容。1)1)段间直接段间直接(远远)转移转移 格式:格式:JMP FAR PTR OPRJMP FAR PTR OPR 操作:操作:(IP)(IP)OPR OPR的段内偏移地址的段内偏移地址 (CS)(CS)OPR OPR的所在的段地址的所在的段地址 说明:指令中直接指定要转向的说明:指令中直接指定要转向的IPIP和和CSCS ex:JMP far ptr next
9、_progJMP far ptr next_prog 50EA 02 00 20JMP新IP新CS(IP)=0250H,(CS)=2000H2)2)段间间接转移段间间接转移 格式:格式:JMP DWORD PTR OPRJMP DWORD PTR OPR 操作:操作:(IP)(IP)(EA)(EA)(CS)(CS)(EA+2)(EA+2)ex ex:JMP DWORD PTR ALPHASPDIJMP DWORD PTR ALPHASPDI (EA)=(sp)+(di)+alpha (EA)=(sp)+(di)+alpha 把把(EA)(EA)单元中的内容送入单元中的内容送入(IP)(IP)把
10、把(EA+2)(EA+2)单元中的内容送入单元中的内容送入(CS)(CS)2.条件转移指令 以某些标志位的逻辑运算作依据,满足规定的以某些标志位的逻辑运算作依据,满足规定的 条件转移,否则顺序执行,转向的目标地址必须在条件转移,否则顺序执行,转向的目标地址必须在 -128 -128+127+127之间。之间。(1)(1)格式:格式:Jxx Jxx (2)(2)说明:说明:JXX-JXX-转移条件转移条件 -标号标号 指令为指令为2 2字节字节 使用条件转移指令之前,必须选择影响标志位的使用条件转移指令之前,必须选择影响标志位的 指令指令(CMP(CMP、TESTTEST等等)。指令指令转移条件
11、转移条件含义含义 JCJC JNC JNC CF=1CF=1 CF=0 CF=0有进位有进位(借位借位)转移转移无进位无进位(借位借位)转移转移JE/JZJE/JZJNE/JNZJNE/JNZ ZF=1ZF=1 ZF=0 ZF=0 相等相等(等于等于0)0)转移转移不相等不相等(不等于不等于0)0)转移转移 JSJS JNS JNS SF=1SF=1 SF=0 SF=0 负数转移负数转移 正数转移正数转移 JOJO JNO JNO OF=1OF=1 OF=0 OF=0 有溢出转移有溢出转移 无溢出转移无溢出转移JP/JPEJP/JPEJNP/JPOJNP/JPO PF=1PF=1 PF=0 P
12、F=0 有偶数个有偶数个“1“1转移转移 有奇数个有奇数个“1“1转移转移(3)(3)单条件单条件 转移指令转移指令 1 1)单一标志位单一标志位2)JCXZ2)JCXZ格式:格式:JCXZ JCXZ 操作:操作:若若(CX)=0(CX)=0,转至,转至 ,否则顺序执行,否则顺序执行。(4)(4)无符号数比较无符号数比较 用来判断无符号数的大小,判断条件:用来判断无符号数的大小,判断条件:CFCF、ZFZF指令转移条件含义JA/JNLECF=0 AND ZF=0 AB转移JAE/JNBCF=0 OR ZF=1 A=B转移JB/JNAECF=1 AND ZF=0 AB转移JBE/JNA CF=1
13、 OR ZF=1 AB转移JGE/JNLSF=OF OR ZF=1 A=B转移JL/JNGECF=OF AND ZF=0 AB转移JLE/JNG A0 if:(ax)x0 x=0 (bx)y -1 x=0?NY=-1Y=0Y=1X=0?YYN流程图 .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单元,偶数存入单
14、元,偶数存入BBUF单元单元。(2)若两个数中均为奇数,则两数分别加若两个数中均为奇数,则两数分别加1,并存回原变量处。,并存回原变量处。(3)若两个数中均为偶数,若两个数中均为偶数,则两数不变则两数不变A、B同同类类?NYB偶?NB+1 BA+1 AB偶?YYYYA BData segmentAbuf db x1Bbuf db 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
15、 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 start3.3.循环程序设计循环程序设计(P(P160160)在应用中,往往要求某一段程序重复执行多次,这时要用循环结构。在应用中,往往要求某一段程序重复执行多次,这时要用循环结构。一一.循环控制命令循环控制命令(P(P9595)1.LOOP 1.LOOP指令指令 格式:格式:LOOP OPR L
16、OOP OPR 测试条件测试条件(CX)(CX)0,0,循环循环 操作操作:(1)(CX):(1)(CX)(CX)-1(CX)-1 (2)(2)检测条件,若满足,转移至标号,否则,顺序执行检测条件,若满足,转移至标号,否则,顺序执行 说明:说明:(1)(1)使用使用LOOPLOOP前,循环次数送入前,循环次数送入CXCX (2)(2)本命令等价于:本命令等价于:DEC CX JNZ DEC CX JNZ 2.2.LOOPZ/LOOPELOOPZ/LOOPE指令指令(为为0 0或相等时循环或相等时循环)格式:格式:LOOPZ/LOOPELOOPZ/LOOPE OPR OPR 测试条件测试条件ZF
17、=1ZF=1且且(CX)(CX)0,0,循环循环 操作同上。本指令可以提前结束循环。操作同上。本指令可以提前结束循环。3.3.LOOPNZ/LOOPNELOOPNZ/LOOPNE指令指令(不为不为0 0或不相等时循环或不相等时循环)格式:格式:LOOPNZ/LOOPNE OPRLOOPNZ/LOOPNE OPR 测试条件测试条件ZF=0ZF=0且且(CX)(CX)0,0,循环循环 操作同上。本指令可以提前结束循环。操作同上。本指令可以提前结束循环。二二.循环程序的结构循环程序的结构1.循环程序的组成(1)初始化:设置循环计数值,设置变量等(2)循环体:程序的处理部分(3)循环控制部分:对循环是
18、否结束加以判定,修改变量、指针,为下一次循环作准备。(4)结束处理:分析、存放程序的结果。2.2.循环程序有两种结构形式循环程序有两种结构形式 (1)DOwhile(DOwhile(当型当型)循环初始状态循环控制条件?循环体结束处理NY 循环体条件?先判断条件,可能循环先判断条件,可能循环体一次也不执行,又称体一次也不执行,又称“零迭代次循环零迭代次循环”(2)DOUntil(DOUntil(直到型直到型)循环初始状态循环控制条件?循环体结束处理NY 循环体条件?先执行后判断,循环体先执行后判断,循环体至少执行一次。至少执行一次。三.循环程序的设计方法1.1.计数器控制循环计数器控制循环(若循
19、环次数有可能为若循环次数有可能为0 0,用,用DO DO WHILEWHILE结构结构)()(可正计数或负计数可正计数或负计数!)!)ex5.1(Pex5.1(P161161):把把BXBX寄存器内的二进制数用十六进制寄存器内的二进制数用十六进制形式在屏幕上显示出来形式在屏幕上显示出来。(1)(1)算法分析:算法分析:BXBX内容从左向右每四位为一组在屏内容从左向右每四位为一组在屏幕上显示幕上显示(循环循环),循环次数为,循环次数为4(4(四位二进制数一四位二进制数一组组),屏幕上显示的是,屏幕上显示的是ASCIIASCII码。码。(AL)(BL),保留低四位(AL)(AL)+30H(AL)=
20、3A(AL)(AL)+7形成AF的ASCII码YY(DL)(AL),调DOS功能显示 初始化Bx循环左移四位(CH)(CH)-1(CH)=0?NendYN(CH)=4,赋值给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,3
21、0h cmp al,3ah Jl printit add al,7hPrintit:mov dl,al mov ah,2 int 21h dec ch jnz rotate mov ah,4ch int 21hMain endpCode ends end start Mov cx,4Rotate:push cx mov cl,4POP CXLOOP ROTATE2.条件控制法(循环次数不能确定,満足某个条件可继续循环。循环次数不能确定,満足某个条件可继续循环。)ex:设在内存某一数据区以设在内存某一数据区以stringstring地址开始存放了一字地址开始存放了一字符串,其最后一个字符为符串,
22、其最后一个字符为“$”(24H)“$”(24H),要求检查该字,要求检查该字符串中所有字符的奇偶性,规定每个字符对应的一个符串中所有字符的奇偶性,规定每个字符对应的一个字节中必须有偶数个字节中必须有偶数个“1”“1”,则为正确。若奇偶性正确,则为正确。若奇偶性正确,结果为结果为0 0,否则结果为,否则结果为-1-1。分析:分析:循环结束的条件有两个循环结束的条件有两个(“(“或或”的关系的关系)(1)(1)只要有一个字符奇偶性错,就退出循环并置结只要有一个字符奇偶性错,就退出循环并置结果单元为果单元为-1-1。(2)(2)测试到结束标志测试到结束标志“$”“$”时也退出循环时也退出循环 。此时
23、所。此时所有字符奇偶性正确,结果为有字符奇偶性正确,结果为0 0。取串首址送BX结果单元地址送DI取一字符送AL(BX)(BX)+1(AL)=“$”PF=0?(奇)NNYY(AH)0(AH)1RESULT (AH)ENDYYNNData 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 bx
24、cmp al,24h jz done or al,al jpo error jmp lop1Done:mov ah,0 jmp next Error:mov ah,-1Next:mov di,ah mov ah,4ch int 21hMain endpCode ends end start 3.逻辑尺控制法 在实际应用的循环程序中,有时循环体内具有多在实际应用的循环程序中,有时循环体内具有多分支结构的循环程序,每执行循环一次,程序应按照分支结构的循环程序,每执行循环一次,程序应按照规定好的次序去执行其他分支或重复执行某个分支。规定好的次序去执行其他分支或重复执行某个分支。对于这种结构的循环程序
25、,我们采用逻辑尺控制对于这种结构的循环程序,我们采用逻辑尺控制方法来实现。方法来实现。逻辑尺控制法首先应设计一把逻辑逻辑尺控制法首先应设计一把逻辑“尺尺”,即将,即将字节、字或双字甚至将根据需要所设置的多字节中的字节、字或双字甚至将根据需要所设置的多字节中的各位表示不同的操作。若在循环中执行更多分支,也各位表示不同的操作。若在循环中执行更多分支,也可采用多位组合,如:可采用多位组合,如:2 2位组合表示位组合表示4 4个分支,个分支,3 3位组合位组合表示表示8 8个分支。最简单的逻辑尺是用一位个分支。最简单的逻辑尺是用一位“0”“0”和和“1”“1”表示表示 两种不同的分支。两种不同的分支。
26、P167.ex5.5 设有数组设有数组X X和和Y Y,X X中有中有X X1 1,,X,X1010,Y,Y中有中有Y Y1 1,,Y,Y1010,试编程计算试编程计算,结果存入结果存入Z Z中中.z1=x1+y1 z5=x5-y5 z8=x8-y8 z1=x1+y1 z5=x5-y5 z8=x8-y8 z2=x2+y2 z6=x6+y6 z9=x9+y9 z2=x2+y2 z6=x6+y6 z9=x9+y9 z3=x3-y3 z7=x7-y7 z10=x10+y10 z3=x3-y3 z7=x7-y7 z10=x10+y10 z4=x4-y4 z4=x4-y4 分析:可用循环十次,每次取数,
27、操作加、减分析:可用循环十次,每次取数,操作加、减 为了区别,设立标志位为了区别,设立标志位 0 0:加:加 1 1:减:减 逻辑尺:逻辑尺:000000 0000000011011100(0011011100(前前6 6位无意义位无意义!)!)置循环计数值I=0(下标)测试尺第i位?Xi-YiXi+Yi结果送ZiI=I+1计数值-1计数值为0NENDYY 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 as
28、sume 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 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采用静态采用静态逻辑尺逻辑尺!(P P170170)ex5.6)ex5.6 从键盘上输
29、入一行字符,要求第一个字符从键盘上输入一行字符,要求第一个字符为空格,不是,退出。若是,开始接受字符,并存为空格,不是,退出。若是,开始接受字符,并存入入BUFFERBUFFER为首址的缓冲区为首址的缓冲区(空格符不存入空格符不存入),直至第,直至第二个空格符时,退出程序。二个空格符时,退出程序。分析:分析:(1)(1)是第一个字符,不是空格,是第一个字符,不是空格,flag=0,flag=0,退出。退出。(2)(2)是第一个字符,是空格,是第一个字符,是空格,flag=1flag=1,输入下一,输入下一个字符。个字符。(3)(3)不是第一个字符,是空格,不是第一个字符,是空格,flag=1,
30、flag=1,退出。退出。(4)(4)不是第一个字符,不是空格,不是第一个字符,不是空格,flag=1,flag=1,存入存入BufferBuffer。falg:falg:是一逻辑尺,开始时是一逻辑尺,开始时flag=0,flag=0,空格开始空格开始时时,flag=1,flag=1,空格结束时空格结束时,flag=1,flag=1。(动态逻辑尺动态逻辑尺)置缓冲区首址及标志位接受一字符首字符?Space?YYYYENDSpace?YYNN存入,接 受下一字符NNNNFlag=1Data segmentBuffer db 80 dup(?)Flag db?Data endsCode segme
31、nt assume cs:code,ds:dataMain proc far start:mov ax,data mov 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 四.多重循环程序设计 一一个循环程序的
32、循环体中又包含着循环结构这就是多重循环。个循环程序的循环体中又包含着循环结构这就是多重循环。Ex:5.8 Ex:5.8 附加段有一个字数组,首址在附加段有一个字数组,首址在DIDI中,第一个字为数组长度,使数组中,第一个字为数组长度,使数组整序整序(从大到小从大到小)。分析:分析:(用冒泡法用冒泡法)原算法为:从第一个数开始依次对相邻两个数比较,次原算法为:从第一个数开始依次对相邻两个数比较,次序不对交换位置,次序对,不作任何操作,序不对交换位置,次序对,不作任何操作,N N个数,进行个数,进行N-1N-1次比较,最次比较,最小的数已放到最后。小的数已放到最后。(要比较要比较N-1N-1遍遍)
33、比较遍数比较遍数 1 2 3 N-3 N-2 N-1 1 2 3 N-3 N-2 N-1 比较次数比较次数:(N-1)+(N-2)+(N-3)+3 +2 +1=O(n(N-1)+(N-2)+(N-3)+3 +2 +1=O(n2 2)EX:8 5 16 84 32 EX:8 5 16 84 32 一遍一遍 8 16 84 32 5 8 16 84 32 5 二遍二遍 16 84 32 8 5 16 84 32 8 5 三遍三遍 84 32 16 8 5 84 32 16 8 5缺陷:大多数情况,数组缺陷:大多数情况,数组未比较未比较N-1N-1遍已达到目的,遍已达到目的,而程序必须进行而程序必须
34、进行N-1N-1遍操作遍操作。改进:设一个标志位,改进:设一个标志位,外循环为外循环为1 1,进入内循,进入内循环时,每交换一次置环时,每交换一次置0 0,每次内循环结束,每次内循环结束,标志位若为标志位若为0 0,进入下,进入下一次外循环,若为一次外循环,若为1 1,表示表示 已有序,立即结已有序,立即结束外循环。束外循环。外循环SAVE_CNT N标志 1SAVE_CNT SAVE_CNT-1SAVE_CNT=0?CX SAVE_CNT,DI 首址Ai+1=AiAi Ai+1,标志 0(CX)-1=0?标志=0?ENDYNNNYYN data segmentSave_cnt dw?Star
35、t_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:extraMain 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_
36、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 next cmp bx,0 je initStored:mov di,start_addr pop bx mov ah,4ch int 21hMain endpCode ends end start Lesson:补充作业补充作业1.有以下程序段有以下程序段FIBONA DW 40H DUP(?)NUM DB 10 .MOV CX,0 MOV CL,NUM
37、 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)=?