汇编语言学生信息管理系统实验报告32页word文档.docx
《汇编语言学生信息管理系统实验报告32页word文档.docx》由会员分享,可在线阅读,更多相关《汇编语言学生信息管理系统实验报告32页word文档.docx(27页珍藏版)》请在冰豆网上搜索。
![汇编语言学生信息管理系统实验报告32页word文档.docx](https://file1.bdocx.com/fileroot1/2023-2/10/5fdeda78-0811-4a5e-a733-d8d8def07d1b/5fdeda78-0811-4a5e-a733-d8d8def07d1b1.gif)
汇编语言学生信息管理系统实验报告32页word文档
微机原理技术与接口实验报告
学院:
专业:
班级:
姓名:
学号:
微机原理与接口技术试验
实验目的
掌握熟练汇编语言
实验要求
课本P119页31题
实验环境
文本编辑器,MASM5.0.windows7
实验设计
子程序名称及功能
子程序名称
功能
ins_stu
录入学生信息。
判断输入字符串长度以避免缓冲区溢出。
score_sort
根据成绩对学生排序。
num_sort
根据学号对学生排序。
print_seq
按序列输出学生信息。
get_average
算平均分并输出。
get_sat
统计分数段并输出。
str2num
将学号由字符串形式转为整数形式。
score_fmt
将成绩由字符串形式转为10倍整数形式。
智能处理小数点。
pscore
将10倍整数形式的成绩按小数格式输出。
pnum
输出10进制数字
pstu
输出学生信息,入口:
ax存储学生编号
子程序调用关系图
1、输入学生信息
2、按学号排序输出
3、按成绩排序输出
4、统计并输出平均成绩
5、统计并输出各分数段
程序源代码(见附页)
程序运行结果
附页(源代码如下)
.modelsmall;small,程序只能有一个代码段和一个数据段
.stack200h;堆栈段名stack,默认大小1024字节,这里是200h字节
.data;数据段名_data
studentstruc;学生的数据结构,32字节,2^5,便于计算地址
xnamedb14dup('$')
classdb14dup('$')
numdw0
scoredw0;为保存1位小数,以10倍值保存
studentends
stu_sizeequ32;32=2^5
stu_dbstudent100dup(<'x','y',6,500>);100名学生的空间
stu_numdb0;已保存的学生人数
stu_seqdb100dup('$');排序信息,排序操作在序列中进行,排序结果体现在序列中
welcomedb'==StudentInformationMannagementSystem==',0dh,0ah;打印菜单
db'0.Addrecord.',0dh,0ah;0.录入学生成绩(十进制形式)
db'1.Sortbynumber.',0dh,0ah;1.按学号排序显示
db'2.Sortbyscore.',0dh,0ah;2.按成绩排序显示
db'3.ShowAverage',0dh,0ah;3.统计平均成绩
db'4.ShowStatistics.',0dh,0ah;4.统计各分数段人数
db'5.Exit.',0dh,0ah;5.退出
db'$'
msg1db'name:
','$'
msg2db'class:
','$'
msg3db'number:
','$'
msg4db'score:
','$'
m_str_ldb0dh,0ah,'[length<14byte]','$'
m_num_ldb0dh,0ah,'[value<100]','$'
tabledwCASE0,CASE1,CASE2,CASE3,CASE4,CASE5
buflendb100;输入缓冲区大小100
aclendb?
;实际输入长度
bufdb100dup(0),'$';实际缓冲区
bufrearequoffsetbuf+100;缓冲区尾
ns6db0;统计各分数段人数
n67db0
n78db0
n89db0
n91db0
ms6db'failed:
','$';显示各分数段人数
m67db'60~70:
','$'
m78db'70~80:
','$'
m89db'80~90:
','$'
m91db'90~100:
','$'
.CODE;代码段名_text
START:
psmacrostr;打印字符串,要求以'$'结尾
pushax
pushdx
leadx,str
movah,9
int21h
popdx
popax
endm
pcmacroch;打印字符
pushax
pushdx
movdl,ch
movah,2
int21h
popdx
popax
endm
endlmacro;打印'\n'
pc0dh
pc0ah
endm
scsmacro;从键盘输入字符串,保存在buf中,串长aclen
leadx,buflen
movah,10
int21h
endm
sccmacro;从键盘输入字符,保存在al
movah,1
int21h
endm
memcpymacrodest,src,len;经典的内存拷贝
pushax
pushcx
pushsi
pushdi
movax,ds
moves,ax;串操作di要用到附加段
movcl,len
movch,0
leasi,src
leadi,dest
cld
repmovsb
;mov[di],'$'
popdi
popsi
popcx
popax
endm
;使bx指向编号为ax的学生单元
;寄存器:
ax,bx,cx
GET_STUmacro
pushax
pushcx
leabx,stu_db
movcl,5
shlax,cl
addbx,ax;bx指向这个学生的存储单元
popcx
popax
endm
movax,@data
movds,ax
WELC:
endl
pswelcome
pc':
'
;输入选项
scc;ascii码保存在al
endl
movah,0
movbx,ax
subbx,'0'
cmpbx,5
jbeCASE0TO5
jmpWELC
CASE0TO5:
shlbx,1
jmptable[bx];基址寻址
CASE0:
;录入学生成绩(十进制形式)
callins_stu
jmpWELC
CASE1:
;按学号排序显示
callnum_sort
callprint_seq
jmpWELC
CASE2:
;按成绩排序显示
callscore_sort
callprint_seq
jmpWELC
CASE3:
;统计平均成绩
callget_average
jmpWELC
CASE4:
;统计各分数段人数
callget_sat
jmpWELC
CASE5:
movah,4ch;结束
int21h
;ins_stu:
输入学生信息
;入口:
stu_num已有学生人数,即最新空白编号
;出口:
stu_db
;存储单元:
stu_db,stu_num
ins_stuprocnear
pushax
pushbx
pushcx
pushdx
moval,stu_num
movah,0
;确定存放在第几个位置
leabx,stu_db
movcl,5
shlax,cl
addbx,ax;bx指向空白单元
input_name:
psm_str_l
psmsg1
scs
cmpaclen,14
jaeinput_name
memcpy[bx].xname,buf,aclen
endl
input_class:
psm_str_l
psmsg2
scs
cmpaclen,14
jaeinput_class
memcpy[bx].class,buf,aclen
endl
psm_num_l
psmsg3
scs
callstr2num
mov[bx].num,ax
endl
psm_num_l
psmsg4
scs
callscore_fmt
mov[bx].score,ax
endl
incstu_num;增加学生记录
popdx
popcx
popbx
popax
ret
ins_stuendp
;pnum:
以十进制形式输出一个无符号数
;入口:
ax需要输出的正数
;出口:
;存储单元:
pnumprocnear
pushax
pushbx
pushcx
pushdx
movbx,bufrear
decbx
mov[bx],$
OUTLOOP:
orax,ax
jzOUTLOOPFIN;ax为零
movdx,0
movcx,10
divcx
adddl,'0'
decbx
movBYTEptr[bx],dl
jmpOUTLOOP
OUTLOOPFIN:
cmpbx,offsetbufrear-1;输出0
jnePRINT_NUM
decbx
movBYTEptr[bx],'0'
PRINT_NUM:
movdx,bx
movah,9
int21h
popdx
popcx
popbx
popax
ret
pnumendp
;pscore:
以十进制形式输出带一位小数的分数
;入口:
ax需要输出的正数
;出口:
;存储单元:
pscoreprocnear
pushax
pushbx
pushcx
pushdx
movbx,bufrear
OUTLOOP2:
orax,ax
jzOUTLOOPFIN2
movdx,0
movcx,10
divcx
adddl,'0'
decbx
movBYTEptr[bx],dl
jmpOUTLOOP2
OUTLOOPFIN2:
cmpbx,offsetbufrear-1;x要改成0x,以便小数格式输出
jeS0X
cmpbx,offsetbufrear;空要改成00,以便小数格式输出
jnePRINT_SCORE
S00:
;==,为空
decbx
movBYTEptr[bx],'0'
S0X:
decbx
movBYTEptr[bx],'0'
PRINT_SCORE:
movdx,bx
movbx,bufrear
decbx
movcl,[bx];暂存小数
mov[bx],$
;movdx,bx
movah,9
int21h
pc'.'
pccl
popdx
popcx
popbx
popax
ret
pscoreendp
;pstu:
输出学生信息
;入口:
ax存储编号
;出口:
;存储单元:
pstuprocnear
pushax
pushbx
pushcx
GET_STU
psmsg1
ps[bx].xname;
pc''
psmsg2
ps[bx].class
pc''
psmsg3
movax,[bx].num
callpnum
pc''
psmsg4
movax,[bx].score
callpscore
endl
popcx
popbx
popax
ret
pstuendp
;str2num:
将数字由字符串转成数值
;入口:
buf
;出口:
ax
;存储单元:
buf缓冲区,aclen缓冲区内容长度
str2numproc
pushbx
pushcx
pushsi
movax,0
movcl,aclen
movch,0
leasi,buf
GET_NUM:
;movax,dest;adddest,dest*10+[si]-'0'
movbl,10
mulbl;以前的数*10,乘法指令必须用ax
movbl,[si]
movbh,0
addax,bx
subax,'0'
incsi
loopGET_NUM
popsi
popcx
popbx
ret
str2numendp
;score_fmt:
将分数格式存储
;入口:
buf
;出口:
ax
;存储单元:
buf缓冲区,aclen缓冲区内容长度
score_fmtproc
pushbx
pushcx
pushdx
pushsi
movax,0
movcl,aclen
movch,0
movdx,0
leasi,buf
GET_SCORE:
cmpBYTEptr[si],'.';这个类型很重要
jnzMUL_DEX;不是小数点
movdx,1;发现小数点
incsi
loopGET_SCORE
MUL_DEX:
movbl,10
mulbl
movbl,[si]
movbh,0
addax,bx
subax,'0'
incsi
loopGET_SCORE
cmpdx,0
jnzEND_SCORE
movbl,10
mulbl
END_SCORE:
popsi
popdx
popcx
popbx
ret
score_fmtendp
;get_average:
算平均分并输出
;入口:
stu_db
;出口
;存储单元:
stu_db,stu_num
get_averageprocnear
pushax
pushbx
pushcx
pushdx
movcx,0;学生编号
movax,0;暂存平均成绩低8位
movdx,0;暂存平均成绩高8位
REPERT:
cmpcl,stu_num
jaeOUT_PUT;总分已经加完了
;找到编号为cx的学生
pushax
pushcx
movax,cx
GET_STU
popcx
popax
addax,[bx].score;32位加法
adcdx,0
inccl
jmpREPERT
OUT_PUT:
movcl,stu_num
movch,0
orcl,0;假设学生人数不多于255人
jnzEND_AVE;没有学生,不能除0
inccx
END_AVE:
divcx;扩展为16位除法,商保存在ax中
endl
callpscore
endl
popdx
popcx
popbx
popax
ret
get_averageendp
;get_sat:
统计各分数段人数并输出
;入口:
stu_db
;出口
;存储单元:
ns6,n67,n78,n89,n91,stu_db,stu_num
get_satprocnear
pushax
pushbx
pushcx
movns6,0
movn67,0
movn78,0
movn89,0
movn91,0
movcx,0;学生编号(人数-1)
SAT_IN:
cmpcl,stu_num
jaeSAT_OUT;已经完了
;找到编号为cx的学生
pushax
pushcx
movax,cx
GET_STU
popcx
popax
inccl
movax,[bx].score
cmpax,600
jbIS6
cmpax,700
jbI67
cmpax,800
jbI78
cmpax,900
jbI89
;>=90
incn91
jmpSAT_IN
IS6:
incns6
jmpSAT_IN
I67:
incn67
jmpSAT_IN
I78:
incn78
jmpSAT_IN
I89:
incn89
jmpSAT_IN
SAT_OUT:
movah,0
psms6
moval,ns6
callpnum
endl
psm67
moval,n67
callpnum
endl
psm78
moval,n78
callpnum
endl
psm89
moval,n89
callpnum
endl
psm91
moval,n91
callpnum
endl
popcx
popbx
popax
ret
get_satendp
;print_seq:
根据序列stu_seq输出列表
;输入:
stu_seq
;输出:
;存储单元:
stu_seq
print_seqprocnear
pushax
pushbx
;stu_seq保存了编号序列,以'$'结束
leabx,stu_seq
PRINT_SEQ_BEGIN:
moval,[bx]
cmpal,'$'
jzPRINT_SEQ_END
movah,0
callpstu
incbx
jmpPRINT_SEQ_BEGIN
PRINT_SEQ_END:
popbx
popax
ret
print_seqendp
;num_sort:
按学号排序
;输入:
stu_seq
;输出:
stu_seq
;存储单元:
num_sortprocnear
pushbx
pushdx
movdl,0
leabx,stu_seq
SORT_BEGIN:
cmpdl,stu_num
jaeSORT_END
movBYTEptr[bx],dl
incbx
incdl
jmpSORT_BEGIN
SORT_END:
movBYTEptr[bx],'$'
;stu_seq保存了按输入顺序的序列,以'$'结束
cmpstu_num,1;学生数小于等于1,没必要排序
jleNON_NUM
movcl,stu_num;循环次数,内存量不能直接减
deccl
movch,0
LOOP1:
movdi,cx;暂存外循环cx
leabx,stu_seq;指向第一个序号
LOOP2:
moval,BYTEptr[bx]
movah,0
pushbx
GET_STU
movdx,[bx].num;dx前一个序列号对应的学号
popbx
moval,BYTEptr[bx+1]
pushbx
GET_STU
cmpdx,[bx].num;[bx].num后一个序列号对应的学号
popbx
jaeCONTI
moval,BYTEptr[bx];小于则交换两个序列号
;callpnum
;endl
xchgal,BYTEptr[bx+1]
;callpnum
;endl
movBYTEptr[bx],al
CONTI:
incbx;下一个序列号
loopLOOP2
movcx,di;恢复外循环
loopLOOP1
NON_NUM:
popdx
popbx
ret
num_sortendp
;score_sort:
按成绩排序
;输入:
stu_seq
;输出:
stu_seq
;存储单元:
score_sortprocnear
pushbx
pushdx
movdl,0
leabx,stu_seq
SCORE_BEGIN:
cmpdl,stu_num
jaeSCORE_END
movBYTEptr[bx],dl
incbx
incdl
jmpSCORE_BEGIN
SCORE_END:
movBYTEptr[bx],'$'
;stu_seq保存了按输入顺序的序列,以'$'结束
cmpstu_num,1;学生数小于等于1,没必要排序
jleNON_SCORE
movcl,stu_num;循环次数,内存量不能直接减
deccl
movch,0
SLOOP1:
movdi,cx;暂存外循环cx
leabx,stu_seq;指向第一个序号
SLOOP2:
moval,BYTEptr[bx]
movah,0
pushbx
GET_STU
movdx,[bx].score;dx前一个序列号对应的学号
popbx
moval,BYTEptr[bx+1]
pushbx
GET_STU
cmpdx,[bx].score;[bx].num后一个序列号对应的学号
popbx
jaeSCONTI
moval,BYTEptr[bx];小于则交换两个序列号
;callpnum
;endl
xchgal,BYTEptr[bx+1]
;callpnum
;endl
movBYTEptr[bx],al
SCONTI:
incbx;下一个序列号
loopSLOOP2
movcx,di;恢复外循环
loopSLOOP1
NON_SCORE:
popdx
popbx
ret
score_sortendp
ENDSTART
希望以上资料对你有所帮助,附励志名言3条:
1、上帝说:
你要什么便取什么,但是要付出相当的代价。
2、目标的坚定是性格中最必要的力量源泉之一,也是成功的利器之一。
没有它,天才会在矛盾无定的迷径中徒劳无功。
3、当你无法从一楼蹦到三楼时,不要忘记走楼梯。
要记住伟大的成功往往不是一蹴而就的,必须学会分解你的目标,逐步实施。