汇编大作业.docx
《汇编大作业.docx》由会员分享,可在线阅读,更多相关《汇编大作业.docx(9页珍藏版)》请在冰点文库上搜索。
![汇编大作业.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/ade9b358-4f43-4c1c-9669-b72b34c439f5/ade9b358-4f43-4c1c-9669-b72b34c439f51.gif)
汇编语言课程设计
课题名称:
学生成绩管理系统
小组成员:
班级:
指导教师:
日期:
2014.06.18
一、选题目的:
熟悉汇编语言程序设计的实验环境,主要是熟悉汇编程序的基本结构,编译、连接和调试等基本操作。
利用该题目进行汇编语言程序设计运用的综合性训练,综合运用汇编语言循环程序和子程序编程方法,巩固以及提高汇编语言程序设计能力运用水平,为后续的开发和实验工作打好基础。
二、功能设计:
编制一个程序,要求接收从键盘收入的一个班的学生成绩,并存放于50字节的GRADE数组中,其中GRADE+N保存学号N+1的学生成绩,然后根据GRADE得学生成绩,把学生名次填入50自己的RANK数组中,其中RANK+N的内容是学号N+1学生的名次,在按学号把学生顺序学生名次显示出来。
三、算法流程图:
·
四、运行结果:
从键盘输入三个学生的姓名和成绩,按学生成绩升序排序,并显示出排序结果
五、程序源代码:
datasegment
infor0db0ah,0dh,'sort=$'
infor1db0ah,0dh,'inputname:
$'
infor2db0ah,0dh,'inputscore:
$'
nequ8姓名长度
mequ4成绩长度(3位+回车符)
pequ3输入的人数
qequ3成绩的位数
buff1dbn,?
ndup(0),'$'姓名缓冲区,加$字符以便输入时用
buff2dbm,?
mdup(0),'$'成绩缓冲区
snamedbpdup(n+1dup(0))保存姓名
score1dwpdup(m+1dup(0))保存成绩
score2dwpdup(m+1dup(0))
mingcidbpdup(0)名次
xdw?
sign1dw0
sign2dw0
contdb'1'计数
dataends
codesegment
assumecs:
code,ds:
data
mainprocfar
start:
movax,data
movds,ax
moves,ax
movbx,0
movcx,0
callinput
callsort
callprint
movah,4ch
int21h
mainendp
inputproc
incbx输入次数统计
cmpbx,p输入次数>p?
jaexit
leadx,infor1显示提示2
movah,9
int21h
leadx,buff1输入姓名
movah,10
int21h
moval,buff1+1实际输入个数——a1
addal,2+2.包含bufferl的0、1号单元
movah,0
movsi,ax回车0d所在位置,跟在最后一个字符后
movbuff1[si],0将0d换为0,便于输出显示
leadx,infor2显示提示2
movah,9
int21h
leadx,buff2输入成绩
movah,10
int21h
moval,buff2+1实际输入个数
addal,2个数+2,包含0、1单元,为找到0d
movah,0
movsi,ax
movbuff2[si],0将0d换为0,便于输出显示
movmingci[bx-1],blbx为输入次数,保存输入的次序
cmpbx,1第一次输入转let1
jzlet1
addsign1,n+1姓名间隔为n+1
addsign2,q成绩间隔为q
let1:
子程序嵌套
callcopy
jmpinput
exit:
ret
inputendp
copyproc
movcx,n+1姓名长度+3(包含$)
leasi,buff1+2
leadi,sname姓名传递到sname
adddi,sign1加上间隔值
cld
repmovsb
movcx,n
movax,'$'用$覆盖姓名区,清除已输入的姓名
leasi,buff2+2
leadi,score1成绩传递到score1
adddi,sign2加上间隔符
cld
repmovsb
leasi,buff2+2
movdi,sign2
callchange二进制成绩score2
ret
copyendp
changeproc
movx,0
movcx,[si-1]成绩的位数cx
movcx,000fh保留低四位
rept2:
moval,[si] 按位取出成绩
cmpal,30h是否在0、9之间
jlexit1
cmpal,39h
jgexit1
andax,000fh
xchgax,x
movdx,10将ax中前一次形成的书扩大十倍
muldx 保存到x
addx,ax
incsi
looprept2
movax,x按十进制形成的成绩以二进制保存
movscore2[di],ax二进制成绩送入score2
movx,0
addsign2,2下一个成绩单元
exit1:
ret
changeendp
sortproc
movcx,p数组长度
deccx
loop1:
pushcx保存外循环次数
movbx,0
movsi,0
loop2:
movax,score2[bx]
cmpax,score2[bx+m+1]m+1=5
jgenext降序
xchgax,score2[bx+m+1]交换成绩
movscore2[bx],ax
moval,mingci[si]
xchgal,mingci[si+1]交换名次
movmingci[si],al
next:
addbx,m+1
incsi下一个成绩
looploop2
popcx恢复外循环次数
looploop1
ret
sortendp
printproc
leadx,infor0显示结果提示
movah,9
int21h
movcx,p
movbx,0
movax,0
movdi,0
rept3:
movdl,0ah回车换行
movah,2
int21h
movdl,0dh
int21h
movdl,cont显示名次序号
movah,2
int21h
inccont
movdl,0ah回车换行
movah,2
int21h
movdl,0dh
int21h
movax,0
moval,mingci[di]取名次
decal位置-1,因为地址从0开始
movbl,9
mulbl
leadx,sname
adddx,ax偏移地址+姓名位移量
movah,9显示姓名
int21h
movdl,0ah回车换行
movah,2
int21h
movdl,0dh
int21h
movax,0
movbx,0
moval,mingci[di]取名次
decal地址从0开始
movbl,5
mulbl
leadx,score1
adddx,ax
movah,9显示成绩
int21h
incdi
looprept3
ret
printendp
codeends
endstart
六、自我评价:
本次大作业做的是显示学生名次表,重要考察的是复杂程序设计中,采用模板块结构可以划分功能,分解程序,在各个程序之间存在参数传递问题,强调了传递方式和嵌套调用层次的运用。
此程序包含了主程序和五个子程序。
用变量p控制输入的人数,姓名和成绩输入分别用DOS中断调用的10号功能实现字串输入,用buffer1和buffer2作为键入的姓名和成绩的缓存区,然后将所有人名和成绩用串传送指令转存到sname和score1中保存。
程序中将score1中成绩的十进制数ASCII码转换为二进制数score2,在本程序中更加全面的了解了汇编。
七、参考来源:
1、IBM-PC汇编语言程序设计(第二版)
2、80x86汇编语言程序设计