汇编语言程序设计课程设计.docx
《汇编语言程序设计课程设计.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计课程设计.docx(22页珍藏版)》请在冰豆网上搜索。
汇编语言程序设计课程设计
汇编语言程序设计课程设计
课程设计报告
(本科)
课程:
汇编语言程序设计
学号:
姓名:
班级:
教师:
时间:
2014.6.3~2014.6.19
计算机科学与技术系
设计名称:
代码转换程序:
1.实现十六进制和十进制的相互转换
2.实现八进制和十进制的相互转换
设计内容、目的与要求:
实验要求:
本次课程设计着重于理论与实践的相结合,运用所学知识,配合实践操作。
实现代码转换程序。
内容包括:
设计题目;原始条件及参数;要求完成的主要任务(如:
设计方案的选择与确定、设计计算、程序编制、说明书撰写等具体要求);时间安排等。
计划与进度安排:
1.首先明确设计要求和理论知识,了解各进制之间的转换关系。
2.将思路流程的进制转换表格画出,按照流程图完成设计。
3.参考资料和收集代码,对题目进行编写。
4.对程序进行调试和修改,在电脑上进行演示。
具体时间安排:
6月3日~6月12日:
完成设计思路并作出草稿;
完成程序的输入;
6月13日~6月16日:
完成对基本功能的修改并运行无误;
增加对开始的源程序的功能;
6月17日至6月19日:
修改并完成,提交验收;
设计过程、步骤:
系统流程图:
图1系统流程图
十进制转二进制DECibin
图2十进制到二进制转换流程
二进制转八进制binioct
图3二进制转八进制转换流程
八进制转二进制octbin
图4八进制转二进制转换流程
二进制转十进制binidec
图5二进制转十进制转换流程
同理,十六进制转换为十进制的流程与此类似。
实验结果与分析:
图6首先运行无错误
图7输入1号功能变换
图8输入2号功能变换数值
图9产生obj文件
图10输入2号功能实现数制转换
图11输入1号功能实现数制转换
设计体会与建议:
通过此次课程设计,我们获益匪浅,现总结如下:
(1)我了解到汇编语言是一种基于硬件的一种语言,它相对于之前学的C语言是低级的。
但是汇编语言有它最大的好处,就是运行汇编程序所占用的系统资源很小,这样的话,运行同样的程序,汇编语言的速度要大于C语言。
我也查阅过资料,在我们将来要学习的单片机中,C语言和汇编语言是我们所学的可以对单片机进行编程的语言。
(2)我还意识到计算机是通过执行指令序列来解决问题的,因而每种计算机都有一组指令集供给用户使用,这组指令集就称为计算机的指令系统。
而指令是由操作码字段和操作数字段两部分组成。
操作码字段指示计算机所要执行的操作,而操作数字段则指出在指令执行操作的过程中所需要的操作数。
(1)汇编语言相对于我们之前学习的C语言是非常繁琐的。
它有很多操作码,并且其助记符也是很难记清楚的,实践过程中遇到了很多根部想不到的困难。
例如,我们自己的电脑不能运行MASM程序等问题。
这是程序兼容性存在问题,最后只好在虚拟机中运行。
所以,虽然我的课设题目不难,却花了我很长时间。
而且我们最后完成的程序没有很好地拓展性。
汇编语言不仅要求我们有严谨的逻辑系统,更要求有扎实的基础和记忆。
(2)我还意识到理论学习与实际操作实在是有很大差距。
在今后的课程学习中,(以上王康也提到了,将来需要学习单片机。
)汇编语言是必不可少的。
我会认真对待每一次实践机会,努力提高自己的上机操作能力,让自己的编程能力更上一层楼。
我还会继续学习汇编语言,在实践方面带来更大作用。
附录:
源代码
十进制与八进制相互转换的程序清单:
;DECIOCT
;十进制与八进制相互转换
;首先选择算法,1为八进制转十进制,2为十进制转八进制
;***************************
DECioctSEGMENT
ASSUMECS:
DECioct
;主程序部分。
mainPROCFAR
start:
MOVDL,3ah;显示提示附
MOVAH,2
INT21h
MOVAH,1;输入选择数字
INT21h
CMPAL,32h;数字为1时,执行八进制转十进制
JEREPEat2;数字为2时,执行十进制转八进制
REPEat1:
CALLoctbin;键盘输入八进制数转为二进制
CALLcrlf;回车并换行
CALLbinidec;二进制转十进制
CALLcrlf;回车并换行
JMPREPEat1;重复执行
REPEat2:
CALLDECibin;键盘输入十进制数转为二进制
CALLcrlf;回车并换行
CALLbinioct;二进制转八进制
CALLcrlf;回车并换行
JMPREPEat2;重复执行
mainENDP
;-----------------------------
;十进制转二进制
DECibinPROCNEAR
MOVBX,0;将BX清零
NEwchar2:
MOVAH,1
INT21h;21号中断输入
SUBAL,30h;ASCII转二进制
JLexit2;<0则跳转
CMPAL,9d;判断是否>9
JGexit2;如果大于则不是十进制数
CBW;字节转为字
XCHGAX,BX;交换寄存器
MOVCX,10d;把10放如CX
MULCX;AX扩大10倍
XCHGAX,BX;交换寄存器
ADDBX,AX;原数的10倍加上输入数
JMPNEwchar2;跳转输入
exit2:
RET
DECibinENDP
;---------------------------------------
;二进制转八进制
binioctPROCNEAR
MOVCL,2;移位数字2
ROLBL,CL;循环左移2位
MOVAL,BL;把输入的数送入AL
ANDAL,03h;将高六位屏蔽
ADDAL,30h;转换为ASCII
MOVDL,AL;输出AL
MOVAH,2
INT21h
MOVCH,2;剩余显示2位
rotate2:
MOVCL,3;移位数字3
ROLBL,CL;循环左移3位
MOVAL,BL;把输入的数送入AL
ANDAL,07h;将高五位屏蔽
ADDAL,30h;转换为ASCII
MOVDL,AL;输出AL
MOVAH,2
INT21h
DECCH;递减CH
JNZrotate2;CH不为0则跳转
RET
binioctENDP
;---------------------------------------
;八进制转二进制
octbinPROCNEAR
MOVBX,0;BX清零
NEwchar1:
MOVAH,1;输入数字
INT21h
SUBAL,30h;转换为二进制数
JLexit1
CMPAL,8d;如果<8则跳转
JLADD_to1
CMPAL,10h
JGEexit1
ADD_to1:
MOVCL,3;移位数字3
SHLBX,CL;左移3位
MOVAH,0;AH清0
ADDBX,AX;把新位移入数字
JMPNEwchar1;跳转继续输入
exit1:
RET
octbinENDP
;--------------------------------------
;二进制转十进制
binidecPROCNEAR
MOVCX,10000d;除数为10000
CALLDEC_div
MOVCX,1000d;除数为1000
CALLDEC_div
MOVCX,100d;除数为100
CALLDEC_div
MOVCX,10d;除数为10
CALLDEC_div
MOVCX,1d;除数为1
CALLDEC_div
RET
;---------------------------------------
;子程序
DEC_divPROCNEAR
MOVAX,BX;把二进制数移入AX
MOVDX,0;DX高八位清零
DIVCX;除数CX
MOVBX,DX;余数移入BX
MOVDL,AL;商移入DL
ADDDL,30h;转换为ASCII
MOVAH,2;输出十进制数位
INT21h
RET
DEC_divENDP
;---------------------------------------
binidecENDP
;---------------------------------------
;回车和换行。
crlfPROCNEAR
MOVDL,0dh;回车
MOVAH,2;输出
INT21h
MOVDL,0ah;换行
MOVAH,2;输出
INT21h
RET
crlfENDP
;----------------------------------------
DECioctENDS
;*****************************************
ENDstart
十六进制与十进制相互转换的程序清单:
;DECIOCT
;十进制与十六进制相互转换
;首先选择算法,1为十六进制转十进制,2为十进制转十六进制
;***************************
DECioctSEGMENT
ASSUMECS:
DECioct
;主程序部分。
mainPROCFAR
start:
MOVDL,3ah;显示提示附
MOVAH,2
INT21h
MOVAH,1;输入选择数字
INT21h
CMPAL,32h;数字为1时,执行十六进制转十进制
JEREPEat2;数字为2时,执行十进制转十六进制
REPEat1:
CALLoctbin;键盘输入十六进制数转为二进制
CALLcrlf;回车并换行
CALLbinidec;二进制转十进制
CALLcrlf;回车并换行
JMPREPEat1;重复执行
REPEat2:
CALLDECibin;键盘输入十进制数转为二进制
CALLcrlf;回车并换行
CALLbinioct;二进制转十六进制
CALLcrlf;回车并换行
JMPREPEat2;重复执行
mainENDP
;-----------------------------
;十进制转二进制
DECibinPROCNEAR
MOVBX,0;将BX清零
NEwchar2:
MOVAH,1
INT21h;21号中断输入
SUBAL,30h;ASCII转二进制
JLexit2;<0则跳转
CMPAL,9d;判断是否>9
JGexit2;如果大于则不是十进制数
CBW;字节转为字
XCHGAX,BX;交换寄存器
MOVCX,10d;把10放如CX
MULCX;AX扩大10倍
XCHGAX,BX;交换寄存器
ADDBX,AX;原数的10倍加上输入数
JMPNEwchar2;跳转输入
exit2:
RET
DECibinENDP
;---------------------------------------
;---------------------------------------
二进制转十六进制
Binioctprocnear
Movch,4
Rotate:
movcl,4
Rolbx,cl
Moval,bl
Andal,0fh
Addal,30h
Cmpal,3ah
jlprintit
Addal,7h
Printit:
Movdl,al
Movah,2
Int21h
Decch
Jnzrotate
Ret
Binioctendp
---------------------------------------
十六进制转为二进制
octbinPROCNEAR
MOVBX,0;BX清零
NEwchar1:
MOVAH,1;输入数字
INT21h
SUBAL,30h;转换为二进制数
JLexit1
CMPAL,16d;如果<8则跳转
JLADD_to1
CMPAL,10h
JGEexit1
ADD_to1:
MOVCL,4;移位数字3
SHLBX,CL;左移3位
MOVAH,0;AH清0
ADDBX,AX;把新位移入数字
JMPNEwchar1;跳转继续输入
exit1:
RET
octbinENDP
二进制转化为十进制
binidecPROCNEAR
MOVCX,10000d;除数为10000
CALLDEC_div
MOVCX,1000d;除数为1000
CALLDEC_div
MOVCX,100d;除数为100
CALLDEC_div
MOVCX,10d;除数为10
CALLDEC_div
MOVCX,1d;除数为1
CALLDEC_div
RET
;---------------------------------------
;子程序
DEC_divPROCNEAR
MOVAX,BX;把二进制数移入AX
MOVDX,0;DX高八位清零
DIVCX;除数CX
MOVBX,DX;余数移入BX
MOVDL,AL;商移入DL
ADDDL,30h;转换为ASCII
MOVAH,2;输出十进制数位
INT21h
RET
DEC_divENDP
;---------------------------------------
binidecENDP
;---------------------------------------
;回车和换行。
crlfPROCNEAR
MOVDL,0dh;回车
MOVAH,2;输出
INT21h
MOVDL,0ah;换行
MOVAH,2;输出
INT21h
RET
crlfENDP
;----------------------------------------
DECioctENDS
;*****************************************
ENDstart