课程设计

更新时间:2024-06-23 08:57:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课程设计报告

课程:学号:姓名:班级:教师:时间:(本科)

汇编语言程序设计

1310441012 1310441065

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

设计过程、步骤: 系统流程图: 开始 八进制转十进制 选择转换方式 十进制转八进制 调用octbin 调用DECibin 调用crlf 调用crlf 调用binidec 调用binioct 调用crlf 调用crlf 结束 图1 系统流程图

2

十进制转二进制DECibin 开始 BX清零 输入数值 转ASCII <0或>9d 交换AX、BX AX乘10 交换AX、BX 加上AX 结束 图2 十进制到二进制转换流程

3

二进制转八进制binioct 开始 BX左移2位 把最右面2位转为ASCII码 显示一个字符 循环计数值置为2 BX循环左移3把最右面3位转为ASCII码 显示一个字符 循环计数值 =0? N Y 结束 图3 二进制转八进制转换流程 八进制转二进制octbin

4

开始 BX清零 输入十进制数 判定范围 <8执行 移位数字为3 <0重新输入 左移3位 AH清零 添加新二进制位 跳转输入 结束 图4 八进制转二进制转换流程 5

二进制转十进制binidec 开始 CX置10000d 开始 子程序DEC_div 把二进制数转入AX 调用子程序 DX清零 CX置1000d 除法运算 调用子程序 余数移入BX CX置100d 商移入DL 调用子程序 转为ASCII CX置10d 显示商 调用子程序 结束 CX置1d 调用子程序 结束 图5 二进制转十进制转换流程 同理,十六进制转换为十进制的流程与此类似。 6

实验结果与分析: 图6 首先运行无错误 图7输入1号功能变换 图8输入2号功能变换数值

7

图9 产生obj文件 图10 输入2号功能实现数制转换 图11 输入1号功能实现数制转换 8

设计体会与建议: 通过此次课程设计,我们获益匪浅,现总结如下: (1)我了解到汇编语言是一种基于硬件的一种语言,它相对于之前学的C语言是低级的。但是汇编语言有它最大的好处,就是运行汇编程序所占用的系统资源很小,这样的话,运行同样的程序,汇编语言的速度要大于C语言。我也查阅过资料,在我们将来要学习的单片机中,C语言和汇编语言是我们所学的可以对单片机进行编程的语言。 (2)我还意识到计算机是通过执行指令序列来解决问题的,因而每种计算机都有一组指令集供给用户使用,这组指令集就称为计算机的指令系统。而指令是由操作码字段和操作数字段两部分组成。操作码字段指示计算机所要执行的操作,而操作数字段则指出在指令执行操作的过程中所需要的操作数。 (1)汇编语言相对于我们之前学习的C语言是非常繁琐的。它有很多操作码,并且其助记符也是很难记清楚的,实践过程中遇到了很多根部想不到的困难。例如,我们自己的电脑不能运行MASM程序等问题。这是程序兼容性存在问题,最后只好在虚拟机中运行。所以,虽然我的课设题目不难,却花了我很长时间。而且我们最后完成的程序没有很好地拓展性。汇编语言不仅要求我们有严谨的逻辑系统,更要求有扎实的基础和记忆。 (2)我还意识到理论学习与实际操作实在是有很大差距。在今后的课程学习中,(以上王康也提到了,将来需要学习单片机。)汇编语言是必不可少的。我会认真对待每一次实践机会,努力提高自己的上机操作能力,让自己的编程能力更上一层楼。我还会继续学习汇编语言,在实践方面带来更大作用。

9

附录:源代码

十进制与八进制相互转换的程序清单:

;DECIOCT

;十进制与八进制相互转换

;首先选择算法,1为八进制转十进制,2为十进制转八进制 ;***************************

DECioct SEGMENT

ASSUME CS:DECioct ;主程序部分。

main PROC FAR

start: MOV DL,3ah ; MOV AH,2 INT 21h

MOV AH,1 ; INT 21h

CMP AL,32h ;进制

JE REPEat2 ;进制

REPEat1: CALL octbin ; CALL crlf ; CALL binidec ; CALL crlf ; JMP REPEat1 ;

REPEat2: CALL DECibin ;制

CALL crlf ; CALL binioct ; CALL crlf ;

JMP REPEat2 ; main ENDP

;-----------------------------

显示提示附 输入选择数字 数字为1时,执行八进制转十数字为2时,执行十进制转八键盘输入八进制数转为二进制 回车并换行 二进制转十进制 回车并换行 重复执行 键盘输入十进制数转为二进回车并换行 二进制转八进制

回车并换行 重复执行 10

;十进制转二进制

DECibin PROC NEAR

MOV BX,0 ;将BX清零 NEwchar2:

MOV AH,1

INT 21h ;21号中断输入 SUB AL,30h ;ASCII转二进制 JL exit2 ;<0则跳转 CMP AL,9d ;判断是否>9

JG exit2 ; CBW ; XCHG AX,BX ; MOV CX,10d ; MUL CX ;AX XCHG AX,BX ; ADD BX,AX ; JMP NEwchar2 ;exit2: RET DECibin ENDP

;--------------------------------------- ;二进制转八进制

binioct PROC NEAR

MOV CL,2 ROL BL,CL MOV AL,BL AND AL,03h ADD AL,30h MOV DL,AL MOV AH,2 INT 21h

MOV CH,2 rotate2:

MOV CL,3 ROL BL,CL MOV AL,BL AND AL,07h ADD AL,30h MOV DL,AL MOV AH,2 INT 21h

DEC CH

如果大于则不是十进制数 字节转为字 交换寄存器 把10放如CX 扩大10倍 交换寄存器

原数的10倍加上输入数 跳转输入 ;移位数字2 ;循环左移2位

;把输入的数送入AL ;将高六位屏蔽 ;转换为ASCII ;输出AL ;剩余显示2位 ;移位数字3 ;循环左移3位

;把输入的数送入AL ;将高五位屏蔽 ;转换为ASCII ;输出AL ;递减CH

11

JNZ rotate2 ;CH不为0则跳转 RET binioct ENDP

;--------------------------------------- ;八进制转二进制

octbin PROC NEAR

MOV BX,0 NEwchar1:

MOV AH,1 INT 21h

SUB AL,30h JL exit1

CMP AL,8d JL ADD_to1

CMP AL,10h JGE exit1 ADD_to1:

MOV CL,3 SHL BX,CL MOV AH,0 ADD BX,AX JMP NEwchar1 exit1: RET octbin ENDP

;-------------------------------------- ;二进制转十进制

binidec PROC NEAR

MOV CX,10000d CALL DEC_div

MOV CX,1000d CALL DEC_div

MOV CX,100d CALL DEC_div

MOV CX,10d CALL DEC_div

MOV CX,1d CALL DEC_div RET

;---------------------------------------

;BX清零 ;输入数字 ;转换为二进制数 ;如果<8则跳转 ;移位数字3 ;左移3位 ;AH清0

;把新位移入数字 ;跳转继续输入 ;除数为10000 ;除数为1000 ;除数为100 ;除数为10 ;除数为1 12

;子程序

DEC_div PROC NEAR

MOV AX,BX ;把二进制数移入AX MOV DX,0 ;DX高八位清零 DIV CX ;除数CX MOV BX,DX ;余数移入BX MOV DL,AL ;商移入DL ADD DL,30h ;转换为ASCII MOV AH,2 ;输出十进制数位 INT 21h RET DEC_div ENDP

;--------------------------------------- binidec ENDP

;---------------------------------------

;回车和换行。

crlf PROC NEAR

MOV DL,0dh MOV AH,2 INT 21h

MOV DL,0ah MOV AH,2 INT 21h RET crlf ENDP

;---------------------------------------- DECioct ENDS

;***************************************** END start

;回车 ;输出 ;换行 ;输出 13

十六进制与十进制相互转换的程序清单:

;DECIOCT

;十进制与十六进制相互转换

;首先选择算法,1为十六进制转十进制,2为十进制转十六进制 ;***************************

DECioct SEGMENT

ASSUME CS:DECioct ;主程序部分。

main PROC FAR

start: MOV DL,3ah ; MOV AH,2 INT 21h

MOV AH,1 ; INT 21h

CMP AL,32h ;十进制

JE REPEat2 ;六进制

REPEat1: CALL octbin ;制

CALL crlf ; CALL binidec ; CALL crlf ; JMP REPEat1 ;

REPEat2: CALL DECibin ;制

CALL crlf ; CALL binioct ; CALL crlf ;

JMP REPEat2 ; main ENDP

;----------------------------- ;十进制转二进制

显示提示附 输入选择数字 数字为1时,执行十六进制转数字为2时,执行十进制转十键盘输入十六进制数转为二进回车并换行 二进制转十进制 回车并换行 重复执行 键盘输入十进制数转为二进回车并换行 二进制转十六进制

回车并换行 重复执行 14

DECibin PROC NEAR

MOV BX,0 ;将BX清零 NEwchar2:

MOV AH,1

INT 21h ;21号中断输入 SUB AL,30h ;ASCII转二进制 JL exit2 ;<0则跳转 CMP AL,9d ;判断是否>9

JG exit2 ;如果大于则不是十进制数 CBW ; XCHG AX,BX ; MOV CX,10d ; MUL CX ;AX XCHG AX,BX ; ADD BX,AX ; JMP NEwchar2 ;exit2: RET DECibin ENDP

;---------------------------------------

;---------------------------------------

二进制转十六进制

Binioct proc near Mov ch,4 Rotate: mov cl,4 Rol bx,cl Mov al,bl And al,0fh Add al,30h Cmp al,3ah jl printit Add al,7h Printit:

Mov dl,al Mov ah,2 Int 21h Dec ch

Jnz rotate Ret Binioct endp

---------------------------------------

字节转为字 交换寄存器 把10放如CX 扩大10倍 交换寄存器

原数的10倍加上输入数跳转输入 15

十六进制转为二进制

octbin PROC NEAR

MOV BX,0 ; BX清零 NEwchar1:

MOV AH,1 ;输入数字 INT 21h

SUB AL,30h ; JL exit1

CMP AL,16d ; JL ADD_to1

CMP AL,10h JGE exit1 ADD_to1:

MOV CL,4 ; SHL BX,CL ; MOV AH,0 ;AH ADD BX,AX ; JMP NEwchar1 ;exit1: RET octbin ENDP

二进制转化为十进制

binidec PROC NEAR

MOV CX,10000d ; CALL DEC_div

MOV CX,1000d ; CALL DEC_div

MOV CX,100d ; CALL DEC_div

MOV CX,10d ; CALL DEC_div

MOV CX,1d ; CALL DEC_div RET

;--------------------------------------- ;子程序

DEC_div PROC NEAR

MOV AX,BX ; MOV DX,0 ;DX

转换为二进制数 如果<8则跳转 移位数字3 左移3位 清0

把新位移入数字 跳转继续输入 除数为10000 除数为1000 除数为100 除数为10 除数为1 把二进制数移入AX 高八位清零

16

DIV CX ;除数CX

MOV BX,DX ;余数移入BX MOV DL,AL ;商移入DL ADD DL,30h ;转换为ASCII MOV AH,2 ;输出十进制数位 INT 21h RET DEC_div ENDP

;--------------------------------------- binidec ENDP

;---------------------------------------

;回车和换行。

crlf PROC NEAR

MOV DL,0dh ; MOV AH,2 ; INT 21h

MOV DL,0ah ; MOV AH,2 ; INT 21h RET crlf ENDP

;---------------------------------------- DECioct ENDS

;***************************************** END start

回车 输出 换行 输出 17

本文来源:https://www.bwwdw.com/article/gj23.html

Top