北京邮电大学微机原理与接口技术软件件实验报告.docx

上传人:b****2 文档编号:17556585 上传时间:2023-07-26 格式:DOCX 页数:44 大小:456.88KB
下载 相关 举报
北京邮电大学微机原理与接口技术软件件实验报告.docx_第1页
第1页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第2页
第2页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第3页
第3页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第4页
第4页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第5页
第5页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第6页
第6页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第7页
第7页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第8页
第8页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第9页
第9页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第10页
第10页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第11页
第11页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第12页
第12页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第13页
第13页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第14页
第14页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第15页
第15页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第16页
第16页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第17页
第17页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第18页
第18页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第19页
第19页 / 共44页
北京邮电大学微机原理与接口技术软件件实验报告.docx_第20页
第20页 / 共44页
亲,该文档总共44页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

北京邮电大学微机原理与接口技术软件件实验报告.docx

《北京邮电大学微机原理与接口技术软件件实验报告.docx》由会员分享,可在线阅读,更多相关《北京邮电大学微机原理与接口技术软件件实验报告.docx(44页珍藏版)》请在冰点文库上搜索。

北京邮电大学微机原理与接口技术软件件实验报告.docx

北京邮电大学微机原理与接口技术软件件实验报告

信息与通信工程学院

微机原理软件实验报告

班级:

学号:

姓名:

序号:

时间:

2015-11-6——2015-11-29

实验二分支,循环程序设计

一、实验目的:

1.开始独立进行汇编语言程序设计;

2.掌握基本分支,循环程序设计;

3.掌握最简单的DOS功能调用.

二、实验内容:

1.安排一个数据区(数据段),内存有若干个正数,负数和零.每类数的个数都不超过9。

2.编写一个程序统计数据区中正数,负数和零的个数。

3.将统计结果在屏幕上显示。

4.(选做)统计出正奇数,正偶数,负奇数,负偶数以及零的个数。

三、预习题:

1、十进制数0--9所对应的ASCII码是什么?

如何将十进制数0--9在屏幕上显示出来?

答:

十进制数0——9对应的二进制数为30H——39H。

要屏显0-9的数码,只需将AH置成02H(DOS功能调用),然后将要显示的数码的ASCII码存进DL里,然后执行INT21H就可以打印字符。

或者,若这些数码是以字符串的格式存储,则可以将AH置成09H,(最后以’$’字符结束,)然后将串首地址传给DS,然后执行INT21H就可以打印字符串。

2、如何检验一个数为正,为负或为零?

你能举出多少种不同的方法?

答:

可以将待检验数与0比较(使用CMP指令后用JZ指令判断ZF是否为零),也可以将待检验数与80H相与,判断ZF的值。

二是和0相比是否相等,然后用该数(假设为8位)和10000000相与,取出符号位判断,可区分正负。

本次试验中我使用的方法是与0比较,所有判决方法的核心思想要么是直接和0相比,要么使用逻辑或移位运算,取出符号进行判断。

四、实验过程:

流程图:

 

大于0小于0

等于0

代码:

DATASEGMENT;数据段

BUFFDW4,0,37,99,-9,-2,-87,0,76,11,0,-34,-11,0,22;待判断数据

COUNTEQU$-BUFF;COUNT的值为BUFF所占的字节数

POSIDB?

;正数

ZERODB?

;负数

NEGTDB?

;0

POSIEVENDB0;正偶数

POSIODDDB?

;正奇数

NEGTEVENDB0;负偶数

NEGTODDDB?

;负奇数

POSICHARDB'Positive:

$';用于打印提示的字符串定义

NEGTCHARDB'Negtive:

$'

ZEROCHARDB'Zero:

$'

EVENCHARDB'Even:

$'

ODDCHARDB'Odd:

$'

CRDB0DH,0AH,'$';回车换行的ASCII码

DATAENDS

STACKSEGMENTSTACK'STACK';堆栈段

DB100DUP(?

STACKENDS

CODESEGMENT;代码段

ASSUMECS:

CODE,DS:

DATA,ES:

DATA,SS:

STACK

BEGIN:

PUSHDS

XORAX,AX

PUSHAX;返回DOS

MOVAX,DATA

MOVDS,AX;给DS真正赋值

MOVCX,COUNT

SHRCX,1;相当于除2,正好为BUFF中的数据个数

MOVDX,0;设定初值:

DH及DL分别为等于、大于零的个数

MOVAH,0;设定初值:

AH为小于零的个数

LEABX,BUFF;把BUFF中的第一个数存到BX

AGAIN:

CMPWORDPTR[BX],0;BUFF中的第一个数与0进行比较

JGEPOSITIVE;大于等于0时转POSITIVE

INCAH;统计小于零的个数

ADDWORDPTR[BX],1

ANDNEGTEVEN,[BX];和1与之后的结果加到负偶数中

JMPNEXT

POSITIVE:

JZZERO;等于0时转ZERO

INCDL;统计大于零的个数

ADDWORDPTR[BX],1

ANDPOSIEVEN,[BX];和1与之后的结果加到正偶数中

JMPNEXT

ZERO:

INCDH;统计等于零的个数

NEXTINCBX;修改地址指针

INCBX

LOOPAGAIN;循环判断CX不为0

MOVPOSI,DL;保存结果,正数

MOVZERO,DH;0

MOVNEGT,AH;负数

MOVAH,POSI

MOVAL,POSIEVEN

SUBAH,AL;计算正奇数个数

MOVPOSIODD,AH

MOVAH,NEGT

MOVAL,NEGTEVEN

SUBAH,AL

MOVNEGTODD,AH;计算负奇数个数

PRINT:

;打印正数提示符和正数(奇偶)个数

MOVAH,09H

MOVDX,OFFSETPOSICHAR

INT21H

MOVAH,02H

MOVDL,POSI

ADDDL,30H

INT21H

MOVAH,09H

MOVDX,OFFSETEVENCHAR

INT21H

MOVAH,02H

MOVDL,POSIEVEN

ADDDL,30H

INT21H

MOVAH,09H

MOVDX,OFFSETODDCHAR

INT21H

MOVAH,02H

MOVDL,POSIODD

ADDDL,30H

INT21H

MOVDX,OFFSETCR

MOVAH,09H

INT21H

;打印负数提示符和负数(奇偶)个数

MOVAH,09H

MOVDX,OFFSETNEGTCHAR

INT21H

MOVAH,02H

MOVDL,NEGT

ADDDL,30H

INT21H

MOVAH,09H

MOVDX,OFFSETEVENCHAR

INT21H

MOVAH,02H

MOVDL,NEGTEVEN

ADDDL,30H

INT21H

MOVAH,09H

MOVDX,OFFSETODDCHAR

INT21H

MOVAH,02H

MOVDL,NEGTODD

ADDDL,30H

INT21H

MOVDX,OFFSETCR

MOVAH,09H

INT21H

MOVAH,09H

MOVDX,OFFSETZEROCHAR

INT21H

MOVAH,02H

MOVDL,ZERO

ADDDL,30H

INT21H

CODEENDS

ENDBEGIN;代码段结束

 

结果分析:

数据区待统计的数据为:

4,0,37,99,-9,-2,-87,0,76,11,0,-34,-11,0,22

实验结果如下图所示:

本实验意在练习基本的分支、循环结构。

关键的点在于和0比较,区分正负和零,然后在正数和负数中判断奇偶,这里巧妙地使用了和1与之后结果加和到偶数中,最后利用统计的数的个数减去偶数得奇数的方法。

使得程序更加流畅和简洁,思路也更清晰。

五、实验总结

汇编程序同高级语言一样,在写代码前都要对实验做分析,设计好思路,这样写代码时思路才比较清晰,代码也比较容易写和查找错误。

此次实验主要是循环和分支,也是用汇编语言编写的第一个程序,让我熟悉了汇编语言的基本写法,对很多理论课学到的知识都有了更深的了解。

了解了怎样利用判别条件在不同的分支中跳转,循环的判别及循环过程。

总而言之,此次实验收获还是很多的,不仅加深了对这两种结构的了解,提升了自己设计程序的能力,并且也提升了自己排除bug的能力,进一步熟悉了第一个实验的整个流程。

 

实验三代码转换程序设计

一、实验目的:

1.掌握几种最基本的代码转换方法;

2.运用子程序进行程序设计.

二、实验内容:

1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来.

2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明.

3.对输入要有检错措施,以防止非法字符输入,并有适当的提示.

4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图.

三、预习题:

1.如何将输入的两个字符(0--9)变为十进制或二进制数?

答:

两字符减去0的ASCII码(30H)后,高位数乘以十加上低位数,即变为十进制数。

2.如何将选出的最小值(二进制或十进制)变为ASCII码再进行显示?

答:

本次实验是直接读入并存储数字的ASCII码,比较其大小,然后直接输出ASCII码。

3.你觉得采用二进制运算还是十进制运算更适合于这个实验?

答:

相比二进制,采用十进制运算更简洁,但需要和ASCII码进行转换。

可直接使用数字对应的ASCII比较,分别比较十位和个位,最后直接输出字符即可。

四、实验过程:

模块层次图:

 

流程图:

代码:

DATASEGMENT;数据段

INPUTDB100DUP(?

MINTMPDB'9'-30H,'9'-30H;置最小值的初始值为99

COUNTDB0D

IFERRORDB0D;用于判断调用输入子程序是否有错

WELCOMEDB'Pleaseinputnumbers:

','$';提示信息字符串

OUTTIPDB'Minimumis:

','$'

CRDB0DH,0AH,'$';回车换行

ERROR1DB'ERROR:

Characterisnotvalid!

','$';各种错误输入提示

ERROR2DB'ERROR:

Numbermustcontainstwodigits!

','$'

ERROR3DB'ERROR:

Numberisempty!

','$'

ERROR4DB'ERROR:

Needseparatechar!

','$'

DATAENDS

STACKSEGMENTSTACK'STACK';堆栈段

DB100DUP(?

STACKENDS

CODESEGMENT;代码段

ASSUMECS:

CODE,DS:

DATA,SS:

STACK,ES:

DATA

BEGINPROCFAR

PUSHDS;返回DOS

XORAX,AX

PUSHAX

MOVAX,DATA;真正给DS赋值

MOVDS,AX

MOVDX,OFFSETWELCOME;调用欢迎提示

CALLPRINT;调用子程序

MOVDX,OFFSETCR;回车换行

CALLPRINT

CALLMAIN;获取用户输入

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

BEGINENDP

;获取输入,出口参数为IFERROR,表示是否有错

MAINPROC

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

MAINENDP

;回车换行输出字符串,入口参数为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

ENDBEGIN

结果分析:

实验以空格为分隔符,空格的个数不限制,以回车为输入结束标志符。

对输入的数字进行了位数和范围的严格限制,即必须是两位数字,如果数字小于10,需要补齐零。

第一次不输入数字,直接回车后,提示错误,输入不能为空;

第二次输入数据1,提示错误,要求输入必需为2位数字;

第三次输入字符$,提示错误,要求输入为数字;

第四次输入123,提示错误,所输入数据两位后必需有空隔;

正确输入待比较数据:

012366098256,找到最小数为01,结果正确。

五、实验总结

这次实验主要是如何分析、如何调用子程序,用子程序使得整个代码思路比较清晰,代码也不容易出错,修改bug的时候比较好查找。

在实验中,以数组方式进行存储数据,每两个BYTE存储一个输入的两位数,存储格式为字符ASCII码,比较数字大小时,采用分别比较高位ASCII码和低位ASCII码的方式,从而不用在输入时将字符存储为数字,输出时也不用再进行逆转换,程序效率大为提高。

实验中遇到了很多问题,在同学的帮助下,解决了很多问题,了解了主函数和子函数的调用,每次遇到bug时,要是直接看代码找不到问题所在,就用debug查找,进一步熟悉了debug的使用,也从DS、IP、CS、AX、BX等寄存器的变化更好的理解了代码,更好的理解了汇编的过程,都是不小的进步,对以后的实验也有帮助。

实验四子程序设计

一、实验目的:

1.进一步掌握子程序设计方法;

2.进一步掌握基本的DOS功能调用.

二、实验内容:

1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入.

2.统计检查每个学生的名次.

3.将统计结果在屏幕上显示.

4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可

能考虑美观.

5.输入要有检错手段.

三、预习题:

1.如何确定一个学生在这门科目中的名次?

答:

有两种基本思路:

一是抽取每个学生的成绩和其他所有学生的成绩进行比较,然后统计比其分数高的学生,得出该学生的名次;二是把学生成绩存入连续内存区域,即数组方式,取得每个学生的成绩偏移量,即成绩偏移地址。

然后比较偏移地址所指的成绩的大小,交换数据区的值的位置,完成排序。

2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?

答:

采用冒泡排序法可获得较好的时间和空间性能。

冒泡法平均时间性能O(N2)。

相比于直接比较,性能有所改善。

但相对于快速排序、归并排序等优化的算法的时间复杂度O(N*log2N)还不够好。

但后两者使用汇编实现代码的复杂度和编程要求要高。

考虑到学生人数比较少,使用冒泡法是比较简洁的,时间性能是可以接受的。

3.准备好模块层次图.

答:

如下图所示实验过程中的模块层次图

4.给出输出显示的形式。

答:

以列表显示输出,依次为排名、学号、成绩。

四、实验过程:

模块层次图:

 

流程图:

代码:

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

BEGINPROCFAR

ASSUMECS:

CODE,DS:

DATA,ES:

DATA

MOVAX,DATA

MOVDS,AX

MOVES,AX

CALLGETNUMBER;获得学生的人数

CALLGETINFO;获得学号分数的输入

CALLSORT;执行排序活动名次

CALLPRINT;把名

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2