您好,欢迎访问三七文档
5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。答:程序段如下:BEGIN:MOVAH,1;从键盘输入一个字符的DOS调用INT21HCMPAL,‘a’;输入字符‘a’吗?JBSTOPCMPAL,‘z’;输入字符‘z’吗?JASTOPSUBAL,20H;转换为大写字母,用ANDAL,11011111B也可MOVDL,AL;显示一个字符的DOS调用MOVAH,2INT21HJMPBEGINSTOP:RET5.2编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符。答:程序段如下:BEGIN:MOVAH,1;从键盘输入一个字符的DOS调用INT21HCMPAL,‘a’;输入字符‘a’吗?JBSTOPCMPAL,‘z’;输入字符‘z’吗?JASTOPDECAL;得到前导字符MOVDL,AL;准备显示三个字符MOVCX,3DISPLAY:MOVAH,2;显示一个字符的DOS调用INT21HINCDLLOOPDISPLAYSTOP:RET5.3将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL和DL中。答:程序段如下:DSEGSEGMENTSTOREDB4DUP(?)DSEGENDS┇BEGIN:MOVCL,4;右移四次MOVCH,4;循环四次LEABX,STOREA10:MOVDX,AXANDDX,0FH;取AX的低四位MOV[BX],DL;低四位存入STORE中INCBXSHRAX,CL;右移四次DECCHJNZA10;循环四次完了码?B10:MOVDL,STORE;四组数分别放在AL、BL、CL和DL中MOVCL,STORE+1MOVBL,STORE+2MOVAL,STORE+3STOP:RET5.4试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示‘MATCH’,若不相同则显示‘NOMATCH’。答:程序如下:DSEGSEGMENTSTRING1DB‘Iamastudent.’STRING2DB‘Iamastudent!’YESDB‘MATCH’,0DH,0AH,‘$’NODB‘NOMATCH’,0DH,0AH,‘$’DSEGENDS;--------------------------------------------------------------------------CSEGSEGMENTMAINPROCFARASSUMECS:CSEG,DS:DSEG,ES:DSEGSTART:PUSHDS;设置返回DOSSUBAX,AXPUSHAXMOVAX,DSEGMOVDS,AX;给DS赋值MOVES,AX;给ES赋值;BEGIN:LEASI,STRING1;设置串比较指令的初值LEADI,STRING2CLDMOVCX,STRING2-STRING1REPECMPSB;串比较JNEDISPNOLEADX,YES;显示MATCHJMPDISPLAYDISPNO:LEADX,NO;显示NOMATCHDISPLAY:MOVAH,9;显示一个字符串的DOS调用INT21HRETMAINENDPCSEGENDS;以上定义代码段;--------------------------------------------------------------------------ENDSTART5.5试编写一程序,要求能从键盘接收一个个位数N,然后响铃N次(响铃的ASCII码为07)。答:程序段如下:BEGIN:MOVAH,1;从键盘输入一个字符的DOS调用INT21HSUBAL,‘0’JBSTOP;输入字符‘0’吗?CMPAL,9;输入字符‘9’吗?JASTOPCBWMOVCX,AX;响铃次数NJCXZSTOPBELL:MOVDL,07H;准备响铃MOVAH,2;显示一个字符的DOS调用,实际为响铃INT21HCALLDELAY100ms;延时100msLOOPBELLSTOP:RET5.6编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组P和负数数组N,并分别把这两个数组中数据的个数显示出来。答:程序如下:DSEGSEGMENTCOUNTEQU20ARRAYDW20DUP(?);存放数组COUNT1DB0;存放正数的个数ARRAY1DW20DUP(?);存放正数COUNT2DB0;存放负数的个数ARRAY2DW20DUP(?);存放负数ZHENDB0DH,0AH,‘Thepositivenumberis:’,‘$’;正数的个数是:FUDB0DH,0AH,‘Thenegativenumberis:’,‘$’;负数的个数是:CRLFDB0DH,0AH,‘$’DSEGENDS;--------------------------------------------------------------------------CSEGSEGMENTMAINPROCFARASSUMECS:CSEG,DS:DSEGSTART:PUSHDS;设置返回DOSSUBAX,AXPUSHAXMOVAX,DSEGMOVDS,AX;给DS赋值BEGIN:MOVCX,COUNTLEABX,ARRAYLEASI,ARRAY1LEADI,ARRAY2BEGIN1:MOVAX,[BX]CMPAX,0;是负数码?JSFUSHUMOV[SI],AX;是正数,存入正数数组INCCOUNT1;正数个数+1ADDSI,2JMPSHORTNEXTFUSHU:MOV[DI],AX;是负数,存入负数数组INCCOUNT2;负数个数+1ADDDI,2NEXT:ADDBX,2LOOPBEGIN1LEADX,ZHEN;显示正数个数MOVAL,COUNT1CALLDISPLAY;调显示子程序LEADX,FU;显示负数个数MOVAL,COUNT2CALLDISPLAY;调显示子程序RETMAINENDP;--------------------------------------------------------------------------DISPLAYPROCNEAR;显示子程序MOVAH,9;显示一个字符串的DOS调用INT21HAAM;将(AL)中的二进制数转换为二个非压缩BCD码ADDAH,‘0’;变为0~9的ASCII码MOVDL,AHMOVAH,2;显示一个字符的DOS调用INT21HADDAL,‘0’;变为0~9的ASCII码MOVDL,ALMOVAH,2;显示一个字符的DOS调用INT21HLEADX,CRLF;显示回车换行MOVAH,9;显示一个字符串的DOS调用INT21HRETDISPLAYENDP;显示子程序结束CSEGENDS;以上定义代码段;--------------------------------------------------------------------------ENDSTART5.7试编写一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它存放在AX中。答:程序段如下:BEGIN:MOVBX,0MOVCX,100COMPARE:MOVAX,DATA[BX];取数组的第一个偶数ADDBX,2TESTAX,01H;是偶数吗?LOOPNZCOMPARE;不是,比较下一个数JNZSTOP;没有偶数,退出JCXZSTOP;最后一个数是偶数,即为最小偶数,退出COMPARE1:MOVDX,DATA[BX];取数组的下一个偶数ADDBX,2TESTDX,01H;是偶数吗?JNZNEXT;不是,比较下一个数CMPAX,DX;(AX)(DX)吗?JLENEXTMOVAX,DX;(AX)(DX),则置换(AX)为最小偶数NEXT:LOOPCOMPARE1STOP:RET5.8把AX中存放的16位二进制数K看作是8个二进制的“四分之一字节”。试编写程序要求数一下值为3(即11B)的四分之一字节数,并将该数(即11B的个数)在终端上显示出来。答:程序段如下:BEGIN:MOVDL,0;计数初始值MOVCX,8COMPARE:TESTAX,03H;是数03吗?JNZNOEQUAL;不是,转走INCDL;是,计数NOEQUAL:RORAX,1;准备判断下一个数RORAX,1LOOPCOMPAREADDDL,‘0’;将计数值转换为ASCII码MOVAH,2;进行显示INT21HSTOP:RET5.9试编写一个汇编语言程序,要求从键盘接收一个四位的16进制数,并在终端上显示与它等值的二进制数。答:程序段如下:BEGIN:MOVBX,0;用于存放四位的16进制数MOVCH,4MOVCL,4INPUT:SHLBX,CL;将前面输入的数左移4位MOVAH,1;从键盘取数INT21HCMPAL,30H;0吗?JBINPUT;不是‘0~F’的数重新输入CMPAL,39H;是‘0~9’吗?JAAF;不是,转‘A~F’的处理ANDAL,0FH;转换为:0000B~1001BJMPBINARYAF:ANDAL,11011111B;转换为大写字母CMPAL,41H;又A吗?JBINPUT;不是‘A~F’的数重新输入CMPAL,46H;F吗?JAINPUT;不是‘A~F’的数重新输入ANDAL,0FH;转换为:1010B~1111BADDAL,9BINARY:ORBL,AL;将键盘输入的数进行组合DELCHJNZINPUTDISPN:MOVCX,16;将16位二进制数一位位地转换成ASCII码显示DISP:MOVDL,0ROLBX,1RCLDL,1ORDL,30HMOVAH,2;进行显示INT21HLOOPDISPSTOP:RET5.10设有一段英文,其字符变量名为ENG,并以$字符结束。试编写一程序,查对单词SUN在该文中的出现次数,并以格式“SUN:xxxx”显示出次数。答:程序如下:DSEGSEGMENTENGDB‘Hereissun,sun,…,$’DISPDB‘SUN:’DATDB‘0000’,0DH,0AH,‘$’KEYWORDDB‘sun’DSEGENDS;--------------------------------------------------------------------------CSEGSEGMENTMAINPROCFARASSUMECS:CSEG,DS:DSEG,ES:DSEGSTART:PUSHDS;设置返回DOSSUBAX,AXPUSHAXMOVAX,DSEGMOVDS,AX;给DS赋值MOVES,AX;给ES赋值BEGIN:MOVAX,0MOVDX,DISP-ENG-2;计算ENG的长度(每次比较sun,因此比较次数-2)LEABX,ENGCOMP:MOVDI,BXLEASI,KEYWORDMOVCX,3REPECMPSB;串比较JNZNOMATCHINCAX;是,SUN的个数加1ADDBX,2NOMATCH:INCBX;指向ENG的下一个字母DECDXJNZCOMPDONE:MOVCH,4;将次数转换为16进制数的ASCII码MOVCL,4LEABX,DAT;转换结果存入DAT单元中DONE1:ROLAX,CLMOVDX,AXANDDL,0FH;取一位16进制数ADDDL,30HCMPDL,39HJLESTOREADDDL,07H;是“A~F”所以要加7STORE:MOV[BX],DL;转换结果存入DAT单元中INCBXDECCHJNZDONE1DISPLAY:LEADX,DISP;显示字符串程序(将DISP和DAT一起显示)MOVAH,09HINT21HRETMAINENDPCSEGENDS;以上定义代码段;--------------------------------------------------------------------------ENDSTART5.11从键盘输入一系列以$为结束符的字符串,然后对其中
本文标题:汇编语言第五章答案
链接地址:https://www.777doc.com/doc-1904895 .html