汇编语言第四章程序流程控制语句及程序设计课件_第1页
汇编语言第四章程序流程控制语句及程序设计课件_第2页
汇编语言第四章程序流程控制语句及程序设计课件_第3页
汇编语言第四章程序流程控制语句及程序设计课件_第4页
汇编语言第四章程序流程控制语句及程序设计课件_第5页
已阅读5页,还剩100页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章程序流程控制语句

及程序设计4.1程序设计方法概述4.2顺序程序设计4.3DOS系统功能调用4.4分支程序设计4.5循环程序设计4.6子程序设计4.1概述4.1.1汇编语言程序设计的一般步骤4.1.2流程图4.1.1汇编语言程序设计的一般步骤汇编语言程序设计一般有以下几个步骤:1.分析问题,确定算法2.绘制流程图3.根据流程图编制程序4.调试程序(2)判断框

(3)处理框

(4)调用框

(5)指向线

(6)连接框

4.2顺序程序设计下面举例说明顺序程序的设计。【例】试编写一程序计算以下表达式的值。w=(v-(x*y+z-540))/x式中x、y、z、v均为有符号字数据。设x、y、z、v的值存放在字变量X、Y、Z、V中,结果存放在双字变量W之中,程序的流程图如图4.1所示。源程序如下:DATA SEGMENTX DW 200Y DW 100Z DW 3000V DW 10000W DW 2DUP(?)DATA ENDSSTACK SEGMENTSTACK DB200DUP(0)STACK ENDSCODE SEGMENT ASSUMEDS:DATA,CS:CODE,SS:STACKSTART: MOV AX,DATA MOV DS,AX ;DATA→AX MOV AX,X IMUL Y ;(X)*(Y)→DX:AX MOV CX,AX MOV BX,DX ;(DX:AX)→(BX:CX) MOV AX,Z CWD ;(Z)符号扩展 ADD CX,AX ADC BX,DX ;(BX:CX)+(DX:AX)→(BX:CX) SUB CX,540 SBB BX,0 ;(BX:CX)-540→(BX:CX) MOV AX,VCWD ;(V)符号扩展 SUB AX,CX SBB DX,BX;(DX:AX)-(BX:CX)→(DX:AX) IDIV X ;(DX:AX)/X MOV W,AX ;商→W MOV W+2,DX ;余数DX→W+2 MOV AH,4CH INT 21HCODE ENDS ;退出DOS状态 END STARTSTACK SEGMENTSTACKDB200DUP(0)STACK ENDSDATA SEGMENTTAB DB80,85,86,71,79,96DB83,56,32,66,78,84NO DB10ENGLISTDB?DATA ENDSCODE SEGMENTASSUMEDS:DATA,SS:STACK,CS:CODEBEGIN:MOV AX,DATA MOV DS,AX LEA BX,TAB MOV AL,NO DEC AL XLAT TAB MOV ENGLISH,AL MOV AH,4CH INT 21HCODE ENDS END BEGIN4.3DOS系统功能调用4.3.1系统功能调用方法4.3.2常用的DOS系统功能调用4.3.2常用的DOS系统功能调用1.单字符输入(1号调用)2.单字符显示(2号调用)3.打印输出(5号调用)4.结束调用(4CH号调用)5.显示字符串(9号调用)6.字符串输入(10号调用)1.单字符输入(1号调用)格式:MOV AH,1INT 21H功能:接受从键盘输入字符的ASCII码送入寄存器AL中,并送显示器显示。

2.单字符显示(2号调用)格式:MOVDL,待显示字符的ASCII码MOVAH,2INT21H功能:将DL寄存器中的字符送显示器显示,如果DL中为〈CTRL〉+〈BREAK〉的ASCII码,则退出。3.打印输出(5号调用)格式:MOV DL,待打印字符的ASCII码MOV AH,5INT 21H功能:将DL寄存器中的字符送打印机打印。4.结束调用(4CH号调用)格式:MOV AH,4CHINT 21H功能:终止当前程序并返回调用程序。10号系统功能调用的输入缓冲存储区的定义缓冲区名DB缓冲区大小;规定输入缓冲区的大小DB0;实际输入字符的个数DB缓冲区大小DUP(0);键盘输入的字符存放在该输入缓冲区中例:BUFDB80DB0DB80DUP(0)DATA SEGMENTSTR DB0DH,0AH,‘Exampleofstringdisplay!$’DATA ENDSSTACK SEGMENTSTACKDB 100DUP(0)STACK ENDSCODE SEGMENTASSUMEDS:DATA,CS:CODE,SS:STACK【例】若要在屏幕上显示字符串“Exampleofstringdisplay!”,则程序如下:

BEGIN: MOV AX,DATA MOV DS,AX LEA DX,STR MOV AH,9 INT 21H MOV AH,4CH INT 21HCODE ENDS END BEGINDB 80DUP(0)BUFB DB 81DUP(0)DATA ENDSSTACK SEGMENTSTACK DB 200DUP(0)STACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART: MOV AX,DATA MOV DS,AXLEA DX,INFO1 MOV AH,9 ;9号调用,显示输入提示信息 INT 21H LEA DX,BUFA MOV AH,10 ;10号调用,键盘输入字符串到缓 冲区BUFA INT 21H LEA SI,BUFA+1 MOV CH,0 ;取字符长度→CX MOV CL,[SI] ADD SI,CX ;SI指向字符串尾部 LEA DI,BUFB ;DI指向字符串变量BUFB4.4分支程序设计4.4.1控制转移类指令4.4.2分支程序设计*4.4.3用跳转表实现多分支程序设计4.4.1

控制转移类指令1、无条件转移指令2、条件转移指令1、无条件转移指令段内转移:指在同一代码段的范围内进行转移,只需要改变IP寄存器的内容。一般有三种用法。(1)段内直接短转移格式:JMPSHORT标号名(2)段内直接转移格式:JMP标号名;该标号的属性为近标号(3)段内间接转移格式:JMPCX;将(CX)寄存器的内容送IP寄存器JMPWORDPTR[1234H];将字存储单元[1234H]中的内容送IP寄存器段间转移:指要转移到另一个代码段去执行程序,此时不仅需要改变IP寄存器中的内容,还要修改CS段寄存器的内容才能达到转移的目的,因此段间转移需要修改两个寄存器中的内容。一般有两种用法。(1)段间直接转移格式:JMPFARPTR标号名;该标号具有远属性(2)段间间接转移格式:JMPDWORDPTR[1234H];将双字存储单元的低字内容送IP寄存器,双字存储单元的高字内容送CS寄存器

简单条件转移指令无符号数条件转移指令有符号数条件转移指令判断CX的值为0则转移指令它们都有通用的语句格式和功能。语句格式:[标号:]操作符短标号功能:如果条件满足,则(IP)+位移量→IP。2、条件转移指令共有10条指令,根据五个标志位ZF、SF、OF、PF和CF的两种状态(0或1)分别进行转移。(1)JE/JZ;ZF=1则转移,测试前次操作结果是否等于0JNE/JNZ;ZF=0则转移,测试前次操作结果是否不等于0(2)JS;SF=1则转移,测试前次操作结果是否为负数JNS;SF=0则转移,测试前次操作结果是否为正数(3)JO;OF=1则转移,测试前次操作结果是否有溢出JNO;OF=0则转移,测试前次操作结果是否没有溢出简单条件转移指令(4)JC;CF=1则转移,测试前次操作结果是否有进(借)位JNC;CF=0则转移,测试前次操作结果是否无进(借)位(5)JP;PF=1则转移,测试前次操作结果中1的个数是否为偶数JNP;PF=0则转移,测试前次操作结果中1的个数是否为奇数【例】下面程序段测试AX的低四位是否全0,如果均是0,使CX=0,否则使CX=-1。MOVCX,-1TESTAX,000FHJNZNEXTMOVCX,0NEXT:……无符号数条件转移指令无符号数条件转移指令往往跟在比较指令之后,根据运算结果设置的条件标志状态确定转移方向。这类指令视比较对象为无符号数。根据不同状态设置了高于、高于等于、低于、低于等于四条指令。(1)JA/JNBE;当CF=0且ZF=0时转移。用于两个无符号数a、b的比较,若a>b则条件满足实现转移。(2)JAE/JNB;当CF=0或ZF=1时转移。用于两个无符号数a、b的比较,若a>b或a=b则条件满足实现转移。(3)JB/JNAE;当CF=1且ZF=0时转移。用于两个无符号数a、b的比较,若a<b则条件满足实现转移。(4)JBE/JNA;当CF=1或ZF=1时转移。用于两个无符号数a、b的比较,若a<b或a=b则条件满足实现转移。【例】比较无符号数大小,将较大的数存放AX寄存器。CMP AX,BX;(AX)-(BX)JAE NEXT ;若AX>=BX,转移到NEXTXCHG AX,BX;若AX<BX,交换NEXT:…

有符号数条件转移指令当比较判断两个有符号数的大小时,要选用有符号数条件转移指令。有符号数条件转移根据条件标志ZF、SF、OF的特定组合决定是否转移。(1)JG/JNLE;当SF=OF且ZF=0时转移。用于两个有符号数a、b的比较,若a>b则条件满足实现转移。(2)JGE/JNL;当SF=OF或ZF=1时转移。用于两个有符号数a、b的比较,若a>b或a=b则条件满足实现转移。(3)JL/JNGE;当SF≠OF且ZF=0时转移。用于两个有符号数a、b的比较,若a<b则条件满足实现转移。(4)JLE/JNG;当SF≠OF或ZF=1时转移。用于两个有符号数a、b的比较,若a<b或a=b则条件满足实现转移。【例】比较有符号数大小,将较大的数存放在AX寄存器。CMP AX,BX ;(AX)-(BX)JGE NEXT ;若AX>=BX,转移到NEXTXCHG AX,BX ;若AX<BX,交换NEXT:…语句格式:JCXZ短标号功能:当CX=0时,则转移到标号所指出的地址处执行。判断CX的值为0则转移指令4.4.2分支程序设计【例】编写计算下面函数值的程序:1 X>0Y=0 X=0-1 X<0设输入数据为X、输出数据Y,且皆为字节变量。程序流程图如图4.2所示。程序如下:图4.2分支运算程序流程图DATA SEGMENTX DB-10Y DB?DATA ENDSSTACK SEGMENTSTACK DB200DUP(0)STACK ENDSCODE SEGMENT ASSUMEDS:DATA,SS:STACK,CS:CODESTART: MOV AX,DATAMOV DS,AX CMP X,0 ;与0进行比较 JGE A1 ;X≥0转A1 MOV Y,-1 ;X<0时,-1→Y JMP EXITA1:JG A2 ;X>0转A2 MOV Y,0 ;X=0时,0→Y JMP EXITA2:MOV Y,1 ;X>0,1→YEXIT:MOV AH,4CH INT 21HCODEENDS END START【例】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。设三个带符号数分别在三个字变量X、Y、Z中存储。程序流程图如图4.3所示:图4.3程序流程图

程序如下:STACKSEGMENTSTACK DB200DUP(0)STACKENDSDATA SEGMENTX DW00ABHY DW–5Z DW200MAX DW?DATA ENDSCODE SEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATA MOV DS,AX MOV AX,X CMP AX,Y ;X>Y? JG L1 MOV AX,Y ;Y>Z? CMP AX,Z JG EXITL2:MOV AX,Z JMP EXIT

L1: CMP AX,Z ;X>Z? JLE L2EXIT: MOV MAX,AX MOV AH,4CH INT 21HCODE ENDS END START4.4.3用跳转表法实现多分支程序设计

(补充)【例】设某程序有8路分支,试根据给定的N值(1~8),将程序的执行转移到其中的一路分支。

程序流程如图4.4所示。

程序如下:DATA SEGMENTTAB DWP1,P2,P3,P4,P5,P6,P7,P8NDB5DATA ENDSSTACKSEGMENTSTACK DB200DUP(0)STACK ENDSCODE SEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART: MOV AX,DATA MOV DS,AX

┆ MOV AL,N DEC AL ADD AL,AL;形成表内偏移 MOV BL,AL MOV BH,0

JMP WORDPTRTAB[BX]P1:

……

┆ JMP EXITP2:

……

┆ JMP EXITP3:

……

┆ JMP EXITP4:

……

┆JMP EXIT

┆P8:

……

┆EXIT: MOV AH,4CH INT 21HCODE ENDS END START

注:上述程序中的无条件转移指令的转移地址采用的是变址寻址。同理,转移地址也可以用寄存器间接寻址或基址加变址寻址。4.5循环程序设计4.5.1循环程序的结构4.5.2单重循环程序设计4.5.3多重循环程序设计1)循环指令LOOP2)相等/为零循环指令LOOPE/LOOPZ3)不相等/不为零循环指令LOOPNE/LOOPNZ循环指令该组指令执行的步骤:(1)CX-1CX;(2)检查是否满足测试条件,如满足则IP+(标号)位移量IP;(3)如果不满足测试条件,则IP值不变,即退出循环,程序继续顺序执行。1.循环指令LOOP语句格式:LOOP短标号功能:(CX)≠0,则程序转移(循环);否则,顺序执行。说明:使用LOOP指令可代替两条指令,DECCXJNE短标号2.相等/为零循环指令LOOPE/LOOPZ语句格式:①LOOPE短标号②LOOPZ短标号功能:(CX)≠0且ZF=1,则程序转移(循环);否则,顺序执行。分析下面的例子,该程序完成什么功能?DATASEGMENTBUFDB‘AAABBCD’COUNTEQU$-BUFDATAENDS……MOVAL,’A’MOVDI,OFFSETBUFMOVCX,COUNTDECDINEXT:INCDICMPAL,[DI]LOOPENEXT

MOVBX,DIJNZEXITMOVBX,0FFFFH;当ZF=1,CX=0时退出循环EXIT:…….功能:在字符串查找是否存在非‘A’字符,若找到,将BX指针指向第一个非‘A’字符,否则置BX为-1。注意:有两种可能退出循环的执行。(1)计数结束(CX)=0,此时ZF=1,表示所有都是‘A’字符。(2)ZF=0,表示找到非‘A’字符。3.不相等/不为零循环指令LOOPNE/LOOPNZ语句格式:①LOOPNE短标号②LOOPNZ短标号功能:(CX)≠0且ZF=0,则程序转移(循环);否则,顺序执行。4.5.1循环程序的结构1.初始化部分2.工作部分3.修改部分4.控制部分循环程序的常见结构形式如图4.5(a)、(b)所示。4.5.2单重循环程序设计1.计数控制2.条件控制1.计数控制【例】已知有COUNT个字节数据存放在以BUF为首址的存贮区中,编写程序统计负数和正数的个数分别送MINUS和PLUS单元。

对于循环次数已知的情况,通常采用计数控制方法来实现循环。又分为倒计数法和正计数法。DATASEGMENTBUFDB-32,25,36,-18,-46,0,-3COUNTEQU$-BUFPLUSDB?MINUSDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBL,0;统计负数个数的计数器MOVDL,0;统计正数个数的计数器MOVSI,OFFSETBUFMOVCX,COUNTLOP1:MOVAL,[SI]CMPAL,0;判断是否为正数JGENEXT0INCBL;若为负数,(BL)+1(BL)JMPNEXT1NEXT0:INCDL;若为正数,(DL)+1(DL)NEXT1:INCSILOOPLOP1MOVMINUS,BLMOVPLUS,DLMOVAH,4CHINT21HCODEENDSENDSTART【例】编程实现计算如下等式:X1+Y1=Z1;X2+Y2=Z2;X3-Y3=Z3;X4-Y4=Z4;X5-Y5=Z5;X6+Y6=Z6;X7-Y7=Z7;X8+Y8=Z8;X9+Y9=Z9;X10+Y10=Z10;X11+Y11=Z11;X12-Y12=Z12。分析:采用逻辑尺控制法。用0或1分别表示做减法或加法运算,在该例中形成的逻辑尺为00011。DATASEGMENT

RULEDW00011

XDB21,34,25,56,23,76,84,92,36,38,69,10YDB61,82,72,37,59,51,26,34,57,80,26,22ZDB12DUP(0)DATAENDSSTACKSEGMENTSTACKDB100DUP(0)STACKENDSCODESEGMENTASSUMECS:CODE,SS:STACK,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,12MOVAX,RULEMOVSI,OFFSETXMOVBX,OFFSETYMOVDI,OFFSETZLOOP1:MOVDL,[SI]

SHRAX,1;判断是做加法还是减法JCADD1;若对应位为“1”做加法SUBDL,[BX]JMPEND1ADD1:ADDDL,[BX]END1:MOV[DI],DL;保存运算结果INCSIINCDIINCBXLOOPLOOP1MOVAH,4CHINT21HCODEENDSENDSTART2.条件控制【例】设在内存某一数据区从STRING地址开始存放了一个字符串,其最后一个字符为“$”(ASCII码为24H)。要求检查该字符串中所有字符的奇偶性,规定每个字符对应的一个字节数中必须有偶数个“1”,则为正确。若奇偶性正确,结果为0,否则结果为-1。

对于循环次数未知的情况,通常采用条件控制方法来实现循环。DATASEGMENTSTRINGDB‘THISISASTRING$’RESULTDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBX,OFFSETSTRINGLOP1:MOVAL,[BX]INCBX

CMPAL,24H;判断是否是“$”结束符JZDONE

ORAL,AL;判断数的奇偶性JNPERRORJMPLOP1DONE:MOVAH,0JMPNEXTERROR:MOVAH,-1NEXT:MOVRESULT,AHMOVAH,4CHINT21HCODEENDSENDSTART【例】编写程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不是则退出程序;如是则开始接收键入的字符并顺序存放在首址为BUFFER的缓冲区中(空格符不存入),直到收到第二个空格符时退出程序。DATASEGMENTBUFFERDB80DUP(0)FLAGDB?DATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDSCODESEGMENTASSUMECS:CODE,SS:STACK,DS:DATABEGIN:MOVAX,DATAMOVDS,AXLEABX,BUFFERMOVFLAG,0NEXT:MOVAH,1INT21HTESTFLAG,01HJNZFOLLOWCMPAL,20HJNZEXITMOVFLAG,1JMPNEXTFOLLOW:CMPAL,20HJZEXITMOV[BX],ALINCBXJMPNEXTEXIT:MOVAH,4CHINT21HCODEENDSENDBEGIN4.5.3多重循环程序设计如果一个循环程序的循环体内还包含一个或多个循环结构的程序,那么这个程序称为双重或多重循环结构程序。【例】在以BUF为首址的字节存储区中存放有n个无符号数X1,X2,…,Xn,现要求将它们按从小到大的顺序排列在BUF存储区中,试编写程序。STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTBUFDB30H,10H,40H,20H,……,0FFHN=$-BUFDATAENDSCODESEGMENTASSUMECS:CODE,SS:STACK,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,1;1(SI)

LOPI:MOVDI,SIINCDI;(SI)+1(DI)MOVAL,[BUF+SI-1]LOPJ:CMPAL,[BUF+DI-1]JBENEXTXCHG[BUF+DI-1],ALMOV[BUF+SI-1],ALNEXT:INCDICMPDI,NJBELOPJINCSICMPSI,N-1JBELOPIMOVAH,4CHINT21HCODEENDSENDSTART4.6子程序设计4.6.1子程序的概念4.6.2子程序的定义4.6.3子程序设计方法4.6.4子程序应用举例4.6.5子程序的嵌套与递归调用4.6.1子程序的概念 在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。 调用子程序的程序称为主调程序或主程序。

4.6.2子程序的定义子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下:过程名PROC[NEAR/FAR]┆RET过程名ENDP其中PROC表示过程定义开始,ENDP表示过程定义结束。过程名是过程入口地址的符号表示。一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。4.6.3子程序设计方法1.子程序的调用和返回2.现场的保护与恢复3.主程序与子程序参数传递方式1、子程序的调用和返回子程序的调用:

(1)callproc_name(2)callfarptrproc_name子程序的返回:

ret注意:堆栈中内容的变化!2.现场的保护与恢复例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则可采用如下方法保护和恢复现场。PROG PROC PUSH AX;保护现场 PUSH BX PUSH CX PUSH DX

POP DX;恢复现场 POP CX POP BX POP AX RET ;返回断点处PROC ENDP3.主程序与子程序参数传递方式(1)寄存器法(2)约定单元法(3)堆栈法4.6.4子程序应用举例【例】将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元并显示。如二进制数转换成字符串为‘’。要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8位和16位二进制数的转换。入口参数:DX=存放待转换的二进制数CX=存放待转换数的位数(8位或16位)DI=存放ASCII码首地址出口参数:转换后的字符串存放在以DI作指针的字节存贮区中程序如下:DATA SEGMENTNUM8 DB 93HNUM16 DW 0ABCDHASCBUF DB 20 DUP(0)DATA ENDSSTACK(定义略)CODE SEGMENT ASSUMEDS:DATA,CS:CODE,SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV DX,0 MOV DL,NUM8 ;转换二进制数送DX MOV CX,8 ;置位数8 LEA DI,ASCBUF ;字符串首址→DI

CALL BTASC

;调用子程序BTASC MOV [DI],BYTEPTR0DH MOV [DI+1],BYTEPTR0AHMOV[DI+2],BYTEPTR‘$’LEA DX,ASCBUF MOV AH,9 INT 21H MOV DX,NUM16 MOV CX,16 ;置位数16 LEA DI,ASCBUF

CALLBTASCMOV [DI],BYTEPTR0DH MOV[DI+1],BYTEPTR0AH MOV[DI+2],BYTEPTR‘$’ LEA DX,ASCBUF MOV AH,9 INT 21HBTASC PROC PUSH AX ;保存AX MOV AL,0 CMP CX,8 ;比较8位数 JNE L1 ;直接转换16位数 MOV DH,DL ;8位数转换送DHL1: ROL DX,,1 ;DX

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论