北邮微机原理实验报告_第1页
北邮微机原理实验报告_第2页
北邮微机原理实验报告_第3页
北邮微机原理实验报告_第4页
北邮微机原理实验报告_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、实验要求:一个学生的信息包括姓名、班级、学号(班内序号)、成绩。试编写程序实现以下功能:(1)能录入学生成绩(十进制形式);提示:输入形如:tom 301 16 95回车,每名学生用一行,选择一个特殊符表示输入结束;(2)能按要求:如学号或成绩进行排序显示;(3)能统计平均成绩;(4)能统计不及格、60-70、70-80、80-90、90-100各分数段的人数。2、 实验设计:1.分析及算法思想:(1)采用数组进行数据存储:学生数目信息数组(存储学生数目),学生信息数组(按班级-学号-姓名格式存储),平均成绩数组。五个DB变量记录各分数段人数。 (2)输入学生数目保存在数组中,提示输入学生

2、信息并存储,对于字符串输入进行转换,以二进制的形式存储在数据段中。采用冒泡排序对数据段中的人员信息进行排序,以成绩为参数进行遍历,统计各分数段人数并将同时求出平均成绩,输出运算结果。2.数据结构:(1)输入:a. 学生数目数组number db 3 dup(0) 说明:第一个存个/十位(ASCII码),第二个存个位(ASCII码),第三个存学生数(二进制)b. 学生信息数组information db 99 dup(20 dup(0)说明:用20字节单元表示学生信息,0-19中:0对应最大字符,1对应实际输入,2-18对应输入信息,19对应$c.成绩数组grade db 99 dup(7 du

3、p(0)说明:第一个存整数部分(二进制形式),第二个存小数部分(二进制形式)d.平均成绩数组average_grade_buffer db 2 dup(0)说明:和成绩数组原理一样(2) 排序:(按成绩分布排序)(3)提示信息:Student_num:提示输入学生数目student_information:提示输入学生信息student_grade:提示输入成绩信息average_grade:提示输出平均成绩grade_rank:提示输出成绩排名Result1:(90-100)分数段人数Result2:(80-90)分数段人数Result3:(70-80)分数段人数Result4:(60-70

4、)分数段人数Result5:(0-60)分数段人数blank :输出空格,便于查看结果huanhang:输出换行,便于查看结果3.子程序:(1)store_student_num 存储用户输入的学生数目;(2)store_student_information存储学生姓名和班级和学号;(3)store_student_grade存储学生成绩;(4)sort排序学生成绩的函数;(5)find_result显示最后结果的函数;(6)display输出分数排序的函数。(7)show将二进制数(不大于127的十进制整数)输出的函数4.流程图:3、 运行实例:输入四个学生的信息:结果如下4、 实验总结通

5、过这次的汇编程序,我从中学习到了很多知识。虽然刚开始的时候遇到了很多难题,但是通过与老师、同学的交流之后,逐步克服了一个个的难题。提高了自己编程的思维能力,在将来的学习,生活之中能够快速的解决问题。汇编相对于别的编程语言而言,难度是比较大。汇编是直接对CUP进行操作,能够直接控制计算机编程。由于汇编不像JAVA那样的高级编程语言面向对象,在编程的时候思维有点乱,容易出错,而且小的错误也不容易找到,特别是程序代码长的时候。5、 附页(源代码);输入学生数目格式:1到99的整数;输入学生信息格式:班级(class)-学号(NUM)姓名(NAME),班级最多5位,学号最多5位,姓名最多6位,加上1位

6、中间分隔符 ;输入学生成绩格式:0.0-100.0 最多一位小数;!警告:任何错误的输入都将导致程序运行失败或错误!;#数据段开始DATAS SEGMENT ;此处输入数据段代码 ; 输入输出提示字符 student_num db Please input the number of students(1-99):,0dh,0ah,$ student_information db 0dh,0ah,Please input the student information(CLASS-NUM-NAME):,0dh,0ah,$ student_grade db 0dh,0ah,Please inpu

7、t the student grade(0.0-100.0):,0dh,0ah,$ average_grade db 0dh,0ah,The average grade is:,0dh,0ah,$ result1 db 0dh,0ah,The number of student in Up 90 is:,0dh,0ah,$ ;各分数段人数 result2 db 0dh,0ah,The number of student in 80-90 is:,0dh,0ah,$ result3 db 0dh,0ah,The number of student in 70-80 is:,0dh,0ah,$ r

8、esult4 db 0dh,0ah,The number of student in 60-70 is:,0dh,0ah,$ result5 db 0dh,0ah,The number of student in Below 60 is:,0dh,0ah,$ grade_rank db 0dh,0ah,The grade rank(from high to low)is:,0dh,0ah,$ ;打印排名 blank db ,$ huanhang db 0dh,0ah,$ kaishishuchu db 0dh,0ah,*,0dh,0ah,$ ;数据 number db 3 dup(0) ;第一

9、个存个/十位(ASCII码),第二个存个位(ASCII码),第三个存学生数(二进制) ;用20字节单元表示学生信息,0-19中:0对应最大字符,1对应实际输入,2-18对应输入信息,19对应$ information db 99 dup(20 dup(0) ;用7字节单元来存分数,0-6中,0-4对应输入字符,5对应输入整数部分的二进制数,6对应于小数部分的二进制数 grade db 99 dup(7 dup(0) average_grade_buffer db 2 dup(0) ;第一个存整数部分(二进制形式),第二个存小数部分(二进制形式) n0 db 0 ;各分数段人数存储区(二进制形式

10、) n1 db 0 n2 db 0 n3 db 0 n4 db 0DATAS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATASSTART: ;此处输入代码段代码 MOV AX,DATAS MOV DS,AX mov si,0 ;指向每个学生信息mov di,0 ;指向每个学生成绩 mov cx,100 ;初始化学生数 mov dx, offset student_num ;请求输入学生总数 mov ah,09 int 21h call store_student_num ;存储学生总数,结果送cx中 cmp cx,0 ;输入为0退出jle OutToDOSc

11、mp cx,100 ;学生数超出本程序范围,退出jge OutToDOSinput: mov dx, offset student_information ;请求输入学生信息mov ah,09 int 21h call store_student_information ;存储学生信息add si,20 ;指向下一个学生信息mov dx, offset student_grade ;请求输入学生成绩mov ah,09int 21hcall store_student_grade ;存储每个学生成绩 add di,7 ;指向下一个学生loop input ;循环,直到输入所有学生成绩call s

12、ort ;排序call find_result ;显示平均成绩和分段人数call display ;显示排序结果OutToDOS: mov ah,1 ;任意键结束 int 21h mov ax,4c00h ;返回DOSint 21h ;#存储学生数目的函数store_student_num proc ;调用之后,cx中存储了学生数(二进制) push ax push bx mov bx,0 s1: mov ah,1 int 21h cmp al,0dh ;是否为回车 je s2 and al,0fh ;转换为非压缩的BCD码 mov numberbx,al inc bx jmp s1 s2:

13、cmp bx,2 jg s5 ;大于2 jz s3 ;等于2 ;小于2 mov al,number jmp s4 s3: mov ah,number mov al,number+1 aad ;BCD码转换为二进制数 s4: mov number+2,al mov cx,0 mov cl,number+2 s5: pop bx pop ax retstore_student_num endp ;#存储学生信息的函数 store_student_information proc push ax push bx push dx mov al,18 mov informationsi,al lea d

14、x,informationsi mov ah,0ah int 21h mov bl,informationsi + 1 ;实际输入的字符个数 mov al, mov informationsi + bx + 2,al ;将回车换成 mov informationsi+19,$ ;将每个存储单元的最后一个字节置为$以便输出 pop dx pop bx pop ax retstore_student_information endp;#存储学生成绩的函数store_student_grade proc push ax push bx push cx push dx mov bx,0 mov cx,

15、0 mov dx,di deal0: mov ah,1 int 21h cmp al,0dh ;判断是否为回车 jz deal2 ;是回车 cmp al,. ;是否为小数点 jnz deal1 ;不是小数点 mov bx,cx ;bx指向小数点处 inc bx ;标记小数点字符出现在第几个位置 deal1: push bx mov bx,dx mov gradebx,al pop bx inc cx ;记录输入字符的个数 inc dx jmp deal0 deal2: cmp bx,0 jnz deal3 ;有小数点 ;无小数点 cmp cx,3 jg gout ;大于100 jz deal4

16、 ;等于100 ;小于100 cmp cx,2 jz deal5 ;输入数目为2位数 ;个位数 deal6: ;处理个位数 mov al,gradedi sub al,0 mov gradedi + 5,al jmp gout deal5: ;处理2位数 mov ah,gradedi and ah,0fh mov al,gradedi + 1 and al,0fh aad mov gradedi + 5,al jmp gout deal4: ;处理3位数 mov al,100 mov gradedi + 5,al jmp gout deal3: ;处理带有小数部分的成绩 mov al,grad

17、edi + bx ;将小数部分处理 sub al,0 mov gradedi + 6,al cmp bx,4 jz deal4 ;.出现在输入字符的第四位,则输入的整数部分为3位数 jg gout ;整数部分大于3位数 cmp bx,3 jz deal5 ;.出现在输入字符的第三位,则输入的整数部分为2位数 jmp deal6 ;否则为个位数 gout: pop dx pop cx pop bx pop ax retstore_student_grade endp;#排序学生成绩的函数 sort proc push ax push bx push cx push dx push si push

18、 di mov dx,0 mov dl,number+2Loop1: ;使用冒泡排序法 mov cx,dx mov di,0 mov si,0Loop2: ;先比整数部分,再比小数部分 mov al,gradedi + 5 cmp al,gradedi + 12 jg next ;大于,向下个移动 jl swap1 ;小于,交换成绩,名字 ;等于,比较小数部分 mov al,gradedi + 6 cmp al,gradedi + 13 jge next ;大于或等于,向下个移动 jl swap1 ;小于,交换成绩,名字swap1: mov bx,siswap11: ;交换学生信息 mov a

19、l,informationbx + 2 xchg al,informationbx + 22 mov informationbx + 2,al inc bx cmp al,$ jnz swap11 push bx mov bx,0swap2: ;交换学生成绩 mov al,gradedi + bx xchg al,gradedi + bx + 7 mov gradedi + bx,al inc bx cmp bx,7 jnz swap2 pop bxnext: add si,20 add di,7 dec cx jnz Loop2 dec dx jnz Loop1 pop di pop si

20、pop dx pop cx pop bx pop ax retsort endp ;#显示最后结果的函数find_result proc push ax push bx push cx push dx push si push di mov bx,0 mov cx,0 mov cl,number+2 ;cl中保存学生人数 mov di,0 mov si,0 F1: mov al,gradedi + 5 cmp al,100 jg Fout ;大于100 jz F90 ;等于100 ;小于100 cmp al,90 jge F90 ;大于等于90 ;小于90 cmp al,80 jge F80

21、;大于等于80 ;小于80 cmp al,70 jge F70 ;大于等于70 ;小于70 cmp al,60 jge F60 ;大于等于60 ;小于60 ;处理=90 mov dl,n0 inc dl mov n0,dl jmp Fnext F80: ;处理大于等于80小于90 mov dl,n1 inc dl mov n1,dl jmp Fnext F70: ;处理大于等于70小于80 mov dl,n2 inc dl mov n2,dl jmp Fnext F60: ;处理大于等于60小于70 mov dl,n3 inc dl mov n3,dl jmp Fnext F2: add di

22、,7 dec cx jnz F1 ;处理所有学生 mov dx,offset kaishishuchu ;打印一段* mov ah,09 int 21h mov dx,offset average_grade ;打印平均成绩 mov ah,09 int 21h mov ax,bx mov dx,0 mov cx,0 mov cl,number+2 div cx mov cl,10 div cl call show ;先打印平均成绩的整数部分 push ax mov dl,. ;打印. mov ah,2 int 21h pop ax mov al,ah call show ;再打印平均成绩的小数

23、部分 mov dx,offset result1 ;输出大于等于90的人数 mov ah,09 int 21h mov al,n0 call show mov dx,offset result2 ;输出大于等于80并小于90的人数 mov ah,09 int 21h mov al,n1 call show mov dx,offset result3 ;输出大于等于70并小于80的人数 mov ah,09 int 21h mov al,n2 call show mov dx,offset result4 ;输出大于等于60并小于70的人数 mov ah,09 int 21h mov al,n3

24、call show mov dx,offset result5 ;输出小于60的人数 mov ah,09 int 21h mov al,n4 call show Fout: pop di pop si pop dx pop cx pop bx pop ax retfind_result endp;#输出分数排序的函数display proc push ax push bx push cx push dx push si push di mov dx, offset grade_rank mov ah,09 int 21h mov cx,0 mov cl,number+2 ;cl中保存学生人数 mov di,0 mov si,0 D1: lea dx, offset information add dx,s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论