西安电子科技大学-微机原理与接口技术大作业

简介

  本文旨在给学弟学妹做大作业时提供思路,学校作业可能会查重,学弟学妹使用的时候一定要读懂后进行修改!!!

  如果发现哪里有错可以评论留言。

  代码和报告见我的GitHub找相应的课程,求个Star:XDU_HW,里面还有其他课程的代码和报告

一、实验要求

编写程序实现下列5项功能,通过从键盘输入1~5进行菜单式选择。
• 按数字键“1”,完成将字符串中的小写字母变换成大写字母。用户输入由英文大小写字母或数字0~9组成的字符串(以回车结束),变换后按下列格式在屏幕上显示:

<原字符串>:abcdgyt0092
<新字符串>:ABCDGYT0092
按任意键重做;按Esc键返回主菜单

• 按数字键“2”,完成在字符中找最大值。用户输入由英文大小写字母或数字0~9组成的字符串(以回车结束),找出最大值后按下列格式在屏幕上显示:

<原字符串>The maximum is <最大值>
按任意键重做;按Esc键返回主菜单

• 按数字键“3”,完成输入数据组的排序。用户输入一组十进制数值(小于255),然后变换成十六进制数,并按递增方式进行排序,按下列格式在屏幕上显示:

<原数值串> <新数值串>
按任意键重做;按Esc键返回主菜单

• 按数字键“4”,完成时间的显示。首先提示用户对时,即改变系统的定时器HH:MM:SS(以冒号间隔,回车结束),然后在屏幕的右上角实时显示出时间HH:MM:SS。
按任意键重做;按Esc键返回主菜单

• 按数字键“5”,结束程序的运行,返回操作系统

二、程序设计

  采用分模块的方式,把前四个任务分别写程四个函数,最后设计系统页面,整合所有功能。接下来分别说明四个任务和系统页面的设计。
数据段和堆栈段定义如下所示

DATAS SEGMENT
	TIPMenu1 DB 'Push 1 To Capitalize String','$'
	TIPMenu2 DB 'Push 2 To Find The Maximum of The String','$'
	TIPMenu3 DB 'Push 3 To Sort The Array','$'
	TIPMenu4 DB 'Push 4 To Show Time in Real Time','$'
	TIPMenu5 DB 'Push 5 To Exit','$'
	
	TIPInputString DB 'Please input string:','$'
	TIPOriginalString DB 'Original string:','$'
	TIPNewString DB 'New string:','$'
	
	TIPMax DB 'The maximum is ','$'
	
	TIPInputArray DB 'Please input array:','$'
	TIPOriginalArray DB 'Original array:','$'
	TIPNewArray DB 'New array:','$'
	
	TIPInputTIME DB 'Please input TIME(HH:MM:SS:):','$'
	
	
	BUFFSTRING  DB 100
				DB ?
				DB 100 DUP(?)
	ARRAY DB 100 DUP(0)
	ARRAYLength DB 0
	ARRAYSorted DB 100 DUP(0)
	SpiltSymbol DB ?
	TIMEBUFF DB 3 DUP(0)
	
	TEMP DB 0
	Decimal DB 10
	HEX DB 16
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
		DB 100 DUP(?)
	TOP LABEL WORD
    ;此处输入堆栈段代码
STACKS ENDS

  在数据段中,TIPxx用于显示的提示信息或者结果,BUFFSTRING用于存放输入进来的字符串,ARRAY用于存放从字符串转码来的十进制数组,ARRAYLength用于存放数组的长度,ARRAYSorted用于存放按增序排好的数组,SpiltSymbol用于存放用于隔开数据的字符(在本文中“,”用于隔开数组中的数据,“:”用于隔开时间),TEMP用于临时存放数据,Decimal用于输出十进制数时的除数,HEX用于输出十六进制数时的除数。

  在堆栈段中,开辟100个字节的空间,用TOP可以采用字型访问该空间。

2.1 任务1:将字符串中的小写字母变换成大写字母

2.1.1 主框架

  程序主要使用遍历访问的方法,当找到小写字母后把原字符与上5FH便可以得到其对应大写字母的ASCII码。该任务模块的基本思路如图 1所示。最后把程序封装为函数 C a p i t a l i z e S t r i n g CapitalizeString CapitalizeString,无入口和出口参数,在函数的开头和结尾加上保护现场和恢复现场。该任务模块的基本思路如图 1所示

在这里插入图片描述

图 1任务一主流程图

2.1.2 输入字符串函数

入口参数:SI指向输入提示语句
出口参数:无
  流程图中的 函数使用DOS系统功能调用中的字符串显示和输入和字符显示。字符串显示用于显示TIPInputString,在输入完字符串后使用字符显示换行。 I n p u t S t r i n g InputString InputString流程图如图 2所示

在这里插入图片描述

图 2 InputString函数流程图

2.2 任务2:在字符中找最大值

2.2.1 主框架

  程序主要使用遍历访问的方法,如果当前字符的ASCII码大于所记录的最大值,则将此字符的ASCII码记录下来,最终得到字符串中的最大值,最后把程序封装为函数 F i n d M a x S t r FindMaxStr FindMaxStr,无入口和出口参数,在函数的开头和结尾加上保护现场和恢复现场。该任务模块的基本思路如图 3所示

在这里插入图片描述

图 3任务2主流程图

2.3 任务3:输入数据组的排序

2.3.1 主框架

  程序的数组输入调用InputString函数,数据以逗号分隔,字符串数组转换函数Str2Num把输入的字符串以“,”为分隔,并将对应的十进制数存入ARRAY中;十进制转十六进制输出部分由Disp函数完成;整个数组的显示由DISPARRAY函数完成;数组排序由 函数完成,排好序的数组存入 中。最后把程序封装为函数 ,无入口和出口参数,在函数的开头和结尾加上保护现场和恢复现场。该任务模块的基本思路如图 4所示

在这里插入图片描述

图 4任务3主流程图

2.3.2 字符串转化为数组函数

  入口参数:分隔符
  出口参数:无
  函数主要用遍历的方式查找分隔符“,”,当找到分隔符就开始处理分隔符前的数据,从高位开始,加上当前位,移到下一位,乘10后加上该位,直到该数据结束。遍历整个字符串,把所有数据存入ARRAY中。 函数流程图如图 5所示

在这里插入图片描述

图 5 函数流程图

2.3.3 十六进制显示十进制数函数

  入口参数:SI指向十进制数地址
  出口参数:无
  函数的方法是十进制数对十六取余,并将余数压入堆栈,再对商取余,将余数压入堆栈,直到商为0,最后把余数一个一个弹出,判断是否小于等于9,如果小于等于9,则加上48得到对应的ASCII码输出,如果大于9,则加上65减去10得到对应的ASCII码输出。 函数流程图如图 6所示

在这里插入图片描述

图 6 函数流程图

2.3.4 显示整个数组函数

  入口参数:SI指向数组首地址
  出口参数:无
  函数主要遍历数组,并调用 函数以十六进制显示,并在数据之间用逗号分隔。 函数流程图如图 7所示

在这里插入图片描述

图 7 函数流程图

2.3.5 数组排序函数

  入口参数:无
  出口参数:无
  函数主要使用遍历的方式,每次遍历找到数组中最小的数据,放入新数组中,并把原数组中的数据变为255,一共遍历数组长度此,最终得到从小到大排列的新数组。 函数流程图如图 8所示

在这里插入图片描述

图 8 函数流程图

2.4 任务4:时间实时显示

2.4.1 主框架

  首先调用 函数进行时间校准,函数中调用了 函数,数据以冒号分隔,字符串数组转换函数 把输入的字符串以“:”为分隔,并将对应的十进制数存入 中,使用置系统时间功能重置系统时间;之后使用 函数实时显示时间,时间的显示调用了 函数,其中的十进制显示调用了 函数。最后把程序封装为函数 ,无入口和出口参数,在函数的开头和结尾加上保护现场和恢复现场。该任务模块的基本思路如图 9所示

在这里插入图片描述

图 9任务4主流程图

2.4.2 时间校准函数

  时间校准函数首先显示校准时间提示,接着调用了 来获取输入的时间信息,再调用 函数把字符串转化为数据信息保存,最后调用置系统时间功能进行时间校准。 函数流程图如图 10所示

在这里插入图片描述

图 10 函数流程图

2.4.3 十进制显示函数

  入口参数:SI指向时间数据地址
  出口参数:无
  由于时间由两位构成,所以不需要像 函数那样考虑显示多位的情况,只需要对数据进行除10运算后得到的余数和商加上48即可得到对应的ASCII码,最后显示两个字符即可。 函数流程图如图 11所示

在这里插入图片描述

图 11 函数流程图

2.4.4 时间显示函数

  入口参数:SI指向时间数据地址
  出口参数:无
  主要调用 函数,并在两数据间显示“:”分隔。 函数流程图如图 12所示

在这里插入图片描述

图 12 函数流程图

2.4.5 实时显示时间函数

  函数首先设置光标位置到右上角,接着调用DOS系统功能获取系统时间,将获取的时间存入ARRAY,调用 函数显示时间,接着给CX赋值为0FFFFH进行延时操作,最后调用键盘服务读取键盘状态,若有输入则停止,无输入则更新显示时间。 函数流程图如图 13所示

在这里插入图片描述

图 13 函数流程图

2.5 任务5:返回操作系统

2.5.1 主框架

  清屏后调用DOS功能中的终止进程功能。

2.6 设置系统页面及整合功能

2.6.1 主框架

  调用 函数显示主菜单,设置光标到左上角,获取键盘状态,比较输入的字符分别与1、2、3、4、5进行对比跳转到对应任务,如果不是1、2、3、4、5则重新获取键盘状态;跳转到对应任务后调用相应任务函数,接着检测键盘输入是否为Esc,如果是则返回程序开始,显示主菜单,否则返回对应任务重新执行。该模块的基本思路如图 14所示

在这里插入图片描述

图 14整体框架主流程图

2.6.2 显示主菜单

  首先清屏,设置光标位置为第二行第一列,开始调用字符串输出功能,输出5个TIP。 函数流程图如图 15所示

在这里插入图片描述

图 15 函数流程图

三、功能测试

  到此为止,所有功能及整体框架全部完成,完整代码见附录。
  运行后主菜单页面如所示,输入1~5完成不同功能。

在这里插入图片描述

图 16 主菜单页面

3.1 将字符串中的小写字母变换成大写字母

  按数字键1进入任务1,任务1输入页面如图 17所示

在这里插入图片描述

图 17任务1输入页面

  输入“abCD12#%”后按回车,结果如图 18所示

在这里插入图片描述

图 18任务1结果

  按Esc键返回主菜单

3.2 在字符中找最大值

  按数字键2进入任务2,任务2输入页面如所示

在这里插入图片描述

图 19任务2输入页面

  输入“123abcABC”后按回车,结果如图 20所示

在这里插入图片描述

图 20任务2结果

  按Esc键返回主菜单

3.3 输入数据组的排序

  按数字键3进入任务3,任务3输入页面如所示

在这里插入图片描述

图 21任务3输入页面

  输入“12,13,14,11,10,”后按回车,结果如图 22所示

在这里插入图片描述

图 22任务3结果

  按Esc键返回主菜单

3.4 时间的显示

  按数字键4进入任务4,任务4输入页面如所示

在这里插入图片描述

图 23任务4输入页面

  输入“14:43:30:”后按回车,结果如图 24和图 25所示

在这里插入图片描述

图 24任务4结果1

在这里插入图片描述

图 25任务4结果2

  按Esc键返回主菜单

3.5 返回操作系统

  按数字键5进入任务5,返回操作系统,结果如图 26所示

在这里插入图片描述

图 26任务5结果

完整代码

完整代码可以在微机原理与接口技术大作业下载

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值