基本结构程序设计.ppt
本章内容本章内容:掌握顺序结构程序的设计;掌握顺序结构程序的设计;掌握分支转移指令的使用;掌握分支转移指令的使用;掌握分支程序和循环程序的设计方法。掌握分支程序和循环程序的设计方法。第第5章章基本结构程序设计基本结构程序设计汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第2 2页页第第2页页本章要求本章要求1.1.掌握顺序结构程序的设计方法,能利用汇编语言基本指令熟练掌握顺序结构程序的设计方法,能利用汇编语言基本指令熟练进行顺序结构程序设计;进行顺序结构程序设计;2.2.熟练掌握分支转移指令的使用,如何生成有效测试标志,选择熟练掌握分支转移指令的使用,如何生成有效测试标志,选择何种方式的转移指令。何种方式的转移指令。3.3.掌握分支程序设计方法;掌握分支程序设计方法;4.4.掌握循环程序设计方法及串指令的应用。掌握循环程序设计方法及串指令的应用。本章重点及难点本章重点及难点:汇编指令的综合应用及多分支、多重循环程序设计。汇编指令的综合应用及多分支、多重循环程序设计。计划学时计划学时:8-10学学时时汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第3 3页页第第3页页 顺序结构程序在设计上比较简单,它按指令书写的先后次序执行一系列操作,这种程序也称为直线程序。组成输入数据已知的数据,即让计算机进行运算的对象处理根据问题的需要对输入数据进行相应的运算处理输出结果将运算处理的结果输出基本语句:数据传送指令、算术运算指令和逻辑运算指令执行过程:指令2指令n开始结束5.1顺序结构程序设计顺序结构程序设计汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第4 4页页第第4页页【例】【例】:在屏幕上显示一个字符串:在屏幕上显示一个字符串:“WELCOME!”“WELCOME!”。完整程序完整程序:DATASEGMENT;数据段开始;数据段开始STRINGDBWELCOME!,13,10,$DATAENDS;数据段结束;数据段结束CODESEGMENT;代码段开始;代码段开始ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;设置;设置DSMOVAH,9;子功能号;子功能号9,用于输出字符串用于输出字符串LEADX,STRING;字符串偏移地址;字符串偏移地址INT21H;系统功能调用;系统功能调用MOVAX,4C00H;返回;返回DOSINT21HCODEENDS;代码段结束;代码段结束ENDSTART汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第5 5页页第第5页页【例】【例】:对于三个8位无符号数86H、34H和21H,编写RESULT=86H*34H-21H的程序。DATASEGMENTNUMDB86H,34H,21HRESULTDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,NUMMOVAL,SIMOVBL,SI+1MULBL;乘积放在AXMOVBL,SI+2MOVBH,0;把BX高位字节清零SUBAX,BXMOVRESULT,AX;保存运算结果MOVAH,4CHINT21HCODEENDSENDSTART 取操作数1取操作数2求乘积取操作数3将减数扩展为16位做减法结果送指定处开始结束汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第6 6页页第第6页页【例】:以BUF为首址的内存中存有015的平方值表。查表求X单元中数(在015之间)的平方值,并送回X单元。DATA SEGMENTDATA SEGMENTBUF DB 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225X DB 12DATA ENDSDATA ENDSSTACK SEGMENT STACK STACK DB 100 DUP(?)STACK ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUF XOR AX,AX MOV AL,X ADD SI,AX MOV AL,SI MOV X,AL MOV AH,4CH INT 21H CODE ENDSCODE ENDS END START取表的首地址取要求值的数查表求其平方值开始结束汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第7 7页页第第7页页转移的目标地址直接出现在指令中功能:无条件地使程序转移到指定的目标地址类型段内转移改变IP的值,CS的值不变直接方式间接方式转移的目标地址在寄存器或存储单元中段间转移改变IP和CS的值直接方式间接方式格式:JMP 目标标号功能:IP IP+disp格式:JMP 字地址指针功能:IP EA格式:JMP 目标标号功能:IP OFFSET 目标标号 CS SEG 目标标号格式:JMP 双地址指针功能:IP EA CS EA+2转移指令转移指令5.2分支程序设计分支程序设计1.无条件转移指令无条件转移指令JMP汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第8 8页页第第8页页功能:以某些标志位或标志位的逻辑运算为依据,满足条件,程序转移 至指定目标;不满足条件,程序顺序执行。注意注意:条件转移的目标地址 在+127或-128字节的范围之内分类:1.单个标志位的条件转移指令 2.组合条件的条件转移指令2.条件转移指令条件转移指令汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第9 9页页第第9页页(1 1).单个标志位的条件转移指令单个标志位的条件转移指令类型C标志JB/JNAE/JC C=1时,转移JAE/JNB/JNC C=0时,转移Z标志JE/JZZ=1时,转移JNE/JNZ Z=0时,转移S标志JS S=1时,转移JNSS=0时,转移P标志JP/PE P=1时,转移JNP/JPO P=0时,转移O标志JOO=1时,转移JNOO=0时,转移汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第1010页页第第10页页(2).组合条件的条件转移指令组合条件的条件转移指令比较大小比较大小无符号数无符号数JB/JCJNAEJBE/JNCJNAJNB/JNCJAEJNBEJA带符号数带符号数JL/JNGEJLE/JNGJNL/JNGEJG/JNLE(3).CX的值为的值为0转移指令转移指令格式:JCXZCX=0,转移说明:(1)条件转移指令不影响标志位 (2)条件转移指令前安排算术运算、比较、测试 等影响相应标志位的指令无符号数:无符号数:A代表大于代表大于B代表小于代表小于带符号数:带符号数:G代表大于代表大于L代表小于代表小于汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第1111页页第第11页页分支程序基本执行流程分支程序基本执行流程指令操作(影响标志位)指令操作(影响标志位)测试标志位测试标志位执行程序段执行程序段A执行程序段执行程序段B下一条指令下一条指令真真假假汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第1212页页第第12页页【例】【例】:测试测试AX当前值是否为零,若为零,则置当前值是否为零,若为零,则置CX为为50,否则令,否则令CX为为200。程序段一程序段一:CMPAX,0JZLMOVCX,200JMPNEXTL:MOVCX,50NEXT:;比较;比较AX是否为是否为0;若;若AX为为0,即,即ZF=1则转移则转移;若;若AX不为不为0,则令,则令CX=200;跳转到;跳转到NEXT程序段二程序段二:CMPAX,0JNZLMOVCX,50JMPNEXTL:MOVCX,200NEXT:汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第1313页页第第13页页【例】【例】:判断判断AX当前值的正负,若为正数,则置当前值的正负,若为正数,则置CX为为50,否则令,否则令CX为为200。程序段一程序段一:CMPAX,0JNSLMOVCX,200JMPNEXTL:MOVCX,50NEXT:;比较;比较AX是否为是否为0,影响,影响SF标志标志;若;若AX为正,即为正,即SF=0则转移则转移;若;若AX为负数,则令为负数,则令CX=200;跳转到;跳转到NEXT程序段二程序段二:ADDAX,0JSLMOVCX,50JMPNEXTL:MOVCX,200NEXT:程序段三(用程序段三(用ZF测试)测试):TESTAX,8000HJNZLMOVCX,50JMPNEXTL:MOVCX,200NEXT:程序段四(用程序段四(用CF测试)测试):BTAX,15JCLMOVCX,50JMPNEXTL:MOVCX,200NEXT:程序段五(用程序段五(用CF测试)测试):SHLAX,1JCLMOVCX,50JMPNEXTL:MOVCX,200NEXT:汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第1414页页第第14页页【例】【例】:已知已知X为为16位的数,判断位的数,判断X是奇数还是偶数,若为奇数,则令是奇数还是偶数,若为奇数,则令Z=X,若为偶数,令若为偶数,令Z=0。程序段一(用程序段一(用ZF测试)测试):MOVAX,XTESTAX,1JNZLMOVZ,0JMPNEXTL:MOVZ,AXNEXT:程序段二(用程序段二(用CF测试)测试):MOVAX,XBTAX,0JCLMOVZ,0JMPNEXTL:MOVZ,AXNEXT:SHRAX,1汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第1515页页第第15页页【例】【例】:已知已知W为为16位的数,若位的数,若W为正数,则令为正数,则令Z=W,若为,若为0,令,令Z=400H,若为负数,则,若为负数,则Z=|W|+50H。AXWAX=0?SF=0?Z400HZAXZ|W|+50HNEXTZF=1ZF=0SF=0SF=1流程图片段流程图片段汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第1616页页第第16页页程序段一:程序段一:MOVAX,WCMPAX,0JZL1JNSL2NEGAXADDAX,50HMOVZ,AXJMPNEXTL2:MOVZ,AXJMPNEXTL1:MOVZ,400HNEXT:程序段二:程序段二:MOVAX,WCMPAX,0JNZL1MOVZ,400HJMPNEXTL1:JNSL2NEGAXADDAX,50HMOVZ,AXJMPNEXTL2:MOVZ,AXNEXT:汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第1717页页第第17页页【例】【例】:如果:如果X50,转到,转到TOO_HIGH,不满足,不满足,X-Y;如果溢出转到;如果溢出转到OVERFLOW,否则,否则|X-Y|RESULT。JOJNS程序段如下程序段如下:MOVAX,XCMPAX,50JGTOO_HIGH;大于则转移到;大于则转移到TOO_HIGHSUBAX,YOVERFLOW;溢出则转移;溢出则转移NONNEG;结果为正则转移;结果为正则转移NEGAXNONNEG:MOVRESULT,AXTOO_HIGH:OVERFLOW:汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第1818页页第第18页页【例】【例】:已知已知X为一个带符号数,比较为一个带符号数,比较X的值,若的值,若X大于大于55H,则令,则令Y=X/2-30H,若,若X小于小于-1,则令,则令Y=|X|,否则,否则,Y=0。编程解决该问题。编程解决该问题。MOVAX,XCMPAX,55H;第一次比较;第一次比较JGXGY;大于则转移;大于则转移CMPAX,-1;第二次比较;第二次比较JLXLY;小于则转移;小于则转移MOVY,0;令;令Y=0JMPEXITXLY:NEGAX;求绝对值;求绝对值MOVY,AX;结果送到;结果送到YJMPEXITXGY:SARAX,1;大于,则执行;大于,则执行Y=X/2-30HSUBAX,30HMOVY,AX;结果送到;结果送到YEXIT:汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第1919页页第第19页页5.2.2 5.2.2 双分支结构程序双分支结构程序1.1.双分支结构程序的典型结构双分支结构程序的典型结构双分支结构程序的典型结构一双分支结构程序的典型结构一双分支结构程序的典型结构二双分支结构程序的典型结构二条件条件B真真假假条件条件AB真真假假汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第2020页页第第20页页条件产生条件产生在进行条件测试以前,必须执行能生成状态标志的先行指令,如:TEST、CMP、ADD、SUB、AND、OR、XOR和移位指令等,这些指令执行后能按规定影响PSW中的状态标志位OF,SF,ZF,PF与CF。为条件检测作好准备。测试与定向测试与定向条件转移指令自动对相应的状态标志位进行测试,以确定是否满足条件,决定程序的不同走向。而每一条条件转移指令,恰好有两种选择,转移或顺序执行。标号标号对于每个分支,在转移的目标地址处一定要给出标号。需注意的问题需注意的问题汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第2121页页第第21页页2.2.双分支结构程序设计举例双分支结构程序设计举例【例】:设计字符比较程序,两个字符相同时,显示YES;否则显示NODATASEGMENTD1DBAD2DBBRES1DBYES,$RES2DBNO,$DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,D1MOVBL,D2 CMPAL,BLJNENEXT1LEADX,RES1JMPNEXT2NEXT1:LEADX,RES2NEXT2:MOVAH,09HINT21HMOVAH,4CHINT21HCODEENDSENDSTARTNY相同?显示NO显示YES取数开始返回汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第2222页页第第22页页【例】:设存储单元A和B各有一无符号字节数,比较大小,将较大数送A单元DATASEGMENTADB39HBDB0B4HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,ACMPAL,BJNCNEXTXCHGAL,BMOVA,ALNEXT:MOVAH,4CHINT21HCODEENDSENDSTART取数YNABA、B交换开始返回汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第2323页页第第23页页 【例】【例】比较两个带符号字节数的大小,找出两个数中大的存入MAX字节单元,编写源程序如下:DATASEGMENTDA1DBX1,X2;X1,X2为任意二个带符号数MAXDB?DATAENDSSTAKSEGMENTSTACKDW20HDUP(?)STAKENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,DA1;取X1,送到AL中CMPAL,DA1+1JGEL1;若XX2则转到L1,这里产生分支MOVAL,DA1+1;若XX2则DA1+1的内容送ALL1:MOVMAX,ALMOVAH,4CHINT21HCODEENDSENDSTART 汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第2424页页第第24页页多分支结构程序设计多分支结构程序设计含义:程序有两个以上的分支设计方法:双分支方法、地址表法、转移表法、逻辑分解法结构:条件=?X1X2Xn其它程序段1程序段2程序段0程序段n汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第2525页页第第25页页1.由多个双分支结构实现多分支结构程序设计【例】【例】:计算符号函数SNG(X)的值符号函数:1 当X0时 Y=0 当X=0时-1 当X0时YNYNAL XAL0Y 1Y 0开始返回汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第2626页页第第26页页DATASEGMENTXDB0B9HYDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,XCMPAL,0JLNEXT1;X0则转NEXT2MOVY,0;X=0则令Y=0JMPRES源程序如下:源程序如下:NEXT1:MOVY,0FFHJMPRESNEXT2:MOVY,1RES:MOVAH,4CHINT21HCODEENDSENDSTART汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第2727页页第第27页页2.2.转移表法多分支程序设计转移表法多分支程序设计设计方法:把转移到各分支程序段的转移指令依次存放在一起,形成转移表。各转移指令在表中的位置:离表首地址的偏移量作为转移条件,偏移量加上表首地址作为转移地址,转到表的相应位置,执行相应的无条件转移指令典型例子:JMPBXTAB:JMPSHORTMODE0;转移表JMPSHORTMODE1JMPSHORTMODE2JMPSHORTMODE3JMPSHORTMODE4说说明明:转移表中每条转移指令(段内短转移)占用2个字节,所以有如下计算公式:表地址表地址=模式字模式字*2+*2+转移表首地址转移表首地址汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第2828页页第第28页页【例例】:根据输入值(04)的不同,执行不同的操作,用转移表法编写程序转移表首地址送BX输入值乘2送AXBXBX+AXJMP BXJMP MODE0JMP MODE4MODE0MODE4 开始汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第2929页页第第29页页CODESEGMENTASSUMECS:CODESTART:LEABX,BRATAB;取转移表首地址MOVAH,1INT21H;从键盘接收一个字符SUBAL,30H;ASCII数值MOVAH,0ADDAX,AX;AX乘2ADDBX,AX;获取跳转地址JMPBXBRATAB:JMPSHORTMODE0;转移表JMPSHORTMODE1JMPSHORTMODE2JMPSHORTMODE3JMPSHORTMODE4MODE0:MOVDL,30HJMPEXITMODE1:MOVDL,31HJMPEXITMODE2:MOVDL,32HJMPEXITMODE3:MOVDL,33HJMPEXITMODE4:MOVDL,34HEXIT:MOVAH,2INT21HMOVAH,4CHINT21HCODEENDSENDSTART汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第3030页页第第30页页3.3.利用地址表法实现多分支程序设计利用地址表法实现多分支程序设计设计方法:把各分支程序段的入口地址依次存放在数据段的一个表中,形成地址表。取各分支程序段的编号作为各分支入口地址的表地址的位移量。某个分支程序入口地址的表地址为:表地址=编号*2+入口地址首地址ADTABDWADDR0,ADDR1,ADDR2,ADDR3,ADDR4LEABX,ADTAB;取转移表首地址MOVAL,NUM;NUM数值送ALMOVAH,0SHLAX,1;AX乘2ADDBX,AX;获取跳转地址JMPBX汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第3131页页第第31页页【例例】:根据NUM(04)的不同,执行不同的操作,用地址表法编写程序转移表首地址送BX输入值乘2送AXBXBX+AXJMP BXJMP ADDR0JMP ADDR4ADDR0ADDR4 开始汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第3232页页第第32页页DATASEGMENTNUMDB2ADTABDWADDR0,ADDR1,ADDR2,ADDR3,ADDR4DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEABX,ADTAB;取转移表首地址MOVAL,NUM;NUM数值送ALMOVAH,0SHLAX,1;AX乘2ADDBX,AX;获取跳转地址JMPBXADDR0:MOVDL,30HJMPEXITADDR1:MOVDL,31HJMPEXITADDR2:MOVDL,32HJMPEXITADDR3:MOVDL,33HJMPEXITADDR4:MOVDL,34HEXIT:MOVAH,2INT21HMOVAH,4CHINT21HCODEENDSENDSTARTMOVAL,NUM;NUM数值送ALMOVAH,0SHLAX,1;AX乘2MOVSI,AXJMPADTABSI汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第3333页页第第33页页4.4.逻辑分解法多分支程序设计逻辑分解法多分支程序设计YYNNNY逻辑分解法分支结构框图条件1成立程序段1条件2成立程序段2条件n成立程序段n+1程序段n设计方法:将多分支结构采用逻辑等效的方法,按条件的先后,依次分解成所示的一串双分支结构,然后使用双分支的方法来进行程序设计。汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第3434页页第第34页页NEXT0:MOV DL,30H JMP EXITNEXT1:MOV DL,31H JMP EXITNEXT2:MOV DL,32H JMP EXITNEXT3:MOV DL,33H JMP EXITNEXT4:MOV DL,34H EXIT:MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END STARTDATASEGMENTNUMDB2DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,NUMCMPAL,0JZNEXT0CMPAL,1JZNEXT1CMPAL,2JZNEXT2CMPAL,3JZNEXT3CMPAL,4JZNEXT4【例】【例】:根据AL中的值(04),执行不同的操作,用逻辑分解法编写程序。汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第3535页页第第35页页【例】【例】:已知有四个已知有四个16位带符号数位带符号数W、X、Y和和Z,试编写程序,若四个数中,试编写程序,若四个数中有一个为有一个为0,则把另外三个单元清零;若四个数都不为,则把另外三个单元清零;若四个数都不为0,则求其累加和,则求其累加和(不考虑溢出),并保存到(不考虑溢出),并保存到BUF单元中单元中。参考程序:参考程序:DATASEGMENTWDW?;定义变量XDW?YDW?ZDW?BUFDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA分支程序设计综合举例分支程序设计综合举例汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第3636页页第第36页页START:MOVAX,DATAMOVDS,AXCMPX,0JZZEROCMPY,0JZZEROCMPZ,0JZZEROCMPW,0JZZEROMOVAX,WADDAX,X;四个数累加ADDAX,YADDAX,ZMOVBUF,AXJMPNEXT;置四个数为0ZERO:MOVW,0MOVX,0MOVY,0MOVZ,0NEXT:MOVAH,4CHINT21HCODEENDSENDSTART汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第3737页页第第37页页 【例】【例】字节变量BUFX和BUFY存放整数,试编写完成指定下列操作的程序:(1)若两个数中有一个是奇数,则将奇数存入BUFX字节单元中,偶数存入BUFY字节单元中;(2)若两个数均为奇数,则两数分别加1,并存回原变量单元中;(3)若两个数均为偶数,则两变量内容不变。程序清单:程序清单:DATASEGMENTBUFXDBXBUFYDBYDATAENDSSTAKSEGMENTSTACKDW20HDUP(?)STAKENDS汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第3838页页第第38页页CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AXMOVAL,BUFX;取XMOVBL,BUFY;取YXORAL,BL TESTAL,01H;测试X与Y是否同类 JZL1;D0=0,则为同类转L1处理 TESTBL,01H;非同类,测试Y是偶数否?JZDONE;是偶数满足(1),转DONE XCHGBL,BUFX;奇数存入BUFX单元 MOVBUFY,BL;偶数存入BUFY单元 JMPDONEL1:TESTBL,01H;同类,测试Y是偶数否JZDONE;同为偶数,满足(3)不变,转DONEINCBUFX;是奇数两数同时各加1,存原单元。INCBUFYDONE:MOVAH,4CHINT21HCODEENDSENDSRTART汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第3939页页第第39页页已知OPER1和OPER2为16位带符号数,分析下面程序段功能。MOVAX,OPER1MOVBX,OPER2MOVCX,0CMPAX,0JNLL1NEGAXL1:ADDCX,AXCMPBX,0JNLLNEGBXL:ADDCX,BX程序段完成的功能是:。CX|OPER1|+|OPER2|课课堂堂练练习习汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第4040页页第第40页页LOOP指令相当于以下两条指令的组合:DEC CX JNZ LABEL功能:CX-10,循环;否则退出循环类型LOOP格式:LOOP LABEL循环直到计数为0LOOPZ/LOOPE格式:LOOPZ/LOOPE LABEL功能:CX-10 ZF=1,循环;否则退出循环为零/相等则循环LOOPNZ/LOOPNE格式:LOOPNZ/LOOPNE LABEL功能:CX-10 ZF=0,循环;否则退出循环不为零/不相等则循环5.3循环结构程序设计循环结构程序设计5.3.1循环控制指令汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第4141页页第第41页页指令系统专门设计了几条控制循环的指令。循环结构的实现方法是:MOVCX,N;置循环次数,N事先要定义AGAIN:;循环体循环体DECCXJNZAGAIN1LOOP(Loop)循环指令)循环指令指令格式:LOOPOPR测试条件:CX0则继续循环,CX0退出循环LOOP指令规定:将CX作为计数寄存器,当执行LOOP指令时,它一定是将CX的内容减1,如CX结果不等于零,则转到LOOP指令中指示的短标号处;否则,顺序执行LOOP下一条指令。因此,在循环程序开始前(初始化),应将循环次数送到CX寄存器,这是指令本身的要求,不可违反。LOOP指令的操作数只能是一个短标号,即转移距离不可超过128127的范围。汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第4242页页第第42页页【例】在STR开始的缓冲区中存放有一个字符串,结束符$,计算该字符串的长度并存入LEN单元.DATASEGMENTSTRDBJHHJK123ABCD$LENDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,STR;取字符串首地址XORBL,BL;用于统计长度LOP:MOVAL,SICMPAL,24HJZSTOPINCBLINCSIJMPLOPSTOP:MOVLEN,BLMOVAH,4CHINT21HCODEENDSENDSTARTYN串长度加1,修改地址指针置串指针,串长度初值为0取串元素=$?存串长度开始结束汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第4343页页第第43页页【例】求以BUF为首地址的10个内存单元的无符号数据和。已知其和小于等于255,将结果存入第11个内存单元。DATASEGMENTBUFDB12H,38H,46H,0BH,09H,41H,32H,56,02H,26HRESDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,0;用于存放累加结果MOVCX,0AH;设置循环次数LEABX,BUFLP:ADDAL,BX;累加求和INCBX;指向下一单元LOOPLPMOVRES,ALMOVAH,4CHINT21HCODEENDSENDSTARTNYCX=0?AL清0送结果取数累加修改地址指针、计数值减1开始结束汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第4444页页第第44页页2LOOPZLOOPE(loopwhilezero,oregual)当当为为零零或或相相等等时时循环指令循环指令指令格式:LOOPZ(或LOOPE)OPR执行循环条件:CX0且ZF1退出循环条件:ZF0或CX0本指令的操作也是先将CX寄存器的内容减1,仅当CX0且ZF1时转移到LOOPZ指令指定的短标号处继续循环。LOOPZLOOPE指令本身对状态标志位没有影响,应该由先行指令提供状态标志,如CMP、TEST等指令。这条指令是有条件地形成循环,即当规定的循环次数尚未完成时,还要满足“相等”或者“等于零”的条件,才能继续循环。3LOOPNZLOOPNE(loopwhilenonzexoornotegual)不不为为零零或不相等时循环指令。或不相等时循环指令。指令格式:LOOPNZ(或LOOPNE)OPR执行循环条件:CX0且ZF0退出循环条件:ZF1或CX0汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第4545页页第第45页页【例】【例】在字节数组中找出第一个非0的数据,并将其下标存入RES单元,假设其下标值小于10。DATA SEGMENT ARR DB 0,0,38H,46H DB 89H,67H,0H,92H CNT EQU$ARR RES DB?DATA ENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,CNTMOVDI,-1AGAIN:INCDICMPARRDI,0LOOPZAGAINJZEXITMOVRES,DIEXIT:MOVAH,4CHINT21HCODEENDSENDSTARTNCX=0?YN修改地址指针计数值减1Y送结果=0?初始化取数比较开始结束汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第4646页页第第46页页(1)先执行后判断(非0次循环结构)修改部分控制部分初始化部分工作部分结尾部分(2)先判断后执行(0次循环结构)初始化部分修改部分结尾部分控制部分工作部分5.3.2 循环程序的结构汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第4747页页第第47页页【例】【例】在以BUF为首地址的字节单元中存放了CNT个无符号数,找出其中最大数送入MAX字节单元。DATA SEGMENT BUF DB 1,2,3,100,23,78,90,134 CNT EQU$-BUF ;BUF数组元素个数 MAX DB?DATA ENDS【分析】:可把第一个数先送到AL中,将AL中的数与后面的CNT-1个数逐个进行比较,如果AL中的数大于或等于与之相比较的数,则转下一个数进行比较;若AL中的数小于相比较的数,则把相比较的数送入AL中,保证AL中的数始终处于较大的数。比较CNT-1次之后最大数必定在AL中,最后把AL中的数送入MAX单元。本例的特点:循环次数已知,因此可以用计数器来控制循环的执行。程序编写如下:汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第4848页页第第48页页CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;设置DSMOVCX,CNT-1;设置比较次数LEABX,BUF;取BUF数组首地址MOVAL,BX;设第一个数为最大值LOOP1:INCBX;移动指针,指向下一个数CMPAL,BXJAENEXT;大于等于则转移MOVAL,BX;小于则把数送ALNEXT:DECCXJNZLOOP1MOVMAX,AL;最大值送MAXMOVAH,4CHINT21HCODEENDSENDSTART汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第4949页页第第49页页5.3.3 5.3.3 循环程序设计方法循环程序设计方法1.1.用计数器控制循环用计数器控制循环含义:利用循环次数作为控制条件应用场合:循环次数已知分类:正计数法和倒计数法设计方法:初值放入CX汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第5050页页第第50页页【例】已知数据块的长度,统计数据块中正数和负数的个数DATASEGMENTBUFDB32,25,36,-18,-64,0,-3COUNTEQU$-BUFPLUSDB?;存放正数MINUSDB?;存放负数DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBL,0;负数个数MOVDL,0;正数个数MOVSI,OFFSETBUFMOVCX,0;循环初值LOP1:MOVAL,SI;取值CMPAL,0JGNEXT0JZNEXT1INCBLJMPNEXT1NEXT0:INCDLNEXT1:INCSIINCCXCMPCX,COUNTJLLOP1MOVMINUS,BLMOVPLUS,DLMOVAH,4CHINT21HCODEENDSENDSTART汇编语言程序设计汇编语言程序设计第第5章章基本结构程序设计基本结构程序设计 第第5151页页第第51页页【例】已知数据块的长度,统计数据块中正数和负数的个数DATASEGMENTBUFDB32,25,36,-18,-64,0,-3COUNTEQU$-BUFPLUSDB0;存放正数MINUSDB0;存放负数DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,BUFMOVCX,COUNT;循环次数LOP1:MOVAL,SI;取值CMPAL,0JGNEXT0JZNEXT1INCMINUSJMPNEXT1NEXT0:INCPLUSNEXT1:INCSILOOPLOP1MOVAH,4CHINT21HCODEENDSENDSTART汇编语言程