学生信息管理程序 汇编语言.docx

上传人:b****5 文档编号:5704239 上传时间:2022-12-31 格式:DOCX 页数:25 大小:19KB
下载 相关 举报
学生信息管理程序 汇编语言.docx_第1页
第1页 / 共25页
学生信息管理程序 汇编语言.docx_第2页
第2页 / 共25页
学生信息管理程序 汇编语言.docx_第3页
第3页 / 共25页
学生信息管理程序 汇编语言.docx_第4页
第4页 / 共25页
学生信息管理程序 汇编语言.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

学生信息管理程序 汇编语言.docx

《学生信息管理程序 汇编语言.docx》由会员分享,可在线阅读,更多相关《学生信息管理程序 汇编语言.docx(25页珍藏版)》请在冰豆网上搜索。

学生信息管理程序 汇编语言.docx

学生信息管理程序汇编语言

;学生信息管理程序汇编语言

.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

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

当前位置:首页 > 医药卫生 > 基础医学

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

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