




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第五章第五章 顺序、分支与循环程序设计顺序、分支与循环程序设计分析问题分析问题寻找解决问题的算寻找解决问题的算法法 描述算法描述算法 编写程序编写程序 上机调试程序上机调试程序 顺序、分支、循环程序和子程序的设计是汇编语言程序设计的基本内容。 一般源程序的基本结构:一般源程序的基本结构:顺序程序顺序程序分支程序分支程序循环程序循环程序2顺序程序顺序程序分支程序分支程序循环程序循环程序3START: ;指令开始地址指令开始地址 MOV AX,DATA ; MOV DS,AX ;初始化初始化DS MOV AH, 4CH ; INT 21H ;返回返回DOS操作系统操作系统CODE ENDS EN
2、D START ;汇编结束标志汇编结束标志DATA SEGMENT DATA ENDS ;定义数据段定义数据段STACK1 SEGMENT PARA STACK DW 20H DUP (0)STACK1 ENDS ;定义堆栈段定义堆栈段CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1数据段数据段堆栈段堆栈段代码段代码段4MAIN PROC FAR ;设置为设置为FAR过程过程 PUSH DS ;为返回操作系统执行为返回操作系统执行INT 20H MOV AX,0 ;指令做准备指令做准备 PUSH AX ;立即数不能够作为操作数立即数不能够作为操作数 R
3、ET ;返回操作系统返回操作系统MAIN ENDPCODE ENDS END MAIN ;汇编结束标志汇编结束标志DATA SEGMENT DATA ENDS ;定义数据段定义数据段STACK1 SEGMENT PARA STACK DW 20H DUP (0)STACK1 ENDS ;定义堆栈段定义堆栈段CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1数据段数据段堆栈段堆栈段代码段代码段55.1 5.1 顺序程序设计顺序程序设计 顺序程序是指程序的结构从开始到结尾一直是顺序执行,中顺序程序是指程序的结构从开始到结尾一直是顺序执行,中途没有分支。途没有
4、分支。例例 5.2.1 试编写程序计算以下表达式试编写程序计算以下表达式: Z=(3X+Y-5)/2设设X、Y的值放在字变量的值放在字变量VARX、VARY中,结果存放在中,结果存放在VARZ中。中。6AX3*VARXAX(AX)+VARYAX(AX)-5开始结束AX(AX)/2算法分析:算法分析: 1、乘、乘2n和除和除2n可以使用算术左移和右移实现可以使用算术左移和右移实现 2、其它非、其它非2n的乘除运算可以用移位和加减组合的乘除运算可以用移位和加减组合运算来实现。如运算来实现。如 3X可以分解成可以分解成2X+X7TITLE EQUATION COMPUTEDATA SEGMENT V
5、ARX DW 15 VARY DW 10 VARZ DW ?DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP (0)STACK1 ENDS8CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1START: MOV AX,DATA ; MOV DS,AX ;装入装入DS 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 ;存结果存结果 MOV
6、 AH, 4CH INT 21H CODE ENDS END START9TITLE EQUATION COMPUTEDATA SEGMENTVARX DW 15VARY DW 10VARZ DW ?DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP (0)STACK1 ENDS10CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1COMP PROC FAR ;设置为设置为FAR过程过程 PUSH DS ;为返回操作系统执行为返回操作系统执行INT 20H MOV AX,0 ;指令做准备指令做准备 PUSH AX
7、;立即数不能够作为操作数立即数不能够作为操作数 MOV AX,DATA ; MOV DS,AX ;装入装入DS 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 ;存结果存结果 RET ;IP与与CS分别出栈分别出栈COMP ENDPCODE ENDS END COMP11 例例5.2.2 利用学号查学生的数学成绩表。利用学号查学生的数学成绩表。算法分析:算法分析:首先在数据段中建立一个成绩表首先在数据段中建立一个成绩表
8、TABLE,在表中各学生的成绩按照学号从小到大,在表中各学生的成绩按照学号从小到大的顺序存放。要查的学号存放在变量的顺序存放。要查的学号存放在变量NUM中,查中,查表的结果放在变量表的结果放在变量MATH中。中。1213 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)STACK
9、1 ENDS14COSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1START: MOV AX,DATA ; MOV DS,AX ;装入装入DS MOV BX,OFFSET TABLE ;BX指向表首址指向表首址 XOR AH,AH ;(AH)=0 MOV AL,NUM DEC AL ;实际学号是从实际学号是从1开始的开始的 ADD BX,AX ;BX加上学号指向要查的成绩加上学号指向要查的成绩 MOV AL,BX ;查到成绩送查到成绩送AL MOV MATH,AL ;存结果存结果 MOV AH,4CH ;返回返回DOS INT 21HCOSEG EN
10、DS END START15在上述程序中,如果使用换码指令在上述程序中,如果使用换码指令XLAT,可以简化程序。,可以简化程序。XLAT 表首址表首址 ;功能为:;功能为:AL=(BX)+(AL)换码指令格式为:换码指令格式为:其中表首址可以省略。其中表首址可以省略。在在XLAT指令执行前,要求将表首址的偏移量送入指令执行前,要求将表首址的偏移量送入BX中,待中,待查项与表首址之间的字节距离查项与表首址之间的字节距离 (0255)送入送入AL中。中。16START: MOV AX,DATA MOV DS,AX MOV BX,OFFSET TABLE ;为换码指令做准备为换码指令做准备 MOV
11、AL,NUM ;为换码指令做准备为换码指令做准备 DEC AL XLAT TABLE ;AL=(BX)+(AL) MOV MATH,AL MOV AH,4CH INT 21HCOSEG ENDS END START利用利用XLAT指令指令,上述程序可简化为上述程序可简化为:17一一.转移指令转移指令 目标是程序中的一个标号目标是程序中的一个标号, 表示转移指令所转移的目的地表示转移指令所转移的目的地指令的地址。指令的地址。1. 无条件转移指令无条件转移指令5.2分支程序设计分支程序设计 分支程序结构是指程序的执行顺序将根据某些指令的执分支程序结构是指程序的执行顺序将根据某些指令的执行结果,选择
12、某些指令执行或不执行。行结果,选择某些指令执行或不执行。分支程序的实现主要是由转移指令完成。分支程序的实现主要是由转移指令完成。格式格式: JMP 目标目标2. 条件转移指条件转移指令令18 : JMP TARGET :TARGET: . : 根据目标所在的位置,根据目标所在的位置,JMP指令分为段内转移和段间转移。指令分为段内转移和段间转移。例如:例如:段间转移段间转移指令执行时,将有:指令执行时,将有: IP= 目标地址偏移量目标地址偏移量 CS=目标地址段基值目标地址段基值段内转移段内转移指令执行时,将指令执行时,将有:有: IP= 目标地址偏移量目标地址偏移量跳转指令实质上是改变了原来
13、指令的执行顺序。跳转指令实质上是改变了原来指令的执行顺序。19 . JMP LABEL1 LABEL1: 目标地址可以有两种提供方法:目标地址可以有两种提供方法:A. 段内转移直接寻址段内转移直接寻址- 指令中直接给出转移目的地标号指令中直接给出转移目的地标号例如例如 . LABEL2: JMP LABEL2或者或者(1) 段内转移段内转移 JMP指令与转移目标位于同一个代码段内。转移时指令与转移目标位于同一个代码段内。转移时IP寄存器内容被改变,而寄存器内容被改变,而CS保持不变。保持不变。20OPCODE DISP指令编码指令编码: OPCODE字段长度为一个字节字段长度为一个字节, DI
14、SP字段根据字段根据OPCODE字段字段为不同编码时分别为为不同编码时分别为1个或个或2个字节。个字节。 DISP 为相对位移量,用补为相对位移量,用补码表示。码表示。 7 0 15/7 0指令的功能为:指令的功能为: IP =( IP )+ DISP 0EBH时,为短转移,时,为短转移,DISP为为8位,转移偏移量:位,转移偏移量: -128+127 字节字节OPCODE= 0E9H时,为长转移,时,为长转移,DISP为为16位,转移偏移量:位,转移偏移量: -32768+3276721注意:转移偏移量是相对转移指令的下一条指令的起始地址注意:转移偏移量是相对转移指令的下一条指令的起始地址如
15、果是相对于该转移指令的地址而言,则相对偏移量的值为:如果是相对于该转移指令的地址而言,则相对偏移量的值为:-126+129字节字节或或-32765+3277022OPCODE MOD 100 R/M 位移量位移量 B. 段内转移间接寻址段内转移间接寻址指令中指定一个指令中指定一个16位通用寄存器位通用寄存器或字存储单元,其内容为转移目标地址。或字存储单元,其内容为转移目标地址。例如:例如:JMP CX JMP WORD PTR BXSI指令编码格式:指令编码格式:7 0 7 0 15/7 0指令执行时,由指令执行时,由MOD、R/M以及位移量确定一个寄存器以及位移量确定一个寄存器或有效地址或有
16、效地址EA,将所指内容送入,将所指内容送入IP中。中。IP=(通用寄存器)通用寄存器)或或IP=(EA)23(2)段间转移)段间转移JMP指令与目标地址不在同一个段内指令与目标地址不在同一个段内COSEG1 SEGMENT COSEG2 SEGMENT : JMP FAR PTR TARGET TARGET:. : : COSEG1 ENDS COSEG2 ENDSA、段间转移直接寻址、段间转移直接寻址在在JMP指令中,目标地址符前面加属性说明为指令中,目标地址符前面加属性说明为FAR。例如:例如:执行该转移指令,将同时改变执行该转移指令,将同时改变CS和和IP的内容。的内容。247 0 7
17、0 7 0 7 0 7 0 OPCODE OFFSET-LOW OFFSET-HIGH SEG-LOW SEG-HIGH 指令执行时,将有:指令执行时,将有: IP= 目标地址偏移量目标地址偏移量 CS=目标地址段基值目标地址段基值指令编码格式:指令编码格式:25B. 段间间接寻址段间间接寻址目标地址存放在一个双字存储单元中目标地址存放在一个双字存储单元中低地址字单元内容为偏移量,高地址字单元内容为段基值。低地址字单元内容为偏移量,高地址字单元内容为段基值。 指令编码格式:指令编码格式:OPCODE MOD 1 0 1 R/M 位移量位移量 7 0 7 6 5 4 3 2 1 0 15/7 0
18、指令执行时,将有:指令执行时,将有: 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的情况为例进的情况为例进行分析。行分析。30AB可以分为以下几种情况:可以分为以下几种情况:1.A和和B都为负数都为负数 若要若要AB,则,则A-B的结果一定是正数(的结果一定是正数(SF=0),也不会也不会发生溢出(发生溢出(OF=0),且结果不为零(
19、),且结果不为零(ZF=0)。)。2. A和和B都为正数都为正数 若要若要AB,则,则A-B的结果一定是正数(的结果一定是正数(SF=0),也),也不会发生溢出(不会发生溢出(OF=0),并且结果不为零(),并且结果不为零(ZF=0)。)。3.A为正数,为正数,B为负数为负数执行执行A-B的结果可能有两种情况的结果可能有两种情况:(这两种情况结果都不为零这两种情况结果都不为零ZF=0)(1)不发生溢出。这时结果为正数()不发生溢出。这时结果为正数(SF=0),即有),即有SF=OF。(2)发生溢出。这时结果变为负数()发生溢出。这时结果变为负数(SF=1),即有),即有SF=OF。综上,综上,
20、JG的转移条件为的转移条件为(SF=OF 且且 ZF=0)31二、分支程序设计二、分支程序设计分支程序的结构有两种常见结构:分支程序的结构有两种常见结构:1、用比较、用比较/测试指令测试指令+条件转移指令实现分支条件转移指令实现分支比较指令:比较指令:CMP DEST,SRC 该指令的功能与减法指令该指令的功能与减法指令SUB相似,区别是相似,区别是(DEST)-(SRC)的差值不送入的差值不送入DEST。而其结果影响标志位。而其结果影响标志位。2、用跳转表形成多路分支、用跳转表形成多路分支1、用比较、用比较/测试指令测试指令+条件转移指令实现分支条件转移指令实现分支测试指令:测试指令:TES
21、T DEST,SRC 该指令的功能与减法指令该指令的功能与减法指令AND相似,区别是相似,区别是(DEST) AND (SRC)的差值不送入的差值不送入DEST。而其结果影响标志位。而其结果影响标志位。32这种类型的分支程序有两种结构这种类型的分支程序有两种结构比较比较/测试测试判定条件判定条件程序段程序段1程序段程序段2满足满足不满足不满足比较比较/测试测试判定条件判定条件程序段程序段不满足不满足满足满足 一条条件转移指令只能实现两条分支程序的设计。要一条条件转移指令只能实现两条分支程序的设计。要实现更多条分支的程序,需使用多条条件转移指令。实现更多条分支的程序,需使用多条条件转移指令。IF
22、-THEN-ELSEIF-ELSE33 例例5.3.2 数据段的数据段的ARY数组中存放有数组中存放有10个无符号数,个无符号数,试找出其中最大者送入试找出其中最大者送入MAX单元。单元。算法分析算法分析:依次比较相邻两数的大小,将较大的送入依次比较相邻两数的大小,将较大的送入AL中。中。每次比较后,较大数存放在每次比较后,较大数存放在AL中,相当于较大的数往中,相当于较大的数往下传。下传。比较一共要做比较一共要做9次。次。比较结束后,比较结束后,AL中存放的就是最大数。中存放的就是最大数。3435DATA SEGMENT ARY DB 17,5,40,0,67,12,34,78,32,10
23、MAX DB ?DATA ENDSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1BEGIN: MOV AX,DATA MOV DS,AX MOV SI, OFFSET ARY ; SI指向指向ARY的第一个元素的第一个元素 MOV CX, 9 ;CX作次数计数器作次数计数器 MOV AL, SI ;取第一个元素到取第一个元素到ALLOP: INC SI ;SI指向后一个元素指向后一个元素 CMP AL, SI ;比较两个数比较两个数 JAE BIGER
24、;前元素前元素后元素转移后元素转移 MOV AL, SI ;取较大数到取较大数到ALBIGER:DEC CX ;减减1计数计数 JNZ LOP ;未比较完转回去,否则顺序执行未比较完转回去,否则顺序执行 MOV MAX, AL ;存最大数存最大数 MOV AH,4CH INT 21HCODE ENDS END BEGIN36 例例5.3.4 编写一程序,实现将存储器中的源数据块传送到目编写一程序,实现将存储器中的源数据块传送到目的数据块。的数据块。源块首址源块首址 目的块首址目的块首址目的块目的块源块源块0必须从数据块必须从数据块首址开始传送首址开始传送 在存储器中两个数据块的存放有下列情况:
25、两个数据块分在存储器中两个数据块的存放有下列情况:两个数据块分离和有部分重叠。离和有部分重叠。两个数据块分离两个数据块分离目的块目的块源块源块0可以从首址或末可以从首址或末址开始传送址开始传送目的块目的块源块源块037三种相对位置情况的传送方法:三种相对位置情况的传送方法:因此,我们设定:当源块首地址因此,我们设定:当源块首地址目的块首址的情目的块首址的情况,必须从数据块首址开始传送。况,必须从数据块首址开始传送。 对于源块与目的块有重叠且源块首址对于源块与目的块有重叠且源块首址目的块首址的情目的块首址的情况,必须从数据块末址开始传送。况,必须从数据块末址开始传送。38SI=源数据块首址源数据
26、块首址DI=目的数据块首址目的数据块首址CX (DI) ?形成末址形成末址SI=(SI)+(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指向目的块末址指向目的块末址41BOTTOM: MOV AL,SI ;从末址开始传送从末址开始传送 MOV DI, AL DE
27、C 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 ENDS END BEGIN422、用跳转表形成多路分支、用跳转表形成多路分支当程序的分支数量较多时,采用跳转表的方法可以使程序当程序的分支数量较多时,采用跳转表的方法可以使程序长度变短,长度变短, 跳转表有两种构成方法:跳转表有两种构成方法:(1)跳转表用入口地址构成)跳转表用入口地址构成 在程序中将各分支的入口地址组织
28、成一个表放在数据段在程序中将各分支的入口地址组织成一个表放在数据段中,在程序中通过查表的方法获得各分支的入口地址。中,在程序中通过查表的方法获得各分支的入口地址。(2)跳转表用无条件转移指令构成)跳转表用无条件转移指令构成(1)跳转表用入口地址构成)跳转表用入口地址构成43例例5.3.5 设某程序有设某程序有10路分支,试根据变量路分支,试根据变量N的值(的值(110),),将程序转移到其中的一路分支去。将程序转移到其中的一路分支去。设设10路分支程序段的入口地址分别为:路分支程序段的入口地址分别为:BRAN1、BRAN2.BRAN10。当变量当变量N为为1时,转移到时,转移到BRAN1;N为
29、为2时,转移到时,转移到BRAN2,依次类推。,依次类推。在跳转表中每两个字节存放一个入口地在跳转表中每两个字节存放一个入口地址的偏移量,如右图所示。址的偏移量,如右图所示。跳转表跳转表程序中,先根据程序中,先根据N的值形成查表地址:的值形成查表地址:(N-1)2+表首址。表首址。44BX=表首址表首址求查表地址:求查表地址:BX=(N-1)*2+(BX)获得入口地址:获得入口地址:CX=(BX)(CX)=? 结结 束束N=1BRAN1N=2BRAN2N=10BRAN10多路分支结构流程图多路分支结构流程图开开 始始45 TITLE JUMP TABLE OF ADDRESSDATA SEGM
30、ENTATABLE DW BRAN1,BRAN2,BRAN3,.,BRAN10N 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, AX46XOR AH,AHMOV AL,NDEC ALSHL AL,1MOV BX,OFFSET ATABLE ;BX指向表首址指向表首址ADD BX,AX ;BX指向查表地址指向查表地址 MOV CX,BX ;将将N对应的分支入口地址送到
31、对应的分支入口地址送到CX中中JMP CX ;转移到转移到N对应的分支入口地址对应的分支入口地址47BRAN1: JMP END1BRAN2: JMP END1BRAN3: JMP END1 BRAN10:END1: MOV AH,4CH INT 21HCODE ENDS END START48 跳转表的每一个项目就是一条无条件转移指令。跳转表的每一个项目就是一条无条件转移指令。这时跳转表是代码段中的一段程序。这时跳转表是代码段中的一段程序。(2)跳转表用无条件转移指令构成)跳转表用无条件转移指令构成49TITLE JUMP TABLE OF INSTRUCTIONDATA SEGMENTN
32、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的源程序可修改为如下程序:的源程序可修改为如下程序:50 DEC BL ;四条指令实现四条指令实现(N-1)*3 MOV AL,BL ;每一条指令都是每一条指令都是3字节编码字节编码 SHL BL,1 ADD BL,AL ADD BX,OFFSET ITABLE ;BX指向
33、查表地址指向查表地址 JMP BX ;转移到转移到N对应的对应的JMP指令指令 ITABLE: JMP BRAN1 ;JMP指令构成的跳转表指令构成的跳转表 JMP BRAN2 ;每一条指令都是每一条指令都是3字节的编码字节的编码 JMP BRAN3 : : JMP BRAN1051BRAN1: . : JMP END1BRAN2: . : JMP END1 : :BRAN10: . : :END1: MOV AH,4CH INT 21HCODE ENDS END START528086/8088指令系统中有指令系统中有4条循环控制指令条循环控制指令LOOP、LOOPZ、LOOPNZ与与JCX
34、Z。编码长度都是。编码长度都是2字节。字节。 OPCODE DISP 7 0 7 0 指令使用指令使用CX寄存器做循环计数。循环控制指令寄存器做循环计数。循环控制指令的执行对标志位没有影响。的执行对标志位没有影响。 DISP:8位补码表示本指令的下一条指令的首址位补码表示本指令的下一条指令的首址与目标单元之间的字节距离。与目标单元之间的字节距离。 指令中指定一定的条件,若条件满足,则将指令中指定一定的条件,若条件满足,则将DISP加入到加入到IP中,即中,即IP=(IP)+DISP使程序转移到目的指使程序转移到目的指令执行。令执行。5.3 循环程序设计循环程序设计一、循环控制指令一、循环控制指
35、令指令编码格式为:指令编码格式为:53其中目标是程序中的一个寻址方式。其中目标是程序中的一个寻址方式。 执行一次执行一次LOOP指令将使:指令将使:CX = (CX)-1若(若(CX)00,则转到目标处执行,否则顺序执行。,则转到目标处执行,否则顺序执行。 在前面的例子在前面的例子中,中, 数据段的数据段的ARY数组中存放有数组中存放有10个个无符号数,试找出其中最大者送入无符号数,试找出其中最大者送入MAX单元。若使用单元。若使用循环指令,则程序可修改如下:循环指令,则程序可修改如下:1、LOOP指令指令格式:格式: LOOP 目标目标54源程序结构如下:源程序结构如下:DATA SEGME
36、NT ARY 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,SILOP: INC SI CMP AL,SI JAE BIGER MOV AL,SIBIGER:LOOP LOP MOV MAX,AL 55指令执行:指令执行:CX = (CX) =1,若,若(CX) 00且且ZF=1ZF=1,则转到目标,则转到目标处执行,否则顺序执行。处执行,否则顺序执行。2、LOOPE / LOOPZ指令指令格式:
37、格式:LOOPE 目标目标 或或 LOOPZ 目标目标56DATA SEGMENTSTRG DB CHECK NO_SPACE LENG EQU $STRGINDEX DB ?DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDS 例例 编写一程序,在一字符串中查找第一个非空格字符,编写一程序,在一字符串中查找第一个非空格字符,并将其在字符串中的序号(并将其在字符串中的序号(1 1n)n)送入送入INDEXINDEX单元中。若未找单元中。若未找到,则将到,则将INDEXINDEX单元置为全单元置为全1 1。57CODE SEGME
38、NT ASSUME CS:CODE,DS:DATA,SS:STACK1START: MOV AX,DATA MOV DS,AX MOV CX,LENG ;字符串长度送入字符串长度送入CX MOV BX,-1 ;设地址指针初值设地址指针初值NEXT: INC BX CMP STRGBX,20H ;空格的空格的ASCII码为码为20H LOOPE NEXT ;是空格字符且计数不为是空格字符且计数不为0,继续查找,继续查找 JNZ FOUND ;找到非空格字符,转找到非空格字符,转FOUND MOV BL,0FFH ;未找到非空格字符未找到非空格字符 JMP END0FOUND: INC BL ;使
39、位置序号从使位置序号从1开始开始END0: MOV INDEX,BL ;存结果存结果 MOV AH,4CH INT 21HCODE ENDS END START58 指令执行:指令执行:CX = (CX) 1,若,若(CX) 00且且ZF=0ZF=0,则,则转到目标处执行,否则顺序执行。转到目标处执行,否则顺序执行。 例例 编写程序,计算两个字节数组编写程序,计算两个字节数组ARY1ARY1和和ARY2ARY2对应元对应元素之和,一直计算到两数之和为素之和,一直计算到两数之和为0 0或数组结束为止。并将和或数组结束为止。并将和存入数组存入数组SUMSUM中,将该数组的长度存放在中,将该数组的长
40、度存放在NUMNUM单元中。单元中。3、LOOPNE / LOOPNZ指令指令使用格式:使用格式:LOOPNE 目标目标 或或 LOOPNZ 目标目标59源程序如下:源程序如下: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:
41、DATA,SS:STACK1BEGIN: MOV AX,DATA MOV DS,AX60 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 BL ;0结果并未计入长度结果并未计入长度ZERO: MOV NUM, BL ;存结果存结果 MOV AH, 4CH INT 21HCODE ENDS END BEGIN614、JC
42、XZ指令指令指令格式:指令格式:JCXZ 目标目标 该指令测试该指令测试CX的内容是否为的内容是否为0,如果(,如果(CX)=0,则转,则转移到目标处指令,否则顺序执行。移到目标处指令,否则顺序执行。 该指令相当于条件转移指令。它一般用在一个循环的该指令相当于条件转移指令。它一般用在一个循环的开始,当一个循环的循环次数为开始,当一个循环的循环次数为0时,就不执行该循环。时,就不执行该循环。如果没有这个控制,将使得循环次数变得非常大(如果没有这个控制,将使得循环次数变得非常大(0-1=0FFFFH),从而产生错误结果。),从而产生错误结果。62程序结构为:程序结构为: . MOV CX,COUN
43、T JCXZ NEXTLOP: . LOOP LOPNEXT: .63 二、循环程序的结构二、循环程序的结构循环程序有两种结构形式循环程序有两种结构形式1、先执行后判断结构、先执行后判断结构2、先判断后执行结构、先判断后执行结构循环初始化部分循环初始化部分循循 环环 体体控制条件控制条件结束处理部分结束处理部分NY循环初始化部分循环初始化部分控制条件控制条件结束处理部分结束处理部分循循 环环 体体NY64在循环程序中主要包括以下四个部分:在循环程序中主要包括以下四个部分: 用于建立循环的初始状态。包括:循环次数计数器、用于建立循环的初始状态。包括:循环次数计数器、地址指针以及其他循环参数的初始
44、设定。地址指针以及其他循环参数的初始设定。 循环程序完成的主要任务。包括工作部分和修改部分。循环程序完成的主要任务。包括工作部分和修改部分。工作部分工作部分:是完成循环程序任务的主要程序段。:是完成循环程序任务的主要程序段。修改部分修改部分:为循环的重复执行,完成某些参数的修改。:为循环的重复执行,完成某些参数的修改。1、初始化部分、初始化部分2、循环体、循环体65 判断循环条件是否成立。可以有以下两种判断方法:判断循环条件是否成立。可以有以下两种判断方法:(1)用计数控制循环)用计数控制循环循环次数已知循环次数已知 (2)用条件控制循环)用条件控制循环循环次数未知循环次数未知处理循环结束后的
45、结果。如存储结果等。处理循环结束后的结果。如存储结果等。3、循环控制部分、循环控制部分4、结束处理部分、结束处理部分66三、单重循环程序设计三、单重循环程序设计常选用常选用CX作计数器,可选用作计数器,可选用LOOP、LOOPE或或LOOPNE等循环控制指令。等循环控制指令。1、计数控制循环、计数控制循环67 由于循环体中有由于循环体中有“+”和和“-”两种两种可能的运算,通过设置标志可能的运算,通过设置标志0(+)和和1(-)来判断,低位表示低下标的运算。八来判断,低位表示低下标的运算。八个运算表达式由个运算表达式由8位逻辑尺:位逻辑尺:10011010B来识别。来识别。 例例 设有两个数组
46、设有两个数组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=?XiYiXi+YiZi=结果结果修改指针:修改指针:SI=(SI)+1CX= (CX)-1(cx)=0?结束结束=1=0NY68DATA SEGM
47、ENTX 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 10011010B;设置标志设置标志0(+)和和1(-)来判断,低位表示低下标的运算来判断,低位表示低下标的运算DATA ENDSSTACK0 SEGMENT PARA STACK DW 20H DUP(0)STACK0 ENDSCOSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK0BEGIN: MOV AX,DATA MOV DS
48、,AX MOV CX,LEN ;初始化计数器初始化计数器 MOV SI,0 ;初始化指针初始化指针 MOV BL,LOGR ;初始化逻辑尺初始化逻辑尺69LOP: MOV AL,XSI SHR BL,1 ;标志位送标志位送CF JC SUB1 ;为为1,转做减法,转做减法 ADD AL,YSI ;为为0,做加法,做加法 JMP RESSUB1: SUB AL,YSIRES: MOV ZSI,AL ;存结果;存结果 INC SI ;修改指针;修改指针 LOOP LOP MOV AH,4CH INT 21HCOSEG ENDS END BEGIN702、条件控制循环、条件控制循环 例例 编写一程序,将字单元编写一程序,将字单元VARW 中含中含1的个数的个数(含含1的个数的个数是指用二进制表示时是指用二进制表示时,有多少个有多少个1)统计出来,存入统计出来,存入CONT单元中单元中。 本例中通过将字单元各位逐本例中通过将字单元各位逐位移入最高位来判断。为了减位移入最高位来判断。为了减少循环次数,循环中加
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 办公软件应用技术考试
- 2025中文合同谈判常用句型
- 人工挖井合同样本
- 二零二五版知识产权服务框架协议
- 个人退股协议书范例二零二五年
- 商铺产权转让合同
- 2025四川房屋租赁合同范本
- 聘用兼职教师合同二零二五年
- 工业品买卖合同参考
- 二零二五食品安全协议责任书
- 吉林省吉林市2024-2025学年高三下学期3月三模试题 生物 含答案
- 2025年陕西农业发展集团有限公司(陕西省土地工程建设集团)招聘(200人)笔试参考题库附带答案详解
- 2025年03月中央社会工作部所属事业单位公开招聘11人笔试历年参考题库考点剖析附解题思路及答案详解
- 2025年中高端女装市场趋势与前景深度分析
- 2025北京清华附中高三(下)统练一数学(教师版)
- 2025-2030中国孵化器行业市场发展前瞻及投资战略研究报告
- 5.3基本经济制度 课件 2024-2025学年统编版道德与法治八年级下册
- Unit4 Breaking Boundaries 单元教学设计-2024-2025学年高中英语外研版(2019)选择性必修第二册
- T-CCTAS 61-2023 桥梁承重缆索抗火密封综合防护技术规程
- 2025慢性阻塞性肺病(GOLD)指南更新要点解读课件
- 2024年05月湖北中国邮政储蓄银行湖北省分行春季校园招考笔试历年参考题库附带答案详解
评论
0/150
提交评论