您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第4章 汇编语言程序设计2
1微机原理与接口技术2顺序结构;分支结构;循环结构;子程序结构;综合举例;内容提要§4-4程序设计方法§4-4程序设计方法——概述3§4-4程序设计方法——概述▲一个好的程序应该具备的特点:⑴程序结构模块化,程序易读,易调试及维护。⑵执行速度快。⑶占用内存空间小。概述4§4-4程序设计方法——概述▲设计汇编语言源程序的基本步骤:⑴分析问题抽象数学模型,确定实现算法。⑵绘制程序流程图粗框图细框图。图例如图4-7所示。⑶分配存储空间、工作单元分配数据段、堆栈段、程序段的位置,确定寄存器主要作用。⑷编写程序⑸静态检查,上机调试⑹程序运行,结果分析。5§4-4程序设计方法——概述▲常用四种程序结构顺序结构,分支结构,循环结构,子程序结构。6§4-4程序设计方法——顺序结构程序简单,程序顺序执行,无分支、循环,也无转移,图中没有判断框。例4-55内存中TABLE开始存放0~9的平方值,通过人机对话,当任意给定一个数X(0~9),查表得X的平方值,放在AL中。一、顺序结构解:DATASEGMENTTABLE1DB0,1,4,9,16,25,36,49,64,81BUFDB‘Pleaseinputonenumber(0~9):’,0DH,0AH,‘$’DATAENDSSSEGSEGMENTPARASTACK‘STACK’DB50DUP(?)SSEGENDSCODESEGMENTMAINPROCFARASSUMECS:DATA,DS:DATA,SS:SSEGSTART:MOVAX,DATA;段初始化MOVDS,AX7§4-4程序设计方法——顺序结构MOVDX,OFFSETBUF;9号功能调用,提示输入一个数MOVAH,9INT21HMOVAH,1;1号功能调用,键入数送ALINT21HANDAL,0FHMOVBX,OFFSETTABLE1MOVAH,0;查表得输入数的平方值ADDBX,AX;本2条指令等价于XLATMOVAL,[BX]MOVAH,4CHINT21HRETMAINENDPCODEENDSENDSTART8§4-4程序设计方法——分支结构1.分支结构:根据不同条件程序选择不同的处理方法时,运用分支结构。如图5-2所示。二、分支结构图5-2分支结构框图形式判定条件YN判定条件9§4-4程序设计方法——分支结构例4-56存储器中有一串字符串首址为BUF,字符串长度N小于256,要求分别计算出其中数字‘0’~‘9’,字母‘A’~‘Z’和其它字符的个数,并分别将它们的个数存放到此字符串的下面三个单元中。解:DATASEGMENTBUFDBNDB01H,38H,47H,60H,…76HNUMDB3DUP(?)DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATASTART:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AX10§4-4程序设计方法——分支结构MOVCH,BUF;数组个数N→CHMOVBX,1MOVDX,0;DH计数字的个数,DL计字母的个数LP:MOVAH,BUF[BX]CMPAH,30HJLNEXT;小于‘0’转CMPAH,39HJGABC;大于‘9’转INCDH;数字个数加1JMPNEXTABC:CMPAH,41HJLNEXT;小于‘A’转CMPAH,5AHJGNEXT;大于‘Z’转INCDL;字母的个数加1NEXT:INCBX;数组地址加1DECCH;计数器减1JNZLP11§4-4程序设计方法——分支结构MOVBUF[BX],DH;数字的个数送入内存单元MOVBUF[BX+1],DL;字母的个数送入内存单元MOVAH,NSUBAH,DH;N―DH―DL=其它字符的个数SUBAH,DLMOVBUF[BX+2],AH;其它字符的个数送入内存单元RETMAINENDPCODEENDSENDSTART12§4-4程序设计方法——分支结构2.多分支:依次测试多个条件是否满足:若满足转入相应分支入口;不满足继续向下测试,直到全部测试完。此方法编程简单直观,但速度慢。。例4-57有8个加工子程序,入口地址分别为P1,P2,…P8。编程实现检测键盘输入命令,使系统分别转向8个加工子程序。解:相应程序如下:13§4-4程序设计方法——分支结构MOVAH,1INT21H;1号功能键调用,键盘接收(P159)CMPAL,‘1’;键值为1,转1号加工子程序JEP1CMPAL,‘2’;键值为2,转2号加工子程序JEP2…CMPAL,‘8’JEP8;键值非1~8,转向停止JMPSTP1:…;1号加工子程序P2:…P3:……P8:…ST:HLT14§4-4程序设计方法——分支结构3.跳转表实现多分支:好处:可以直接找到相应入口。实现:建立跳转表:包括每个分支的入口地址、跳转指令或关键字。⑴根据表内地址分支:跳转表中存放了每个分支程序的入口地址,只要找到表地址,再将其中内容取出,即可得到每个分支的入口地址。表地址=跳转表首地址+偏移地址使用:JMPWORDPTR[BX];转入相应入口地址15§4-4程序设计方法——分支结构跳转表在内存中的存放方法如图4-9(a)所示。按表地址分支的流程图如图4-9(b)所示。图5-3跳转表在内存中的存放方法BASEBASE+2┇┇┇┇┇P2高位P2低位P1高位P1低位P1P2图5-4跳转表分支流程图开始取编号求偏移量求表地址分支转到相应的加工程序16§4-4程序设计方法——分支结构例将上例用跳转表来实现解:ADATASEGMENTBASEDWP1,P2,P3,P4;定义跳转表DWP5,P6,P7,P8KEYDB?ADATAENDSASTACKSEGMENTPARASTACK‘STACK’DB100DUP(?)ASTACKENDSACODESEGMEINTASSUMECS:ACODE,DS:ADATA,SS:ASTACKMAINPROCFARSTART:PUSHDSMOVAX,0PUSHAXMOVAX,ADATAMOVDS,AX17§4-4程序设计方法——分支结构MOVAH,1;检测按键,键值在AL中INT21HANDAL,0FH;将ASCII码转换为非压缩BCD码MOVBX,OFFSETBASE;取跳转表首地址MOVAH,0ADDAL,AL;数字×2=偏移量ADDBX,AX;求表地址JMPWORDPTR[BX];转入相应入口地址…RETMAINENDPCODEENDSENDSTART18§4-4程序设计方法——分支结构⑵根据表内指令分支:表内存放:转移指令。查表后程序转到相应子程序。转移指令跳转表存放形式如图。图5-5转移指令跳转表BASE1JMPP1JMPP2JMPP5E9P1低位P1高位E9P2低位P2高位┇┇使用:JMPBX;转入转移指令19§4-4程序设计方法——分支结构例将例4-57程序用跳转表来安排指令实现分支。解:建立跳转表:DATASEGMENTBASEDBE9,P1低,Pl高,E9…DBE9……E9,P8低,P8高DATAENDS有关程序段为:MOVAH,1;键入到ALINT21HANDAL,0FHMOVAH,0MOVBL,AL;AL为键值ADDAL,ALADDAL,BL;偏移量=键值×3MOVBX,OFFSETBASE;基地址ADDBX,AX;表地址JMPBX;转入转移指令20§4-4程序设计方法——分支结构⑶根据关键字分支:表中存放:关键字,及相应分支地址。图4-10(a)给出了关键字跳转表的格式;图5-7(b)给出了关键字分支流程图。图5-6关键字跳转表BASEP1程序入口地址P2程序入口地址P8程序入口地址3132┇38关键字值图5-7关键字分支流程图开始输入关键字关键字=0指针←表首址与表内关键字比较相等吗调整指针加3实现分支YNYN21§4-4程序设计方法——分支结构BDATASEGMENTBASEDB31H;关键字DWP1;P1入口地址DB32HDWP2┇DB38HDWP8BDATAENDS┇例将例4-55用关键字跳转表方式实现分支。22┇LOP:MOVAH,1;读入键值INT21HANDAL,0FHCMPAL,‘0’JELOPMOVBX,OFFSETBASE;取表首址NEXT:CMPAL,[BX];=关键字转DOJEDOADDBX,3;修改地址JMPNEXTDO:JMPWORDPTR[BX+1]┇23§4-4程序设计方法——分支结构分支程序举例4-58设有首地址为BUFFER的数组,已按升序排好,数组长度N=10,在数组中查找数M(=80),若找到则从数组中删掉,若找不到将它插入正确的排序位置,DX中记录数组最后的长度。解:DATASEGMENTBUFFERDW5,10,32,47,53,77,89,106,115,124NEQU10MEQU80DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATAMAINPROCFARSTART:PUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVES,AX24§4-4程序设计方法——分支结构MOVAX,M;待查数→AXMOVCX,N;计数→CXMOVDX,NMOVDI,OFFSETBUFFERCLDREPNESCASW;串扫描查找JEDEL;查到ZF=1DECDX;未查到,此数插入正确位置MOVSI,DX;关键字与最后一个数比较ADDSI,DXL1:CMPAX,BUFFER[SI]JLL2;关键字比较组中某个字小MOVBUFFER[SI+2],AX;否则插在后面JMPL325§4-4程序设计方法——分支结构L2:MOVBX,BUFFER[SI];数组下移一位MOVBUFFER[SI+2],BXSUBSI,2JMPL1L3:ADDDX,1;修改长度JMPNEXT1DEL:JCXZNEXT;找到,删此元素DEL1:MOVBX,[DI];其后元素依次前移MOV[DI-2],BXADDDI,2LOOPDEL1NEXT:DECDX;改变数组长度NEXT1:RETMAINENDPCODEENDSENDSTART26§4-4程序设计方法——循环程序结构1.循环程序的两种结构形式:▲“先执行后判断”•进入循环后至少要执行一次循环体,再判断循环是否结束。•适合于循环次数固定的程序。▲“先判断后执行”•进入循环后,先判断循环结束条件,再决定是否执行循环体,可能循环体一次也不执行。•适合于循环次数不固定的程序。如图4-11所示。三、循环程序结构27§4-4程序设计方法——循环程序结构图5-8循环程序结构图入口初始化部分循环体修改参数循环控制出口入口初始化部分循环体修改参数循环控制出口(a)“先执行,后判断”结构(b)“先判断,后执行”结构28§4-4程序设计方法——循环程序结构两种循环结构都包括四部分:⑴初始化设置循环计数值,设置变量初值。⑵循环体循环部分的核心:循环的全部执行指令。⑶修改参数修改操作数地址,为下次循环作准备。⑷循环控制修改计数器值,判断循环控制条件,决定是否跳出循环。29§4-4程序设计方法——循环程序结构例4-59将BX中的16进制数转换为ASCII码,存放到BUF开始的内存单元中去,并在屏幕显示出数值。解:本程序编写采用“先执行后判断”的结构。流程图如图4-12所示。图5-916进制数转化成ASCII码流程图开始初始化循环计数值把最右面的数位转换为ASCII码加上7出口BX循环左移一个数位是‘A’~’F’?显示一个字符循环计数值=0?NYYN30§4-4程序设计方法——循环程序结构解:MOVSI,OFFSETBUF;设置内存地址MOVCH,4;计数初值=4NEXT:MOVCL,4ROLBX,CL;最高位移到右边MOVAL,BL;一个数转换成ASCII码ANDAL,0FHADDAL,30HCMPAL,3AH;字符为A~F吗?JLSTOREADDAL,7STORE:MOV[SI],AL;字符存入内存MOVAH,2;调用屏幕显示(P161)MOVDL,ALINT21HINCSI;修改计数并
本文标题:第4章 汇编语言程序设计2
链接地址:https://www.777doc.com/doc-3515797 .html