您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 第五章程序设计方法和上机调试
微机原理及应用第五章程序设计方法和上机调试Wu1第五章程序设计方法和上机调试§5.1汇编语言程序设计方法汇编语言设计基本要求:①结构化、简明、易读、易调试、易维护(修改、扩充等)②执行速度快:③占用的存储空间少相矛盾,根据实际权衡汇编语言程序设计的基本步骤:①分析问题,建数学模型,确定算法②绘制流程图或写出步骤安排③分配空间及寄存器,根据框图写程序④静态检查⑤上机调试程序结构类型:顺序结构分支结构不同的情况有不同的做法循环结构重复做的工作子程序多次重复使用的、具有通用性便于共享的部分。子程序前面应加必要的说明;子程序名称;功能;入口参数;出口参数;所用寄存器例1:查平方表程序----顺序结构0~15的平方值存在TABLE开始的16个单元。任给一自然数M在XX单元中。查表求M的平方值,并将结果存入YY单元中。STACKSEGMENTPARASTACK‘STACK’DB50DUP(?)STACKENDS;组合类型,本段可以被别的段引用类别DATASEGMENTPARAPUBLIC‘DATA’TABLEDB0,1,4,9,16,25,36,49,64,81DB100,121,144,169,196,125XXDB6YYDB?DATAENDS;CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK微机原理及应用第五章程序设计方法和上机调试Wu2段寄存器指向说明CS指向CODE段……STARTPROCFARPUSHDSMOVAX,0将DOS段值和偏移量(零)入栈。PUSHAXMOVAX,DATAMOVDS,AX;当前数据段MOVBX,OFFSETTABLE;取表的偏移量MOVAH,0可用MOVAL,XXMOVAL,XXXLAT代替ADDBX,AX;取要查数的偏移量MOVAL,[BX];查表MOVAL,XX[BX]MOVYY,ALRETSTARTENDPCODEENDSENDSTARTP67页*:XLAT换码指令完成一字节的查表转换AL←(BX+AL)表的首址放入BX,相对首址偏移值入AL。014……24……E1624例2:数据块传送----分支结构将内存中首址为STG1、长度为STRSE的数据块传送到首址为STG2的区域中去。无重迭STG1+STRSE-1<STG2或STG2+STRSE-1<STG1有重迭时STG1+STRSE-1≥STG2STG2+STRSE-1≥STG1分析可知第一种情况用减量传送STG1+STRSE-1≥STG2,其它都用增量传送。DATASEGMENTSTRGDB100DUP(?)STG1EQUSTRG+7STG2EQUSTRG+25TABLE[XX]XXYY微机原理及应用第五章程序设计方法和上机调试Wu3STRSEEQU50;传送50字节数据DATAENDS;STACKSEGMENTPARASTACK‘STACK’DB100DUP(?);定义100个字节堆栈STACKENDS;CODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKGOOPROCFAR主模块用STARTPUSHDSMOVAX,0DOS入栈PUSHAXMOVAX,DATA指向当前数据段MOVDS,AXMOVES,AXMOVCX,STRSE;计数器值MOVSI,OFFSETSTG1;数据源指针MOVDI,OFFSETSTG2;目的数据指针CLD;增量传送MOVBX,SIPUSHSI;保护源操作数指针ADDBX,STRSE-1ADDSI,STRSE-1;源最后一个数指针CMPBX,DICMPSI,DI;比较STG1+STRSE-1≥STG2.减POPSI;恢复SI<STG2.增(?)JBOK;低于则转移STD;减量传送ADDSI,STRSE-1;源尾部ADDDI,STRSE-1;目的尾部OK:REPMOVSB;重复传送RETGOOENDPCODEENDSENDGOO例5-2吴分支结构存储器中由一串字符串首址为BUF,字符串长度N小于256,要求分别计算出其中数字、字母和其它字符的个数,存放在字符串的下面三个单元中。解:本题根据字符的ASCII码值范围进行判断,字母41H~5AH,数字30H~39HDATASEGMENTBUFDBNDB01H,38H,47H,60H,…,76HNUMDB3DUP(?)微机原理及应用第五章程序设计方法和上机调试Wu4DATAENDS;STACKSEGMENTPARASTACK‘STACK’DB100DUP(?);定义100个字节堆栈STACKENDS;CODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATA,SS:STACKSTART:PUSHDSMOVAX,0DOS入栈PUSHAXMOVAX,DATA指向当前数据段MOVDS,AXMOVCH,N;数组个数NCHMOVBX,1MOVDX,0;DH计数字个数,DL计字母个数LP:MOVAH,BUF[BX];第一次取01HAHCMPAH,30HJLNEXT;小于‘0’转CMPAH,39HJGABC;大于‘9’转INCDH;数字个数+1JMPNEXTABC:CMPAH,41HJLNEXT;小于‘A’转CMPAH,5AHJGNEXT;大于‘Z’转INCDL;字母个数+1NEXT:INCBX;数组地址+1DECCH;计数-1JNZLP;不为0跳转继续MOVBUF[BX],DH;数字个数送内存单元MOVBUF[BX+1],DH;字母个数送内存单元MOVAH,NSUBAH,DH;计算其它字符个数SUBAH,DLMOVBUF[BX+2],AH;其它字符个数送内存单元RETMAINENDPCODEENDSENDSTART微机原理及应用第五章程序设计方法和上机调试Wu5P124例6在一个带符号的字类型的数据串中,找出最大值---循环结构STTSEGMENTPARASTACK‘STACK‘DB50DUP(?)STTENDS;DATASEGMENTVALUESDW2,21,87,-23,14,90;0002H,0015H,0057H,FFE9H,000EH,005AHCOUNTEQU$-VALUES;数据串长度字节数,$-(地址计数器值)YYDW?DATAENDS;CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STTSTARTPROCFARPUSHDSMOVAX,0;DOS交权时,DOS的段值和偏移量入栈。PUSHAXMOVAX,DATA指向DS段(当前)MOVDS,AXMOVBX,OFFSETVALUES;数据首址偏移量MOVCX,COUNT/2-1;量计数器,比较n-1次MOVAX,[BX];取第一个放AX中,做初始最大值。FINDM:ADDBX,2;下移一个数据CMPAX,[BX];原来的最大值与现在的比JGTESTIP;若原来的大、不变、转移MOVAX,[BX];否则,换新的最大值入AXTESTIP:LOOPFINDM;检查循环是否结束MOVYY,AX;将最大值放入单元RETSTARTENDPCODEENDSENDSTART方法:将第一个数据作为初始最大值,再将后面的数据与其比较,将最大值放入AX中。P131页例10.在数据段定义了两个数组,编一个程序实现对两数组分别求和。要求采用子程序调用形式。调用程序用CALL指令调用之前把子程序所需参数入栈,以便子程序运行时使用这些参数。当子程序返回后,这些参数已不再有用,因此子程序结束时的RET指令应使用带常数的返回指令。以便堆栈恢复原态。STACKSEGMENTPARASTACK‘STACK‘SPAEDW20DUP(?)微机原理及应用第五章程序设计方法和上机调试Wu6TOPEQULENGTHSPAESTACKENDS;DATASEGMENTARY1DB1,2,3,4,5,6,7,8,9,10NUM1EQU$-ARY1;求数组1长度SUM1DW?ARY2DB20,30,40,10,21,33NUM2EQU$-ARY2;求数组2长度SUM2DW?DATAENDS;MAINSEGMENTASSUMECS:MAIN,DS:DATA,SS:STACKSTR:PUSHDSMOVAX,0DOS入栈PUSHAXMOVAX,DATA指向当前数据段MOVDS,AXMOVAX,NUM1PUSHAX;数组长度进栈.参数1MOVAX,OFFSETARY1PUSHAX;数组首址偏移量进栈,参数2CALLFARPTRSUM;CS、IP先后进栈MOVAX,NUM2PUSHAXMOVAX,OFFSETARY2PUSHAXCALLFARPTRSUMHLTMAINENDS;主程序结束;功能:数组求和;入口参数:数组长度、首址偏移量。出口:∑;所用寄存器AX、BX、CX、BPPROCESEGMENTASSUMECS:PROCE,DS:DATA,SS:STACKSUMPROCFARPUSHAXPUSHBXPUSHCXPUSHBPMOVBP,SP微机原理及应用第五章程序设计方法和上机调试Wu7PUSHFMOVCX,[BP+14];参数1,因在PUSHF之前SP移入BP,所以+14是参1。MOVBX,[BP+12];参数2,首址偏移量MOVAX,0ADN:ADDAL,[BX]INCBXADCAH,0;进位加进去LOOPADNMOV[BX],AX;数据之和送结果单元POPF;标志出栈Flag←(sp+1,sp),sp←sp+2POPBPPOPCXPOPBXPOPAXRET4;舍弃两个参数返回原来参数入栈两次。SUMENDPPROCEENDSENDSTR§5.2汇编语言上机调试过程⑴进入用户目录进行程序编辑。>loginF:\cduserF:\user\5F:\user\5\Edit保存:Alt进入主菜单。Save.saveas…⑵MASMSourcefilename[.ASM]:文件名源文件Objectfilename[xyz.OBJ]:目标文件SourceListing[NUL.LST]:打印文件CrossReference[NOL.CRF]:交叉索引文件0WarningErrors0SevereErrorsDOS状态下TYPEXYZ.ASMLST均可打印出来⑶连接Link汇编程序建立的目标码文件即.obj文件必须经过连接以后,才能成为可执行文件。即.EXE文件。ObjectModules[.OBJ]:xyz目标文件RONFile[xyz.EXE]:可执行文件ListFile[NUL.MAP]:内存分配图文件Libraries[.LIB]:库文件xyz.ASM.微机原理及应用第五章程序设计方法和上机调试Wu8若有多个要连接的OBJ文件,应一次打入,各OBJ文件名词用“+”号相间隔。⑷运行文件XYZ⑸调用DEBUG程序调试在\DOS\DEBUG[Path][filemame].\user\5\xyz.exe即出现“一”提示符,说明系统已在DEBUG管理之下。一、显示内存单元命令。D或D[地址]从地址在显示80H个字节。当前地址开始或—D[范围]显示80H字节二、修改存储单元内容命令EE地址显示原来单元内容输入一个字节的16进制数,按空格键,则修改完成。接着显示下一单元的地址和原有内容。按回车结束此命令。三、检查和修改寄存器内容的命令R—R显示所有寄存器内容—RAX显示AX寄存器内容—RF显示和修改标志位状态置位:OYDNEINGZRACPECY—复位:NVUPDIPLNZNAPONC除跟踪标志T之外。四、运行命令G—G[=执行的起始地址偏移量][断点地址1[断点地址2]]最多可设置10个断点。五、跟踪命令T(单步)—T[=指定地址]执行指定地址处的一条指令停下来,显示CPU所有寄存器和标志状态。—T从CS:IP执行一条指令—[=指定地址][值]执行的指令条数.六、反汇编命令U—U显示32个字节的源程序内容—U范围P118页例:DATASEGMENTTABLEDB0,1,4,9XXDB2YYODB‘RESULT:’DATAENDS;CO
本文标题:第五章程序设计方法和上机调试
链接地址:https://www.777doc.com/doc-2189658 .html