汇编语言实验报告.docx
《汇编语言实验报告.docx》由会员分享,可在线阅读,更多相关《汇编语言实验报告.docx(21页珍藏版)》请在冰点文库上搜索。
汇编语言实验报告
华北科技学院综合性
实验报告
课程名称汇编语言
实验学期2013至2014学年第2学期
学生所在院部计算机学院计算机工程系
年级二年级专业班级计科B12-
学生姓名学号
任课教师李冬艳
实验成绩
计算机学院制
《汇编语言》课程综合性实验报告
开课实验室:
基础实验室四2018-09-07
实验题目
显示学生名次表
一、实验目的
进行汇编语言程序设计应用的综合性训练。
综合运用汇编语言循环程序、子程序、宏指令编程方法,提高汇编语言程序设计能力的应用水平。
二、设备与环境
PC兼容机、Windows操作系统、汇编程序masmforwindows2012
三、实验内容
编制一程序,要求接收从键盘输入的一个班的学生的学号、姓名、成绩,对学生的成绩进行排序,最后把学号、姓名、学生成绩、名次显示出来。
实验要求:
1.必须画流程图。
2.本程序涉及汇编语言的多重循环、子程序及宏,其中成绩输入、计算学生名次、显示学生名次都分别用子程序,也可用宏处理。
3.要求用菜单选择。
具体要求:
输入1是数据录入并输出(包括姓名、学号、成绩);
输入2是排序后的数据输出(包括姓名、学号、成绩、名次);
输入3是可以按学号查找某学生,并输出其成绩,选择修改或不改成绩。
四、实验结果及分析(包括①已完成什么功能,②如何实现的、遇到的问题和解决办法、流程图和关键代码解释,③收获和体会等)
1.流程图
2、程序分析
程序开始,显示主菜单,通过选择进入程序调用。
调用子程序INPUT,进入子程序:
输出字符串:
“input:
”调用子程序input,输入数据后调用子程序copy进行数据转存。
调用change把输入的数转换为二进制,保存到score2中。
程序排名:
用CX以栈的形式保存循环次数,把成绩送到AL中,和AL+1比较,小于交换,结束内循环,恢复外循环次数,结束外循环。
调用print输出排序。
最查找通过输入学号进行查找,如果找到进行修改。
最后输出。
3、关键代码
DATASENDS
aamacro
movah,2
movdl,10
int21h
movdl,13
int21h
endm
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
movsi,ax
movbuffnumber[si],0
movcx,p
movdi,0
loop4:
pushcx
movcx,i
inccx
movsi,2
loop5:
movbl,snum[di]
cmpbl,buffnumber[si]
jnzlet3
incdi
incsi
looploop5
popcx
movdx,p
incdx
subdx,cx
movx,dx
callprint2
jmpexit4
let3:
movbx,18
subbx,si
movdx,di
adddx,bx
movdi,dx
popcx
looploop4
movah,9
leadx,mess7
int21h
exit4:
movcx,i
movax,0
leadi,buffnumber+2
repstosb
jmplet0
prog4:
MOVAH,4CH
INT21H
movah,9
leadx,mess0
int21h
START:
MOVAX,DATAS
MOVDS,AX
moves,ax
let0:
movah,9;显示菜单
leadx,menu
int21h
movah,1
int21h
cmpal,'1';输入选择
jzprog1
cmpal,'2'
jzprog2
cmpal,'3'
jzprog3
cmpal,'4'
jzprog4
movah,9
leadx,mess5
int21h
jmplet0
prog1:
callinput;调用input
jmplet0
prog2:
;调用排序、输出
movax,p
cmpax,1
jllet0
callsort
callprint
jmplet0
prog3:
;查找
movax,p
cmpax,1
jllet0
movah,9
leadx,mess6
int21h
movah,10
leadx,buffnumber
int21h
moval,buffnumber+1
addal,2
movah,0
movsi,ax
movbuffscore[si],0
aa
movah,9
leadx,mess3
int21h
leadx,buffname+2
int21h
leadx,buffnumber+2
int21h
leadx,buffscore+2
int21h
movmingci[bx-1],bl
cmpbx,1
jzlet1
addsignname,n+1
addsignnum,i+1
addsignscore,s+1
let1:
callcopy
ret
inputendp
;copy子程序
copyproc
movcx,n+1
leasi,buffname+2
leadi,sname
adddi,signname
cld
repmovsb
movcx,n
movax,0
leadi,buffname+2
repstosb
movcx,i+1
leasi,buffnumber+2
leadi,snum
adddi,signnum
cld
repmovsb
movcx,i
movax,0
leadi,buffnumber+2
repstosb
movcx,s+1
leasi,buffscore+2
leadi,score1
adddi,signscore
movah,10
leadx,buffname
int21h
moval,buffname+1
addal,2
movah,0
movsi,ax
movbuffname[si],0
let4:
movah,9
leadx,mess1
int21h
movcx,i
movax,0
leadi,buffnumber+2
repstosb
movah,10
leadx,buffnumber
int21h
moval,buffnumber+1
movah,0
movcx,ax
loop6:
movax,cx
incax
movsi,ax
cmpbuffnumber[si],30h
jblet4
cmpbuffnumber[si],39h
jalet4
looploop6
moval,buffnumber+1
addal,2
movah,0
movsi,ax
movbuffnumber[si],0
let5:
movah,9
leadx,mess2
int21h
movah,10
leadx,buffscore
int21h
moval,buffscore+1
movah,0
movcx,ax
moval,buffscore+1
addal,2
movah,0
moval,mingci[si]
xchgal,mingci[si+1]
movmingci[si],al
next:
addbx,s+1
incsi
looploop3
popcx
looploop2
exit2:
ret
sortendp
;print子程序,输出当前排序后的结果
printproc
movah,9
leadx,mess4
int21h
movcx,p
movbx,0
movax,0
movdi,0
movcont,'1'
rept3:
movah,9
leadx,cont
int21h
addcont[0],1
movax,0
moval,mingci[di]
decal
movbl,9
mulbl
leadx,sname
adddx,ax
movah,9
int21h
movax,0
moval,mingci[di]
decal
movbl,16
mulbl
leadx,snum
adddx,ax
movah,9
int21h
movax,0
movbx,0
moval,mingci[di]
decal
cld
repmovsb
leasi,buffscore+2
movdi,signscore
callchange
ret
copyendp
;change子程序十进制ASCII码->二进制
changeproc
movx,0
movcx,[si-1]
andcx,0fh
rept2:
moval,[si]
cmpal,30h
jlexit1
cmpal,39h
jgexit1
andax,0fh
xchgax,x
movdx,10
muldx
addx,ax
incsi
looprept2
movax,x
movscore2[di],ax
movx,0
movcx,s
movax,0
leadi,buffscore+2
repstosb
exit1:
ret
changeendp
;sort子程序,对数据进行排序
sortproc
movcx,p
deccx
cmpcx,0
jzexit2
loop2:
pushcx
movbx,0
movsi,0
loop3:
movax,score2[bx]
cmpax,score2[bx+s+1]
jgenext
xchgax,score2[bx+s+1]
movscore2[bx],ax
leadx,mess2
int21h
movah,10
leadx,buffscore
int21h
moval,buffscore+1
addal,2
movah,0
movsi,ax
movbuffscore[si],0
movax,x
decal
movbl,5
mulbl
leadi,score1
adddi,ax
leasi,buffscore+2
movcx,s+1
repmovsb
movcx,p
movsi,0
loop6:
movax,x
cmpal,mingci[si]
jzlet5
incsi
looploop6
let5:
movax,si
movah,0
movbl,5
mulbl
movdi,ax
leasi,buffscore+2
callchange
exit5:
ret
print2endp
movbl,5
mulbl
leadx,score1
adddx,ax
movah,9
int21h
aa
incdi
looprept3
ret
printendp
;print2子程序,输出当前数据,并询问是否修改成绩
print2proc
aa
movah,9
leadx,mess3
int21h
movax,x
decal
movbl,9
mulbl
leadx,sname
adddx,ax
movah,9
int21h
movax,x
decal
movbl,16
mulbl
leadx,snum
adddx,ax
movah,9
int21h
movax,x
decal
movbl,5
mulbl
leadx,score1
adddx,ax
movah,9
int21h
leadx,mess8
int21h
movah,1
int21h
cmpal,'n'
jzexit5
movah,9
4、结果
5、实验心得及体会
通过这次的汇编程序,我从中学习到了很多知识。
虽然刚开始的时候遇到了很多难题,但是通过与老师、同学的交流之后,逐步克服了一个个的难题。
提高了自己编程的思维能力,在将来的学习,生活之中能够快速的解决问题。
汇编相对于别的编程语言而言,难度是比较大。
汇编是直接对CUP进行操作,能够直接控制计算机编程。
由于汇编不像C++那样的高级编程语言面向对象,在编程的时候思维有点乱,容易出错,而且小的错误也不容易找到,特别是程序代码长的时候。
子程序INPUT的程序中主要有三个部分:
学号输入,姓名输入,成绩输入,它们都设有缓区,分别为BUFF1,BUFF2,BUFF3。
输入方式是调用了10号功能,输入一个字符串,长度也已经在之前设计好了,学号,姓名,成绩都是相同的输入方式。
学号,姓名,成绩输入完成后,子程序INPUT再调用COPY将缓存区转存到学号,姓名,成绩存储单元之中。
子程序COPY的设计业分为三个部分:
学号转存,姓名转存,成绩转存。
子程序PRINT,将学生的学号,姓名,成绩,按照成绩降序输出。
最后查找及修改。
这次实验真是让我受益匪浅啊,它涵盖了本学期的大部分知识点。
对熟练掌握汇编语言是极其重要的。
教师评价
评定项目
A
B
C
D
评定项目
A
B
C
D
算法正确
操作熟练
程序结构合理
实验结果正确
功能完善
文字流畅、报告规范
其他:
评价教师签名:
2014年6月20日