微机软件实验习题与答案(完整版)_第1页
微机软件实验习题与答案(完整版)_第2页
微机软件实验习题与答案(完整版)_第3页
微机软件实验习题与答案(完整版)_第4页
微机软件实验习题与答案(完整版)_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

./微机原理软件实验实验1 两个多位十进制数相加的实验实验容:将两个多位十进制数相加,要求加数和被加数均以ASCII码形式各自顺序存放以DATA1和DATA2为首的5个存单元中〔低位在前,结果送回DATA1处。完整代码如下:DATASSEGMENT;此处输入数据段代码STRING1DB'inputthefirstnumber:','$'STRING2DB13,10,'inputthesecondnumber:','$'STRING3DB13,10,'theoutputis:','$'DATA1DB6DUP<00H>,'$'DATA2DB6DUP<00H>,'$'DATASENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AX;此处输入代码段代码LEASI,DATA1LEADI,DATA2L0:LEADX,STRING1;打印字符串STRING1MOVAH,09INT21HINPUT1:;输入第一个数MOVAH,01;输入字符至AL中INT21HCMPAL,'/'JEL1MOV[SI],ALINCSIJMPINPUT1L1:LEADX,STRING2;打印字符串STRING2MOVAH,09INT21HINPUT2:;输入第二个数MOVAH,01;输入字符至ALINT21HCMPAL,'/'JEL2MOV[DI],ALINCDIJMPINPUT2L2:MOVSI,0CLC;清空进位标志位CFMOVCX,6PLUSE:;相加;SUBDATA1[SI],30H;SUBDATA2[SI],30H;这里不能使用这两条指令,因为如果DATA1[5]=00H,00H-30H需要借位相减,使CF=1MOVAL,DATA1[SI]ADCAL,DATA2[SI]AAA;加法调整指令,可使两个ASCII数直接相加MOVDATA1[SI],AL;和赋给DATA1[SI]INCSILOOPPLUSEL3:LEADX,STRING3;打印字符串STRING3MOVAH,09INT21HMOVCX,6MOVSI,6SHOW:DECSICMPDATA1[SI],00HJESHOWSHOW2:MOVDL,DATA1[SI]ADDDL,30HMOVAH,02INT21HCMPSI,0JEL4DECSIJMPSHOW2L4:MOVAH,4CHINT21HCODESENDSENDSTART运行结果如下:输入为低位在前,即输入1234和99999相加实际上是4321和99999相加〔即:4321+99999=104320实验2 两个数相乘的实验〔无符号数相乘实验容:实现十进制数的乘法。要求被乘数和乘数均以ASCII码形式各自顺序存放在存中,乘积在屏幕上显示出来。完整代码如下:DATASSEGMENT;此处输入数据段代码STRING1DB'theoutputis:','$'DATA1DB31H,32H,33HDATA2DB35H,36HDATASENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AX;此处输入代码段代码MOVDL,10MOVAL,DATA1[0];AL=31HSUBAL,30H;AL=01HMULDL;乘10;AL=10ADDAL,DATA1[1];AL=10+32HSUBAL,30H;AL=10+32H-30H=12MULDL;AL=120ADDAL,DATA1[2];AL=120+33HSUBAL,30H;AL=120+33H-30H=123MOVBL,AL;BL=AL;MOVAL,DATA2[0];AL=35HSUBAL,30H;AL=5MULDL;乘10;AL=50ADDAL,DATA2[1];AL=50+36HSUBAL,30H;AL=50+36H-30H=56MULBL;AX=123x56=6888SUBDX,DX;DX清零MOVBX,1000DIVBX;<DX,AX>/1000,商6在AX中,余数888在DX中PUSHDXMOVDL,ALADDDL,30HMOVAH,02;打印最高位6INT21HPOPDXMOVBL,100MOVAX,DX;888赋给AXDIVBL;AX/100,商放在AL中,余数88放在AH中MOVDL,ALMOVCL,AH;!!!这里千万不能把AH直接赋给AL,因为经过INT21H指令后AL,AH会改变ADDDL,30HMOVAH,02;打印第二位INT21HMOVBL,10MOVAL,CLSUBAH,AH;清空AHDIVBL;AX/10,商放在AL中,余数8放在AH中MOVDL,ALMOVCL,AHADDDL,30HMOVAH,02;打印第三位INT21HMOVDL,CLADDDL,30HMOVAH,02;打印第四位INT21HCODESENDSENDSTART运行结果为:实验3 字符串匹配实验实验容:编写程序实现两个字符串比较。如果相同,则屏幕显示"match",否则屏幕显示"nomatch" ,完整代码如下:DATASSEGMENT;此处输入数据段代码PRINT1DB'inputthefirststring:','$'PRINT2DB13,10,'inputthesecondstring:','$'PRINT3DB'match','$'PRINT4DB'nomatch','$'PRINT5DB13,10,'output:','$'STRING1DB30DUP<00H>,13,10,'$'STRING2DB30DUP<00H>,13,10,'$'DATASENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKS,ES:DATASSTART:MOVAX,DATASMOVDS,AX;此处输入代码段代码LEADX,PRINT1;打印字符串PRINT1MOVAH,09INT21HLEASI,STRING1;STRING1地址赋给SILEADI,STRING2;STRING2地址赋给DIINPUT1:MOVAH,01;输入字符至ALINT21HCMPAL,'/';输入字符串以‘/’结束,转L0JEL0MOV[SI],ALINCSIJMPINPUT1L0:LEADX,PRINT2;打印字符串PRINT2MOVAH,09INT21HINPUT2:MOVAH,01;输入字符至ALINT21HCMPAL,'/'JEL1MOV[DI],ALINCDIJMPINPUT2L1:MOVCX,30;CX=30代表比较30次MOVSI,00HCOMPARE:;字符串一个一个比较MOVAL,STRING1[SI];取STRING1存储单位中的第SI个字符赋给ALCMPAL,STRING2[SI];AL与STRING2存储单位中的第SI个字符比较JNENOMATCHINCSILOOPCOMPAREJMPMATCHNOMATCH:;打印output:nomatchLEADX,PRINT5MOVAH,09INT21HLEADX,PRINT4MOVAH,09INT21HJMPL2MATCH:;打印output:matchLEADX,PRINT5MOVAH,09INT21HLEADX,PRINT3MOVAH,09INT21HL2:MOVAH,4CHINT21HCODESENDSENDSTART运行结果:实验4 从键盘输入数据并显示的实验实验容:将键盘输入的2位十六进制数转换为等值的二进制数,并在屏幕上显示。列如:键入f2,则显示11110010.完整代码如下:DATASSEGMENT;此处输入数据段代码STRING1DB'pleaseinputastring:','$'STRING2DB13,10,'theoutputis:','$'STRING3DB13,10,'inputerror',13,10,'$'DATASENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AX;此处输入代码段代码L0:LEADX,STRING1;打印字符串STRING1MOVAH,09INT21HMOVAH,01;输入第一个字符至AL中INT21HCMPAL,'0'JBERROR1CMPAL,'9'JBEENTER1CMPAL,'A'JBERROR1CMPAL,'F'JBEENTER1CMPAL,'a'JBERROR1CMPAL,'f'JBEENTER1ERROR1:LEADX,STRING3;打印字符串STRING3MOVAH,09INT21HJMPL0ENTER1:CALLASC2BCD;把ASCII码转化成十进制数BCD码MOVCL,4ROLAL,CLMOVBL,AL;把高四位放到BL寄存器中;输入第二个字符MOVAH,01;输入第二个字符至AL中INT21HCMPAL,'0'JBERROR1CMPAL,'9'JBEENTER2CMPAL,'A'JBERROR1CMPAL,'F'JBEENTER2CMPAL,'a'JBERROR1CMPAL,'f'JBEENTER2ENTER2:CALLASC2BCD;把ASCII码转化成十进制数BCD码ADDBL,ALLEADX,STRING2;打印字符串STRING2MOVAH,09INT21HMOVCX,9CLC;清空标志位SHOW:;显示BL中的二进制数DECCXCMPCX,0JENEXT;输出完八位之后返回DOSROLBL,1;循环左移一位,若溢出为1,则CF=1JCM1JMPM2M1:MOVDL,'1';若CF=1,转至M1打印‘1’MOVAH,02INT21HJMPSHOWM2:MOVDL,'0';若CF=0,转至M1打印‘0’MOVAH,02INT21HJMPSHOWNEXT:MOVAH,4CHINT21HASC2BCDPROCCMPAL,'9'JBEL1;若AL≤9,转L1SUBAL,07H;若输入的数为A~F,或者a~f,则减7,A接在39H后面,A~F=3AH~3FH,a~f=5AH~5FHL1:SUBAL,30H;减30HANDAL,0FH;滤除高位,保留低位,因为a~f恰好比A~F大20H,这样a~f就和A~F的数值一样了RETASC2BCDENDPCODESENDSENDSTART输出结果为:〔若输出不在0~9,A~F,a~f,则重新输入实验5 字符和数据计算的实验实验容:先在屏幕上显示"inputstring,",输入字符串;再显示"result="。如为0~9的数字,则计数器加1,如为非数字,则直接显示,但不计数。完整代码如下:DATASSEGMENT;此处输入数据段代码STRING1DB'inputstring:','$'STRING2DB13,10,'result=','$'STRING3DB13,10,'zifu:','$'DATASENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AX;此处输入代码段代码LEADX,STRING1;打印字符串1MOVAH,09INT21HMOVCX,0MOVBX,0INPUT:MOVAH,01;输入字符至ALINT21HCMPAL,'/';输入/后转L0JEL0CMPAL,'0';下溢出转RUZHANJBRUZHANCMPAL,'9';上溢出转RUZHANJARUZHANINCCL;若为数字则计数器+1JMPINPUTRUZHAN:;非数字字符入栈PUSHAXADDBL,1;BL代表入栈的字符个数,方便待会输出JMPINPUTL0:LEADX,STRING3;打印字符串3MOVAH,09INT21HCHUZHAN:POPAXMOVDX,AXMOVAH,02INT21HSUBBL,1CMPBL,0;入了多少个栈,出多少栈JNECHUZHANOUTPUT:;输出数字的个数LEADX,STRING2;打印字符串2MOVAH,09INT21HMOVDL,CLADDDL,30HMOVAH,02INT21HMOVAH,4CHINT21HCODESENDSENDSTART输出结果为:〔这里非数字字符输出顺序与输入顺序相反实验6改变年月日的实验实验容:先在屏幕上显示"whatisthedate<mm/dd/yy>?"从键盘输入的月日年能把计算机的系统日期改为你键入的值。完整代码如下:DATASSEGMENT S1DB0AH,0DH,"whatisthedate<mm/dd/yy>?:",'$'DATASENDSSTACKSSEGMENTSTACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AXMOVDX,OFFSETS1MOVAH,09H;打印字符串"whatisthedate<mm/dd/yy>?:"INT21HMOVDX,0H;DX=CH=0MOVCH,0;MOVSI,0AHKAISHI:MOVCL,0;用来压缩移位SHURU:MOVAH,01H;输入字符存入AL中INT21HMOVAH,0AH;10赋给AHCMPAL,0DH;AL=13则结束,设置日期JEGENGGAICMPAL,'/';计算来判断是年,月,日JEZIZENGANDAL,0FHCMPCH,0;等于0则转月JEYUECMPCH,1;等于1则转日JERICMPCH,2;等于2则转年JENIANZIZENG:INCCHJMPSHURU;无条件转移至SHURUYUE:ADDDH,ALCMPCL,0JNZKAISHIINCCLMOVAL,DHMULAHMOVDH,ALJMPSHURU;无条件转移至SHURURI:ADDDL,ALCMPCL,0JNZKAISHIINCCLMOVAL,DLMULAHMOVDL,ALJMPSHURU;无条件转移至SHURUNIAN:CMPCL,0JNZXIABUADDBL,ALMOVCL,03H;3赋给CLJMPSHURU;无条件转移至SHURUXIABU:MOVAH,0;清空AHMOVSI,BX;SI=BXSHLBX,CL;BX左移三位,乘以8SHLSI,1;SI左移一位,乘以2ADDBX,SI;两个相加,即乘以10ADDBX,AX;BX加上新输入的数字JMPSHURUGENGGAI:MOVCX,BXMOVAH,2BH;设置日期INT21HMOVAH,4CHINT21HCODESENDSENDSTART输出结果为:〔设置20XX12月3日,注意如果要设置好系统,否则可能计算机的日期改变不了实验7 将小写字母转换为大写字母的实验实验容:接收键入字符〔以Ctrl-c为结束,将小写字母变为大写字母,并在屏幕上显示。完整代码如下:DATASSEGMENT;此处输入数据段代码STRING1DB13,10,'pleaseinputastring:','$'STRING2DB13,10,'theoutputstringis:','$'DATADB100DUP<00H>,'$'DATASENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AX;此处输入代码段代码M:LEASI,DATALEADX,STRING1;打印字符串1MOVAH,09INT21HINPUT:MOVAH,01;输入字符CINT21HCMPAL,03HJEOUTPUTCMPAL,'a'JBMCMPAL,'z'JAMSUBAL,20H;减20H变小写MOV[SI],ALINCSIJMPINPUTOUTPUT:LEADX,STRING2;打印字符串2MOVAH,09INT21HLEASI,DATAL1:MOVDL,[SI]CMPDL,00HJEENDINGMOVAH,02INT21HINCSIJMPL1ENDING:MOVAH,4CHINT21HCODESENDSENDSTART运行结果为:〔如果输入的不在a~f中,则重新输入实验8 排序实验<0~9>实验容:从首地址为1000H开始存放10个数,将这些数按降序排列.完整代码如下:DATASSEGMENT;此处输入数据段代码STRING1DB'pleaseinput10numbers:','$'STRING2DB13,10,'thesortednumbersare:','$'ORG1000HDATADB10DUP<00H>,'$'DATASENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AX;此处输入代码段代码LEADX,STRING1;输入提示语'pleseinput10numbers:'MOVAH,09INT21HMOVCX,10LEASI,DATAINPUT:MOVAH,01;输入字符至ALINT21HMOV[SI],AL;把AL赋给偏移地址为SI指向的单元INCSILOOPINPUTMOVBL,0L0:MOVCX,9LEASI,DATAL1:;比较第SI个数和第SI+1个数的大小MOVAL,[SI]INCSICMPAL,[SI]JBCHANGE;若小于则转CHANGEL2:LOOPL1;小循环〔CX自动减1,若CX=0则结束L3:INCBLCMPBL,10JBL0;若大循环有10次了,则转OUTPUTJMPOUTPUTCHANGE:;交换两个数XCHGAL,[SI];交换,MOV[SI-1],AL;赋给SI-1JMPL2OUTPUT:LEADX,STRING2;输入提示语'thesortednumbersare:'MOVAH,09INT21HMOVCX,10LEASI,DATAL4:;循环输出MOVDL,[SI]MOVAH,02INT21HINCSILOOPL4MOVAH,4CHINT21HCODESENDSENDSTART输出结果为:实验8 排序实验<多位数排序>实验容:从首地址为1000H开始存放10个数,将这些数按降序排列.完整代码如下:DATASEGMENT;CHANGE函数DI,SI为入口函数,交换SI,DI的值,SI,DI值已经大变BUFFERDB100DB?DB100DUP<?>DB"$"ORG1000HNEQU10STOREDATADB110DUP<30H>;每个数最大为10位TEMP1DB12DUP<24H>;中间变量TEMP2DB12DUP<24H>;中间变量TEMP3DB12DUP<24H>;中间变量DATAENDSSTACKSEGMENTPARASTACKDW60HDUP<0>STACKENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACKSTART:MOVAX,DATAMOVDS,AX;MOVAX,STACK;MOVSS,AX;可以有可以无,因为其已经默认为SS了MOVDX,OFFSETBUFFERMOVAH,0AHINT21HCALLTURNLINELEASI,BUFFERLEADI,STOREDATACALLBUFFERTOSTORECALLTURNLINELEASI,STOREDATACALLCOMPAREGO:MOVSI,OFFSETSTOREDATAMOVCL,110PRINT:MOVDL,[SI]CMPDL,30HJNEPRINT1CMPAL,1JEPRINT1;打印该有的0INCSILOOPPRINTPRINT1:CMPDL,2CHJEPRINT0JIXU:MOVAH,02HINT21HCMPDL,2CHJNEGOON5MOVAL,0JMPGOON6PRINT0:CMPAL,0JNEJIXUMOVDL,30HMOVAH,02HINT21HMOVDL,2CHJMPJIXUGOON5:MOVAL,1GOON6:INCSILOOPPRINTMOVAH,01HINT21HMOVAH,4CHINT21HCOMPAREPROC;以SI为入口传递MOVBX,SI;LEADI,TEMP2;GETLAST:;CALLTEMPSAVE;INCDL;CMPDL,N;JEGOON1;LEADI,TEMP2;JMPGETLAST;TEMP2始终指向当前最后一个数;GOON1:MOVCL,NCOMPARE1:MOVSI,BXLEADI,TEMP1CALLTEMPSAVE;TEMP1指向第一个数,错啦,为什么呢,因为那样比不会进行变化MOVSI,BXMOVDH,1LEADI,TEMP1PUSHSICOMPARE2:LODSBMOVAH,[DI]CMPAL,2CHJEEQUALCMPAL,AHJBBELOWCMPAL,AHJAABOVEINCDIJMPCOMPARE2BELOW:INCDHPOPSIPUSHSILEADI,TEMP1CALLTEMPSAVE;使TEMP1存入当前最小,因为TEMP1当前元已经存在了;不可以再转存,否则出错POPSIADDSI,NINCSIPUSHSICMPDH,CLJAGOON2LEADI,TEMP1JMPCOMPARE2EQUAL:INCDH;不交换POPSIADDSI,NINCSIPUSHSICMPDH,CLJAGOON2;比较CL次LEADI,TEMP1JMPCOMPARE2ABOVE:;TEMP1始终指向当前最小,若当前值大于时最小时前移;此时TEMP1不便,只需前移就好,交换前后两个数的大小INCDHPOPSIPUSHSISUBSI,NSUBSI,1MOVDI,SIPOPSIPUSHSICALLCHANGEPOPSIADDSI,NINCSIPUSHSICMPDH,CLJAGOON2;比较CL次LEADI,TEMP1JMPCOMPARE2GOON2:LOOPCOMPARE1JMPGORETCOMPAREENDP;存储函数思路:从最后一位开始存,首位均置零,最高10位BUFFERTOSTOREPROCMOVCL,10ADDSI,2;SUBDI,3STORE:MOVAL,[SI]CMPAL,2CH;直到SI指向,<结束一个数>,再进行存储JESTORE2INCSIJMPSTORESTORE2:MOVBX,SI;存储SISTOREIN:ADDDI,N;ADDDI,3MOVDX,DI;存储DISTOREIN1:MOVAL,[SI]MOV[DI],ALDECSIDECDILEAAX,BUFFERADDAX,1;注意边界要取好,因其也有值CMPSI,AXJEJMP1MOVAL,[SI]CMPAL,2CHJEJMP1JMPSTOREIN1;条件控制循环JMP1:MOVSI,BXINCSI;进行存储下个数INCDX;使DI加1因为前几位已经用了MOVDI,DXLOOPSTORE;MOVAL,"$";INCDI;MOV[DI],ALRETBUFFERTOSTOREENDPCHANGEPROCPUSHDIPUSHSILEADI,TEMP3CALLTEMPSAVE;TEMP3存放SI当前值POPDI;往SI存入值POPSIPUSHSICALLTEMPSAVE;******把DI的值存入SI中POPDILEASI,TEMP3CALLTEMPSAVE;*******把SI的值存入DI中RETCHANGEENDPTEMPSAVEPROC;存储中间变量的函数,以DI,SI,为入口,以,标志位结束STEMP:LODSBMOV[DI],ALINCDICMPAL,2CHJENEXTJMPSTEMPNEXT:RETTEMPSAVEENDPTURNLINEPROCMOVDL,0AHMOVAH,02HINT21HRETTURNLINEENDPCODEENDSENDSTART输出结果为:实验9 设置光标的实验实验容:设置光标,起始位置为第5行第6列,结束位置为第8行第6列。完整代码如下:DATASSEGMENT;此处输入数据段代码DATASENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AX;此处输入代码段代码MOVAH,08;输入无回显INT21HMOVDH,5;设置行MOVDL,6;设置列MOVBH,0;设置页MOVAH,02INT10HMOVAH,08;输入无回显INT21HMOVDH,8;设置行MOVDL,6;设置列MOVBH,0;设置页MOVAH,02INT10HMOVAH,08;输入无回显INT21HMOVAH,4CHINT21HCODESENDSENDSTART输出结果为:〔任意输入一个字符,光标跳到5行6列,再任意输入一个字符,光标跳到8行6列这里光标截图后是看不到的,所以就不截图了实验10 计算N!的实验实验容:在键盘输入数字,结果显示在屏幕上。DATASSEGMENT;段定义〔结构;此处输入数据段代码P1DB'inputthenumber<0-6>:','$'p2DB13,10,'theresultis:','$'DATASENDSSTACKSSEGMENT;此处输入堆栈段代码ST1DW40HDUP<0>STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKS;段分配〔结构START:MOVAX,DATAS;设置段地址〔结构MOVDS,AXMOVAX,STACKSMOVSS,AX;此处输入代码段代码LEADX,P1;显示提示字符串'inputthenumber:'MOVAH,09INT21HMOVAH,01;键入N到A

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论