微机原理实验一、实验目的:1、应用学过的汇编语言编写简单程序,将汇编语言在编程中实际应用。2、掌握汇编语言的编辑、汇编、连接、调试等基本方法。3、灵活应用各种语句实现要求的程序功能。4、在实验中进一步掌握并熟练应用汇编语言,理解常用指令、伪指令及存储空间分配等二、实验内容:从键盘取得一串字符显示在屏幕上,然后将这串字符以输入的反序再显示一遍,并统计这字符串中‘A’的个数,显示在屏幕上。附加要求:可以从键盘输入需要统计的字符,并统计这字符串中这个字符的个数,显示在屏幕上。三、流程图:开始输出提示“输入字符串”‘SHURUZIFUCHUAN’输入字符串输出提示“反转后字符”‘FANZHUANHOUZIFU’设置循环次数CX为输入的字符个数指针指向字符串最后一个字符指针指向—1指向前一个单元输出指针指向单元中的字符CX=0?输出提示‘输入字符’‘SHURUZIFU’输入要查找的字符设置CX循环次数即字符串的字符数指针指向第一个字符指向下一个字符CX=0?和输入字符比较是否相同计数加1输出相同的字符数量结束是否否是是否四、实验程序:DATASSEGMENTPASSDB20;预留20个字节的空间存放输入的字符BLK1DB'SHURUZIFUCHUAN:$';在屏幕上要显示的提示语句BLK2DB'SHURUZIFU:$'BLK3DB'SHULIANGSHI:$'BLK4DB'FANZHUANHOU:$'DATASENDS;********以上是数据段定义,下面开始代码段************CODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AX;实现ASSUME中的承诺;****************************************************MOVAH,09H;字符串输出功能09HLEADX,BLK1INT21H;**********显示第一句提示语*************************MOVAH,0AH;字符串输入功能0AHLEADX,PASSINT21H;********以上完成字符串输入并显示出来***************MOVAH,2MOVDL,0DHINT21HMOVDL,0AHINT21H;*********以上实现回车换行***************************MOVAH,09HLEADX,BLK4INT21H;*******输出BLK4中定义的内容,提示为反转后字符串***************MOVCL,PASS+1;PASS+1处是实际输入的字符个数MOVCH,0;CH置0,CX为循环的次数也就是输入的字符个数MOVDL,PASS+1MOVDH,0;DX同样是字符个数,用于后面的加法运算LEASI,PASS+2;PASS+2处为实际输入字符的开始位置;ADDSI,DX;用加法实现了将SI的指针指向了字符串的最后一个字符S0:DECSI;SI不断减1,指针指向地址不断前移,也就反向了输出刚才输入的字符串MOVAH,02H;显示输出功能02HMOVDL,[SI];输出指针所指向单元中的内容INT21HLOOPS0;**********以上用循实现了字符串的反转后输出功能***************MOVAH,2MOVDL,0DHINT21HMOVDL,0AHINT21H;***********回车换行*******************MOVAH,09HLEADX,BLK2INT21H;**********显示提示语BLK2输入要查找的字符的提示语输出************************MOVAH,01H;有回显的输入,显示的是输入的要查找字符INT21HMOVCL,PASS+1XORCH,CHLEASI,PASS+2XORDL,DL;和前面相同CX设置了循环次数,SI指向第一个字符S1:CMPAL,[SI];进行字符比较,是和Al比较,若相同则计数加1,不同则比较下一个JNZNEXTINCDL;DL记录的是比较过程中相同的字符数NEXT:INCSI;指向下一个字符LOOPS1MOVBL,DL;DL记录的数量给BL后面语句输出之前要用到DL;*******通过以上循环将所有字符比较一遍得到数量*******************************MOVAH,02HMOVDL,0DHINT21HMOVDL,0AHINT21H;*******************回车换行**************************MOVAH,09HLEADX,BLK3INT21H;*****输出提示语BLK3相同字符的数量**************************MOVDL,BLADDDL,30H;计数加30H是为了转换成ASC码输出。MOVAH,02HINT21HMOVAH,4CHINT21HCODESENDSENDSTART五、调试及遇到的问题:在使用MASA进行连接link的时候出现了语句的错误,经过仔细的查找将语句中因为输入错误,符号输入错误,比如出现了汉字输入的分号等问题加以修改,程序可以正常生成obj文件,进而可以生成exe可执行文件,但是在执行过程中出现了下面几个比较严重的问题,是因为程序编写逻辑或原理错误造成的,虽然可以得到exe可执行文件但是输出的结果是有问题的,所以经过了改正才得以解决。(1)从输出的字符串可以看出输出了乱码经过查找是因为,定义的字符串地址PASS,其中PASS+1是字符的个数,PASS+2是第一个字符串,所以在程序中将字符个数MOVCL,PASS+1语句写成了MOVCL,PASS就使得程序出现了上面的显示有乱码输出。(2)输出的字符少了一个问题在相同的位置,字符的第一个实际的位置是在PASS+2,而在编写程序的时候写的是PASS+1,所以导致了在程序输出的时候得到的是少一个字符的情况。这个问题需要仔细看输出才发现的,所以在编程的时候容易发生错误,在认真看输出后发现少了一个字符。(3)输出的数量显示的是一个笑脸图案而不是数字查找问题后发现,是在定义输出的时候少了一个步骤,ADDDL,30H,加30H是让DL中得到的计数值转化成为ASC码输出然后我们才能看到数字,否则看到的都是对应的乱码。这个问题是一个编程程序根本问题如果不解决是得不到最终结果的,所以在多次调试和改变之后终于能够得到最后的正确结果。六、实验结果:经过反复的找错调试,最终程序正确并且得到了输出的结果,输入任意的字符串,能够反序输出然后输入要查找的字符,能够得到要查找的字符的个数。七、分析总结:通过这次实验,实际操作编写一个程序,并运行得到结果,整个过程让我对汇编语言的理解更为深刻,对汇编语言的各种语句的功能更加熟悉,对汇编程序的运行过程也有了更直观的了解。课程知识和实验结合起来,能够使知识运用更熟悉灵活。同时,编写程序是一个需要知识和细心地过程,任何的细小的错误都会使得程序最终不能正常的运行,所以在查找错误的过程中更能学习到汇编语言编程的方法和逻辑。在编写程序时同样也遇到了很多的问题,在解决问题的过程中需要耐心的查找错误最终改正错误。总之,汇编语言编程能够让我对汇编语句,存储设备,地址单元,指针等问题有了更深和更直观的了解学习。