计算机组成与汇编课程设计报告.doc
- 文档编号:4890497
- 上传时间:2023-05-07
- 格式:DOC
- 页数:22
- 大小:227.50KB
计算机组成与汇编课程设计报告.doc
《计算机组成与汇编课程设计报告.doc》由会员分享,可在线阅读,更多相关《计算机组成与汇编课程设计报告.doc(22页珍藏版)》请在冰点文库上搜索。
CENTRALSOUTHUNIVERSITY
计算机组成与汇编
课程设计报告
学生姓名
汪锋
指导教师
杨希
学院
信息科学与工程学院
专业班级
计科0802
完成时间
2011年7月
目录
1.设计内容 2
2.设计目的 2
3.概要设计 2
4.详细设计 2
5.程序代码 9
6.运行结果 20
7.设计总结 20
参考文献 21
一、设计内容
1.输入20~30之间的n值,用递归计算Fibonacci数,以十进制数输出.
2.编写一拷贝程序,要求在命令行指定源文件名和目标文件名.
3.编写一个成绩统计程序,接收一批(最多20个)从键盘录入的0-100之间的十进制格式的分数值,无数据直接回车时结束成绩录入。
然后显示录入的总人数,总分,平均分值(十进制整数格式),显示优秀,良好,中等,及格和不及格人数。
(注:
90以上优秀80以上良好70以上中等60以上及格60以下不及格)
4.虚拟平台的模型机实验
二、设计目的
课程设计是计算机原理与汇编语言教学过程中的重要环节。
本课程设计主要目的是使计算机专业学生深入学习计算机原理与汇编语言知识,进一步提高学生计算机原理与汇编语言综合能力和程序设计技能,锻炼运用计算机原理与汇编语言解决实际问题的能力。
三、概要设计
1、实验一是Fibonacci数列的求值,可通过递归调用实现。
2、实验二是要求复制文件,通过给出的文件名找到并打开文件,然后将文件内容读入内存,建立一个新文件,将内存中的内容写入心文件中。
3、实验三要求对学生成绩进行统计,并输出相关信息。
可先将输入数据读入一个数组中,每读入一个数据,计算器家1,将读入的所有数据相加得到总分,并对每个数据进行比较,统计相应等级。
4、实验三是虚拟实验,要求通过给出的各种芯片和元器件,连接成一个虚拟机,并进行相关的指令操作。
四、详细设计
1、Fibonacci数列求值
算法思想是先将输入的字符存入数组中,然后将其转化为十进制数,再通过调用递归函数实现求值,最后将结果转化为字符串后输出。
主要代码如下:
数据段的定义:
datasegment ;数据段
bufdb3,?
3dup(?
)
buf1db5dup(?
)
db'$'
buf2db0
flagdb1
mess1db'enterthenumber:
','$'
mess2db13,10,'result:
','$'
buf3db1,24dup(0)
buf4db1,24dup(0)
dataends
输入参数并将参数转化为十进制数
leadx,mess1;提示输入
movah,9
int21h
movdx,offsetbuf;输入参数
movah,0ah
int21h
leasi,buf;计算参数的值
pushax
moval,0
subbyteptr[si+2],30h
addal,byteptr[si+2]
递归调用的子程序
code2segment;子程序
assumecs:
code2,ds:
data,ss:
sseg
sumprocfar
leasi,buf3
cmpdl,buf2
jbsum1
jmpexit
sum1:
incdl
leadi,buf4
movcx,25
s1:
moval,[si]
movbl,[di]
add[di],al
cmpbyteptr[di],10d
jbs2
subbyteptr[di],10d
addbyteptr[si+1],1
s2:
mov[si],bl
incdi
incsi
loops1
callsum
exit:
ret
sumendp
code2ends
将结果输出
movdl,0dh;输出
movah,2
int21h
movdl,0ah
movah,2
int21h
2、文件复制
文件复制主要算法流程为先将输入的文件名存入一个缓冲区并打开文件,打开文件后,以512个字节为单位将文件内容读入到内存缓冲区中,知道源文件末尾。
读完文件后,根据输入的目标文件名创建文件,然后同样以512字节为单位将内存缓冲区中的字符串写入目标文件中,写操作完成后,关闭文件。
其主要代码如下:
数据段:
dataSEGMENT
mess1DB'Please,inputfilename:
',0DH,0AH,24H
mess2DB0DH,0AH,'Please,inputdestinationfilename:
',07H,0DH,0AH,24H
fnfDB0DH,0AH,'filehasnotexisted!
',07H,0DH,0AH,24H
fdfDB0DH,0AH,'Destinationfilehasexisted!
',07H,0DH,0AH,24H
fdeDB0DH,0AH,'Destinationpathhasnotexisted!
',07H,0DH,0AH,24H
freDB0DH,0AH,'readingerror.',07H,0DH,0AH,24H
fweDB0DH,0AH,'writtingerror.',07H,0DH,0AH,24H
fcsDB0DH,0AH,'Filecopyedsucceed.',0DH,0AH,24H
fbufferDB128;缓冲区
DB?
fnameDB128DUP(?
);字符串名
fnum_sDW?
;源文件号
fnum_dDW?
;新文件号
bufferDB512DUP(?
);字符串内容
dataENDS
存入文件名称:
full0:
LEADX,mess1;提示信息输出
MOVAH,9
INT21H
CLD
MOVCX,128;将文件名存入fname中
MOVAL,0
LEADI,fname
REPSTOSB
字符读入内存:
readf:
MOVBX,fnum_s;取源文件号
MOVCX,512;读出512个字符
MOVDX,OFFSETbuffer
MOVAH,3FH
INT21H
JNCwritef;读成功,则写
LEADX,fre;不成功,显示错误信息,关闭文件,并结束程序
MOVAH,9
INT21H
JMPexit
字符写入目标文件:
writef:
MOVBX,fnum_d;取新文件号
MOVCX,AX;按实际读入字数写文件
MOVAH,40H
INT21H
JNCcmpcx;写成功
LEADX,fwe;不成功,显示错误信息,关闭文件,并结束程序
MOVAH,9
INT21H
JMPexit
关闭文件:
exit:
MOVAH,3EH;关闭文件
INT21H
MOVBX,fnum_s
MOVAH,3EH
INT21H
MOVAX,4C00H
INT21H
3、成绩统计程序
算法思想是先将键盘输入的字符串成绩转化为十进制后存入内存缓冲区中,读入的同时进行计数。
然后通过循环语句实现成绩的评定统计与累加过程,将总分除以计数器即得平均分。
最后将所得数据转化为字符串后显示出来。
主要代码如下:
数据段:
DATASEGMENT
STRING1 DB 'PleaseInputScore:
','$'
STRING2DB'Thetotalnumberis:
','$'
STRING3DB 'Thesumis:
','$'
STRING4DB'*********************',0AH,0DH,'$'
ENTER1DB0AH,0DH,'$'
SCORE DW 60DUP(?
) ;分配存储空间
TMP DB0,0,0,0
S5 DW 0 ;定义变量
S6 DW 0
S7 DW 0
S8 DW 0
S9 DW 0
S10 DW 0
TOTALSCOREDB0
DATAENDS
输入:
INPUT:
;输入一个字符
MOV AH,1
INT 21H
CMPAL,30H
JBENTER2
CMPAL,39H
JNBINPUT
MOVAH,AL ;AB=A*10+B
MOVBH,10
MOVAL,BL
MULBH
MOVBL,AL
JMPINPUT
显示总人数:
NUM:
;显示总人数
MOV DX,OFFSETSTRING2 ;输出“thetotalnumberis:
”
MOV AH,09H
INT 21H
MOVAX,DI;outputthenuberofstudents
CALLB_TO_D
CALLOUTTMP
计算并显示总分:
SUM:
;计算总分
MOVSI,6
MOVBX,SCORE[SI]
ADDAX,BX
SUBSI,2
JNSSUM
LEABX,TOTALSCORE
MOV[BX],AX
;显示总分
CALLB_TO_D ;outputthetotalscore
CALLOUTTMP
4、虚拟平台的模型机实验
模型机示意图:
根据上图进行连线,检查无误后开始进行测试,选择菜单中的“工具”,再选择“模型机调试”,在指令输入窗口中输入如下指令:
00000000
00010000
00001001
00100000
00001011
00110000
00001011
01000000
00000000
00000001
这里做的是个加法运算,第一个加数已经存入到内存的00001010单元中,第二个加数是需要手工输入的。
在实验运行面板中点击“运行”按钮,选择“输入”芯片,设置输入的数据后,双击连接“输入”芯片的单脉冲,这样第二个加数就设置好了。
在实验运行面板中双击连续脉冲,模型机便开始工作。
五、程序代码
Fibonacci数列求值
datasegment ;数据段
bufdb3,?
3dup(?
)
buf1db5dup(?
)
db'$'
buf2db0
flagdb1
mess1db'enterthenumber:
','$'
mess2db13,10,'result:
','$'
buf3db1,24dup(0)
buf4db1,24dup(0)
dataends
ssegsegmentstack;堆栈段
dw512dup(?
)
ssegends
code1segment;代码段
assumecs:
code1,ds:
data,ss:
sseg
start:
xordx,dx
movax,data
movds,ax
leadx,mess1
movah,9
int21h
movdx,offsetbuf
movah,0ah
int21h
leasi,buf;计算参数的值
pushax
moval,0
subbyteptr[si+2],30h
addal,byteptr[si+2]
cmpbyteptr[si+3],30h
jbsuan1
movcl,10
mulcl
subbyteptr[si+3],30h
addal,byteptr[si+3]
suan1:
movbuf2,al
popax
movdl,2
pushsi
leadi,buf4
callfarptrsum
popsi
movdl,0dh;输出
movah,2
int21h
movdl,0ah
movah,2
int21h
leadx,mess2
movah,9
int21h
s3:
cmpflag,1
jnzs5
cmpbyteptr[di],0
jzs6
movflag,0
s5:
movdl,[di]
adddl,30h
movah,2
int21h
s6:
decdi
cmpdi,offsetbuf4
jaes3
movah,4ch
int21h
code1ends
code2segment;调用函数
assumecs:
code2,ds:
data,ss:
sseg
sumprocfar
leasi,buf3
cmpdl,buf2
jbsum1
jmpexit
sum1:
incdl
leadi,buf4
movcx,25
s1:
moval,[si]
movbl,[di]
add[di],al
cmpbyteptr[di],10d
jbs2
subbyteptr[di],10d
addbyteptr[si+1],1
s2:
mov[si],bl
incdi
incsi
loops1
callsum
exit:
ret
sumendp
code2ends
endstart
文件复制
dataSEGMENT
mess1DB'Please,inputfilename:
',0DH,0AH,24H
mess2DB0DH,0AH,'Please,inputdestinationfilename:
',07H,0DH,0AH,24H
fnfDB0DH,0AH,'filehasnotexisted!
',07H,0DH,0AH,24H
fdfDB0DH,0AH,'Destinationfilehasexisted!
',07H,0DH,0AH,24H
fdeDB0DH,0AH,'Destinationpathhasnotexisted!
',07H,0DH,0AH,24H
freDB0DH,0AH,'readingerror.',07H,0DH,0AH,24H
fweDB0DH,0AH,'writtingerror.',07H,0DH,0AH,24H
fcsDB0DH,0AH,'Filecopyedsucceed.',0DH,0AH,24H
fbufferDB128
DB?
fnameDB128DUP(?
)
fnum_sDW?
fnum_dDW?
bufferDB512DUP(?
)
dataENDS
;
codeSEGMENT
ASSUMECS:
code,DS:
data
start:
MOVAX,data
MOVDS,AX
PUSHDS
POPES
full0:
LEADX,mess1
MOVAH,9
INT21H
CLD
MOVCX,128
MOVAL,0
LEADI,fname
REPSTOSB
;-------------
LEADX,fbuffer
MOVAH,0AH
INT21H
;------------------
MOVBL,[fbuffer+1];将输入文件名的最后一个回车符换成0,因为建立的文件名不能包括不可见字符
XORBH,BH
MOVSI,OFFSETfname
ADDSI,BX
MOVBYTEPTR[SI],0
;---------------------
LEADX,fname
MOVAX,3D00H
INT21H
JNCopen;打开成功
LEADX,fnf
MOVAH,9
INT21H
JMPfull0;重新输入
;--------------
open:
MOVfnum_s,AX;打开成功,保存源文件号
full1:
LEADX,mess2
MOVAH,9
INT21H
CLD;充0,将上次输入的文件名清零
MOVCX,128;文件名最大128字符,包括回车符
MOVAL,0
LEADI,fname
REPSTOSB
;-------------
LEADX,fbuffer;输入文件名
MOVAH,0AH;键盘输入到缓冲区DS:
DX=缓冲区首地址
INT21H
;------------------
MOVBL,[fbuffer+1]
XORBH,BH
MOVSI,OFFSETfname
ADDSI,BX
MOVBYTEPTR[SI],0
;---------------------
LEADX,fname
MOVAX,3D00H
INT21H
JCsetup;打开不成功
LEADX,fdf
MOVAH,9
INT21H
JMPexit
;--------------
setup:
LEADX,fname
MOVAH,3CH;建立新文件
INT21H
JNCsave;建立成功
LEADX,fde
MOVAH,9
INT21H
JMPexit
save:
MOVfnum_d,AX;保存新文件号
MOVAX,3D01H;以只写方式打开新文件
INT21H
readf:
MOVBX,fnum_s;取源文件号
MOVCX,512;读出512个字符
MOVDX,OFFSETbuffer
MOVAH,3FH
INT21H
JNCwritef;读成功,则写
LEADX,fre;不成功,显示错误信息,关闭文件,并结束程序
MOVAH,9
INT21H
JMPexit
;--------------------------
writef:
MOVBX,fnum_d;取新文件号
MOVCX,AX;按实际读入字数写文件
MOVAH,40H
INT21H
JNCcmpcx;写成功
LEADX,fwe;不成功,显示错误信息,关闭文件,并结束程序
MOVAH,9
INT21H
JMPexit
cmpcx:
CMPCX,512;判断实际读入的字数是不是512
JEreadf;如果是512,说明还没读到文件尾
;
LEADX,fcs;显示‘复制成功’
MOVAH,9
INT21H
;
exit:
MOVAH,3EH;关闭文件
INT21H
MOVBX,fnum_s
MOVAH,3EH
INT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 组成 汇编 课程设计 报告