汇编实验报告.docx
《汇编实验报告.docx》由会员分享,可在线阅读,更多相关《汇编实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
汇编实验报告
中南大学
计算机原理与汇编
实验报告
题目:
1,5,6
姓名:
胡松
学号:
0909123006
专业:
物联网工程1202班
二○一四年六月
实验一………………………………………………………………3
1.问题描述
2.模块功能
3.调试与测试
4.测试结果
5.心得体会
6.附录
实验二………………………………………………………………7
7.问题描述
8.模块功能
9.调试与测试
10.测试结果
11.心得体会
12.附录
实验三………………………………………………………………10
1.问题描述
2.模块功能
3.调试与测试
4.测试结果
5.心得体会
实验一
一、问题描述
从键盘输入年份,通过计算后,输出该年份是否为闰年的信息。
判断闰年的规则是:
如果某一年能被4整除但不能被100整除或者该年能被400整除,则该年为闰年。
二、程序模块功能,程序设计组成框图、流程图。
三、调试与测试。
四、测试结果,用几组测试数据进行测试算法设计的正确性。
五、本次课程设计的心得体会。
学习是一个不断积累和反思的过程,不论是掌握一门技术还是学好一门课程都不是一蹴而就的,汇编作为最底层的语言之一,比高级语言学习起来更困难。
因此,今后还是要不断学习,勤动手勤思考,虚心问教。
六、附录:
源程序清单和结果。
DATASEGMENT;数据段.
MSG1DB13,10,'PleaseInput:
$'
VAR1DB13,10,'THEYEARISLEAP!
','$'
VAR2DB13,10,'THEYEARISNOTLEAP!
','$'
MSG3DB13,10,'InputERROR.$'
xDW?
;年份:
0~65535
BDW4
GDW400
FDW100
DATAENDS
;----------------------------------------------
CODESEGMENT;代码段.
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
;--------------------------------
MOVDX,OFFSETMSG1;提示PleaseInput:
MOVAH,9
INT21H
;--------------------------------
IN_LOOP:
MOVx,0;数据清零.
;MOVCX,4;输入4位
_INX:
PUSHCX
MOVAH,1;输入单个字符.
INT21H
CMPAL,13
JEL
;--------------------------------
CMPAL,'0'
JB_IN_ERR;小于'0',不是数字.
CMPAL,3AH
JBSUB_30H;'0'~'9'.
;--------------------------------
_IN_ERR:
;大于'9',也不是数字.
MOVDX,OFFSETMSG3;提示InputERROR.
MOVAH,9
INT21H
JMPEXIT;转到结束程序.
;--------------------------------
SUB_30H:
SUBAL,'0';还原为数字.
MOVAH,0
MOVCX,AX;暂存新数据.
MOVAX,x
MOVBX,10;老数据乘以10
MULBX
ADDAX,CX;加上新数据.
MOVx,AX;保存.
POPCX
LOOP_INX;继续输入.
;--------------------------------
L:
MOVAX,x;取来刚刚输入的年份
CWD;拓展为32位
DIVB;除以4
CMPDX,0;余数为0?
JNZL1;非0,就不是闰年
;--------------------
MOVAX,x
CWD
DIVG;除以400
CMPDX,0
JZL2;余数为0,就是闰年
;--------------------
MOVAX,x
CWD
DIVF;除以100
CMPDX,0
JNZL2;余数非0,就是闰年
;--------------------
L1:
MOVDX,OFFSETVAR2;显示:
THEYEARISNOTLEAP!
JMP_O_STR
L2:
MOVDX,OFFSETVAR1;显示:
THEYEARISLEAP!
_O_STR:
MOVAH,09H;显示
INT21H
;--------------------------------
EXIT:
MOVAH,4CH
INT21H
;--------------------------------
CODEENDS
ENDSTART
实验二
一、问题描述
反向输出一个整数。
(如原整数为34512,输出21543)。
二、程序模块功能,程序设计组成框图、流程图。
三、调试与测试。
四、测试结果,用几组测试数据进行测试算法设计的正确性。
五、本次课程设计的心得体会。
学习是一个不断积累和反思的过程,不论是掌握一门技术还是学好一门课程都不是一蹴而就的,汇编作为最底层的语言之一,比高级语言学习起来更困难。
因此,今后还是要不断学习,勤动手勤思考,虚心问教。
六、附录:
源程序清单和结果。
datasegment
sourcesdb100,?
100dup(?
)
targetsdb100dup(?
),'$'
dataends
codesegment
assumecs:
code,ds:
data
main:
movax,data
movds,ax
movdx,offsetsources
movah,0ah;键盘输入至缓冲区
int21h
movah,2;显示一个字符,DL为待输出字符的ASCII码
movdl,0dh;将输入的字符转换成ASCII码
int21h
movdl,0ah;
int21h
leasi,sources;将输入的字符串首地址赋给si
incsi;si+1
movcl,[si]
movch,0
addsi,cx
leadi,targets
again:
moval,[si]
mov[di],al
decsi
incdi
loopagain
leadx,targets;将倒序后的字符串首有效地址放在DX中
movah,9;字符串输出
int21h
movah,4ch;带返回码结束
int21h
codeends
endmain
codeends
endstart
实验三
一、问题描述
编写一拷贝程序,要求在命令行指定源文件名和目标文件名。
二、程序模块功能,程序设计组成框图、流程图。
三、调试与测试。
三、测试结果,用几组测试数据进行测试算法设计的正确性。
五、本次课程设计的心得体会。
汇编课程是一门理论性和实践性都很强的课程,通过亲自编写算法、上机运行和调试程序,才能加深理解和掌握所学的知识,提高程序设计和软件研发能力,所以自己做好了思想准备,这次课程设计必须独立的完成。
六、附录:
源程序清单和结果。
.modelsmall
.stack64
.data
;-------------------------------------------
handledw?
;源文件代号
filenampllabelbyte;同一个地址赋予两个不同的变量名
maxlendb30;最大长度
namlendb?
;文件长度
filenamdb30dup(?
);文件名
nam_enddb'$'
fileenddb0;文件结束标志
chandledw?
;目标文件代号
filelendw?
;文件长
onechardb?
menudb10,13,10,13,10,13,'***************MainMenu************',10,13;主菜单
db'***A.FileCopy***B.Exit***',10,13
db'**********************************',10,13
db'PleaseinputyourchoiceAorB',10,13,'$'
copymeg1db10,13,'Pleaseinputsourcefilenameandpath:
','$'
copymeg2db10,13,'Pleaseinputdestinationfilenameandpath:
','$'
copyreturn1db10,13,10,13,10,13,'FileCopySuccess',10,13,'$'
error1db10,13,'Filecopyfailure!
','$'
error2db10,13,'Yourinputiserror!
Pleaseinputagain!
','$'
.code
;-------------------------------------------
;主函数
mainprocfar
movax,@data;初始化DS
movds,ax
moves,ax
mainloop:
;主循环
leadx,menu
movah,9
int21h
callgetch
cmpal,'A'
jberror
cmpal,'B'
jgerror
cmpal,'B'
jeexit
callfilecopy
jmpmainloop
error:
leadx,error2
movah,09
int21h
jmpmainloop
exit:
movax,4ch
int21h
mainendp
;-------------------------------------------
;功能:
文件拷贝
filecopyprocnear
movfilelen,0000;文件长清零
movfileend,00;文件结束标志清零
leadx,copymeg1
movah,09
int21h
leadx,filenampl;dx存放第一个文件缓冲区起始偏移地址
movcl,30;cl是缓冲区大小(字节)
moval,00;al是打开文件的方式
callopenfile;打开源文件
cmpax,0000
jnenextname;打开成功
leadx,error1
movah,09
int21h
ret;源文件不存在返回主函数
nextname:
;读取下一个文件名
movhandle,ax
leadx,copymeg2
movah,09
int21h
leadx,filenampl;dx存放第一个文件缓冲区起始偏移地址
callnewfile;新建目标文件
cmpax,0000
jnecopybegin;目标文件创建成功
movbx,handle
callclosefile;关闭打开的已存在的目标文件
ret;存在同名文件返回主函数
copybegin:
movchandle,ax;
movcx,1
leadx,onechar
again:
movbx,handle
movah,3fh
int21h;从源文件读一个字符
cmpax,0000;ax为实际读入的字节数
jnenext;没到文件末尾
movfileend,1;已是最后一个字符了
next:
movbx,chandle
movah,40h
int21h;写进目标文件
cmpfileend,1
jereturn
incfilelen;文件字节数加一
jmpagain;读下一个字节
return:
;拷贝已完成
movbx,handle
callclosefile;关闭源文件
movbx,chandle
callclosefile;关闭目标文件
movah,09
leadx,copyreturn1
int21h
ret
filecopyendp
;-------------------------------------------
;功能:
接收一个字符
getchprocnear
movah,01
int21h
ret;返回值:
al=字符ASCII码
getchendp
;-------------------------------------------
;功能:
用0清除缓冲区多余的字节
clearprocnear
pushdi;入口参数:
di是缓冲区地址
moval,0
pushdx
movdh,0
movdl,ch;入口参数:
ch是缓冲区已占空间(字节)
adddi,dx
popdx
subcl,ch;入口参数:
cl是缓冲区大小(字节)
movch,0
cld;方向标志位置0指令
repstosb;重复执行存入串操作,把AL的内容存入剩余的缓冲区
popdi
ret;返回值:
缓冲区未被使用的字节被0填满
clearendp
;-------------------------------------------
;功能:
1、输入文件名2、检查文件是否存在若存在则打开
openfileprocnear
jmpbegin_in
errorin_opendb10,13
db'Sourefileisnotexist!
','$'
begin_in:
pushdi;子程序所需要使用的寄存器内容保存在堆栈中
movdi,dx
adddi,2;di-->filenam,di是文件名起始地址
movah,0ah
int21h;键盘输入到缓冲区
movbx,dx
addbx,1
movch,[bx];实际长度
movcl,30;容许最大长度
callclear
movdx,di
movah,3dh;打开文件
int21h
jncbegin_exit;判断CF中的值是否为0
pushds
movax,segerrorin_open
movds,ax
leadx,errorin_open
movah,09h
int21h
popds
movax,0000
popdi
ret;文件存在或错误返回ax=0000
begin_exit:
popdi
ret;打开正确返回ax=文件代号
openfileendp
;-------------------------------------------
;功能:
关闭文件
closefileprocnear
movah,3eh
int21h
ret
closefileendp
;-------------------------------------------
;功能:
判断文件是否存在,若不存在则新建一文件,若存在则直接返回。
newfileprocnear
jmpnewfile_begain
error_newfiledb10,13,10,13,'Destinationfilehasbeenexisted!
',
10,13,'Filecopyfailure!
','$'
newfile_begain:
pushdi;子程序所需要使用的寄存器中的内容先保存在堆栈中
movdi,dx;入口参数:
dx是文件名起始偏移地址
adddi,2;di-->filename
movbx,dx
movah,0ah
int21h;输入文件名
addbx,1;bx-->namlen
movcl,30;容许最大长度
movch,[bx];实际长度
callclear;
moval,00;用读方式打开
movah,3dh;打开文件
movdx,di
int21h
jcnext_st;判断CF看文件是否存在,不存在可以直接建立
movbx,ax;存在先关闭文件
callclosefile
pushds
;-----------------
movax,segerror_newfile
movds,ax
leadx,error_newfile
movah,09h
int21h
popds
movax,0000;文件已存在,返回ax=00000
popdi
ret
;-----------------
next_st:
movdx,di;使dx指向文件名
movcx,0000;普通方式建文件
movah,3ch
int21h;建立文件
popdi
ret;建立文件成功,返回ax=文件代号
newfileendp
endmain