版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一般源程序的基本结构:一般源程序的基本结构:第五章第五章 程序控制结构及其设计技术程序控制结构及其设计技术顺序程序顺序程序分支程序分支程序循环程序循环程序子程序子程序5.1 5.1 顺序程序设计顺序程序设计 顺序程序是指程序的结构从开始到结尾一直是顺序执行,中顺序程序是指程序的结构从开始到结尾一直是顺序执行,中途没有分支。途没有分支。例例 5.2.1 试编写程序计算以下表达式试编写程序计算以下表达式: Z=(3X+Y-5)/2设设X、Y的值放在字变量的值放在字变量VARX、VARY中,结果存放在中,结果存放在VARZ中。中。算法分析:算法分析: 1、乘、乘2n和除和除2n可以使用算术左移和右移
2、实现可以使用算术左移和右移实现 2、其它非、其它非2n的乘除运算可以用移位和加减组合的乘除运算可以用移位和加减组合运算来实现。如运算来实现。如 3X可以分解成可以分解成2X+XTITLE EQUATION COMPUTEDATA SEGMENTVARX DW 15VARY DW 10VARZ DW ?DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP (0)STACK1 ENDSCODE SEGMENTPROC1 PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACK1START:PUSH DS MOV AX,0 PUSH AX
3、 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 ;存结果;存结果 RETPROC1 ENDPCODE ENDS END START 例例5.2.2 利用学号查学生的数学成绩表。利用学号查学生的数学成绩表。算法分析:首先在数据段中建立一个成绩表算法分析:首先在数据段中建立一个成绩表TABLE,在表中各学生的成绩按照学号从小到大,在表中各学生的成绩按照学号从小到大的顺序存放
4、。要查的学号存放在变量的顺序存放。要查的学号存放在变量NUM中,查中,查表的结果放在变量表的结果放在变量MATH中。中。 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)STACK1 ENDSCOSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1START: MOV AX,D
5、ATA 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在上述程序中,如果使用换码指令在上述程序中,如果使用换码指令XLAT,可以简化程序。,可以简化程序。XLAT 表首址表首址 ;功能为:;功能为:
6、AL=(BX)+(AL)换码指令格式为:换码指令格式为:其中表首址可以省略。其中表首址可以省略。在在XLAT指令执行前,要求将表首址的偏移量送入指令执行前,要求将表首址的偏移量送入BX中,待中,待查项与表首址之间的字节距离查项与表首址之间的字节距离 (0255)送入送入AL中。中。一一.转移指令转移指令 目标是程序中的一个标号目标是程序中的一个标号, 表示转移指令所转移的目的地表示转移指令所转移的目的地指令的地址。指令的地址。1. 无条件转移指令无条件转移指令5.2分支程序设计 分支程序结构是指程序的执行顺序将根据某些指令的执分支程序结构是指程序的执行顺序将根据某些指令的执行结果,选择某些指令
7、执行或不执行。行结果,选择某些指令执行或不执行。分支程序的实现主要是由转移指令完成。分支程序的实现主要是由转移指令完成。格式格式: JMP 目的目的 : JMP TARGET :TARGET: . : 根据目标所在的位置,根据目标所在的位置,JMP指令分为段内转移和段间转移。指令分为段内转移和段间转移。(1) 段内转移段内转移 JMP指令与转移目标位于同一个代码段内。转移时指令与转移目标位于同一个代码段内。转移时IP寄存器内容被改变,而寄存器内容被改变,而CS保持不变。保持不变。程序结构:程序结构: . JMP LABEL1 LABEL1: 目标地址可以有两种提供方法:目标地址可以有两种提供方
8、法:A. 段内转移直接寻址段内转移直接寻址- 指令中直接给出转移目的地标号指令中直接给出转移目的地标号例如例如 . LABEL2: JMP LABEL2或者或者OPCODE DISP指令编码指令编码: OPCODE字段长度为一个字节字段长度为一个字节, DISP字段根据字段根据OPCODE字段字段为不同编码时分别为为不同编码时分别为1个或个或2个字节。个字节。 DISP 为相对位移量,用补为相对位移量,用补码表示。码表示。 7 0 15/7 0指令的功能为:指令的功能为: IP =( IP )+ DISP 0EBH时,为短转移,时,为短转移,DISP为为8位,转移偏移量:位,转移偏移量: -1
9、28+127 字节字节OPCODE= 0E9H时,为长转移,时,为长转移,DISP为为16位,转移偏移量:位,转移偏移量: -32768+32767注意:转移偏移量是相对转移指令的下一条指令的起始地址注意:转移偏移量是相对转移指令的下一条指令的起始地址如果是相对于该转移指令的地址而言,则相对偏移量的值为:如果是相对于该转移指令的地址而言,则相对偏移量的值为:-126+129字节字节或或-32765+32770OPCODE MOD 100 R/M 位移量位移量 B. 段内转移间接寻址段内转移间接寻址指令中指定一个指令中指定一个16位通用寄存器位通用寄存器或字存储单元,其内容为转移目标地址。或字存
10、储单元,其内容为转移目标地址。例如:例如:JMP CX JMP WORD PTR BXSI指令编码格式:指令编码格式:7 0 7 0 15/7 0指令执行时,由指令执行时,由MOD、R/M以及位移量确定一个寄存器以及位移量确定一个寄存器或有效地址或有效地址EA,将所指内容送入,将所指内容送入IP中。中。IP=(通用寄存器)通用寄存器)或或IP=(EA)(2段间转移段间转移JMP指令与目标地址不在同一个段内指令与目标地址不在同一个段内COSEG1 SEGMENT COSEG2 SEGMENT : JMP FAR PTR TARGET TARGET:. : : COSEG1 ENDS COSEG2
11、 ENDSA、段间转移直接寻址、段间转移直接寻址在在JMP指令中,目标地址符前面加属性说明为指令中,目标地址符前面加属性说明为FAR。例如:例如:执行该转移指令,将同时改变执行该转移指令,将同时改变CS和和IP的内容。的内容。7 0 7 0 7 0 7 0 7 0 OPCODE OFFSET-LOW OFFSET-HIGH SEG-LOW SEG-HIGH 指令执行时,将有:指令执行时,将有: IP= 目标地址偏移量目标地址偏移量 CS=目标地址段基值目标地址段基值指令编码格式:指令编码格式:B. 段间间接寻址段间间接寻址目标地址存放在一个双字存储单元中目标地址存放在一个双字存储单元中低地址字
12、单元内容为偏移量,高地址字单元内容为段基值。低地址字单元内容为偏移量,高地址字单元内容为段基值。 指令编码格式:指令编码格式:OPCODE MOD 1 0 1 R/M 位移量位移量 7 0 7 6 5 4 3 2 1 0 15/7 0指令执行时,将有:指令执行时,将有: IP= (EA) EA字单元内容字单元内容 CS B 转移转移 JAE / JNB CF=0 或或 ZF=1 A B 转移转移 JB /JNAE CF=1 且且 ZF=0 A B 转移转移 JGE / JNL SF=OF 或或 ZF=1 A B 转移转移 JL / JNGE SFOF 且且 ZF=0 A B的情况为例进的情况为
13、例进行分析。行分析。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
14、=0),即有),即有SF=OF。(2发生溢出。这时结果变为负数发生溢出。这时结果变为负数SF=1),即有),即有SF=OF。二、分支程序设计二、分支程序设计分支程序的结构有两种常见结构:分支程序的结构有两种常见结构:1、用比较、用比较/测试指令测试指令+条件转移指令实现分支条件转移指令实现分支比较指令:比较指令:CMP DEST,SRC 该指令的功能与减法指令该指令的功能与减法指令SUB相似,区别是相似,区别是(DEST)-(SRC)的差值不送入的差值不送入DEST。而其结果影响标志位。而其结果影响标志位。这种类型的分支程序有两种结构这种类型的分支程序有两种结构比较比较/测试测试判定条件判定条
15、件程序段程序段1程序段程序段2满足满足不满足不满足比较比较/测试测试判定条件判定条件程序段程序段满足满足不满足不满足 一条条件转移指令只能实现两条分支程序的设计。要一条条件转移指令只能实现两条分支程序的设计。要实现更多条分支的程序,需使用多条条件转移指令。实现更多条分支的程序,需使用多条条件转移指令。 例例5.3.2 数据段的数据段的ARY数组中存放有数组中存放有10个无符号数,个无符号数,试找出其中最大者送入试找出其中最大者送入MAX单元。单元。算法分析:算法分析:依次比较相邻两数的大小,将较大的送入依次比较相邻两数的大小,将较大的送入AL中。中。每次比较后,较大数存放在每次比较后,较大数存
16、放在AL中,相当于较大的数往下中,相当于较大的数往下传。传。比较一共要做比较一共要做9次。次。比较结束后,比较结束后,AL中存放的就是最大数。中存放的就是最大数。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 BI
17、GER ;前元素;前元素后元素转移后元素转移 MOV AL,SI ;取较大数到;取较大数到ALBIGER:DEC CX ;减;减1计数计数 JNZ LOP ;未比较完转回去,否则顺序执行;未比较完转回去,否则顺序执行 MOV MAX,AL ;存最大数;存最大数 . 例例5.3.4 编写一程序,实现将存储器中的源数据块传送到目编写一程序,实现将存储器中的源数据块传送到目的数据块。的数据块。两个数据块分离两个数据块分离目的块目的块源块源块0可以从首址或末可以从首址或末址开始传送址开始传送源块首址源块首址 目的块首址目的块首址目的块目的块源块源块0必须从数据块必须从数据块首址开始传送首址开始传送 在
18、存储器中两个数据块的存放有三种情况:两个数据块分在存储器中两个数据块的存放有三种情况:两个数据块分离和有部分重叠。离和有部分重叠。三种相对位置情况的传送方法:三种相对位置情况的传送方法:因而,我们设定:当源块首地址因而,我们设定:当源块首地址目的块首址的情目的块首址的情况,必须从数据块首址开始传送。况,必须从数据块首址开始传送。 对于源块与目的块有重叠且源块首址对于源块与目的块有重叠且源块首址目的块首址的情目的块首址的情况,必须从数据块末址开始传送。况,必须从数据块末址开始传送。SI=源数据块首址源数据块首址DI=目的数据块首址目的数据块首址CX (DI) ?形成末址形成末址SI=(SI)+(
19、CX)-1DI=(DI)+(CX)-1(DI)=(SI)SI=(SI)-1DI=(DI)-1CX=(CX)-1(CX)=0?(DI)=(SI)SI=(SI)+1DI=(DI)+1CX目的块首址吗?目的块首址吗? JA TOP ;大于则转到大于则转到TOP处,否则顺序执行处,否则顺序执行 ADD SI,LENG-1 ;SI指向源块末址指向源块末址 ADD DI,LENG-1 ;DI指向目的块末址指向目的块末址BOTTOM: MOV AL,SI ;从末址开始传送从末址开始传送 MOV DI, AL DEC SI DEC DI DEC CX JNE BOTTOM JMP END1 TOP: MOV
20、AL,SI ;从首址开始传送从首址开始传送 MOV DI,AL INC SI INC DI DEC CX JNE TOPEND1: MOV AH,4CH INT 21HCOSEG ENDS END BEGIN2、用跳转表形成多路分支、用跳转表形成多路分支当程序的分支数量较多时,采用跳转表的方法可以使程序当程序的分支数量较多时,采用跳转表的方法可以使程序长度变短,长度变短, 跳转表有两种构成方法:跳转表有两种构成方法:(1跳转表用入口地址构成跳转表用入口地址构成 在程序中将各分支的入口地址组织成一个表放在数据段在程序中将各分支的入口地址组织成一个表放在数据段中,在程序中通过查表的方法获得各分支的
21、入口地址。中,在程序中通过查表的方法获得各分支的入口地址。例例5.3.5 设某程序有设某程序有10路分支,试根据变量路分支,试根据变量N的值的值110),),将程序转移到其中的一路分支去。将程序转移到其中的一路分支去。设设10路分支程序段的入口地址分别为:路分支程序段的入口地址分别为:BRAN1、BRAN2.BRAN10。当变量当变量N为为1时,转移到时,转移到BRAN1;N为为2时,转移到时,转移到BRAN2,依次类推。,依次类推。在跳转表中每两个字节存放一个入口地在跳转表中每两个字节存放一个入口地址的偏移量,如右图所示。址的偏移量,如右图所示。跳转表跳转表程序中,先根据程序中,先根据N的值
22、形成查表地址:的值形成查表地址:(N-1)2+表首址。表首址。开开 始始BX=表首址表首址求查表地址:求查表地址:BX=(N-1)*2+(BX)获得入口地址:获得入口地址:CX=(BX)(CX)=? 结结 束束N=1BRAN1N=2BRAN2N=10BRAN10多路分支结构流程图多路分支结构流程图 TITLE JUMP TABLE OF ADDRESSDATA SEGMENTATABLE DW BRAN1,BRAN2,BRAN3,.,BRAN10N DB 3DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP0)STACK1 ENDSCODE SEGMEN
23、T ASSUME CS:CODE,DS:DATA,SS:STACK1START: MOV AX,DATA MOV DS,AX . XOR AH,AHMOV AL,NDEC ALSHL AL,1MOV BX,OFFSET ATABLE ;BX指向表首址指向表首址ADD BX,AX ;BX指向查表地址指向查表地址 MOV CX,BX ;将;将N对应的分支入口地址送到对应的分支入口地址送到CX中中JMP CX ;转移到;转移到N对应的分支入口地址对应的分支入口地址BRAN1: JMP END1BRAN2: JMP END1BRAN3: JMP END1 BRAN10:END1: MOV AH,4CH
24、 INT 21HCODE ENDS END START 跳转表的每一个项目就是一条无条件转移指令。跳转表的每一个项目就是一条无条件转移指令。这时跳转表是代码段中的一段程序。这时跳转表是代码段中的一段程序。(2跳转表用无条件转移指令构成跳转表用无条件转移指令构成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,DAT
25、A MOV DS,AX . MOV BH,0 MOV BL,N 例例 5.3.5的源程序可修改为如下程序:的源程序可修改为如下程序:DEC BL ;四条指令实现四条指令实现(N-1)*3MOV AL,BL SHL BL,1ADD BL,ALADD BX,OFFSET ITABLE ;BX指向查表地址指向查表地址JMP BX ;转移到转移到N对应的对应的JMP指令指令JMP BRAN1 ;JMP指令构成的跳转表指令构成的跳转表JMP BRAN2JMP BRAN3 : :JMP BRAN10ITABLE:BRAN1: . : JMP END1BRAN2: . : JMP END1 : :BRAN1
26、0: . : :END1: MOV AH,4CH INT 21HCODE ENDS END START8086/8088指令系统中有指令系统中有4条循环控制指令,长度都是条循环控制指令,长度都是2字节。字节。 OPCODE DISP 7 0 7 0 指令使用指令使用CX寄存器做循环计数。循环控制指令寄存器做循环计数。循环控制指令的执行对标志位没有影响。的执行对标志位没有影响。 DISP:8位补码表示本指令的下一条指令的首址位补码表示本指令的下一条指令的首址与目标单元之间的字节距离。与目标单元之间的字节距离。 指令中指定一定的条件,若条件满足,则将指令中指定一定的条件,若条件满足,则将DISP加
27、入到加入到IP中,即中,即IP=(IP)+DISP使程序转移到目的指使程序转移到目的指令执行。令执行。5.3 循环程序设计循环程序设计一、循环控制指令一、循环控制指令指令编码格式为:指令编码格式为:其中目标是程序中的一个标号。其中目标是程序中的一个标号。 执行一次执行一次LOOP指令将使:指令将使:CX = (CX)1假设假设CX)0,则转到目标处执行,否则顺序执行。,则转到目标处执行,否则顺序执行。 例例 5.4.1 5.4.1 在例在例.2中,中, 数据段的数据段的ARYARY数组中存放数组中存放有有1010个无符号数,试找出其中最大者送入个无符号数,试找出其中最大者送入M
28、AXMAX单元。若单元。若使用循环指令,则程序可修改如下:使用循环指令,则程序可修改如下:1、LOOP指令指令格式:格式: LOOP 目的目的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 ;前元素;前
29、元素后元素转移后元素转移 MOV AL,SI ;取较大数到;取较大数到ALBIGER:DEC CX ;减;减1计数计数 JNZ LOP ;未比较完转回去,否则顺序执行;未比较完转回去,否则顺序执行 MOV MAX,AL ;存最大数;存最大数 .LOOP LOP指令执行:指令执行:CX = (CX) 1,假设,假设(CX) 0且且ZF=1,则转到目,则转到目标处执行,否则顺序执行。标处执行,否则顺序执行。 例例 5.4.2 5.4.2 编写一程序,在一字符串中查找第一个非空格编写一程序,在一字符串中查找第一个非空格字符,并将其在字符串中的序号字符,并将其在字符串中的序号1 1n)n)送入送入IN
30、DEXINDEX单元中。单元中。若未找到,则将若未找到,则将INDEXINDEX单元置为全单元置为全1 1。2、LOOPE / LOOPZ指令指令格式:格式:LOOPE 目的目的 或或 LOOPZ 目的目的设置地址指针初值设置地址指针初值 BX= -1CX=传送的字节数传送的字节数(CX)!=0且且 STRGBX= ?比较比较STRGBX与空格与空格 BL=0FEHBX=(BX)+1CX=(CX) -1STRGBX!= ?结结 束束YN开场开场NBL=(BL)+1存结果:存结果:INDEX=(BL)YMOV CX,LENGMOV BX,1INC BXCMP STRGBX, LOOPE NEXT
31、NEXTJNZ FOUNDFOUNDMOV BL, 0FEHINC BLMOV INDEX,BLDATA SEGMENTSTRG DB CHECK NO_SPACE LENG EQU $STRGINDEX DB ?DATA 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 CX,LENG ;字符串长度送入字符串长度送入CX MOV BX,1 ;设地址指针初值设地址指针初值NEXT:
32、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 指令执行:指令执行:CX = (CX) 1,假设,假设(CX) 0且且ZF=0,则转到目标处执行,否则顺序执行。则转到目标处执行,否则顺序执行。 例例 5.4.3
33、 5.4.3 编写程序,计算两个字节数组编写程序,计算两个字节数组ARY1ARY1和和ARY2ARY2对应元素之和,一直计算到两数之和为对应元素之和,一直计算到两数之和为0 0或数组结束为止。或数组结束为止。并将和存入数组并将和存入数组SUMSUM中,将该数组的长度存放在中,将该数组的长度存放在NUMNUM单元中。单元中。3、LOOPNE / LOOPNZ指令指令使用格式:使用格式:LOOPNE 目的目的 或或 LOOPNZ 目的目的设置地址指针初值设置地址指针初值 BX= -1CX=某个数组的长度某个数组的长度(CX)!=0且且 SUMBX!=0?SUMBX=ARY1BX+ARY2BXBL=
34、(BL)+1BX=(BX)+1CX=(CX) -1SUMBX=0?结结 束束YN开场开场N存结果:存结果:NUM=(BL)YINC BLMOV CX,LENG MOV BX,1INC BXMOV AL,ARY1BX ADD AL,ARY2BXMOV SUMBX,ALLOOPNE NZEROJZ ZEROMOV NUM,BLNZEROZERO源程序如下:源程序如下: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
35、DB ?DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1BEGIN: MOV AX,DATA MOV 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
36、BLZERO: MOV NUM,BL ;存结果;存结果 MOV AH,4CH INT 21HCODE ENDS END BEGIN4、JCXZ指令指令指令格式:指令格式:JCXZ 目的目的 该指令测试该指令测试CX的内容是否为的内容是否为0,假如,假如CX)=0,则转,则转移到目标处指令,否则顺序执行。移到目标处指令,否则顺序执行。 该指令相当于条件转移指令。它一般用在一个循环的该指令相当于条件转移指令。它一般用在一个循环的开始,当一个循环的循环次数为开始,当一个循环的循环次数为0时,就不执行该循环。时,就不执行该循环。如果没有这个控制,将使得循环次数变得非常大如果没有这个控制,将使得循环次数
37、变得非常大0-1=0FFFFH),从而产生错误结果。),从而产生错误结果。程序结构为:程序结构为: . MOV CX,COUNT JCXZ NEXTLOP: . LOOP LOPNEXT: . 二、循环程序的结构二、循环程序的结构循环程序有两种结构形式循环程序有两种结构形式1、先执行后判断结构、先执行后判断结构2、先判断后执行结构、先判断后执行结构循环初始化部分循环初始化部分循循 环环 体体控制条件控制条件结束处理部分结束处理部分NY循环初始化部分循环初始化部分控制条件控制条件结束处理部分结束处理部分循循 环环 体体NY在循环程序中主要包括以下四个部分:在循环程序中主要包括以下四个部分: 用于
38、建立循环的初始状态。包括:循环次数计数器、用于建立循环的初始状态。包括:循环次数计数器、地址指针以及其他循环参数的初始设定。地址指针以及其他循环参数的初始设定。 循环程序完成的主要任务。包括工作部分和修改部分。循环程序完成的主要任务。包括工作部分和修改部分。工作部分:是完成循环程序任务的主要程序段。工作部分:是完成循环程序任务的主要程序段。修改部分:为循环的重复执行,完成某些参数的修改。修改部分:为循环的重复执行,完成某些参数的修改。1、初始化部分、初始化部分2、循环体、循环体 判断循环条件是否成立。可以有以下两种判断方法:判断循环条件是否成立。可以有以下两种判断方法:(1用计数控制循环用计数
39、控制循环循环次数已知循环次数已知 (2用条件控制循环用条件控制循环循环次数未知循环次数未知处理循环结束后的结果。如存储结果等。处理循环结束后的结果。如存储结果等。3、循环控制部分、循环控制部分4、结束处理部分、结束处理部分三、单重循环程序设计三、单重循环程序设计单重循环程序的循环体由顺序结构或分支结构组成单重循环程序的循环体由顺序结构或分支结构组成常选用常选用CX作计数器,可选用作计数器,可选用LOOP、LOOPE或或LOOPNE等循环控制指令。等循环控制指令。1、计数控制循环、计数控制循环 由于循环体中有由于循环体中有“+”和和“-”两种两种可能的运算,通过设置标志可能的运算,通过设置标志0
40、和和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开场开场初始化:置指针初始化:置指针SI=0; CX=计数初值计数初值BL=逻辑尺逻辑尺BL右移一位到右移一位到CFCF=?Xi
41、YiXi+YiZi=结果结果修改指针:修改指针:SI=(SI)+1CX= (CX)-1(cx)=0?完毕完毕=1=0NYMOV CX,LEN MOV SI,0MOV BL,LOGRSHR BL,1JC SUB1INC SILOOP LOPMOV AL,XSISUB AL,YSIMOV AL,XSIADD AL,YSIMOV ZSI,ALDATA SEGMENTX DB 0A2H,7CH,34H,9FH,0F4H,10H,39H,5BHY DB 14H,05BH,28H,7AH,0EH,13H,46H,2CHLEN EQU $ YZ DB LEN DUP(?)LOGR DB 10011010BD
42、ATA ENDSSTACK0 SEGMENT PARA STACK DW 20H DUP(0)STACK0 ENDSCOSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK0BEGIN: MOV AX,DATA MOV DS,AX MOV CX,LEN ;初始化计数器;初始化计数器 MOV SI,0 ;初始化指针;初始化指针 MOV BL,LOGR ;初始化逻辑尺初始化逻辑尺LOP: MOV AL,XSI SHR BL,1 ;标志位送标志位送CF JC SUB1 ;为;为1,转做减法,转做减法 ADD AL,YSI ;为;为0,做加法,做加法 JMP RES
43、SUB1: SUB AL,YSIRES: MOV ZSI,AL ;存结果;存结果 INC SI ;修改指针;修改指针 LOOP LOP MOV AH,4CH INT 21HCOSEG ENDS END BEGIN2、条件控制循环、条件控制循环 例例 5.4.5 编写一程序,将字编写一程序,将字单元单元VARW 中含中含1的个数统计出的个数统计出来,存入来,存入CONT单元中。单元中。 本例中通过将字单元各位逐本例中通过将字单元各位逐位移入最高位来判断。为了减位移入最高位来判断。为了减少循环次数,循环中加上了判少循环次数,循环中加上了判断各位是否全为断各位是否全为0,这样可使低,这样可使低位为全
44、位为全0时的循环次数减少。时的循环次数减少。MOV CL,0MOV AX,VARWTEST AX,0FFFFHJZ END0JNS SHIFTSHL AX,1JMP LOPMOV CONT,CLINC CL开开 始始计数器计数器CL置置0AX= (VARW)(AX)=0?计计1的个数:的个数:CL= (CL)+1AX左移一位左移一位存结果存结果:CUNT= (CL)结结 束束(AX)15=1?YNNYEND0SHIFTLOPDATA SEGMENTVARW DW 1101010010001000BCONT DB ?DATA ENDSSTACK1 SEGMENT PARA STACK DW 20
45、H DUP(0)STACK1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1BEGIN: MOV AX,DATA MOV DS,AX MOV CL,0 MOV AX,VARWLOP: TEST AX,0FFFFH ;测试;测试AX是否为是否为0 JZ END0 ;为;为0,循环结束,循环结束 JNS SHIFT ;判最高位,为;判最高位,为0则转则转SHIFT INC CL ;最高位为;最高位为1,计数,计数 SHIFT: SHL AX,1 JMP LOPEND0: MOV CONT,CL ;存结果;存结果 MOV AH,4CH INT 21
46、HCODE ENDS END BEGIN四、多重循环程序设计四、多重循环程序设计 多重循环结构是指循环程序多重循环结构是指循环程序的循环体中又包含了另一个循环的循环体中又包含了另一个循环 例例5.4.6 编写一程序,求编写一程序,求级数级数12+22+32+的前的前N项项和。和。 对于对于N2的计算采用连加的的计算采用连加的方法,即是:方法,即是:N2 =NN=N+N+N N 本题程序采用双重循环。本题程序采用双重循环。内循环计算级数各项的值,内循环计算级数各项的值,外循环计算各级数项之和。外循环计算各级数项之和。MOV DX,0MOV CX,0MOV CL,NMOV AX,0MOV BX,C
47、XADD AX,CXDEC BXJNZ LOP2ADD DX,AXLOOP LOP1开场开场外循环初始化:外循环初始化:DX=0CX= 级数项数级数项数N内循环初始化:内循环初始化: AX=0BX=(CX)求级数项:求级数项:AX=(AX)+(CX)BX= (BX)-1(BX)=0?求级数和求级数和:DX=(DX)+(AX)CX= (CX)-1(CX)=0?存结果:存结果:SUM= (DX)结结 束束NYNYLOP2LOP1MOV SUM,DXDATA SEGMENTSUM DW ?N DB 20DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)S
48、TACK1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1START: MOV AX,DATA MOV DS,AX MOV DX,0 MOV CX,0 MOV CL,N ;设置外循环次数设置外循环次数LOP1: MOV AX,0 MOV BX,CX;设置内循环次数;设置内循环次数LOP2: ADD AX,CX;求级数项的值;求级数项的值 DEC BX JNZ LOP2;BX计数不为计数不为0,继续内循环,继续内循环 ADD DX,AX ;累加级数项;累加级数项 LOOP LOP1;CX计数不为计数不为0,继续循环,继续循环 MOV SUM,D
49、X;存级数和;存级数和 MOV AH,4CH INT 21HCODE ENDS END START5.4 子程序设计子程序设计子程序在一个程序的不同的地方需要多次使用的某子程序在一个程序的不同的地方需要多次使用的某个程序段,将其进行独立编制。个程序段,将其进行独立编制。调用与返回:在主程序中需要使用该功能时,就转移到调用与返回:在主程序中需要使用该功能时,就转移到子程序执行,执行完后又返回原程序继续执行。这样的子程序执行,执行完后又返回原程序继续执行。这样的程序结构称为子程序设计。程序结构称为子程序设计。一、调用与返回指令一、调用与返回指令1、子程序的调用与返回、子程序的调用与返回 在汇编语言
50、中,子程序是以在汇编语言中,子程序是以“过程的形式表示。过程的形式表示。根据被调用过程与调用程序是否在同一个段内,可以根据被调用过程与调用程序是否在同一个段内,可以分为两种情况。分为两种情况。主程序与子程序同在一个段内。这时,子程序的调用与返主程序与子程序同在一个段内。这时,子程序的调用与返回只需修改指令指针回只需修改指令指针IP。CODEA SEGMENT . CALL PROCAAAA: . .PROCA PROC . RET .PROCA ENDP .CODEA ENDS(1段内调用与返回段内调用与返回 右图中指令右图中指令CALL PROCA就是段内调用。就是段内调用。下面下面CODE
51、B段中的段中的CALL FAR PTR PROCB就是段就是段间调用。间调用。CODEA SEGMENT CODEB SEGMENT . .PROCB PROC . CALL FAR PTR PROCB . BBB: . RETPROCB ENDP CODEB ENDS .CODEA ENDS(2段间调用与返回段间调用与返回调用指令与子程序分别在不同的段,这时,需要同调用指令与子程序分别在不同的段,这时,需要同时修改时修改CS和和IP。 两者都是无条件转移到目标单元,但两者都是无条件转移到目标单元,但CALL指指令要保存令要保存“断点断点”,而,而JMP指令不保存断点。指令不保存断点。(3子程
52、序调用指令与转移指令子程序调用指令与转移指令JMP的区别的区别前述程序结构图中,前述程序结构图中,AAA和和BBB就是两条调用就是两条调用子程序指令的断点。断点是调用子程序指令子程序指令的断点。断点是调用子程序指令CALL的下一条指令的地址。的下一条指令的地址。 执行执行CALL指令时,先将断点压入堆栈中保存,指令时,先将断点压入堆栈中保存,然后转移到目标单元。然后转移到目标单元。 CALL指令的执行对各标志位无影响。指令的执行对各标志位无影响。汇编指令书写格式为在汇编指令书写格式为在 CALL 之后直接书写过程名之后直接书写过程名2、调用指令、调用指令指令格式:指令格式:CALL 过程名过程
53、名(1段内调用段内调用 (a) 段内直接调用段内直接调用例如:例如:CALL SUB1例如:例如:CALL BX CALL CX CALL WORD PTR 30HBXSI(b段内间接调用段内间接调用 子程序的起始地址偏移量由一个通用寄存器或一个字存子程序的起始地址偏移量由一个通用寄存器或一个字存储单元提供。储单元提供。 调用指令提供一个双字存储单元的地址,它所指向的双调用指令提供一个双字存储单元的地址,它所指向的双字存储单元内容为被调用过程的起始地址。其中,两个低字存储单元内容为被调用过程的起始地址。其中,两个低字节存放偏移量,两个高字节存放段基值。字节存放偏移量,两个高字节存放段基值。(b
54、) 段间间接调用段间间接调用例如:例如:CALL DWORD PTR DISPBXDI(2段间调用段间调用3、返回指令、返回指令(2段间返回段间返回指令编码为指令编码为 CBH 执行该指令,将从堆栈顶部弹出两个字分别送执行该指令,将从堆栈顶部弹出两个字分别送IP和和CS中。中。 根据子程序调用指令的使用情况,返回指令也分为根据子程序调用指令的使用情况,返回指令也分为段内返回和段间返回。其汇编指令书写形式都是段内返回和段间返回。其汇编指令书写形式都是RET,但它们的编码是不相同的。但它们的编码是不相同的。 一个子程序最后执行的指令一定是返回指令,但一个子程序最后执行的指令一定是返回指令,但不一定
55、是最后一条指令。不一定是最后一条指令。(1段内返回段内返回指令编码为指令编码为 C3H 执行该指令,将从堆栈顶部弹出一个字送入执行该指令,将从堆栈顶部弹出一个字送入IP。汇编指令格式为:汇编指令格式为:RET n 其中其中n为一个立即数,长度为为一个立即数,长度为2字节。并且是一个偶数。字节。并且是一个偶数。(1从堆栈弹出从堆栈弹出1个字送个字送IP段内返回或段内返回或2个字送个字送IP和和CS;(2执行执行 SP=(SP)+n 。将堆栈中已经用过的参数。将堆栈中已经用过的参数(n个字节个字节)弹出舍去弹出舍去.指令执行过程:指令执行过程:(3带弹出值的返回指令带弹出值的返回指令 这条指令既可
56、用于段内返回也可以用于段间返回,但它这条指令既可用于段内返回也可以用于段间返回,但它们的指令编码不同,分别为们的指令编码不同,分别为C2 n和和CA n。 二、编制子程序的基本要求二、编制子程序的基本要求1、具有一定的通用性、具有一定的通用性2、选择适当的参数传递方法、选择适当的参数传递方法在主程序与子程序之间传递参数,可以选择的方法有:在主程序与子程序之间传递参数,可以选择的方法有: A、使用通用寄存器、使用通用寄存器 B、使用指定的存储单元、使用指定的存储单元 C、使用堆栈、使用堆栈选择和设计好子程序所需的各种入口参数和出口参数。选择和设计好子程序所需的各种入口参数和出口参数。A、在主程序
57、中保存子程序中将要使用的一些寄存器的、在主程序中保存子程序中将要使用的一些寄存器的内容内容.PUSH BXPUSH CXCALL SUB1POP CXPOP BX.3、注意信息保护、注意信息保护 信息的保护可以有两种方法:信息的保护可以有两种方法: B、在子程序中保存将要使用的一些寄存器的内容、在子程序中保存将要使用的一些寄存器的内容SUB2 PROC PUSH BX PUSH CX . ; 完成子程序功能指令序列完成子程序功能指令序列 POP CX POP BX RETSUB2 ENDP4、正确使用堆栈、正确使用堆栈 由于堆栈中保存着主程序调用子程序时的断点地址。由于堆栈中保存着主程序调用子
58、程序时的断点地址。若在子程序中也使用了堆栈,注意对各个数据压栈和出若在子程序中也使用了堆栈,注意对各个数据压栈和出栈的顺序不能错误,否则将导致数据的错误使用和子程栈的顺序不能错误,否则将导致数据的错误使用和子程序返回的地址错误。序返回的地址错误。子程序名子程序名子程序功能描述子程序功能描述子程序的入口参数与出口参数子程序的入口参数与出口参数使用哪些寄存器和存储单元使用哪些寄存器和存储单元本子程序是否又调用其他子程序本子程序是否又调用其他子程序子程序的调用形式、举例子程序的调用形式、举例5、编制子程序文件、编制子程序文件 子程序文件应包括文字说明与子程序本身两个部子程序文件应包括文字说明与子程序
59、本身两个部分。而文字说明一般包括:分。而文字说明一般包括:源程序的数据段和堆栈安排如下:源程序的数据段和堆栈安排如下:DATA SEGMENTBIN1 DB 35HBIN2 DW 0AB48HASCBUF DB 20H DUP(?)DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDS三、子程序设计举例三、子程序设计举例例例 5.5.1 将两个给定的二进制数将两个给定的二进制数(8位和位和16位位)转换为转换为ASCII码字符串。码字符串。 主程序提供被转换的主程序提供被转换的数据和转换后的数据和转换后的ASCII码字码字符串的存
60、储区的首地址符串的存储区的首地址开场开场取出待转换数据取出待转换数据给出存放结果首址给出存放结果首址给出转换的位数给出转换的位数调用转换子程序调用转换子程序取出待转换数据取出待转换数据给出存放结果首址给出存放结果首址给出转换的位数给出转换的位数调用转换子程序调用转换子程序完毕完毕主程序框图主程序框图LEA DI,ASCBUF MOV DH,BIN1 MOV AX,8CALL BINASCMOV DX,BIN2 MOV AX, 16ADD DI,8CALL BINASC 子程序完成二进制数与子程序完成二进制数与ASCII码字符串的转换。子码字符串的转换。子程序的入口参量有:被转换程序的入口参量有
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版铝合金模板工程安装与环保评估合同4篇
- 2025年盆景市场推广与销售合作合同范本4篇
- 二零二五年度绿色建筑节能改造项目设计咨询服务合同4篇
- 2025年移动通信网络优化服务合同范本
- 2025年度铝扣板吊顶施工与维护一体化服务合同协议
- 2025游泳馆会员卡年度健康体检及运动康复服务协议3篇
- 2025年度净身出户离婚协议书模板与婚姻律师团队全程支持服务协议3篇
- 上海建筑工地劳务合作协议样书
- 2025年度个人物流运输承包合同范本2篇
- 2025年度私立学校教师聘用合同范本(创新教育版)
- 眼的解剖结构与生理功能课件
- 小学网管的工作总结
- 2024年银行考试-兴业银行笔试参考题库含答案
- 泵站运行管理现状改善措施
- 2024届武汉市部分学校中考一模数学试题含解析
- SYT 0447-2014《 埋地钢制管道环氧煤沥青防腐层技术标准》
- 浙教版七年级下册科学全册课件
- 弧度制及弧度制与角度制的换算
- 瓦楞纸箱计算公式测量方法
- DB32-T 4004-2021水质 17种全氟化合物的测定 高效液相色谱串联质谱法-(高清现行)
- DB15T 2724-2022 羊粪污收集处理技术规范
评论
0/150
提交评论