《第五章 基本程序设计技术.ppt》由会员分享,可在线阅读,更多相关《第五章 基本程序设计技术.ppt(107页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1,一般源程序的基本结构:,第五章 程序控制结构及其设计技术,顺序程序,分支程序,循环程序,子程序,2,5.1 顺序程序设计,顺序程序是指程序的结构从开始到结尾一直是顺序执行,中途没有分支。,例 5.2.1 试编写程序计算以下表达式: Z=(3X+Y-5)/2设X、Y的值放在字变量VARX、VARY中,结果存放在VARZ中。,算法分析: 1、乘2n和除2n可以使用算术左移和右移实现 2、其它非2n的乘除运算可以用移位和加减组合运算来实现。如 3X可以分解成2X+X,3,TITLE EQUATION COMPUTEDATA SEGMENTVARX DW 15VARY DW 10VARZ DW ?
2、DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP (0)STACK1 ENDSCODE SEGMENTPROC1 PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACK1,4,START:PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV AX,VARX SHL AX,1 ;2*X ADD AX,VARX ;3*X ADD AX,VARY ;3X+Y SUB AX,5 ;3*X+Y-5 SAR AX,1 ;(3*X+Y-5)/2 MOV VARZ,AX ;存结果 RETPROC
3、1 ENDPCODE ENDS END START,5,例5.2.2 利用学号查学生的数学成绩表。,算法分析:首先在数据段中建立一个成绩表TABLE,在表中各学生的成绩按照学号从小到大的顺序存放。要查的学号存放在变量NUM中,查表的结果放在变量MATH中。,6,TITLE TABLE LOOKUPDATA SEGMENTTABLE DB 81,78,90,64,85,76,93,82,57,80 DB 73,62,87,77,74,86,95,91,82,71NUM DB 8MATH DB ?DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STA
4、CK1 ENDSCOSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1,7,START: MOV AX,DATA MOV DS,AX MOV BX,OFFSET TABLE ;BX指向表首址 XOR AH,AH MOV AL,NUM DEC AL ;实际学号是从1开始的 ADD BX,AX ;BX加上学号指向要查的成绩 MOV AL,BX ;查到成绩送AL MOV MATH,AL ;存结果 MOV AH,4CH ;返回DOS INT 21HCOSEG ENDS END START,8,在上述程序中,如果使用换码指令XLAT,可以简化程序。,XLAT 表首
5、址 ;功能为:AL=(BX)+(AL),换码指令格式为:,其中表首址可以省略。,在XLAT指令执行前,要求将表首址的偏移量送入BX中,待查项与表首址之间的字节距离 (0255)送入AL中。,9,一.转移指令,目标是程序中的一个标号, 表示转移指令所转移的目的地指令的地址。,1. 无条件转移指令,5.2分支程序设计,分支程序结构是指程序的执行顺序将根据某些指令的执行结果,选择某些指令执行或不执行。,分支程序的实现主要是由转移指令完成。,格式: JMP 目标,10,: JMP TARGET :TARGET: . :,根据目标所在的位置,JMP指令分为段内转移和段间转移。,(1) 段内转移,JMP指
6、令与转移目标位于同一个代码段内。转移时IP寄存器内容被改变,而CS保持不变。,程序结构:,11,. JMP LABEL1 LABEL1: ,目标地址可以有两种提供方法:,A. 段内转移直接寻址- 指令中直接给出转移目的地标号,例如,. LABEL2: JMP LABEL2,或者,12,OPCODE DISP,指令编码:,OPCODE字段长度为一个字节, DISP字段根据OPCODE字段为不同编码时分别为1个或2个字节。 DISP 为相对位移量,用补码表示。,7 0 15/7 0,指令的功能为: IP =( IP )+ DISP,0EBH时,为短转移,DISP为8位,转移偏移量: -128+12
7、7 字节,OPCODE=,0E9H时,为长转移,DISP为16位,转移偏移量: -32768+32767,13,注意:转移偏移量是相对转移指令的下一条指令的起始地址,如果是相对于该转移指令的地址而言,则相对偏移量的值为:,-126+129字节,或,-32765+32770,14,OPCODE MOD 100 R/M 位移量,B. 段内转移间接寻址指令中指定一个16位通用寄存器或字存储单元,其内容为转移目标地址。,例如:JMP CX JMP WORD PTR BXSI,指令编码格式:,7 0 7 0 15/7 0,指令执行时,由MOD、R/M以及位移量确定一个寄存器或有效地址EA,将所指内容送入
8、IP中。,15,(2)段间转移JMP指令与目标地址不在同一个段内,COSEG1 SEGMENT COSEG2 SEGMENT : JMP FAR PTR TARGET TARGET:. : : COSEG1 ENDS COSEG2 ENDS,A、段间转移直接寻址,在JMP指令中,目标地址符前面加属性说明为FAR。,例如:,执行该转移指令,将同时改变CS和IP的内容。,16,7 0 7 0 7 0 7 0 7 0,OPCODE OFFSET-LOW OFFSET-HIGH SEG-LOW SEG-HIGH,指令执行时,将有: IP= 目标地址偏移量 CS=目标地址段基值,指令编码格式:,17,B
9、. 段间间接寻址目标地址存放在一个双字存储单元中低地址字单元内容为偏移量,高地址字单元内容为段基值。,指令编码格式:,指令执行时,将有: IP= (EA) EA字单元内容 CSB的情况为例进行分析。,22,AB可以分为以下几种情况:,1.A和B都为负数,若要AB,则A-B的结果一定是正数(SF=0),也不会发生溢出(OF=0),且结果不为零(ZF=0)。,2. A和B都为正数,若要AB,则A-B的结果一定是正数(SF=0),也不会发生溢出(OF=0),并且结果不为零(ZF=0)。,3.A为正数,B为负数,执行A-B的结果可能有两种情况:,(1)不发生溢出。这时结果为正数(SF=0),即有SF=
10、OF。,(2)发生溢出。这时结果变为负数(SF=1),即有SF=OF。,23,二、分支程序设计,分支程序的结构有两种常见结构:,1、用比较/测试指令+条件转移指令实现分支,比较指令:CMP DEST,SRC,该指令的功能与减法指令SUB相似,区别是(DEST)-(SRC)的差值不送入DEST。而其结果影响标志位。,24,这种类型的分支程序有两种结构,一条条件转移指令只能实现两条分支程序的设计。要实现更多条分支的程序,需使用多条条件转移指令。,25,例5.3.2 数据段的ARY数组中存放有10个无符号数,试找出其中最大者送入MAX单元。,算法分析:依次比较相邻两数的大小,将较大的送入AL中。每次
11、比较后,较大数存放在AL中,相当于较大的数往下传。比较一共要做9次。比较结束后,AL中存放的就是最大数。,26,DATA SEGMENTARY DB 17,5,40,0,67,12,34,78,32,10MAX DB ?DATA ENDS . MOV SI,OFFSET ARY ;SI指向ARY的第一个元素 MOV CX,9 ;CX作次数计数器 MOV AL,SI ;取第一个元素到ALLOP: INC SI ;SI指向后一个元素 CMP AL,SI ;比较两个数 JAE BIGER ;前元素后元素转移 MOV AL,SI ;取较大数到ALBIGER:DEC CX ;减1计数 JNZ LOP ;
12、未比较完转回去,否则顺序执行 MOV MAX,AL ;存最大数 .,27,例5.3.4 编写一程序,实现将存储器中的源数据块传送到目的数据块。,在存储器中两个数据块的存放有三种情况:两个数据块分离和有部分重叠。,28,三种相对位置情况的传送方法:,因此,我们设定:当源块首地址目的块首址的情况,必须从数据块首址开始传送。,对于源块与目的块有重叠且源块首址目的块首址的情况,必须从数据块末址开始传送。,29,SI=源数据块首址DI=目的数据块首址CX (DI) ?,形成末址SI=(SI)+(CX)-1DI=(DI)+(CX)-1,(DI)=(SI),SI=(SI)-1DI=(DI)-1,CX=(CX
13、)-1,(CX)=0?,(DI)=(SI),SI=(SI)+1DI=(DI)+1,CX目的块首址吗? JA TOP ;大于则转到TOP处,否则顺序执行 ADD SI,LENG-1 ;SI指向源块末址 ADD DI,LENG-1 ;DI指向目的块末址,32,BOTTOM: MOV AL,SI ;从末址开始传送 MOV DI, AL DEC SI DEC DI DEC CX JNE BOTTOM JMP END1 TOP: MOV AL,SI ;从首址开始传送 MOV DI,AL INC SI INC DI DEC CX JNE TOPEND1: MOV AH,4CH INT 21HCOSEG E
14、NDS END BEGIN,33,2、用跳转表形成多路分支,当程序的分支数量较多时,采用跳转表的方法可以使程序长度变短, 跳转表有两种构成方法:,(1)跳转表用入口地址构成,在程序中将各分支的入口地址组织成一个表放在数据段中,在程序中通过查表的方法获得各分支的入口地址。,34,例5.3.5 设某程序有10路分支,试根据变量N的值(110),将程序转移到其中的一路分支去。,设10路分支程序段的入口地址分别为:BRAN1、BRAN2.BRAN10。当变量N为1时,转移到BRAN1;N为2时,转移到BRAN2,依次类推。在跳转表中每两个字节存放一个入口地址的偏移量,如右图所示。,跳转表,程序中,先根
15、据N的值形成查表地址:(N-1)2+表首址。,35,开 始,BX=表首址,求查表地址:BX=(N-1)*2+(BX),获得入口地址:CX=(BX),(CX)=?,结 束,N=1,BRAN1,N=2,BRAN2,N=10,BRAN10,多路分支结构流程图,36,TITLE JUMP TABLE OF ADDRESSDATA SEGMENTATABLE DW BRAN1,BRAN2,BRAN3,.,BRAN10N DB 3DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDSCODE SEGMENT ASSUME CS:CODE,DS
16、:DATA,SS:STACK1START: MOV AX,DATA MOV DS,AX .,37,XOR AH,AHMOV AL,NDEC ALSHL AL,1MOV BX,OFFSET ATABLE ;BX指向表首址ADD BX,AX ;BX指向查表地址 MOV CX,BX ;将N对应的分支入口地址送到CX中JMP CX ;转移到N对应的分支入口地址,38,BRAN1: JMP END1BRAN2: JMP END1BRAN3: JMP END1 BRAN10:END1: MOV AH,4CH INT 21HCODE ENDS END START,39,跳转表的每一个项目就是一条无条件转移指
17、令。这时跳转表是代码段中的一段程序。,(2)跳转表用无条件转移指令构成,40,TITLE JUMP TABLE OF INSTRUCTIONDATA SEGMENTN DB 3DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1START: MOV AX,DATA MOV DS,AX . MOV BH,0 MOV BL,N,例 5.3.5的源程序可修改为如下程序:,41,DEC BL ;四条指令实现(N-1)*3MOV AL,BL SHL
18、BL,1ADD BL,ALADD BX,OFFSET ITABLE ;BX指向查表地址JMP BX ;转移到N对应的JMP指令JMP BRAN1 ;JMP指令构成的跳转表JMP BRAN2JMP BRAN3 : :JMP BRAN10,ITABLE:,42,BRAN1: . : JMP END1BRAN2: . : JMP END1 : :BRAN10: . : :END1: MOV AH,4CH INT 21HCODE ENDS END START,43,8086/8088指令系统中有4条循环控制指令,长度都是2字节。,指令使用CX寄存器做循环计数。循环控制指令的执行对标志位没有影响。,DI
19、SP:8位补码表示本指令的下一条指令的首址与目标单元之间的字节距离。,指令中指定一定的条件,若条件满足,则将DISP加入到IP中,即IP=(IP)+DISP使程序转移到目的指令执行。,5.3 循环程序设计,一、循环控制指令,指令编码格式为:,44,其中目标是程序中的一个标号。 执行一次LOOP指令将使:CX = (CX)1若(CX)0,则转到目标处执行,否则顺序执行。,例 5.4.1 在例5.3.2中, 数据段的ARY数组中存放有10个无符号数,试找出其中最大者送入MAX单元。若使用循环指令,则程序可修改如下:,1、LOOP指令,格式: LOOP 目标,45,DATA SEGMENTARY D
20、B 17,5,40,0,67,12,34,78,32,10MAX DB ?DATA ENDS . MOV SI,OFFSET ARY ;SI指向ARY的第一个元素 MOV CX,9 ;CX作次数计数器 MOV AL,SI ;取第一个元素到ALLOP: INC SI ;SI指向后一个元素 CMP AL,SI ;比较两个数 JAE BIGER ;前元素后元素转移 MOV AL,SI ;取较大数到ALBIGER:DEC CX ;减1计数 JNZ LOP ;未比较完转回去,否则顺序执行 MOV MAX,AL ;存最大数 .,LOOP LOP,46,指令执行:CX = (CX) 1,若(CX) 0且ZF
21、=1,则转到目标处执行,否则顺序执行。,例 5.4.2 编写一程序,在一字符串中查找第一个非空格字符,并将其在字符串中的序号(1n)送入INDEX单元中。若未找到,则将INDEX单元置为全1。,2、LOOPE / LOOPZ指令,格式:LOOPE 目标 或 LOOPZ 目标,47,设置地址指针初值 BX= -1CX=传送的字节数,(CX)!=0且 STRGBX= ?,比较STRGBX与空格 ,BL=0FEH,BX=(BX)+1,CX=(CX) -1,STRGBX!= ?,结 束,Y,N,开始,N,BL=(BL)+1,存结果:INDEX=(BL),Y,MOV CX,LENGMOV BX,1,IN
22、C BX,CMP STRGBX, ,LOOPE NEXT,NEXT,JNZ FOUND,FOUND,MOV BL, 0FEH,INC BL,MOV INDEX,BL,48,DATA SEGMENTSTRG DB CHECK NO_SPACE LENG EQU $STRGINDEX DB ?DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDS,49,CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1START: MOV AX,DATA MOV DS,AX MOV CX,LENG ;字符串长度
23、送入CX MOV BX,1 ;设地址指针初值NEXT: INC BX CMP STRGBX, LOOPE NEXT ;是空格字符且计数不为0,继续查找 JNZ FOUND ;找到非空格字符,转FOUND MOV BL,0FEH ;未找到非空格字符FOUND: INC BL ;使位置序号从1开始 MOV INDEX,BL ;存结果 MOV AH,4CH INT 21HCODE ENDS END START,50,指令执行:CX = (CX) 1,若(CX) 0且ZF=0,则转到目标处执行,否则顺序执行。,例 5.4.3 编写程序,计算两个字节数组ARY1和ARY2对应元素之和,一直计算到两数之和
24、为0或数组结束为止。并将和存入数组SUM中,将该数组的长度存放在NUM单元中。,3、LOOPNE / LOOPNZ指令,使用格式:LOOPNE 目标 或 LOOPNZ 目标,51,设置地址指针初值 BX= -1CX=某个数组的长度,(CX)!=0且 SUMBX!=0?,SUMBX=ARY1BX+ARY2BX,BL=(BL)+1,BX=(BX)+1,CX=(CX) -1,SUMBX=0?,结 束,Y,N,开始,N,存结果:NUM=(BL),Y,INC BL,MOV CX,LENG MOV BX,1,INC BX,MOV AL,ARY1BX ADD AL,ARY2BXMOV SUMBX,AL,LO
25、OPNE NZERO,JZ ZERO,MOV NUM,BL,NZERO,ZERO,52,源程序如下:DATA SEGMENTARY1 DB 12,10,3,5,-1,7,34,8,9,10ARY2 DB 14,23,6,-2,1,9,45,21,8,24LENG EQU ARY2-ARY1SUM DB LENG DUP(?)NUM DB ?DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1BEGIN: MOV AX,DATA,53,MOV
26、 DS,AX MOV CX,LENG MOV BX,1 ;设置指针初值NZERO: INC BX MOV AL,ARY1BX ;取被加数 ADD AL,ARY2BX MOV SUMBX,AL LOOPNE NZERO ;和不为0转到NZERO处 JZ ZERO ;和为0转到ZERO处 INC BLZERO: MOV NUM,BL ;存结果 MOV AH,4CH INT 21HCODE ENDS END BEGIN,54,4、JCXZ指令,指令格式:JCXZ 目标,该指令测试CX的内容是否为0,如果(CX)=0,则转移到目标处指令,否则顺序执行。,该指令相当于条件转移指令。它一般用在一个循环的开
27、始,当一个循环的循环次数为0时,就不执行该循环。如果没有这个控制,将使得循环次数变得非常大(0-1=0FFFFH),从而产生错误结果。,55,程序结构为: . MOV CX,COUNT JCXZ NEXTLOP: . LOOP LOPNEXT: .,56,二、循环程序的结构,循环程序有两种结构形式,1、先执行后判断结构,2、先判断后执行结构,57,在循环程序中主要包括以下四个部分:,用于建立循环的初始状态。包括:循环次数计数器、地址指针以及其他循环参数的初始设定。,循环程序完成的主要任务。包括工作部分和修改部分。工作部分:是完成循环程序任务的主要程序段。修改部分:为循环的重复执行,完成某些参数
28、的修改。,1、初始化部分,2、循环体,58,判断循环条件是否成立。可以有以下两种判断方法:(1)用计数控制循环循环次数已知 (2)用条件控制循环循环次数未知,处理循环结束后的结果。如存储结果等。,3、循环控制部分,4、结束处理部分,59,三、单重循环程序设计,单重循环程序的循环体由顺序结构或分支结构组成,常选用CX作计数器,可选用LOOP、LOOPE或LOOPNE等循环控制指令。,1、计数控制循环,60,由于循环体中有“+”和“-”两种可能的运算,通过设置标志0和1来判断。八个运算表达式由8位逻辑尺:10011010B来识别。,例 5.4.4 设有两个数组X和Y,它们都有8个元素,其元素按下标从小到大的顺序存放在数据段中。试编写程序完成下列计算:Z1=X1+Y1 Z2=X2-Y2 Z3=X3+Y3 Z4=X4-Y4 Z5=X5-Y5 Z6=X6+Y6Z7=X7+Y7 Z8=X8-Y8,MOV CX,LEN MOV SI,0,MOV BL,LOGR,SHR BL,1,JC SUB1,INC SI,LOOP LOP,MOV AL,XSISUB AL,YSI,MOV AL,XSIADD AL,YSI,