微原软件实验报告Word下载.docx
- 文档编号:17589729
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:24
- 大小:377.13KB
微原软件实验报告Word下载.docx
《微原软件实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《微原软件实验报告Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
S0DB'
THENUMBEROFBIGGERTHANZERO:
$'
S1DB'
THENUMBEROFZERO:
S2DB'
THENUMBEROFLOWERTHANZERO:
GZDW0;
大于零
ZDW0;
等于零
LZDW0;
小于零
DATAENDS
STACKSEGMENT
DB50DUP(?
)
STACKENDS
CODESEGMENT
ASSUMEDS:
DATA,SS:
STACK,CS:
CODE
BEGIN:
MOVAX,DATA
MOVDS,AX
MOVCX,DA2;
数据个数送CX
LEASI,DA1;
数据区偏移地址送SI
LP:
MOVAL,[SI]
CMPAL,0
JGGZP;
大于零跳转
JLLZP;
小于零跳转
INCZ
JMPNEXT
GZP:
INCGZ
LZP:
INCLZ
NEXT:
INCSI
LOOPLP;
循环比较次数即为数据个数
MOVAH,09H;
输出大于零的个数
LEADX,S0
INT21H
MOVAX,GZ
CALLDISPLAY
输出显示等于零的数的个数
LEADX,S1
MOVAX,Z
输出显示小于零的个数
LEADX,S2
MOVAX,LZ
MOVAX,4C00H
DISPLAYPROCNEAR;
显示子程序,将二进制数转化为十进制数在屏幕上显示出来
MOVBX,10
XORCX,CX
NXT:
MOVDX,0
DIVBX
PUSHDX
INCCX
CMPAX,0
JNZNXT
OUTP:
POPDX
MOVAH,02H
ADDDL,30H
MOVDL,0AH
MOVDL,0DH
LOOPOUTP
RET
DISPLAYENDP
CODEENDS
ENDBEGIN
五.程序运行截图
六.预习题
1.十进制数0--9所对应的ASCII码是什么?
如何将十进制0—9在屏幕上显示出来?
0-9的ascii码为,30h,31h,32h,34h,35h,36h,37h,38h,39h
将要显示的数加上30h,得到该数的ascii码,再利用DOS功能调用显示单个字符,这是一种简答的做法,但考虑到后面两个实验均用到将数据在屏幕显示,于是用了一种更通用的做法:
数字计算机中数据的存储方式是由0和1组成的二进制码串,对于数的显示,一般都需要先转换成对应数的ASCII码才能调用系统显示功能完成显示,由于我们需要的是按十进制数显示,故先要把二进制转换成十进制,采用“除10取余法”来完成,将待转换的数除以10,得到第一个商和余数,此第一个余数就是所求的十进制数的个位;
再用第一个商除以10,得到第二个商和余数,此第二个余数就是所求十进制数的十位,……重复直至商为0,即得到所求的十进制数,再将所得到的十进制数的每一位分别转换成对应的ASCII码,转换过程即给每个十进制位加上30H即可,最后送显示器输出,在这次试验中,我将这一过程做成了一个子程序,代码如下:
2.如何检验一个数为正,为负或为零?
你能举出多少种不同的方法?
利用cmp指令,将该数与0比较,利用跳转指令即可根据该数与0的大小来得到其正负。
也可以利用TEST指令,将该数与0相减,观察标志位。
还可以检查最高位,为0是正数,为1时再检查其他位判断是负数或0
3.如何统计出正奇数,正偶数,负奇数,负偶数以及零的个数.
可以首先与零比较,判断数的正负,再分别对正数、负数来判断其奇偶性:
用所需判断的数除以2,若余数为0,则该数位偶数,否则为奇数。
七.试验总结及心得体会
本实验结构比较清晰,总的来说难度不大,自己在做的过程中,程序主体很快写好,难点在于显示部分,由于实验中要求每类数的个数均不超过9,所以开始转换显示并不复杂,并且把它单独做成了一个子程序,后来在完成后两个实验的过程中,发现均会用到屏幕显示,于是自己回过头来对这部分再研究了下,对其进行了扩展,并使其更加具有通用性,使显示子程序不仅能输出显示10以内的十进制数,更多位数的十进制数也能准确显示。
总的来说,本实验让我熟悉了汇编语言的编程,为后续实验打下了坚实的基础。
实验三:
代码转换程序设计
一.实验目的
1.掌握几种最基本的代码转换方法
2.运用子程序进行程序设计
二.实验内容
1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来.
2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明.
3.对输入要有检错措施,以防止非法字符输入,并有适当的提示.
4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图.
三.程序流程图
模块层次图:
各个子程序说明:
输入子程序input:
输入的数据之间的分隔符为空格,结束标志为回车键,首先调用DOS输入功能,对输入的字符进行比较,若为空格,则写数据,若为回车键,则写最后一个数据并结束输入子程序;
若输入的数比30H(即数字0)小或者比39H(对应数字9)大,则提示输入错误,要求重新输入。
输入的数据存储在DATA段定义的ARRAY中。
排序子程序order:
由于要找到输入的几个数中的最小值,故对输入的数进行比较、排序,采用冒泡排序算法,将相邻的两个数进行比较,小的在前,大的在后,若顺序不一致则交换,若数据个数为i,则比较一共需进行i-1轮。
输出显示子程序display:
该程序的作用是将排序好的数中的最小值显示出来即可,要显示的数位ARRAY中的第一个,使用实验B中的显示子程序即可。
四.源程序
DATASEGMENT
ARRAYDW200DUP(?
);
存所输入的数
NUMDW0;
计所输入的数的个数
S1DB'
PLEASEINPUTSOMENUMBERS:
;
输入提示语
S2DB'
INPUTERROR!
PLEASEINPUTAGAIN……$'
错误提示
S3DB'
THEMINIMUMNUMBERIS:
STACKSEGMENT;
堆栈段
DB500DUP(?
CODESEGMENT
MAINPROCNEAR
START:
MOVAX,DATA
MOVSI,0;
初始化
MOVAH,09H
LEADX,S1;
显示提示语
CALLCRLF
CALLINPUT;
调用输入子程序
CALLORDER;
调用排序子程序
CALLDISPLAY;
调用输出显示子程序
MAINENDP
CRLFPROCNEAR;
回车换行子程序
RET
CRLFENDP
INPUTPROCNEAR
MOVAH,01H;
键盘输入并回显功能调用
CMPAL,20H;
空格为每个数据之间的分割分隔标志
JZWRITE1
CMPAL,0DH;
回车为输入结束标志
JZWRITE2
CMPAL,30H
JBERROR;
输入比0小,则错误
CMPAL,39H
JAERROR;
输入比9大,则错误,重新输入
SUBAL,30H;
得到输入数值
MOVCL,AL
MOVCH,00H
MOVAX,BX
MOVBX,0AH
MULBX
MOVBX,AX
ADDBX,CX
JMPBEGIN
ERROR:
WRITE1:
MOV[ARRAY+SI],BX
ADDSI,2
INCNUM
MOVBX,0
WRITE2:
MOV[ARRAY+SI],BX
INPUTENDP
ORDERPROCNEAR;
冒泡排序
MOVCX,NUM
DECCX;
进行i-1轮比较
LP1:
PUSHCX
LP2:
MOVAX,ARRAY[BX]
CMPAX,ARRAY[BX+2]
JBENEXT
XCHGAX,ARRAY[BX+2]
MOVARRAY[BX],AX
ADDBX,2
LOOPLP2
POPCX
LOOPLP1
ORDERENDP;
显示子程序
LEADX,S3
MOVAX,ARRAY[0]
MOVDX,0
INT21H
CODEENDS
ENDSTART
五.程序运行结果
正常情况:
当输入有误时,程序会识别并提示:
六.预习题
1.如何将输入的两个字符(0--9)变为十进制或二进制数?
字符(0--9)和数字(0--9)虽然看起来一样,但他们的ASCII码码值是有差别的,将输入的字符(0--9)的码值减去30H,即可得到对应十进制数的码值,若要转化为二进制数,则先将待转换数转换为十进制数,再将十进制数转换为二进制数即可
2.如何将选出的最小值(二进制或十进制)变为ASCII码再进行显示?
选出的最小值在机器中的存储形式为二进制数,需先将二进制数转换为十进制数,采用除10取余法,然后再将十进制数逐位转换为其对应的ASCII码,即将每一位加30H即可,然后送显示器输出。
3.你觉得采用二进制运算还是十进制运算更适合于这个实验?
采用十进制数更加适合此实验,程序会更简便些。
七.实验总结及心得体会
这次实验相对于第一次来说,难度明显增大,但整体结构是比较清晰的,虽然说是采用汇编语言来写作,但同样可以借鉴以前所学的面向对象编程,即将程序各部分模块化,输入、排序、输出显示,将任务拆分后,将各个模块分别实现,这一点难度不会很高,有了自己第一次的经验与基础,再查阅相关资料,花了很多时间,但最终各子程序部分顺利完成,但将各模块放在一起还是个麻烦事,每一个子程序都有其接口,故每个子程序与主程序间的接口参数等需要一致,同时程序还要有一定的识错能力,有异常输入时程序会识别并提示。
这次实验让我进一步熟悉和掌握了DOS功能调用、模块化编程及数制间的转换,同时那些独立的模块在以后的实验中同样可以应用,避免了重复性工作。
实验四:
子程序设计
一.实验目的
1.进一步掌握子程序设计方法;
2.进一步掌握基本的DOS功能调用.
二.实验内容
1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入.
2.统计检查每个学生的名次.
3.将统计结果在屏幕上显示.
4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可能考虑美观.
5.输入要有检错手段.
三.程序流程图
模块层次图
四.源程序
PLEASEINPUTSTUDENTSCORES:
错误提示语
THERANGEOFTHESTUDENTSIS:
MOVDI,0
换行子程序
INCDI
CMPDI,02H;
若输入的分数超过100分则提示错误
JAERROR
CALLCRLF;
错误提示
JAENEXT
DISPLAYPROCNEAR
MOVCX,NUM
MOVSI,0
SHOW:
PUSHCX;
将数组array中所存储的输入的数据显示出来
MOVAX,ARRAY[SI]
LOOPSHOW
五.程序运行结果
当输入分数正常时:
当有异常输入时,程序会报错:
当输入成绩超过100分时,程序会报错:
六.预习题
1.如何确定一个学生在这门科目中的名次?
确定名次有多种方法,本实验采用的是冒泡排序法,将按学号顺序输入的学生成绩存入数据区,然后用冒泡排序对这些数据进行排序,再采用输出显示子程序将结果输出即可。
还有一种方法是,抽取每个学生的成绩和其他所有学生的成绩进行比较,然后统计比其分数高的学生,得出该学生的名次,这种方法稍复杂些,本实验没有采用
2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?
采用冒泡排序算法,将学生的成绩排序,同时学生的学号也随着成绩的排序而改变在内存中的位置,当排序结束后,学号的顺序也随之改变,最后将学生的成绩输出,即可得到名次。
七.实验心得与体会
由于有了前三次实验的基础,所以本次实验虽然几经波折,但还是顺利完成了。
本次实验也要用到输入、排序等,所以以前结构化编程的好处便得到了体现,很多工作不用重复进行,循环显示那部分算是一个难点,其要将数据区中的成绩先进行码制转换再顺序输出,开始遇到了问题,显示一直不正确,后来调整了循环次数和循环体,采用双层循环,最终程序正常运行。
通过这几次试验,自己对汇编语言编程掌握的更深了,同时在不断克服困难的过程中,自己也得到了锻炼,自信心得到了增强。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 实验 报告