汇编语言学生信息管理系统实验报告32页word文档.docx

上传人:b****8 文档编号:10401186 上传时间:2023-02-10 格式:DOCX 页数:27 大小:19.24KB
下载 相关 举报
汇编语言学生信息管理系统实验报告32页word文档.docx_第1页
第1页 / 共27页
汇编语言学生信息管理系统实验报告32页word文档.docx_第2页
第2页 / 共27页
汇编语言学生信息管理系统实验报告32页word文档.docx_第3页
第3页 / 共27页
汇编语言学生信息管理系统实验报告32页word文档.docx_第4页
第4页 / 共27页
汇编语言学生信息管理系统实验报告32页word文档.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

汇编语言学生信息管理系统实验报告32页word文档.docx

《汇编语言学生信息管理系统实验报告32页word文档.docx》由会员分享,可在线阅读,更多相关《汇编语言学生信息管理系统实验报告32页word文档.docx(27页珍藏版)》请在冰豆网上搜索。

汇编语言学生信息管理系统实验报告32页word文档.docx

汇编语言学生信息管理系统实验报告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、当你无法从一楼蹦到三楼时,不要忘记走楼梯。

要记住伟大的成功往往不是一蹴而就的,必须学会分解你的目标,逐步实施。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1