北京邮电大学_微机原理软件实验报告 下载本文

内容发布更新时间 : 2024/12/23 2:59:15星期一 下面是文章的全部内容请认真阅读。

2.统计检查每个学生的名次。 3.将统计结果在屏幕上显示。

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

5.输入要有检错手段。

三、预习题:

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

答:此程序显然属于排序问题,从简单的排序算法思考,我首先选定使用冒泡排序

算法或是插入排序算法,由于插入排序的特性就如同它所介绍的一样--我们在玩纸牌时,每一次抓牌前的纸牌都是排好序的,每一次插牌后也都是排好序的,按照这个特性去设计程序,可以很好地去贴合程序的设计。于是最后我选定插入排序去确定学生在科目中的名次。

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

答:因为本实验我所采取的是插入排序,所以最终输入结束后就已经得到了最终学生

的名次,所以输入结束后无需再采用别的算法去确定学生名次。 3.准备好模块层次图。

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

答:逐行显示,每行依次显示出名次、学号、成绩。

四、 程序设计流程图

五、程序源代码

;************************************************************************************************** ;* 作者:LQ * ;* 日期:2017/11/23 * ;* 功能: *

;* 输入若干两位十进制数,对应着学生的科目成绩,按照科目成绩进行排序 * ;************************************************************************************************** assume cs:code data segment db 'Wrong Input!','$' db ' ','$' ;前两行字符串,用于向屏幕打印发生错误时的字符串 db 90 dup(0) ;假定学生总数不大于45 data ends code segment message:db 'rank','$' start: mov ax,data mov ds,ax xor si,si mov di,19H ;19H对应着存储数字的区域前面一个区域 s: mov ah,0 ;int 16h 0编号功能是从键盘缓冲区读取一个键盘值输入 int 16h ;结果 ah存储扫描码,al 存储ascii码值 cmp ah,1cH ;1ch 为回车键的扫描码,一旦按下回车表示程序结束 je print_prog1 cmp ah,39H ;空格键的扫描键,作为两个十进制数之间的分隔符 je storage cmp ah,02H jb error cmp ah,0BH ja error call show add si,2 jmp short s error: ;调用第10号中断的2号子程序 mov ah,2 ;置光标 mov bh,0 mov dh,10 ;dh中放行号 mov dl,35 ;dl中放列号 int 10h mov dx,0 ;ds:dx 指向字符串的首地址 mov ah,9 ;使用int 21h号中断例程的9号子程序 ;功能为在光标位置显示字符串 提供要显示的字符串的地址作为参数 ;要显示的字符串需用'$'作为结束符 int 21h mov cx,10H ;设置一个空循环,用于保持错误的提示一段时间 empty: loop empty mov ah,2 ;置光标 mov bh,0 mov dh,10 ;dh中放行号 mov dl,35 ;dl中放列号 int 10h mov dx,0DH ;ds:dx 指向字符串的空字符串地址 mov ah,9 ;使用int 21h号中断例程的9号子程序 ;功能为在光标位置显示字符串 提供要显示的字符串的地址作为参数 ;要显示的字符串需用'$'作为结束符 int 21h jmp far ptr s show: ;输入结束后,打印出排名、学号、成绩 inc di mov dx,0b800H ;将输入的字符串打印至屏幕 mov es,dx mov byte ptr es:[si],al mov byte ptr es:[si+1],07H sub al,30h mov [di],al ret print_prog1: ;作为中转,因为跳转至print_prog的范围跨度超过了跳转的范围 jmp far ptr print_prog storage: ;每一次按下空格后,都会把数据存储,同时进行插入排序 mov dx,0b800H ;将输入的字符串打印至屏幕 mov es,dx mov byte ptr es:[si],al mov byte ptr es:[si+1],07H ;对已经输入的数据进行处理,有ascii码值转化为实际的数值,以及添加其对应的学号 add si,2 mov al,[di-1] mov bl,10 mul bl add al,[di] mov [di],al mov ax,di sub al,1bH mov bl,2 mov ah,0 div bl inc al mov [di-1],al cmp al,1 je once dec ax mov cx,ax mov bx,di mov dh,[bx] compare: ;对插入的数据进行比对,找到该插入的位置 sub bx,2 cmp dh,[bx] jna exchange loop compare jmp exchange once: ;有些特殊情况: ;比如比对位置发现此时的位置最合适,以及第一次插入数据时肯定是有序的 ;这种情况便不再进行后续比对移动这些操作,直接等待下一次的输入 jmp far ptr s exchange: ;找到插入的位置后,将数据全部后移,腾出空位让应插入的数据插入 sub ax,cx mov cx,ax ;元素向后移动的次数为比较的次数 mov ax,di dec ax mov bx,ax mov dh,[di] mov dl,[di-1] jcxz once move: dec bx mov ah,[bx] mov [bx+2],ah dec bx mov al,[bx] mov [bx+2],al loop move mov [bx+1],dh