北邮汇编语言实验报告.docx
《北邮汇编语言实验报告.docx》由会员分享,可在线阅读,更多相关《北邮汇编语言实验报告.docx(27页珍藏版)》请在冰点文库上搜索。
![北邮汇编语言实验报告.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/a0b78b36-e5dc-44f3-b541-69debd6ee2a7/a0b78b36-e5dc-44f3-b541-69debd6ee2a71.gif)
北邮汇编语言实验报告
微机原理汇编实验一
专业计算机科学与技术
班级
学生
学号
1、实验要求...................................................................3
2、实验设计...................................................................3
3、1.分析及算法思想...................................................................3
2.数据结构...............................................................................3
3.子程序...................................................................................4
4.流程图...................................................................................4
三、运行实例..................................................................6
四、实验总结..................................................................6
五、附页(源代码).......................................................7
一、实验要求:
一个学生的信息包括姓名、班级、学号(班内序号)、成绩。
试编写程序实现以下功能:
(1)能录入学生成绩(十进制形式);提示:
输入形如:
tom3011695回车,每名学生用一行,选择一个特殊符表示输入结束;
(2)能按要求:
如学号或成绩进行排序显示;
(3)能统计平均成绩;
(4)能统计不及格、60-70、70-80、80-90、90-100各分数段的人数。
2、实验设计:
1.分析及算法思想:
(1)采用数组进行数据存储:
学生数目信息数组(存储学生数目),学生信息数组(按班级-学号-姓名格式存储),平均成绩数组。
五个DB变量记录各分数段人数。
(2)输入学生数目保存在数组中,提示输入学生信息并存储,对于字符串输入进行转换,以二进制的形式存储在数据段中。
采用冒泡排序对数据段中的人员信息进行排序,以成绩为参数进行遍历,统计各分数段人数并将同时求出平均成绩,输出运算结果。
2.数据结构:
(1)输入:
a.学生数目数组numberdb3dup(0)
说明:
第一个存个/十位(ASCII码),第二个存个位(ASCII码),第三个存学生数(二进制)
b.学生信息数组informationdb99dup(20dup(0))
说明:
用20字节单元表示学生信息,0-19中:
0对应最大字符,1对应实际输入,2-18对应输入信息,19对应'$'
c.成绩数组gradedb99dup(7dup(0))
说明:
第一个存整数部分(二进制形式),第二个存小数部分(二进制形式)
d.平均成绩数组average_grade_bufferdb2dup(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)分数段人数
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、实验总结
通过这次的汇编程序,我从中学习到了很多知识。
虽然刚开始的时候遇到了很多难题,但是通过与老师、同学的交流之后,逐步克服了一个个的难题。
提高了自己编程的思维能力,在将来的学习,生活之中能够快速的解决问题。
汇编相对于别的编程语言而言,难度是比较大。
汇编是直接对CUP进行操作,能够直接控制计算机编程。
由于汇编不像JAVA 那样的高级编程语言面向对象,在编程的时候思维有点乱,容易出错,而且小的错误也不容易找到,特别是程序代码长的时候。
5、附页(源代码)
;输入学生数目格式:
1到99的整数
;输入学生信息格式:
班级(class)-学号(NUM)—姓名(NAME),班级最多5位,学号最多5位,姓名最多6位,加上1位中间分隔符—
;输入学生成绩格式:
0.0-100.0最多一位小数
;
;!
!
!
警告:
任何错误的输入都将导致程序运行失败或错误!
!
!
;
;
;#######################################################数据段开始
DATASSEGMENT;此处输入数据段代码
;;;输入输出提示字符
student_numdb'Pleaseinputthenumberofstudents(1-99):
',0dh,0ah,'$'
student_informationdb0dh,0ah,'Pleaseinputthestudentinformation(CLASS-NUM-NAME):
',0dh,0ah,'$'
student_gradedb0dh,0ah,'Pleaseinputthestudentgrade(0.0-100.0):
',0dh,0ah,'$'
average_gradedb0dh,0ah,'Theaveragegradeis:
',0dh,0ah,'$'
result1db0dh,0ah,'Thenumberofstudentin[Up90]is:
',0dh,0ah,'$';各分数段人数
result2db0dh,0ah,'Thenumberofstudentin[80-90]is:
',0dh,0ah,'$'
result3db0dh,0ah,'Thenumberofstudentin[70-80]is:
',0dh,0ah,'$'
result4db0dh,0ah,'Thenumberofstudentin[60-70]is:
',0dh,0ah,'$'
result5db0dh,0ah,'Thenumberofstudentin[Below60]is:
',0dh,0ah,'$'
grade_rankdb0dh,0ah,'Thegraderank(fromhightolow)is:
',0dh,0ah,'$';打印排名
blankdb'','$'
huanhangdb0dh,0ah,'$'
kaishishuchudb0dh,0ah,'***********************************',0dh,0ah,'$'
;数据
numberdb3dup(0);第一个存个/十位(ASCII码),第二个存个位(ASCII码),第三个存学生数(二进制)
;用20字节单元表示学生信息,0-19中:
0对应最大字符,1对应实际输入,2-18对应输入信息,19对应'$'
informationdb99dup(20dup(0))
;用7字节单元来存分数,0-6中,0-4对应输入字符,5对应输入整数部分的二进制数,6对应于小数部分的二进制数
gradedb99dup(7dup(0))
average_grade_bufferdb2dup(0);第一个存整数部分(二进制形式),第二个存小数部分(二进制形式)
n0db0;各分数段人数存储区(二进制形式)
n1db0
n2db0
n3db0
n4db0
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
;此处输入代码段代码
MOVAX,DATAS
MOVDS,AX
movsi,0;指向每个学生信息
movdi,0;指向每个学生成绩
movcx,100;初始化学生数
movdx,offsetstudent_num;请求输入学生总数
movah,09
int21h
callstore_student_num;存储学生总数,结果送cx中
cmpcx,0;输入为0退出
jleOutToDOS
cmpcx,100;学生数超出本程序范围,退出
jgeOutToDOS
input:
movdx,offsetstudent_information;请求输入学生信息
movah,09
int21h
callstore_student_information;存储学生信息
addsi,20;指向下一个学生信息
movdx,offsetstudent_grade;请求输入学生成绩
movah,09
int21h
callstore_student_grade;存储每个学生成绩
adddi,7;指向下一个学生
loopinput;循环,直到输入所有学生成绩
callsort;排序
callfind_result;显示平均成绩和分段人数
calldisplay;显示排序结果
OutToDOS:
movah,1;任意键结束
int21h
movax,4c00h;返回DOS
int21h
;##########存储学生数目的函数
store_student_numproc;调用之后,cx中存储了学生数(二进制)
pushax
pushbx
movbx,0
s1:
movah,1
int21h
cmpal,0dh;是否为回车
jes2
andal,0fh;转换为非压缩的BCD码
movnumber[bx],al
incbx
jmps1
s2:
cmpbx,2
jgs5;大于2
jzs3;等于2
;小于2
moval,number
jmps4
s3:
movah,number
moval,number+1
aad;BCD码转换为二进制数
s4:
movnumber+2,al
movcx,0
movcl,number+2
s5:
popbx
popax
ret
store_student_numendp
;##########存储学生信息的函数
store_student_informationproc
pushax
pushbx
pushdx
moval,18
movinformation[si],al
leadx,information[si]
movah,0ah
int21h
movbl,information[si+1];实际输入的字符个数
moval,''
movinformation[si+bx+2],al;将回车换成''
movinformation[si+19],'$';将每个存储单元的最后一个字节置为'$'以便输出
popdx
popbx
popax
ret
store_student_informationendp
;##########存储学生成绩的函数
store_student_gradeproc
pushax
pushbx
pushcx
pushdx
movbx,0
movcx,0
movdx,di
deal0:
movah,1
int21h
cmpal,0dh;判断是否为回车
jzdeal2;是回车
cmpal,'.';是否为小数点
jnzdeal1;不是小数点
movbx,cx;bx指向小数点处
incbx;标记小数点字符出现在第几个位置
deal1:
pushbx
movbx,dx
movgrade[bx],al
popbx
inccx;记录输入字符的个数
incdx
jmpdeal0
deal2:
cmpbx,0
jnzdeal3;有小数点
;无小数点
cmpcx,3
jggout;大于100
jzdeal4;等于100
;小于100
cmpcx,2
jzdeal5;输入数目为2位数
;个位数
deal6:
;处理个位数
moval,grade[di]
subal,'0'
movgrade[di+5],al
jmpgout
deal5:
;处理2位数
movah,grade[di]
andah,0fh
moval,grade[di+1]
andal,0fh
aad
movgrade[di+5],al
jmpgout
deal4:
;处理3位数
moval,100
movgrade[di+5],al
jmpgout
deal3:
;处理带有小数部分的成绩
moval,grade[di+bx];将小数部分处理
subal,'0'
movgrade[di+6],al
cmpbx,4
jzdeal4;'.'出现在输入字符的第四位,则输入的整数部分为3位数
jggout;整数部分大于3位数
cmpbx,3
jzdeal5;'.'出现在输入字符的第三位,则输入的整数部分为2位数
jmpdeal6;否则为个位数
gout:
popdx
popcx
popbx
popax
ret
store_student_gradeendp
;##########排序学生成绩的函数
sortproc
pushax
pushbx
pushcx
pushdx
pushsi
pushdi
movdx,0
movdl,number+2
Loop1:
;使用冒泡排序法
movcx,dx
movdi,0
movsi,0
Loop2:
;先比整数部分,再比小数部分
moval,grade[di+5]
cmpal,grade[di+12]
jgnext;大于,向下个移动
jlswap1;小于,交换成绩,名字
;等于,比较小数部分
moval,grade[di+6]
cmpal,grade[di+13]
jgenext;大于或等于,向下个移动
jlswap1;小于,交换成绩,名字
swap1:
movbx,si
swap11:
;交换学生信息
moval,information[bx+2]
xchgal,information[bx+22]
movinformation[bx+2],al
incbx
cmpal,'$'
jnzswap11
pushbx
movbx,0
swap2:
;交换学生成绩
moval,grade[di+bx]
xchgal,grade[di+bx+7]
movgrade[di+bx],al
incbx
cmpbx,7
jnzswap2
popbx
next:
addsi,20
adddi,7
deccx
jnzLoop2
decdx
jnzLoop1
popdi
popsi
popdx
popcx
popbx
popax
ret
sortendp
;##########显示最后结果的函数
find_resultproc
pushax
pushbx
pushcx
pushdx
pushsi
pushdi
movbx,0
movcx,0
movcl,number+2;cl中保存学生人数
movdi,0
movsi,0
F1:
moval,grade[di+5]
cmpal,100
jgFout;大于100
jzF90;等于100
;小于100
cmpal,90
jgeF90;大于等于90
;小于90
cmpal,80
jgeF80;大于等于80
;小于80
cmpal,70
jgeF70;大于等于70
;小于70
cmpal,60
jgeF60;大于等于60
;小于60
;处理<60
movdl,n4
incdl
movn4,dl
Fnext:
;处理平均成绩处理方式:
整数部分*10+小数部分*10,结果先除以学生人数,再输出(输出整数时除以10)
moval,grade[di+5]
movdl,10
muldl
movdl,grade[di+6]
movdh,0
addax,dx
addbx,ax
jmpF2
F90:
;处理>=90
movdl,n0
incdl
movn0,dl
jmpFnext
F80:
;处理大于等于80小于90
movdl,n1
incdl
movn1,dl
jmpFnext
F70:
;处理大于等于70小于80
movdl,n2
incdl
movn2,dl
jmpFnext
F60:
;处理大于等于60小于70
movdl,n3
incdl
movn3,dl
jmpFnext
F2:
adddi,7
deccx
jnzF1;处理所有学生
movdx,offsetkaishishuchu;打印一段************
movah,09
int21h
movdx,offsetaverage_grade;打印平均成绩
movah,09
int21h
movax,bx
movdx,0
movcx,0
movcl,number+2
divcx
movcl,10
divcl
callshow;先打印平均成绩的整数部分
pushax
movdl,'.';打印'.'
movah,2
int21h
popax
moval,ah
callshow;再打印平均成绩的小数部分
movdx,offsetresult1;输出大于等于90的人数
movah,09
int21h
moval,n0
callshow
movdx,offsetresult2;输出大于等于80并小于90的人数
movah,09
int21h
moval,n1
callshow
movdx,offsetresult3;输出大于等于70并小于80的人数
movah,09
int21h
moval,n2
callshow
movdx,offsetresult4;输出大于等于60并小于70的人数
movah,09
int21h
moval,n3
callshow
movdx,offsetresult5;输出小于60的人数
movah,09
int21h
moval,n4
callshow
Fout:
popdi
popsi
popdx
popcx
popbx
popax
ret
find_resultendp
;##########输出分数排序的函数
displayproc
pushax
pushbx
pushcx
pushdx
pushsi
pushdi
movdx,offsetgrade_rank
movah,09
int21h
movcx,0
movcl,number+2;cl中保存学生人数
movdi,0
movsi,0
D1:
leadx,offsetinformation
adddx,si
adddx,2
movah,09
int21h
movdx,offsetblank;打印一段空白
movah,09