您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 第5章程序设计方法和上机调试
第5章程序设计方法和上机调试按照程序执行的控制结构,汇编程序的设计可分为:顺序结构程序设计、分支结构程序设计、循环结构程序设计和子程序的设计等这也是结构化程序设计的一般方法。任何程序必须经过调试,才能检查出解题目的是否正确以及程序是否符合设计思想。在调试程序的过程中,应该善于利用机器提供的调试工具(如DEBUG)和有效的其他工具软件来进行工作,经过反复的“运行—发现错误—改正错误—运行”,才能得到正确的程序。这一点对初学者特别重要,它将给汇编语言编程提供很大的帮助。程序的编写和调试运行是学好汇编语言的重要手段。只有多编写程序和多调试运行程序,才能有效地提高编写和阅读程序的能力。本章将重点介绍汇编程序设计和上机调试的一般方法。5-1程序设计方法5-6-1顺序程序设计顺序程序是一种最简单的程序,也称为直线程序,它的执行自始至终按照语句出现的先后顺序进行。[例5-1]求两个数的平均值。这两个数分别放在x单元和y单元中,而平均值放在z单元中。程序如下:DATASEGMENTxDB95yDB87zDB?DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATASTART:PUSHDSMOVAX,0PUSHAXMOVAX,DATA;装填数据段寄存器DSMOVDS,AXMOVAL,x;第一个数送入ALADDAL,y;两数相加,结果送ALMOVAH,0ADCAH,0;带进位加法,进位送AHMOVBL,2;除数2送BLDIVBL;求平均值送ALMOVz,AL;结果送入z单元RETMAINENDPCODEENDSENDSTART[例5-2]在内存中自tab开始的16个单元连续存放着0~15的平方值(平方表),任给一个数x(0≤x≤微型机原理及应用9015),如13,且存放在x单元中,查表求x的平方值,并把结果送入y单元中。根据给出的平方表,分析表的存放规律,可知表的起始地址与数x之和,正是x的平方值所在单元的地址,由此编制程序如下:DATASEGMENTtabDB0,1,4,9,16,25,36,49,64,81DB100,121,144,169,196,225xDB13yDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEABX,tabMOVAH,0MOVAL,xADDBX,AXMOVAL,[BX]MOVy,ALMOVAH,4CHINT21HCODEENDSENDSTART5-1-2分支程序设计顺序程序的特点是从程序的第一条指令开始,按顺序执行,直到执行完最后一条指令。然而,许多实际问题并不能设计成顺序程序,需要根据不同的条件作出不同的处理。把不同的处理方法编制成各自的处理程序段,运行时由机器根据不同的条件自动作出选择判断,绕过某些指令,仅执行相应的处理程序段。按这种方式编制的程序,执行的顺序与指令存储的顺序失去了完全的一致性,称之为分支程序。分支程序是机器利用改变标志位的指令和转移指令来实现的。转移指令有JMP和Jcc两类。前者是无条件转移指令,后者是条件转移指令。JMP无条件转移指令将控制转向其后的目的标号指定的地址。Jcc条件转移指令跟随在能改变状态标志的指令之后,根据条件决定是否将控制转向其后的目的地址处。[例5-3]给定以下符号函数:任意给定x值,假定为−25,且存放在x单元,函数值y存放在y单元,根据x的值确定函数y的值。程序流程图如图5-1所示。010001xxxy91第5章程序设计方法与上机调试图5-1实现符号函数程序的流程图程序如下:DATAXSEGMENTxDB−25yDB?DATAXENDSCODEXSEGMENTMAINPROCFARASSUMECS:CODEX,DS:DATAXSTART:PUSHDSMOVAX,0PUSHAXMOVAX,DATAXMOVDS,AXMOVAL,x;AL←xCMPAL,0JGELOOP1;x≥0时转LOOP1MOVAL,0FFH;否则将−1送入y单元MOVy,ALRETLOOP1:JELOOP2;x=0时转LOOP2MOVAL,1;否则将1送入y单元MOVy,ALRETLOOP2:MOVAL,0;将0送入y单元MOVy,ALRETMAINENDPCODEXENDSENDSTART开始AL←xAL≥0?y←-1AL=0?y←1y←0YYN结束N微型机原理及应用92[例5-3]设有首地址为arry的字数组,已按升序排好,数组长度为n(假设n=15),且数据段与附加段占同一段,在该数组中查找数number(假设等于83)。若找到它,则从数组中删掉;若找不到,则把它插入正确位置,且变化后的数组长度在DX中。根据题意编写程序如下:DATAJSEGMENTDW?nDW15numberDW83arryDW5,10,17,21,28,32,41,50,56,67,72DW88,95,125,150DATAJENDSCODMASEGMENTMAINPROCFARASSUMECS:CODMA,DS:DATAJ,ES:DATAJSTART:PUSHDSSUBAX,AXPUSHAXPUSHESMOVAX,DATAJMOVDS,AXPUSHDSPOPESMOVAX,number;待查找的数放入AXMOVDX,n;初始化DXMOVCX,n;设置计数器CXMOVDI,OFFSETarry;arry的有效地址放入DICLD;建立方向标志REPNESCASW;用重复串扫描指令进行查找JEDELETEDECDXMOVSI,DXADDSI,DXTT3:CMPAX,arry[SI]JLTT1MOVarry[SI+2],AX;功能是:若没有查到,JMPTT2;则将此数插入正确位置TT1:MOVBX,arry[SI]MOVarry[SI+2],BXSUBSI,2JMPTT3TT2:ADDDX,2;修改数组长度JMPFANDELETE:JCXZNEXTLOOPT:MOVBX,[DI];此程序段功能是:若查找到,MOV[DI−2],BX;则从数组中删除该数93第5章程序设计方法与上机调试ADDDI,2LOOPLOOPTNEXT:DECDX;修改数组长度FAN:POPESRETMAINENDPCODMAENDSENDSTART5-1-3循环程序设计1.循环程序的结构循环程序通常有两种结构,一种是先执行后判断,另一种是先判断后执行。图5-2循环程序的基本结构(a)先执行后判断(b)先判断后执行(1)初始化部分:建立循环初始值。如设置地址指针、计数器、其他循环参数的起始值等。(2)工作部分:在循环过程中所要完成的具体操作,是循环程序的主要部分。这部分视具体情况而定。它可以是一个顺序程序、一个分支程序或另一个循环程序。(3)修改部分:为执行下一个循环而修改某些参数。如修改地址指针、其他循环参数等。(5)结束处理部分:对循环结束进行适当处理,如存储结果等。有的循环程序可以没有这部分。图5-2(a)给出的循环程序框图是“先执行后判断”的结构;另有一种结构形式是“先判断后执行”的形式,如图5-2(b)所示,这种结构仍由五个部分组成,但是重新安排了中间三个部分的顺序。从框图可以看出它的最大优点是可以一次也不执行循环,也就是说可以设计为零次循环的程序。2.循环控制方法(1)用计数控制循环这种方法直观、方便,易于程序设计。只要在编制程序时,循环次数已知,就可以使用这种方法设计循环程序。[例5-3]从xx单元开始的30个连续单元中存放有30个无符号数,从中找出最大者送入yy单元中。根据题意,我们把第一个数先送入AL寄存器,将AL中的数与后面的29个数逐个进行比较。如果AL中的数较小,则两数交换位置;如果AL中的数大于等于相比较的数,则两数不交换位置。在比较过程中,AL中始终保持较大的数,比较29次,则最大者必在AL中。最后把AL中的数(最大者)送入yy单元。初始化循环体修改结束循环?结束处理(a)N初始化循环体修改进入循环?结束处理(b)NYY微型机原理及应用94图5-3从一批数中求最大者的程序流程图程序如下:DATASPSEGMENTxxDB73,59,61,45,81DB107,37,25,14,64DB3,17,9,23,55,97DB115,78,121,67DB215,137,99,241DB36,58,87,100,74,62yyDB?DATASPENDSCODESPSEGMENTASSUMECS:CODESP,DS:DATASPMAINPROCFARSTART:PUSHDSMOVAX,0PUSHAXMOVAX,DATASPMOVDS,AXMOVAL,xx开始AL←xxSI←xx的有效地址CX←29SI←SI+1AL≥[SI]?AL,[SI]中的数交换CX←CX-1CX=0?yy←AL结束NYNY95第5章程序设计方法与上机调试MOVSI,OFFSETxxMOVCX,29LOOP1:INCSICMPAL,[SI]JAELOOP2XCHGAL,[SI]LOOP2:DECCXJNZLOOP1MOVyy,ALRETMAINENDPCODESPENDSENDSTART(2)用条件控制循环有些情况无法确定循环次数,但可用某种条件来确定是否结束循环。这时,编制程序主要是寻找控制条件以及对控制条件的检测。[例5-4]从自然数1开始累加,直到累加和大于1000为止,统计被累加的自然数的个数,并把统计的个数送入n单元,把累加和送入sum单元。根据题意,被累加的自然数的个数事先是未知的,也就是说,循环的次数是未知的,因此不能用计数器方法控制循环。但题目中给定一个重要条件,即累加和大于1000则停止累加,因此,可以根据这一条件控制循环。我们用CX寄存器统计自然数的个数,用AX寄存器存放累加和,用BX寄存器存放每次取得的自然数。程序的流程图如图5-4所示。图5-4利用条件控制循环的程序流程图程序如下:DATASSEGMENTnDW?sumDW?开始初始化AX←0,CX←0,BX←0BX←BX+1AX←AX+BX,CX←CX+1(AX≤1000?n←CX,sum←AX结束YN微型机原理及应用96DATASENDSSTACKSEGMENTPARASTACK'STACK'DW200DUP(?)STACKENDSCODESSEGMENTMAINPROCFARASSUMECS:CODES,DS:DATAS,SS:STACKSTART:PUSHDSMOVAX,0PUSHAXMOVAX,DATASMOVDS,AXMOVAX,0MOVBX,0MOVCX,0LOOPT:INCBXADDAX,BXINCCXCMPAX,1000JBELOOPTMOVn,CXMOVsum,AXRETMAINENDPCODESENDSENDSTART5-1-4子程序设计1.子程序概念如果在一个程序中的多处需要用到同一段程序,或者说在一个程序中需要多次执行某一连串的指令时,那么我们可以把这段要执行的程序或这一连串的指令抽取出来,写成一个相对独立的程序段,每当我们想要执行这段程序或这一连串的指令时,就调用这段程序,执行完这段程序后再返回原来调用它的程序。这样我们每次执行这段程序时,就不必重写这一连串的指令了,这样的程序段称为子程序或过程。而调用子程序的程序称为主程序或调用程序。2.子程序的定义子程序是用过程定义伪指令PROC和ENDP来定义的,而且还应指出过程的类型属性。在PROC和ENDP之间是为完成某一特定功能的一连串指令,其最后一条指令是返回指令RET。过程通常以一个过程名(标号)后跟PROC开始,而以过程名后跟ENDP结束。其格式如下:过程名PROC[NEAR/FAR]RET过程名ENDP其中,‘过程名’是子程序入口的符号地址;NEAR或FAR是过程的类型属性,它指出对该过程的调用是段内调用还是段间调用,NEAR用于段内调用,而FAR用于段间调用。过程属性的确定原则为:①调用程序和过程若在同一代码段中,则使用NEAR属性;97第5章程序设
本文标题:第5章程序设计方法和上机调试
链接地址:https://www.777doc.com/doc-2196489 .html