汇编语言程序设计期末大作业教学内容.docx
《汇编语言程序设计期末大作业教学内容.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计期末大作业教学内容.docx(32页珍藏版)》请在冰豆网上搜索。
汇编语言程序设计期末大作业教学内容
汇编语言程序设计期末大作业。
汇编语言程序设计期末大作业:
编写一完整的汇编语言源程序,实现从键盘输入一个班(不少于10人)的学生记录(学号:
8位数字、姓名:
不多余10个英文字符,语文:
0-100的整数、数学:
0-100的整数、英语:
0-100的整数)后,
(1)将输入的记录保存在C盘根目录下名为stuscore.dat的文件中;
(2)按照各科成绩总分先高后低的顺序输出全部学生记录和排名顺序;
(3)输出总分高于班平均总分的全部学生记录。
要求:
元月4日前提交一份纸质报告(班长统一收齐)。
大作业格式:
1.标题:
汇编语言程序设计期末大作业
2.作业题目:
(上述)
3.算法分析(流程图)
4.实现代码(必须含注释)
5.实验结果(汇编、连接、运行的截图)
6.总结
代码实现
studentstruct;定义结构
Snumberdb11,0,11dup(?
)
Snamedb11,0,11dup(?
)
Englishdb4,0,4dup(?
)
Chinesedb4,0,4dup(?
)
Mathdb4,0,4dup(?
)
Sumdb4,0,4dup(?
)
studentends
;数据段
datasegment
messMenudb'----------------TheHomeworkofAssembler-----------------$'
messMenu1db'----------Name:
TULINNo:
8000110028--------------$'
messNextdb'--------------------------------------------------------------------------------$'
messNamedb'Pleaseinputthestudentname(<11):
$'
messNumdb'Pleaseinputthestudentnumber(<11):
$'
messEnglishdb'PleaseinputtheEnglishscore:
$'
messChinesedb'PleaseinputtheChinesescore:
$'
messMathdb'PleaseinputtheMathscore:
$'
mess1db'name:
$'
mess2db'number:
$'
mess3db'English:
$'
mess4db'Chinese:
$'
mess5db'Math:
$'
messSumScoredb'SumScore:
$'
MessTabdb09,'$';Tab用于排列对齐
StudAddressdw10dup(?
);存各学生的偏移地址
EnglishScoredb10dup(?
);存学生英语成绩的十进制数
ChineseScoredb10dup(?
);存学生语文成绩的十进制数
MathScoredb10dup(?
);存学生数学成绩的十进制数
Averagedw?
Bufdb6dup(?
)
SumScoredw10dup(?
);用于记录每个学生总分
NumbersOfStudentdb0
Stustudent10dup(<>)
SumRankdb0,1,2,3,4,5,6,7,8,9
FNamedb'C:
\StuScore.dat',0;文件
FileHandledw?
;文件句柄
EndOfFiledw0ffh
OtherLinedb0ah,0dh,'$'
FileSpacedb""
dataends
;堆栈段
stacksegment
db100hdup(?
)
stackends
;代码段
codesegment
assumecs:
code,ds:
data,ss:
stack
start:
movax,data
movds,ax;将数据段首地址传给ds
movax,stack
movss,ax;将堆栈段首地址传给ss
movsp,0
callEndline
leadx,messMenu
movah,09h
int21h
callEndline
leadx,messMenu1
movah,09h
int21h
callEndline
leasi,Stu;取student的首地址给si
movcx,10
InputStu:
callGetStudent
leadx,messNext
movah,09h
int21h
addsi,50
loopInputStu;输出循环结束
leasi,Stu
callGetEnglishScore
callGetChineseScore
callGetMathScore
callStop;程序运行停止一下,按回车键继续执行
callWritetofile
callstop
callSumAverage
callGetSum
callGetAddress
callSortStudent
callStop;程序运行暂停一下,按回车键,继续执行
callShowStu
movah,4ch
int21h
;============================================================
;子程序名:
GetStudent
;功能:
录入学生信息
;============================================================
GetStudentprocnear
pushsi
pushdx
pushax
pushcx;子程序保护现场
leadx,messName
movah,9
int21h
leadx,[si].Sname
movah,0Ah
int21h
callEndline
leadx,messNum
movah,9
int21h
leadx,[si].Snumber
movah,0Ah
int21h
callEndline
leadx,messEnglish
movah,9
int21h
leadx,[si].English
movah,0Ah
int21h
callEndline
leadx,messChinese
movah,9
int21h
leadx,[si].Chinese
movah,0Ah
int21h
callEndline
leadx,messMath
movah,9
int21h
leadx,[si].Math
movah,0Ah
int21h
callEndline
popcx
popax
popdx
popsi
ret
GetStudentendp
;============================================================
;子程序名:
TureShow
;功能辅助子程序ShowStu,用于输出字符串
;============================================================
TureShowprocnear
pushdx;保护相关寄存器
pushcx
pushbx
pushax
movbx,dx;将bx指向缓存区的地址
xorcx,cx
movcl,[bx+1];cl存放了缓存区录入的字符数
LoopTS:
movdl,[bx+2];从第三个偏移地址开始显示
movah,2;调用单个字符输出中断
int21h
incbx
loopLoopTS
popax
popbx
popcx
popdx
ret
TureShowendp
;============================================================
;子程序名:
ShowStu
;功能:
显示学生信息记录
;============================================================
ShowStuprocnear
pushcx
pushax
pushdx
pushsi
pushdi;保护现场
callEndline
leadi,SumScore
leabx,StudAddress
movcx,10
Loop1:
movsi,wordptr[bx]
leadx,mess1
movah,09h
int21h
leadx,[si].Sname
callTureShow
callMessTb;输出1个Tab用于排序对齐
leadx,mess2
movah,09h
int21h
leadx,[si].Snumber
callTureShow
callMessTb;输出1个Tab用于排序对齐
leadx,mess3
movah,09h
int21h
leadx,[si].English
callTureShow
callMessTb;输出1个Tab用于排序对齐
leadx,mess4
movah,09h
int21h
leadx,[si].Chinese
callTureShow
callMessTb;输出1个Tab用于排序对齐
leadx,mess5
movah,09h
int21h
leadx,[si].Math
callTureShow
callMessTb;输出1个Tab用于排序对齐
leadx,messSumScore
movah,09h
int21h
movax,[di]
callOutput
callEndline
addbx,2
adddi,2
loopLoop1
leadx,messNext
movah,09h
int21h
popdi
popsi
popdx
popax
popcx
ret
ShowStuendp
;=============================================================
;子程序名:
Endline
;功能:
回车换行
;=============================================================
Endlineprocnear
pushax;保护相关寄存器
pushdx
pushcx
movah,2;回车
movdl,0ah
int21h
movah,2;换行
movdl,0dh
int21h
popcx
popdx
popax
ret
Endlineendp
;=============================================================
;子程序名GetEnglishScores:
;功能:
将得到的指定个学生的分数以十进制保存到EnglishScore缓冲区中
;=============================================================
GetEnglishScoreprocnear
pushdi;保护相关寄存器
pushsi
pushdx
pushcx
pushbx
pushax
pushbp
leasi,Stu;使si指向第一个学生的偏移地
leabp,EnglishScore;使bp指向以十进制存学生分数的地址
movcx,10;共有指定个学生
LoopScores0:
pushcx;保护外循环的CX值
leabx,[si].English;使bx指向学生字符分数缓冲区
xordi,di
xorcx,cx
movcl,[bx+1];学生字符分数缓冲区的字符数即使循环次数
LoopScore0:
moval,[bx+2];从第三个偏移地址开始
subal,30h;得到一个十进制值
xorah,ah
xchgax,di;使其暂存到di,且将高位di的值乘10
pushsi;保护寄存器的原值
pushdx
movsi,10
mulsi;将si乘10,乘积低位保存在ax
popdx
popsi
xchgax,di;将原来di中低位的值与高位的值ax交换回来
adddi,ax;至此又录入一位十进制数
incbx
loopLoopScore0
movax,di
movds:
[bp],al;将得到的十进制分数存入保存十进制分数缓冲区EnglishScore中
addsi,50;使di指向下一个学生的偏移地址
incbp;使bp指向下一个保存十进制分数缓冲区的下一个单元,以保存下一个学生的分数
popcx;弹出外循环的CX值
loopLoopScores0
popbp
popax
popbx
popcx
popdx
popsi
popdi
ret
GetEnglishScoreendp
;=============================================================
;子程序名GetChineseScore:
;功能:
将得到的指定个学生的分数以十进制保存到ChineseScore缓冲区中
;=============================================================
GetChineseScoreprocnear
pushdi;保护相关寄存器
pushsi
pushdx
pushcx
pushbx
pushax
pushbp
leasi,Stu;使di指向第一个学生的偏移地
leabp,ChineseScore;使bp指向以十进制存学生分数的地址
movcx,10;共有指定个学生
LoopScores1:
pushcx;保护外循环的CX值
leabx,[si].Chinese;使bx指向学生字符分数缓冲区
xordi,di
xorcx,cx
movcl,[bx+1];学生字符分数缓冲区的字符数即使循环次数
LoopScore1:
moval,[bx+2];从第三个偏移地址开始
subal,30h;得到一个十进制值
xorah,ah
xchgax,di;使其暂存到si,且将高位si的值乘10
pushsi;保护寄存器的原值
pushdx
movsi,10
mulsi;将si乘10,乘积低位保存在ax
popdx
popsi
xchgax,di;将原来si中低位的值与高位的值ax交换回来
adddi,ax;至此又录入一位十进制数
incbx
loopLoopScore1
movax,di
movds:
[bp],al;将得到的十进制分数存入保存十进制分数缓冲区ChineseScore中
addsi,50;使di指向下一个学生的偏移地址
incbp;使bp指向下一个保存十进制分数缓冲区的下一个单元,以保存下一个学生的分数
popcx;弹出外循环的CX值
loopLoopScores1
popbp
popax
popbx
popcx
popdx
popsi
popdi
ret
GetChineseScoreendp
;=============================================================
;子程序名GetMathScore:
;功能:
将得到的指定个学生的数学分数以十进制保存到MathScore缓冲区中
;=============================================================
GetMathScoreprocnear
pushdi;保护相关寄存器
pushsi
pushdx
pushcx
pushbx
pushax
pushbp
leasi,Stu;使di指向第一个学生的偏移地
leabp,MathScore;使bp指向以十进制存学生分数的地址
movcx,10;共有指定个学生
LoopScores2:
pushcx;保护外循环的CX值
leabx,[si].Math;使bx指向学生字符分数缓冲区
xordi,di
xorcx,cx
movcl,[bx+1];学生字符分数缓冲区的字符数即使循环次数
LoopScore2:
moval,[bx+2];从第三个偏移地址开始
subal,30h;得到一个十进制值
xorah,ah
xchgax,di;使其暂存到si,且将高位si的值乘10
pushsi;保护寄存器的原值
pushdx
movsi,10
mulsi;将si乘10,乘积低位保存在ax
popdx
popsi
xchgax,di;将原来si中低位的值与高位的值ax交换回来
adddi,ax;至此又录入一位十进制数
incbx
loopLoopScore2
movax,di
movds:
[bp],al;将得到的十进制分数存入保存十进制分数缓冲区MathScore中
addsi,50;使di指向下一个学生的偏移地址
incbp;使bp指向下一个保存十进制分数缓冲区的下一个单元,以保存下一个学生的分数
popcx;弹出外循环的CX值
loopLoopScores2
popbp
popax
popbx
popcx
popdx
popsi
popdi
ret
GetMathScoreendp
;==============================================================
;子程序名:
Writetofile
;功能:
用于创建文件并且存储学生信息
;==============================================================
Buildfile:
pushax
pushcx
pushdx
movah,3ch
movcx,00
leadx,FName
int21h
jcCreateFileError
movFileHandle,ax
jmpCreateFileOk
CreateFileError:
movah,09h
movdx,offsetCreateFileError
int21h
CreateFileOk:
popdx
popcx
popax
ret
WriteToFile:
pushax
pushbx
pushcx
pushdx
pushdi
pushsi
leadi,[si].SName
movdx,di
adddx,2
movcl,[di+1]
movch,0
movbx,FileHandle
movah,40h
int21h
jcWriteFileError
callWriteSpace
leadi,[si].SNumber
movdx,di
adddx,2
movcl,[di+1]
movch,0
movbx,FileHandle
movah,40h
int21h
jcWriteFileError
callWriteSpace
leadi,[si].ChineseScore
movdx,di
adddx,2
movcl,[di+1]
movch,0
movbx,FileHandle
movah,40h
int21h
jcWriteFileError
callWriteSpace
leadi,[si].MathScore
movdx,di
adddx,2
movcl,[di+1]
movch,0
movbx,FileHandle
movah,40h
int21h
jcWriteFileError
callWriteSpace
leadi,[si].EnglishScore
movdx,di
adddx,2
movcl,[di+1]
movch,0
movbx,FileHandle
movah,40h
int21h
jcWriteFileError
callWriteSpace
leadi,[si].SumScore
movdx,di
adddx,2
movcl,[di+1]
movch,0
movbx,FileHandle
movah,40h
int21h
jcWriteFileError
callWriteEndLine