学生信息管理程序 汇编语言.docx
- 文档编号:5704239
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:25
- 大小:19KB
学生信息管理程序 汇编语言.docx
《学生信息管理程序 汇编语言.docx》由会员分享,可在线阅读,更多相关《学生信息管理程序 汇编语言.docx(25页珍藏版)》请在冰豆网上搜索。
学生信息管理程序汇编语言
;学生信息管理程序汇编语言
.modelsmall
.stack200h
.data
;small,程序只能有一个代码段和一个数据段
;堆栈段名stack,默认大小1024字节,这里是200h字节
;数据段名_data
studentstruc
;学生的数据结构,32字节,2^5,便于计算地址
xnamedb14dup('$')
;为保存1位小数,以10倍值保存
classdb14dup('$')
numdw0
scoredw0
studentends
stu_sizeequ32
;32=2^5
stu_dbstudent100dup(<'x','y',6,500>);100名学生的空间
stu_numdb0;已保存的学生人数
stu_seqdb100dup('$');排序信息
welcomedb'==StudentInformationMannagementSystem==',0dh,0ah;
db'0.Addstudent.',0dh,0ah
;输入成绩
db'1.Sortbynumber.',0dh,0ah;按学号排序
db'2.Sortbyscore.',0dh,0ah;按成绩排序
db'3.Averagescore',0dh,0ah;统计平均成绩
db'4.ShowStatistics.',0dh,0ah;显示各分段人数
db'5.Exit.',0dh,0ah;退出
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
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(studentptr[bx]).xname,buf,aclen
endl
input_class:
psm_str_l
psmsg2
scs
cmpaclen,14
jaeinput_class
memcpy(studentptr[bx]).class,buf,aclen
endl
psm_num_l
psmsg3
scs
callstr2num
mov(studentptr[bx]).num,ax
endl
psm_num_l
psmsg4
scs
callscore_fmt
mov(studentptr[bx]).score,ax
endl
incstu_num;增加学生记录
popdx
popcx
popbx
popax
ret
ins_stuendp
;pnum:
以十进制形式输出一个无符号数
;入口:
ax需要输出的正数
;出口:
;存储单元:
pnumprocnear
pushax
pushbx
pushcx
pushdx
movbx,bufrear
decbx
;mov(studentptr[bx]),'$'
movbyteptr[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];暂存小数
movbyteptr[bx],'$'
;movdx,bx
movah,9
int21h
pc'.'
pccl
popdx
popcx
popbx
popax
ret
pscoreendp
;pstu:
输出学生信息
;入口:
ax存储编号
;出口:
;存储单元:
pstuprocnear
pushax
pushbx
pushcx
GET_STU
psmsg1
ps(studentptr[bx]).xname;
pc''
psmsg2
ps(studentptr[bx]).class
pc''
psmsg3
movax,(studentptr[bx]).num
callpnum
pc''
psmsg4
movax,(studentptr[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,(studentptr[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,(studentptr[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,(studentptr[bx]).num
popbx;dx前一个序列号对应的学号
moval,BYTEptr[bx+1]
pushbx
GET_STU
cmpdx,(studentptr[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,(studentptr[bx]).score;dx前一个序列号对应的学号
popbx
moval,BYTEptr[bx+1]
pushbx
GET_STU
cmpdx,(studentptr[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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生信息管理程序 汇编语言 学生 信息管理 程序