5、汇编语言程序设计基本要求:程序要结构化,(简明,易读,易调试)执行速度快。占用存储空间少,(即存储容量小)汇编程序的基本步骤:(1)分析问题,描绘出数学模型。(2)确定算法。(3)绘制程序框图。(4)分配存储器及工作单元。(5)编制程序。(6)静态检查。(7)上机调试、试运行。例:编写一个程序查找一定内存单元中的最大自然数。分析问题,确定数学模型。确定算法。绘制程序框图。分配存储器及工作单元。编制程序。静态检查。上机调试、试运行。开始初始化,设指针、计数器取第一个数到计数器与下一个数比较取大数到寄存器修改地址指针、计数器下一个数大?查找结束?结束NNDATASEGMENTPARA;定义数据段D1DB85,77,90,87,69,92,78;DATAENDS;数据段结束STACKSEGMENTPARASTACK;定义堆栈段DW20DUP(0);堆栈段位20个字节STACKENDS;堆栈段结束CODESEGMENT;定义代码段ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AX;初始化DSMOVBX,OFFSETD1;设置数据指针MOVCX,7;设置计数器DECCXMOVAL,[BX];取第一个数LOP:INCBXCMPAL,[BX];与下一个数比较JAENEXT;下一个数不大转移MOVAL,[BX];大数存入ALNEXT:DECCXJNZLOP;CX≠0继续MOVDL,AL;显示最大数(?)MOVAH,2INT21HCODEENDS;代码段结束ENDSTART;源程序结束程序的基本结构•顺序结构•分支结构•循环结构•子程序结构1、顺序结构顺序结构程序本身很简单,按程序的编写顺序逐条执行。它依赖于计算机能够顺序执行语句的特点,只要语句安排的顺序是正确的就可以了。例:把非压缩的十进制数DATl转化为压缩的十进制数。完成上述功能的程序段为:MOVAX,DATl;例如AX=0204HMOVCL,4SALAH,CL;AH=20,AX=2004HROLAX,CL;AX=0042HROLAL,CLMOVBYTEPIRDATl,AL;DAT1中为24H为压缩的十进制数...2、分支结构条件程序段不满足满足条件程序段1程序段2不满足满足例:设计一字符比较程序,将键入的字符与存储单元的字符相比较,相同显示YES,不同显示NO•DATA1SEGMENT•D1DB'PLEASEINPUTACHARACTER:$'•D2DB'A'•DYESDB'YES','$'•DNODB'NO','$'•DATA1ENDS•STACK1SEGMENTPARASTACK•DW20DUP(0)•STACK1ENDS•CODESEGMENT•ASSUMECS:CODE,DS:DATA1,SS:STACK1•START:MOVAX,DATA1;数据段寄存器DS初始化•MOVDS,AX•LEADX,D1;取被加数D1数据区的首地址•MOVAH,09H;功能号为09H,调显示功能•INT21H•MOVAH,7;从键盘得到一个字符,不回显•INT21H•MOVBL,D2•CMPAL,BL•JZYES•LEADX,DNO•JMPNO•YES:LEADX,DYES•NO:MOVAH,09H;显示•INT21H•MOVAH,4CH;功能号为4CH,返回DOSINT21H•CODEENDS•ENDSTART3、循环结构循环初始设置循环体循环条件满足不满足例:求100个数的和。•DATA1SEGMENT•SEDW100DUP(?)•YDW?•DATA1ENDS•STACK1SEGMENTPARASTACK•DW20DUP(0)•STACK1ENDS•CODESEGMENT•ASSUMECS:CODE,DS:DATA1,SS:STACK1•START:MOVAX,DATA1;数据段寄存器DS初始化•MOVDS,AXMOVAX,0ADDAX,SEADDAX,SE+2ADDAX,SE+4…ADDAX,SE+198MOVY,AXCODEENDSENDSTART加100次改为循环设计:XORAX,AXMOVBX,OFFSETSEMOVCX,100LOP:ADDAX,[BX];循环体INCBXINCBXDECCXJNZLOP;CX0,循环MOVY,AXCODEENDSENDSTART例:统计一个数据块中正数、负数和0的个数。DATASEGMENTMNDB76H,0A8H,34H,0BBH,90H,00HNNDB3DUP(0)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEADI,MNMOVBX,0MOVAH,0MOVCL,NN-MN;数据块长度送CLMOVCH,0LINE1:MOVAL,[DI]ANDAL,AL;送标志判断JZLINE3;0,转到LINE3JNSLINE2;正,转到LINE3INCAH;负JMPLINE4LINE2:INCBHJMPLINE4LINE3:INCBLLINE4:INCDILOOPLINE1MOVDI,OFFSETNNMOV[DI],AH;存负数的个数INCDIMOV[DI],BH;存正数的个数INCDIMOV[DI],BL;存0的个数MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART子程序设计1、主子程序之间的信息交换(参数传递)2、现场保护重复出现的程序段例:16进制变换为ASCIIDATASEGMENT;定义数据段D1DB37H,48H,0A7H,97HD2DB8DUP(38H),'$'DATAENDS;数据段结束STACKSEGMENTPARASTACK;定义堆栈段DW20DUP(0);堆栈段位20个字节STACKENDS;堆栈段结束CODESEGMENT;定义代码段ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AX;初始化DSLEABX,D1;设置数据指针LEASI,D2MOVCX,D2-D1;设置计数器AGAIN:MOVAL,[BX];取第一字节数MOVDL,ALPUSHCXMOVCL,4SHRAL,CL;高位移到低位POPCXCALLCHANGEMOVAL,DLANDAL,0FH;屏蔽高位CALLCHANGEINCBXLOOPAGAIN;CX不等于0循环LEADX,D2MOVAH,09HINT21HMOVAH,4CH;功能号为4CH,返回DOSINT21H;转换子程序CHANGE入口:AL低半子节为要转换的16进制数,;SI为要存放转换后ASCII的间址寄存器。CHANGEPROCCMPAL,10JLJIA0ADDAL,'A'-'0'-10;A-F值JIA0:ADDAL,'0';0-9值MOV[SI],AL;存ASCIIINCSIRETCHANGEENDPCODEENDS;代码段结束ENDSTART;源程序结束汇编语言编程练习:1、在给定的数据区域中,找出最大数。2、在给定的数据区域中,找出最大数和最小数。VARDW?;变量VAR的类型为字ARRAYDD10DUP(?);变量ARRAY的类型为字STRDB‘Thisisatest’;变量STR的类型为字节。。。MOVAX,TYPEAVRMOVBX,TYPEARRAYMOVAX,TYPESTRMOVCX,LENGTHARRAYMOVDX,SIZEARRAY