第四次作业

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1、试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。答:程序段如下:BEGIN:MOVAH,1;INT21HCMPAL,‘a’;JBSTOPCMPAL,‘z’;JASTOPSUBAL,20H;MOVDL,AL;MOVAH,2INT21HJMPBEGINSTOP:RET2、编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符。答:程序段如下:BEGIN:MOVAH,1;INT21HCMPAL,‘a’;JBSTOPCMPAL,‘z’;JASTOPDECAL;MOVDL,AL;MOVCX,3DISPLAY:MOVAH,2;INT21HINCDLLOOPDISPLAYSTOP:RET3、将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL和DL中。答:程序段如下:DSEGSEGMENTSTOREDB4DUP(?)DSEGENDS┇BEGIN:MOVCL,4;MOVCH,4;LEABX,STOREA10:MOVDX,AXANDDX,0FH;MOV[BX],DL;INCBXSHRAX,CL;右移四次DECCHJNZA10;B10:MOVDL,STORE;MOVCL,STORE+1MOVBL,STORE+2MOVAL,STORE+3STOP:RET4、试编写一程序,要求比较两个字符串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;DISPLAY:MOVAH,9;INT21HRETMAINENDPCSEGENDS;;--------------------------------------------------------------------------ENDSTART5、编写程序,将一个包含有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;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;INT21HLEADX,CRLF;显示回车换行MOVAH,9;显示一个字符串的DOS调用INT21HRETDISPLAYENDP;显示子程序结束CSEGENDS;以上定义代码段;--------------------------------------------------------------------------ENDSTART6、试编写一个汇编语言程序,求出首地址为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:RET7、把AX中存放的16位二进制数K看作是8个二进制的“四分之一字节”。试编写程序要求数一下值为3(即11B)的四分之一字节数,并将该数(即11B的个数)在终端上显示出来。答:程序段如下:BEGIN:MOVDL,0;MOVCX,8COMPARE:TESTAX,03H;JNZNOEQUAL;INCDL;NOEQUAL:RORAX,1;RORAX,1LOOPCOMPAREADDDL,‘0’;MOVAH,2;INT21HSTOP:RET8、试编写一个汇编语言程序,要求从键盘接收一个四位的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:RET9、设有一段英文,其字符变量名为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;以上定义代码段;--------------------------------------------------------------------------ENDSTART10、从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示出计数结果。答:程序段如下:DSEGSEGMENTBUFFDB50DUP(‘’)COUNTDW0DSEGENDS┇BEGIN:LEABX,BUFFMOVCOUNT,0INPUT:MOVAH,01;从键盘输入一个字符的功能调用INT21HMOV[BX],ALINCBXCMPAL,‘$’;是$结束符吗?JNZINPUT;不是,继续输入LEABX,BUFF;对非数字字符进行计数NEXT:MOVCL,[BX]INCBXCMPCL,‘$’;是$结束符,则转去显示JZDISPCMPCL,30H;小于0是非数字字符JBNEXTCMPCL,39H;大于9是非数字字符JANEXTINCCOUNT;个数+1JMPNEXTDISP:┇;16进制数显示程序段(省略)11、有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为0的项,并将后续项向前压缩,最后将数组的剩余部分补上0。答:程序如下:DSEGSEGMENTMEMDW100DUP(?)DSEGENDS;--------------------------------------------------------------------------CSEGSEGMENTMAINPROCFARASSUMECS:CSEG,DS:DSEGSTART:PUSHDS;设置返回DOSSUBAX,AXPUSH

1 / 21
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功