微机原理软件实验报告.docx
- 文档编号:8921384
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:56
- 大小:299.64KB
微机原理软件实验报告.docx
《微机原理软件实验报告.docx》由会员分享,可在线阅读,更多相关《微机原理软件实验报告.docx(56页珍藏版)》请在冰点文库上搜索。
微机原理软件实验报告
微机原理软件实验报告
班级:
姓名:
学号:
班内序号:
日期:
实验B分支,循环程序设计实验报告
1.实验目的:
开始独立进行汇编语言程序设计;;掌握基本分支,循环程序设计;;掌握DOS调用.
2.实验内容:
安排一个数据区,内存有若干个正数,负数和零.每类数的个数都不超过9;.编写一个程序统数据区中正数,负数和零的个数;.将统计结果在屏幕上显示.统计出正奇数,正偶数,负奇数,负偶数以及零的个数.。
三.预习题:
1、十进制数0--9所对应的ASCII码是什么?
答:
30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
2、如何将十进制数0--9在屏幕上显示出来?
答:
转化为ASCII码,然后:
MOVAH,02H
MOVDL,Y
INT21H
3、如何检验一个数为正,为负或为零?
你能举出多少种不同的方法?
答:
和零作比较,判断是否为零,CMPNUM,00H;ANDNUM,00H;
判正:
ANDNUM,80H;ORNUM,7FH;SUBNUM,00H;SHLNUM,1;
判负:
ANDNUM,80H;ORNUM,7fh;SUBNUM,00H;SHLNUM,1;
四、实验过程
(一)、流程图
是
否
是否
否是否
是
否
是
(二)、源代码
SHOWMACROX;;宏定义用于显示提示语句
MOVAH,09H
MOVDX,OFFSETX
INT21H
ENDM
SHOW1MACROY;;宏定义用于显示数值
MOVAH,02H
MOVDL,Y
INT21H
ENDM
DATSEGMENT
ADB1,16,70,-1,-2,1,0,-2,0,-2,9
SEQU$-A;待分类的数
PLUSDB?
;存储正数
MINUSDB?
;存储负数
LINGDB?
;存储零
EVEDB0;存负偶数
ODDDB0;存负奇数
ZEVEDB0;存正偶数
ZODDDB0;存正奇数
STRINGDB'THENUMBEROFPOSITIVENUMBERSIS','$'
STRINMDB0DH,0AH,'THENUMBEROFNEGATIVENUMBERSIS','$'
STRINNDB0DH,0AH,'THENUMBEROFZEROIS','$'
STRING1DB0DH,0AH,'THENUMBEROFPOSITIVEODDNUMBERSIS','$'
STRING2DB0DH,0AH,'THENUMBEROFPOSITIVEEVENNUMBERSIS','$'
STRING3DB0DH,0AH,'THENUMBEROFNEGATIVEODDNUMBERSIS','$'
STRING4DB0DH,0AH,'THENUMBEROFNEGATIVEEVENNUMBERSIS','$'
DATENDS
STASEGMENTSTACK
DW50DUP(?
)
STAENDS
CODSEGMENT
ASSUMECS:
COD,DS:
DAT,SS:
STA
STARPROCFAR
PUSHDS
XORAX,AX
PUSHAX
MOVAX,DAT
MOVDS,AX
MOVAX,STA
MOVSS,AX
MOVCX,S
LEABX,A
CON:
MOVAL,BYTEPTR[BX]
ORAL,AL
JZZERO;判断是零
JSFU;判断是负数
JMPZHENG;判断是正数
ZERO:
INCLING;零个数自加
JMPDONE
FU:
INCMINUS;负数个数自加
ANDAL,01H
JZOU;判断是负偶数
INCODD;判断是负奇数,负奇数个数自加
JMPDONE
OU:
INCEVE;负偶数个数自加
JMPDONE
ZHENG:
INCPLUS;正数个数自加
ANDAL,01H
JZZOU;判断是正偶数
INCZODD;正奇数个数自加
JMPDONE
ZOU:
INCZEVE;正偶数个数自加
JMPDONE
DONE:
INCBX;指向下一个内存数
LOOPCON
ADDLING,30H;转换为ASCII码
ADDMINUS,30H
ADDPLUS,30H
ADDODD,30H
ADDEVE,30H
ADDZODD,30H
ADDZEVE,30H
SHOWSTRING;提示语句
SHOW1PLUS;大于0的数
SHOWSTRINN;提示语句
SHOW1LING;等于0的数
SHOWSTRINM;提示语句
SHOW1MINUS;小于0的数
SHOWSTRING1;提示语句
SHOW1ZODD;正奇数个数数
SHOWSTRING2;提示语句
SHOW1ZEVE;正偶数个数
SHOWSTRING3;提示语句
SHOW1ODD;负奇数个数
SHOWSTRING4;提示语句
SHOW1EVE;负偶数个数
RET
STARENDP
CODEENDS
ENDSTAR
(三)、实验分析
数据区待统计的数据为:
1,16,70,-1,-2,1,0,-2,0,-2,9
实验结果如下图所示。
(四)、实验总结、建议要求、心得体会
实验总结:
同一个功能,尽量尝试用不同的方法实现,随着方法的深入了解,实现细节的掌握,对底层的了解就会了解的更深更广泛一点。
程序,尽量要自己写,不可否认的是,汇编的学习比起高级语言的学习来,更为晦涩难懂,借鉴代码的时候,要学会先分析别人的思路,学着画出其流程图,和自己的流程图相比较,了解各自的长处,在进行借鉴,这样会学到更多。
注释必须清晰明了,宁可多写一些字,不然再次看的时候又不懂了。
另外对寄存器的操作要格外小心,要尽力避免犯低级错误;对DS的引用要和AX结合起来,也难怪期中考的不好。
可以发现,前面CPU寄存器的那一个环节基础没有扎实。
计数的时候,计算错了,出了点问题,是赋错了值。
建议要求:
对自己的要求,做事情要有一个清晰的打算,这样落实的时候,就显得比较容易,即使要调整思路也比较容易。
这也就是流程图的好处吧。
心得体会:
这次汇编编程操作弄得鸡飞狗跳的,因为可以说是第一次利用底层的语言来编程,虽然流程图基本画出来了,但是毕竟还是不会写,就先啃别人的代码,啃的很困难啊,还好坚持下来了,可能比起别人,这算不了什么,但是对于我来说,真的是一大进步,一下子明白了,汇编和高级语言的不同。
中间出了几个错误,自己弄不好,郁闷的很,只好请教同学,还好最后都弄好了。
都是基础不扎实的缘故,看来好好扎实基础是关键。
对于代码的调试,老师之前讲过,跟着联系过,所以就比较顺利。
实验C代码转换程序设计
一、实验目的
掌握几种最基本的代码转换方法;运用子程序进行程序设计。
二、实验内容
从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来;两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明;对输入要有检错措施,以防止非法字符输入,并有适当的提示;将整个程序分解为若干模块,分别用子程序实现。
在报告中要给出模块层次图。
三、预习思考
1.如何将输入的两个字符(0~9)变为十进制或二进制数?
答:
输入的字符以后,0~9是ASCII码,分别是30H~39H,那就是说减去30H就行了。
2.如何将选出的最小值(二进制或十进制)变为ASCII码再进行显示?
答:
读入并存储数字的ASCII码,比较其大小,输出ASCII码。
3.你觉得采用二进制运算还是十进制运算更适合于这个实验?
答:
直接比较ASCII,先比较十位,十位数大的数字大,十位相同的时候,比较个位数,个位数大的则大。
如果十位和个位都相同,两数就相同。
四、实验过程
(一)流程图
小于
大于或等于
小于
大于或等于否
是
(二)源代码
DATASEGMENT
INPUTDB100DUP(?
)
MINTMPDB'9'-30H,'9'-30H;最小值初始化
COUNTDB0D
IFERRORDB0D;判断输入是否有错
;提示信息字符串
WELCOMEDB'Pleaseinputnumbers:
','$'
OUTTIPDB'Minimumis:
','$'
CRDB0DH,0AH,'$';
;错误输入
ERROR1DB'ERROR:
Characterisnotvalid!
','$'
ERROR2DB'ERROR:
Numbermustcontainstwodigits!
','$'
ERROR3DB'ERROR:
Numberisempty!
','$'
ERROR4DB'ERROR:
Needseparatechar!
','$'
DATAENDS
;--------------------------------------------------------
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
MAINPROCFAR
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETWELCOME;调用欢迎提示
CALLPRINT
MOVDX,OFFSETCR;
CALLPRINT
CALLGETNUM;获取用户输入
CMPIFERROR,0;判断输入过程是否有错
JNZBACK;错误返回DOS
MOVDX,OFFSETCR;回车换行
CALLPRINT
CALLFINDMIN;查找最小数
MOVDX,OFFSETOUTTIP;调用输出提示
CALLPRINT
MOVAH,02H
MOVDL,MINTMP;输出最小值的十位
ADDDL,30H
INT21H
MOVAH,02H
MOVDL,MINTMP[1];输出最小值的个位
ADDDL,30H
INT21H
BACK:
MOVAX,4C00H;返回DOS
INT21H
MAINENDP
;--------------------------------------------------------
;获取输入,出口参数为IFERROR,表示是否有错
GETNUMPROC
PUSHAX;保存现场
PUSHBX
PUSHCX
PUSHDX
PUSHDI
MOVDI,0;数组偏移地址
MOVCX,0;标识数字的位数
GETLOOP:
MOVAH,01H;从键盘读取一个字符
INT21H
CMPAL,0DH;和回车比较
JEEXIT1;是回车则结束输入
CMPCX,0;数字位数为空
JECMPSPACE0
CMPCX,1;数字位数为1
JECMPSPACE1
CMPCX,2;数字位数为2
JECMPSPACE2
CMPSPACE0:
CMPAL,20H
JEGETLOOP;数字位数为0且输入空格则忽略,继续输入
JMPASCBIN;不是空格就读取该字符
CMPSPACE1:
CMPAL,20H
JEERR2;数字位数为1且输入空格则位数不是两位数出错
JMPASCBIN;否则读取该字符
CMPSPACE2:
CMPAL,20H
JNEERR4;数字位数为2后,不输入空格则分隔符错误
XORCX,CX;输入空格则清零重新计数
JMPGETLOOP
ASCBIN:
SUBAL,30H;化为二进制数字
JLERR1;小于则无效字符
CMPAL,9;和9比较
JGERR1;大于9则是无效字符
MOVINPUT[DI],AL;保存输入的数
INCCOUNT;统计输入的数字个数,为判断是否输入为两位数
INCDI;向后移动数组
INCCX
JMPGETLOOP
ERR1:
MOVIFERROR,1;输出错误1
MOVDX,OFFSETERROR1
CALLPRINT
JMPRETURN
ERR2:
MOVIFERROR,1;输出错误2
MOVDX,OFFSETERROR2
CALLPRINT
JMPRETURN
ERR3:
MOVIFERROR,1;输出错误3
MOVDX,OFFSETERROR3
CALLPRINT
JMPRETURN
ERR4:
MOVIFERROR,1;输出错误4
MOVDX,OFFSETERROR4
CALLPRINT
JMPRETURN
EXIT1:
MOVBL,COUNT;判断输入数的个数是否为零
CMPBL,0
JEERR3;输入数目为0则输出错误并退出
ANDBL,01H;判断数字是否为两位数
CMPBL,0
JNEERR2;输入数字个数为奇数则出错
RETURN:
POPDI;恢复现场
POPDX
POPCX
POPBX
POPAX
RET
GETNUMENDP
;--------------------------------------------------------
;回车换行输出字符串,入口参数为DX
PRINTPROC
PUSHAX
MOVAH,09H
INT21H
POPAX
RET
PRINTENDP
;--------------------------------------------------------
;查找最小的数子程序
FINDMINPROC
PUSHDI;保护现场
PUSHAX
PUSHCX
MOVDI,-2;数组下标
MOVCL,COUNT;把数组长度移入CX
MOVAL,CL
CBW
MOVCX,AX
LOP:
ADDDI,2
CMPCX,DI;是否已经比较完毕
JEEXIT2;如果比较完毕所有数则退出
MOVAH,INPUT[DI];否则接着比较,移入十位数
MOVAL,INPUT[DI+1];移入个位数
CMPAH,MINTMP;比较十位数,MINTMP低地址为十位
JALOP;如果MINTMP小,则直接比较下一个数
JEHIGHEQU
;如果十位数相等,比较个位数,再否则十位大就直接存储
STOMIN:
MOVMINTMP,AH
MOVMINTMP[1],AL
JMPLOP
HIGHEQU:
CMPAL,MINTMP[1];比较个位数
JNBLOP;个位数比MINTMP大则跳到下一个数
JMPSTOMIN;否则将当前数写入为MINTMP
EXIT2:
POPCX
POPAX
POPDI
RET
FINDMINENDP
;--------------------------------------------------------
CODEENDS
ENDMAIN
(三)实验结果
空格为分隔符,回车是输入结束符。
数字小于10,需要补齐零。
5、实验总结
总结:
在设计判断数字大小的问题上,遇到了点麻烦,原来想比较其二进制的大小,但是问题是,这样一位一位的比较,是很麻烦的事情。
最后直接比较权位的数值的大小了,这样比较了最高位之后,就已经可能比较出大小,这样节省时间。
心得体会:
越来越发现汇编语言的复杂行,习惯了利用高级语言编程,本来很简单的一个操作会在汇编下就变得更难解决,而这些语言本身在执行和操作的过程中,所用的时间很多,而写高级所用的时间却很少。
让人不由的对高级语言产生一种亲切感。
汇编语言到是促进了人机交互的这件事情。
但是,如果在写高级语言的时候,能够将高级语言的主要部分反汇编出来,看懂看明白,搞清楚寄存器的调用,着重了解堆栈的应用,这样,才能对程序的运行状态有更深的了解。
实验D子程序设计
一、实验目的
1.进一步掌握子程序设计方法;
2.进一步掌握基本的DOS功能调用。
二、实验内容
1.从键盘上输入某班学生的某科目成绩。
输入按学生的学号由小到大的顺序输入。
2.统计检查每个学生的名次。
3.将统计结果在屏幕上显示。
4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜。
输出应便于阅读.尽可能考虑美观。
5.输入要有检错手段。
三、预习思考
1.如何确定一个学生在这门科目中的名次?
答:
将学生的成绩以数组的形式存储,得到成绩在内存的偏移量,比较各个偏移量所在的区域的成绩的大小,冒泡排序(正好是书上讲过的)。
2.输入结束后,采用什么方法进行比较以得到学生的名次最为简单?
答:
冒泡排序,这样节省时间和内存,消耗小。
3.给出输出显示的形式。
答:
表格形式,学号、分数、名次排列。
四、实验过程
(一)流程图
否
是
否
是
(二)源代码
DATASEGMENT
IDDB400DUP(?
);存储学号,每个16固定个BYTE,存储为字符串
MARKDB20DUP(?
);存储分数,每个1BYTE,存储为二进制数
RANKDB20DUP(?
);存储排名,每个1BYTE,存储为二进制数
RANKTMPDB20DUP(?
);排序时指针临时区
MTMPDB?
;记录成绩的临时区
COUNTBDB?
;记录总的学生的个数,存为8位
COUNTWDW?
;记录总的学生个数,存为16位
CHEOKDB?
;输入检查标志位
ERRORDB?
;记录错误号
TMPDB2DUP(?
);开辟两个内存临时存储区,用作判断和计数
CRDB0DH,0AH,'$';回车换行
TABDB09H,09H,'$';输出TAB键
ERR0DB'Inputcannotbeempty!
','$'
ERR2DB'Characterisinvalid!
','$'
ERR4DB'Markisinvalid!
','$'
ERR6DB'Inputisinvalid!
','$'
ERRLISTDWERR0,ERR2,ERR4,ERR6
TIP0DB'Pleasere-input:
','$'
TIP1DB'Pleaseinputnumberofstudents:
','$'
TIP2DB'PleaseinputIDandMARK:
','$'
PRTIPDB'--------------RESULT---------------','$'
PRINFODB'ID',09H,09H,'MARK',09H,09H,'RANK','$'
PRPRE1DB'ID:
','$'
PRPRE2DB'MARK:
','$'
BUFFDB16;定义输入缓冲区,最长的字符长度
PRESDB?
;存储实际输入了多少个字符
CHARDB16DUP(?
);实际可存储有效字符16个
DATAENDS
CODESEGMENT
;--------------------------------------------------------
;打印提示字信息的宏,形参为PARA
PRINTTIPMACROPARA
PUSHAX
PUSHDX
MOVAH,09H
MOVDX,OFFSETPARA
INT21H
POPDX
POPAX
ENDM
;--------------------------------------------------------
;打印单个字符的宏,形参为ACHAR
PRINTCHARMACROACHAR
PUSHAX
PUSHDX
MOVAH,02H
MOVDL,ACHAR
INT21H
POPDX
POPAX
ENDM
;--------------------------------------------------------
;主程序
MAINPROCFAR
ASSUMECS:
CODE,DS:
DATA,ES:
DATA
MOVAX,DATA
MOVDS,AX
MOVES,AX
CALLGETNUMBER;获得学生的人数
CALLGETINFO;获得学号分数的输入
CALLSORT;执行排序活动名次
CALLPRINT;把名次结果打印出来
BACK:
MOVAX,4C00H;返回DOS
INT21H
MAINENDP
;--------------------------------------------------------;获得将要输入的学生的人数信息的子程序
;每班的学生定义不超过100人
GETNUMBERPROCNEAR
PUSHAX
PUSHBX
HE:
PRINTTIPTIP1
GREP:
CALLGETIN;获取一个输入缓冲
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 软件 实验 报告