补充2汇编语言程序设计.ppt

上传人:牧羊曲112 文档编号:6394279 上传时间:2023-10-26 格式:PPT 页数:78 大小:315KB
返回 下载 相关 举报
补充2汇编语言程序设计.ppt_第1页
第1页 / 共78页
补充2汇编语言程序设计.ppt_第2页
第2页 / 共78页
补充2汇编语言程序设计.ppt_第3页
第3页 / 共78页
补充2汇编语言程序设计.ppt_第4页
第4页 / 共78页
补充2汇编语言程序设计.ppt_第5页
第5页 / 共78页
点击查看更多>>
资源描述

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

1、第6章 汇编语言程序设计,本章学习目标 本章详细讲述汇编语言程序设计的基本步骤,通过实例分析说明程序的基本结构,按照程序设计的基本步骤设计各种结构程序的方法,主要有:汇编语言程序设计基本步骤 顺序程序的基本结构和设计方法 分支程序的基本结构和设计方法 循环程序的结构形式和程序设计子程序设计的基本过程和设计方法,第6章 汇编语言程序设计,6.1 汇编语言程序设计基本方法和基本步骤 6.2 顺序程序的结构形式和程序设计 6.3 分支程序的结构形式和程序设计 6.4 循环程序的结构和程序设计 6.5 子程序结构与设计方法,开 始,6.1 汇编语言程序设计基本方法和基本步骤,6.1.1 汇编语言程序设

2、计基本步骤 6.1.2 结构化程序的概念 6.1.3 流程图画法规定,返回本章首页,6.1.1 汇编语言程序设计的一般步骤,汇编语言程序设计一般有以下几个步骤:1分析问题,抽象出描述问题的数学模型 2确定解决问题的算法或解题思想 3绘制流程图和结构图 4分配存储空间和工作单元 5.编制程序 6.程序静态检查 7.上机调试,返回本节,6.1.2 结构化程序的概念,所谓结构化程序设计是指程序的设计、编写和测试都采用一种规定的组织形式进行,而不是想怎么写就怎么写。这样,可使编制的程序结构清晰,易于读懂,易于调试和修改,充分显示出模块化程序设计的优点。在20世纪70年代初,由Boehm和Jacobi提

3、出并证明的结构定理:即任何程序都可以由3种基本结构程序构成结构化程序,这3种结构是:顺序结构、分支(条件选择)结构和循环结构。每一个结构只有一个入口和一个出口,3种结构的任意组合和嵌套就构成了结构化的程序。,1顺序结构 顺序结构是按照语句实现的先后次序执行一系列的操作,它没有分支、循环和转移 2分支结构(条件选择结构)分支结构根据不同情况做出判断和选择,以便执行不同的程序段。分支的意思是在两个或多个不同的操作中选择其中的一个。分为双分支结构和多分支结构,3循环结构 循环结构是重复执行一系列操作,直到某个条件出现为止。循环实际上是分支结构的一种扩展,循环是否继续是依靠条件判断语句来完成的。按照条

4、件判断的位置,可以把循环分为“当型循环”和“直到型循环”。第一种情况是先作条件判断,第二种情况是先执行一次循环,然后判断是否继续循环。基本逻辑图下图所示。,6.1.3 流程图画法规定,1流程图的概念流程图是由特定的几何图形、指向线、文字说明来表示数据处理的步骤,形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。,2流程图符号表示(1)起止框:表示程序的开始和结束。,起止框,(2)判断框,(3)处理框,(4)调用框,(5)指向线,(6)连接框,返回本节,6.2 顺序程序设计,下面举例说明顺序程序的设计。【例6.1】试编写一程序计算以下表达式的值。=(v-(*+-540)

5、/x式中x、v均为有符号字数据。设、的值存放在字变量、V中,结果存放在双字变量之中,程序的流程图如图6.1所示。,返回本章首页,图6.1 顺序运算程序流程图,源程序如下:DATASEGMENTXDW200YDW100ZDW3000VDW10000WDW2 DUP(?)DATAENDSSTACKSEGMENT STACK DB 200 DUP(0)STACKENDSCODESEGMENTASSUME DS:DATA,CS:CODE,SS:STACK,START:MOVAX,DATAMOVDS,AX;DATAAXMOVAX,X IMULY;(X)*(Y)DX:AXMOVCX,AXMOVBX,DX;

6、(DX:AX)(BX:CX)MOVAX,ZCWD;(Z)符号扩展ADDCX,AXADCBX,DX;(BX:CX)+(DX:AX)(BX:CX)SUBCX,540SBBBX,0;(BX:CX)-540(BX:CX)MOVAX,V,CWD;(V)符号扩展SUBAX,CXSBBDX,BX;(DX:AX)-(BX:CX)(DX:AX)IDIVX;(DX:AX)/XMOVW,AX;商WMOVW+2,DX;余数DXW+2MOVAH,4CHINT21HCODEENDS;退出DOS 状态ENDSTART,【例6.2】,【例6.2】已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB表中,要查的学

7、生的学号放在变量NO中,查表结果放在变量ENGLISH中。编写程序如下:,STACKSEGMENT STACKDB 200 DUP(0)STACKENDSDATASEGMENTTABDB 80,85,86,71,79,96 DB 83,56,32,66,78。84NO DB 10ENGLISTDB?DATAENDSCODESEGMENT,ASSUME DS:DATA,SS:STACK,CS:CODEBEGIN:MOVAX,DATAMOVDS,AXLEABX,TAB MOVAL,NODELALXLATTABMOVENGLISH,ALMOVAH,4CHINT21HCODEENDSENDBEGIN,

8、6.3 分支程序的结构和程序设计,6.3.1 分支程序的结构形式6.3.2 分支结构的程序设计,返回本章首页,6.3.1 分支程序的结构形式,8086/8088指令系统具有许多种条件转移指令,这就说明8086/8088计算机系统具有很强的逻辑判断能力,并且能够根据这种逻辑判断选择执行不同的程序段。也就是说,当条件满足时进行某种处理,当条件不满足时又进行另外一种处理。分支程序的结构可以有两种形式:双分支结构和多分支结构。流程图如下所示。,(1)双分支结构,(2)双分支结构,(3)多分支结构程序设计,6.3.2 分支结构程序设计,1简单的双分支程序设计【例6.3】已知在内存中有一个字节单元NUM,

9、存有带符号数据,要求计算出它的绝对值后,放入RESULT单元中。题目分析:根据数学中绝对值的概念知道,一个正数的绝对值是它本身,而一个负数的绝对值是它的相反数;要计算一个数的相反数,需要完成减法运算,即用0减去这个数。8086/8088指令系统中有专门的求相反数的指令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;为正,转NE

10、XT NEG AL;否则AL求补NEXT:MOV RESULT,AL;送结果 MOV AH,4CH INT 21H;返回DOSCODEENDS END START;汇编结束,2多分支程序设计,多分支结构是有若干个条件,每一个条件对应一个基本操作。分支程序就是判断产生的条件,哪个条件成立,就执行哪个条件对应操作的程序段。也就是说,从若干分支中选择一个分支执行。多分支结构实现的方法有:条件选择法、转移表法和地址表法。条件选择法 一个条件选择指令可实现两路分支,多个条件选择指令就可以实现多路分支。这种方法适用于分支数较少的情况。,用条件转移指令实现程序分支,【例6.4】编写计算下面函数值的程序:1X

11、0Y=0X=0-1X 设输入数据为X、输出数据Y,且皆为字节变量。程序流程图如下图所示。,程序如下:DATA SEGMENT X DB-25 Y DB?DATA 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;转到结束位置

12、EE:MOV BL,0;0送BL,EXIT:MOV Y,BL;BL中内容送Y单元 MOV AH,4CH INT 21H;程序结束CODE ENDS END START;汇编结束,【例6.5】,【例6.5】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。设三个带符号数分别在三个字变量X、Y、Z中存储。程序流程图如下图所示,程序如下:STACSEGMENT STACK DB 200 DUP(0)STACKENDSDATASEGMENTX DW 00ABHY DW 5Z DW 200MAXDW?DATAENDSCODESEGMENT,ASSUME DS:DATA,SS:STA

13、CK,CS:CODE START:MOVAX,DATA MOVDS,AX MOVAX,X CMPAX,Y;XY?JGL1 MOVAX,Y;YZ?CMPAX,Z JGEXITL2:MOVAX,Z JMPEXIT,L1:CMPAX,Z;XZ?JLEL2EXIT:MOVMAX,AX MOVAH,4CH INT21HCODEENDS ENDSTART,返回本节,转移表法,转移方法实现多分支的设计思想如下:把转移到各分支程序段的转移指令依次放在一张表中,这张表称为转移表。把离表首单元的偏移量作为条件来判断各分支转移指令在表中的位置。当进行多分支条件判断时,把当前的条件偏移量加上表首地址作为转移地址,转移

14、到表中的相应位置,继续执行无条件转移指令,达到多分支的目的。,【例6.6】设某程序有8路分支,试根据给定的N值(18),将程序的执行转移到其中的一路分支。程序流程如图下所示。,程序如下: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,AXMOVAL,NDELALADDAL,ALMOVBM,ALMOVBH,0JMPTABBX,P1:JMP

15、EXITP2:JMPEXITP2:JMPEXITP3:,JMPEXITP8:EXIT:MOVAH,4CH INT21HCODEENDS ENDSTART上述程序中的无条件转移指令的转移地址采用的是变址寻址。同理,转移地址也可以用寄存器间接寻址或基址加变址寻址,读者可自行考虑。,返回本节,6.4 循环程序设计,6.4.1 循环程序的结构6.4.2 循环程序的设计方法,返回本章首页,6.4.1 循环程序的结构,1循环结构的组成2循环程序的结构3循环程序控制方法,1.循环程序的组成,(1)循环初始化部分(2)循环体(3)循环参数修改部分(4)循环控制部分,2循环程序的结构,在程序设计中,常见的循环结

16、构有两种:一种是先执行循环体,然后判断循环是否继续进行;另一种是先判断是否符合循环条件,符合则执行循环体,否则退出循环。两种循环结构如下图所示。,3.循环控制的方法,(1)计数控制法(2)条件控制法(3)混合控制法,6.4.2 循环程序设计方法,1单循环程序设计2多重循环程序设计,1单循环程序设计,【例6.7】已知有几个元素存放在以BUF为首址的字节存贮区中,试统计其中正元素的个数。显然,每个元素为一个8位有符号二进制数,统计其中正元素的个数可用循环程序实现。其程序流程图如下图所示。,【例6.8】,【例6.8】编写程序完成求123N的累加和,直到累加和超过1000为止。统计被累加的自然数的个数

17、送CN单元,累加和送SUM。流程图如下图所示。,程序如下:,DATA SEGMENT SUM DW?CN DW?DATAENDSCODESEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX;初始化 MOV AX,0;0送AX,MOV BX,0;0送BXLP:INC BX;BX加1 ADD AX,BX;求累加和 CMP AX,1000;比较 JBE LP;1000转 MOV SUM,AX MOV CN,BX;送结果 MOV AH,4CH INT 21H;返回DOS CODE ENDS END START;汇编结束,2.多重循环程序设计

18、,【例6.9】在以BUF为首址的字存储区中存放有N个有符号数,现需将它们按大到小的顺序排列在BUF存储区中,试编写其程序。我们采用冒泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对,则不交换两数位置;如次序不对则使这两个数交换位置。可以看出,第一遍需比较(N-1)次,此时,最小的数已经放到了最后;第二遍比较只需考虑剩下的(N-1)个数,即只需比较(N-2)次;第三遍只需比较(N-3)次,整个排序过程最多需(N-1)遍。如下面的4个数即是采用冒泡排序比较的例子。,数108169032第一遍101690328第二遍169032108第三遍903216108程序流程图如图4.9所示。,程序

19、如下:DATASEGMENTBUFDW 3,-4,6,7,9,2,0,-8,-9,-10,20N=(-BUF)/2DATAENDSSTACKSEGNMENT STACKDB 200 DUP(0)STACKENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACK,START:MOVAX,DATAMOVDS,AXMOVCX,NDECCXLOOP1:MOVDX,CXMOVBX,0LOOP2:MOVAX,BUFBXCMPAX,BUFBX+2JGELXCHGAX,BUFBX+2MOVBUFBX,AX,L:ADDBX,2DECCXJNELOOP2MOVCX,DXLOOP

20、LOOP1MOVAH,4CHINT21HCODEENDSENDSTART,程序运行后,BUF区中的内容如下:20,9,7,6,3,2,0,-4,-8,-9,-10若要对N个无符号数按由大到小的顺序排列,只需将指令“JGE L”改为“JAE L”即可。,返回本节,6.4 子程序结构与设计方法,6.4.1 子程序的基本概念6.4.2 子程序的结构6.4.3 子程序的定义和参数传递6.4.4 子程序应用举例,返回本章首页,6.4.1 子程序的概念,在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调

21、用。在汇编语言中,子程序又称过程。调用子程序的程序称为主调程序或主程序。,返回本节,6.4.2 子程序的结构,子程序的基本结构包括以下几个部分:(1)子程序说明(2)保护现场和恢复现场(3)子程序体(4)子程序返回,返回本节,6.4.3 子程序的定义和参数传递,1.子程序的定义子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下:过程名 PROC NEAR/FAR 过程名 ENDP其中PROC表示过程定义开始,ENDP表示过程定义结束。过程名是过程入口地址的符号表示。一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。,2主程序与子程序参数传递方式,(1)寄

22、存器法(2)约定单元法(3)堆栈法,返回本节,6.4.4 子程序应用举例,【例6.10】将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元并显示。如二进制数10010011转换成字符串为10010011。要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8倍和16倍二进制数的转换。,入口参数:DX存放待转换的二进制数CX存放待转换数的位数(8位或16位)DI存放ASCII码首地址出口参数:转换后的字符串存放在以DI作指针的字节存贮区中程序如下:DATASEGMENTNUM8DB93HNUM16DW0ABCDHASCBUFDB20DUP(0)DATAEN

23、DS,CODESEGMENTASSUME DS:DATA,CS:CODE,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVDX,0MOVDL,NUM8;转换二进制数送DXMOVCX,8;置位数8LEADI,ASCBUF;字符串首址DICALLBTASC;调用子程序BTASCMOVDI,BYTE PTR 0DHMOVDI+1,BYTE PTR 0AH,MOVDI+2,BYTE PTR$LEADX,ASCBUFMOVAH,9INT21HMOVDX,NUM16MOVCX,16;置位数16LEADI,ASCBUFCALLBTASC MOVDL,BYTE PTR 0DHMOVDL+1,BYTE PTR 0AHMOVDL+2,BYTE PTR;显示转换后的字符串LEADX,ASCBUF MOVAH,9 INT21H,BTASCPROCPUSHAX;保存AXMOVAL,0CMPCX,8;比较8位数JNEL1;直接转换16位数MOVDH,DL;8位数转换送DHL1:ROLDX,,1;DX最高位移入CFRCLAL,1;CF移入AL最低位ADDAL,30HMOVDI,AL,INCDILOOPL1POPAXRETBTASCENDPCODEENDSENDSTART,返回本节,Thank you very much!,本章到此结束,谢谢您的光临!,返回本章首页,结 束,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号