汇编语言分支与循环程序设计.ppt

上传人:小飞机 文档编号:6586387 上传时间:2023-11-15 格式:PPT 页数:61 大小:552KB
返回 下载 相关 举报
汇编语言分支与循环程序设计.ppt_第1页
第1页 / 共61页
汇编语言分支与循环程序设计.ppt_第2页
第2页 / 共61页
汇编语言分支与循环程序设计.ppt_第3页
第3页 / 共61页
汇编语言分支与循环程序设计.ppt_第4页
第4页 / 共61页
汇编语言分支与循环程序设计.ppt_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《汇编语言分支与循环程序设计.ppt》由会员分享,可在线阅读,更多相关《汇编语言分支与循环程序设计.ppt(61页珍藏版)》请在三一办公上搜索。

1、,第一章 基础知识,第5章分支与循环程序设计,1)分析题意,确定算法。这一步是能否编制出高质量程序的关键,因此不应该一拿到题目就急于写程序,而是应该仔细地分析和理解题意,找出合理的算法及适当的数据结构。2)根据算法画出程序框图。这一点对初学者特别重要,这样做可以减少出错的可能性。画框图时可以从粗到细把算法逐步地具体化。3)根据框图编写程序。4)上机调试程序。任何程序必须经过调试才能检查出你的设计思想是否正确以及你的程序是否符合你的设汁思想。在调试程序的过程中应该善于利用机器提供的调试工具(如DEBUG)来进行工作,你会发现它会给你提供很大的帮助。,分析问题,程序设计的解题基本步骤如下:,顺序、

2、分支、循环程序和子程序的设计是汇编语言程序设计的基本内容。,在此基础上还要掌握汇编语言程序设计的基本方法和技巧,包括递归子程序设计、COM和EXE格式程序的结构和特点、多模块程序设计方法等。,一、汇编语言程序设计的基本方法,概述,概述,二、程序的基本结构 1、顺序结构程序 2、分支结构程序 3、循环(重复)结构程序 顺序结构 分支结构 循环(重复)结构,第一节 顺序结构程序设计,顺序结构程序完全按指令书写的前后顺序执行每一条指令,是最基本、最常见的程序结构特点 顺序性、结构简单,只适应于简单问题的处理,例1 计算,例2 移位,例:X+Y+Z W,stack segment para stack

3、 dw 64h dup(?)stack endsdata1 segment Xdw 5 Ydw 6 Zdw 7 Wdw?data1 ends,code segment assume cs:code,ss:stack,ds:data1 start:mov ax,data1 mov ds,ax mov ax,X add ax,Y adc ax,Z mov W,ax mov ah,4ch int 21h code ends end start,例:64位数据移位,data segmentvardb 21h,43h,65h,87h,78h,56h,34h,12hdata endscodesegment

4、assume cs:code,ds:datastart:mov ax,datamov ds,axmov al,var6mov var7,almov al,var5mov var6,almov al,var4mov var5,almov al,var3mov var4,al,图示,mov al,var2mov var3,almov al,var1mov var2,almov al,var0mov var1,almov byte ptr var0,0mov ah,4chint 21hcodeendsend start,12 34 56 78 87 65 43 21h,34 56 78 87 65

5、43 21 00h,移位后,图示,例:64位数据移位,64位数据左移8位,12,34,56,78,87,65,43,21,00,var0,var1,var2,var3,var4,var5,var6,var7,程序结束的方法,程序执行完毕,正常结束要返回DOS,有两种方法(1)使用PSP中的“INT 20H”指令,实现用户程序结束,返回DOS 方法:将用户程序设置成一个远过程 程序开始时,执行如下指令 PUSH DS MOV AX,0 PUSH AX 用户程序结束时,用RET指令,程序结束的方法,(2)使用DOS功能调用的“INT 21H”指令,实现用户程序结束,返回DOS 方法:在程序结束前,

6、使用如下指令 MOV AH,4CH INT 21H 注意:一般情况下,使用第2种方法结束用户程序。,第二节:循环结构,循环程序设计,根据条件重复执行一段指令就构成了循环程序结构。,MOV AX,0;累加求和寄存器清0 MOV BX,OFFSET ARRAY;数组始址送BX中 MOV CX,50;循环控制计数初始化 AGAIN:ADD AX,BX ADD BX,2;数组地址增2,BX指向下一个元素 DEC CX;循环控制计数减1 JNZ AGAIN;计数不为0时继续循环 MOV S,AX;计数为0时循环结束,和存于S中,保证循环正常执行和结束的条件:正确地初始化循环控制计数和初始条件 正确地检测

7、循环条件 必须保证能达到循环结束条件(例如在循环体内有修改循环控制值的指令),指令系统提供了专门用于循环结构的循环控制指令,更加简便的地实现循环结构。,循环控制指令,循环控制指令的转移范围为:-128+127字节,LOOP AGAIN,(段内短转移),(CX)0 且 ZF=1?,(CX)0 且 ZF=0?,在前面的求和例子中,可用一条循环指令代替两条指令:,MOV CX,80 MOV SI,-1 MOV AL,$AGAIN:INC SI CMP AL,STRSSI LOOPNE AGAIN MOV LEN,SI,循环程序设计方法,控制循环的方法可分为两类:,计数循环用于循环次数已知的情况,条件

8、循环用于循环次数不确定的情况,设:STRS DB string$,例 统计AX中的二进制数含“1”的总个数,程序段如下:MOVCX,0 AGAIN:ANDAX,AX;(AX)=0?JZQUIT;是,退出循环 SALAX,1;否,(AX)的最高位移入CF位 JNCNEXT;CF1时,转向NEXT再次循环 INCCX;CF=1,计数器(CX)(CX)+1 NEXT:JMPAGAIN;再次循环 QUIT:,上述程序为当型循环程序结构:先判断条件,后执行循环。,当型循环与直到型循环:,第一章 基础知识,循环程序设计方法例 在ADDR单元中存放着数Y的地址,试编制一程序把Y中1的个数存入COUNT单元中

9、。,算法:要测出Y中1的个数就应逐位测试,一个比较简单的办法是可根据最高有效位是否为1来记数,然后用移位的方法把各位数逐次移到最高位去。循环的结束可以用计数值为16来控制,但更好的办法是结合上述方法可以用测试数是否为0来作为结束条件,这样可以在很多情况下缩短程序的执行时间。此外考虑到Y本身为0的可能性,应该采用WHILEDO的结构形式。,第一章 基础知识,程序框图,第一章 基础知识,程序:,第一章 基础知识,int 21hmain endpcode_seg endsend start,例 在附加段中有一个首地址为LIST和未经排序的字数组,在数组的第一个字中存放着该数组的长度,数组的首地址已存

10、放在DI寄存器中。AX寄存器中存放着一个数。要求编制一程序:在数组中查找该数,如果找到此数则把它从数组中删除。,算法:这一程序应该首先查找数组中是否有(AX),如果没有则不对数组作任何处理就结束程序。如果找到这一元素则应把数组中位于其前(指地址比该元素高)的元素后移一个字(即向低地址方向移动),并修改数组长度值。如果找到的元素正好位于数组末尾,则不必移动任何元素,只要修改数组长度值就可以。这里第一部分的查找元素可以使用串处理指令,第二部分的删除元素则可使用循环结构,由于查找结束时就可以知道该元素的位置,因此可以作为循环次数已知的情况来设计。,第一章 基础知识,流程图:,第一章 基础知识,程序:

11、,data_seg segment LIST dw 10,0,11,22,33,44,55,66,77,88,99data_seg endscode_seg segment assume cs:code_seg,es:data_segmain proc farstart:mov ax,data_seg;代码段地址空间分配 mov es,ax cld;设置DF=0,地址自动递增操作 mov ax,33;设置AX寄存器的数值 lea di,LIST,第一章 基础知识,push di;将LIST的首地址压栈,为将来改变数组元素个数,就可以弹出该;地址 mov cx,es:di;数组个数放入CX中 a

12、dd di,2 repnz scasw;将AX与ES:DI中的元素进行比较,若相等则跳转到DELETE;结束否则 je delete pop di jmp short exitdelete:jcxz del_last;判断要删除的元素是否为最后的数组元素,是就跳转到;DEL_LAST执行del_next:,第一章 基础知识,mov bx,es:di;数组元素向前移动 mov es:di-2,bx add di,2 loop del_nextdel_last:pop di dec word ptr es:di;改变数组元素的大小exit:mov ax,4c00h int 21hmain endp

13、code_seg ends end start,第一章 基础知识,例 试编制一程序;从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不是则退出程序;如是则开始接收留入的字符并顺序存放在首地址为BUFFER的缓冲区中(空格符不存人),直到接收到第二个空格符时退出程序。,算法:这一程序要求接收的字符从空格符开始又以空格符结束,因此程序中必须区分所接收的字符是否是第一个字符,为此设立作为标志的存储单元FLAG,一开始将其置为0,接收第一个字符后可将其置1。,第一章 基础知识,data_seg segment buffer db 100 dup(?)flag db?data_seg endsc

14、ode_seg segment assume cs:code_seg,ds:data_segmain proc farstart:mov ax,data_seg mov ds,ax lea bx,buffer mov flag,0;FLAG初始化为0,准备接收第一个字符next:mov ah,01,第一章 基础知识,int 21h;从键盘输入一个字符,存放在AL寄存器中 test flag,01h;判断是否为第一个字符 jz follow;不是第一个字符跳转到FOLLOW cmp al,20h;是第一个字符,判断该字符是否为空格 jnz exit mov flag,1 jmp next;再输入

15、字符follow:cmp al,20h;判断是否为空格 jz exit;是空格就退出 mov bx,al;不是将该字符的ASC码存入缓冲区内 inc bx jmp next,第一章 基础知识,exit:mov ax,4c00h int 21hmain endpcode_seg endsend start,第一章 基础知识,(3)多重循环,第一章 基础知识,例 有一个首地址为A的N字数组,请编制程序使该数组中的数按照从大到小的次序排序。,算法:我们采用起泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置。下表表示了这种算法的例子,可以看出在做

16、了第一遍的(N一1)次比较后,最小的数已经放到了最后,所以第二遍比较只需要考虑(N-1)个数,即只需要比较(N一2)次,第三遍则只需要做(N一3)次比较总共最多(N1)遍比较就可以完成排序。,第一章 基础知识,loop1:mov dx,cx mov bx,0loop2:mov ax,abx cmp ax,abx+2 jge continue xchg ax,abx+2 mov abx,axcontinue:add bx,2 loop loop2 mov cx,dx loop loop1,第一章 基础知识,mov ax,4c00h int 21hmain endpcode_seg endsend

17、 start,3 分支程序的结构形式,指令系统具有许多种条件转移指令,这就说明计算机系统具有很强的逻辑判断能力,并且能够根据这种逻辑判断选择执行不同的程序段。也就是说,当条件满足时进行某种处理,当条件不满足时又进行另外一种处理。分支程序的结构可以有两种形式:双分支结构和多分支结构。流程图如下所示。,(1)双分支结构,(2)双分支结构,(3)多分支结构程序设计,3.2 分支结构程序设计,1简单的双分支程序设计【例6.3】已知在内存中有一个字节单元NUM,存有带符号数据,要求计算出它的绝对值后,放入RESULT单元中。题目分析:根据数学中绝对值的概念知道,一个正数的绝对值是它本身,而一个负数的绝对

18、值是它的相反数;要计算一个数的相反数,需要完成减法运算,即用0减去这个数。指令系统中有专门的求相反数的指令NEG。流程图如下:,程序如下:DATASEGMENT X DB-25 RESULT DB?DATAENDSCODESEGMENT ASSUME DS:DATA,CS:CODESTART:MOVAX,DATA MOVDS,AX;初始化 MOVAL,X;X取到AL中,TEST AL,80H;测试AL正负 JZ NEXT;为正,转NEXT NEG AL;否则AL求补NEXT:MOVRESULT,AL;送结果 MOV AH,4CH INT 21H;返回DOSCODEENDS END START;

19、汇编结束,2多分支程序设计,多分支结构是有若干个条件,每一个条件对应一个基本操作。分支程序就是判断产生的条件,哪个条件成立,就执行哪个条件对应操作的程序段。也就是说,从若干分支中选择一个分支执行。多分支结构实现的方法有:条件选择法、转移表法和地址表法。条件选择法 一个条件选择指令可实现两路分支,多个条件选择指令就可以实现多路分支。这种方法适用于分支数较少的情况。,用条件转移指令实现程序分支,【例6.4】编写计算下面函数值的程序:1 X0Y=0 X=0-1 X0 设输入数据为X、输出数据Y,且皆为字节变量。程序流程图如下图所示。,程序如下:DATA SEGMENT X DB-25 Y DB?DA

20、TA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX;初始化 MOV AL,X;X取到AL中,CMP AL,0;Al中内容和0比较JGE BIG;大于等于0,转BIGMOV BL,-1;否则为负数,1送BLJMP EXIT;转到结束位置BIG:JE EE;Al中内容是否为0,为0转EEMOV BL,1;否则为大于0,1送BL JMP EXIT;转到结束位置EE:MOV BL,0;0送BL,EXIT:MOV Y,BL;BL中内容送Y单元 MOV AH,4CH INT 21H;程序结束CODE ENDS END

21、START;汇编结束,【例6.5】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。设三个带符号数分别在三个字变量X、Y、Z中存储。程序流程图如下图所示,程序如下:STACSEGMENT STACK DB 200 DUP(0)STACKENDSDATASEGMENTX DW 00ABHY DW 5Z DW 200MAXDW?DATAENDSCODESEGMENT,ASSUME DS:DATA,SS:STACK,CS:CODE START:MOVAX,DATA MOVDS,AX MOVAX,X CMPAX,Y;XY?JGL1 MOVAX,Y;YZ?CMPAX,Z JGEXI

22、TL2:MOVAX,Z JMPEXIT,L1:CMPAX,Z;XZ?JLEL2EXIT:MOVMAX,AX MOVAH,4CH INT21HCODEENDS ENDSTART,返回本节,转移表法,转移方法实现多分支的设计思想如下:把转移到各分支程序段的转移指令依次放在一张表中,这张表称为转移表。把离表首单元的偏移量作为条件来判断各分支转移指令在表中的位置。当进行多分支条件判断时,把当前的条件偏移量加上表首地址作为转移地址,转移到表中的相应位置,继续执行无条件转移指令,达到多分支的目的。,【例】设某程序有8路分支,试根据给定的N值(18),将程序的执行转移到其中的一路分支。程序流程如图下所示。,

23、程序如下:DATASEGMENTTABDW P1,P2,P3,P4,P5,P6,P7,P8N DB 5DATAENDSSTACKSEGMENT DB 200 DUP(0)STACKENDSCODESEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE,START:MOVAX,DATAMOVDS,AXMOV AL,NDEC ALADD AL,ALMOV BL,ALMOV BH,0JMP TABBX,P1:JMPEXITP2:JMPEXITP2:JMPEXITP3:,JMPEXITP8:EXIT:MOVAH,4CH INT21HCODEENDS ENDSTART上述程序中的无条件转移指令的转移地址采用的是变址寻址。同理,转移地址也可以用寄存器间接寻址或基址加变址寻址,读者可自行考虑。,返回本节,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号