| 专 业 | 计算机科学与技术 | 班 级 | 姓 名 | ||
| 设 计 起 止 日 期 | |||||
| 设计题目: 代码转换 | |||||
| 设计任务(主要技术参数): [1]硬件环境: CPU:1.6GH以上 内存:4GB以上 [2]软件环境: 操作系统:Microsoft Windows xp 运行环境:TE.EXE MASM.EXE LINK.EXE DEBUG.EXE [3]设计任务:本程序分为3个部分,运行程序,首先会显示主界面,用户可依据提示选择不同的编号,实现不同的功能:小写字母向大写字母的转换;大写字母向小写字母的转换;二进制数向十六进制数的转换; | |||||
| 指导教师评语: 成绩: 签字: 年 月 日 | |||||
本课程设计是在学完教学大纲规定的全部内容、完成所有实践环节的基础上,旨在深化学生学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。
2 设计方案论证
2.1开发环境
软件环境:操作系统:Windows xp
硬件环境:处理器:英特尔 第三代酷睿 i3-3110M @ 2.40GHz 双核
内存:4GB(三星 DDR3 1333MHz)
主硬盘:希捷 ST500LM012 HN-M500MBB (500GB/5400转/分)
显示器:三星 SEC39(14 英寸)
MASM开发环境:Masm是汇编编译器,是微软公司开发的汇编开发环境,拥有可 视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发的优点,支持伪指令和宏汇编,最后编译生成obj文件,通过link工具连接成可执行文件exe。
使用步骤为:a使用编辑软件TE.EXE进行源程序的编写。
b使用汇编软件MASM.EXE对源程序汇编。
c使用连接软件LINK.EXE对目标文件进行连接。
d使用调试软件DEBUG.EXE对可执行程序进行调试。
2.2 总体设计功能
本程序分为3个部分,运行程序,首先会显示主界面,用户可依据提示选择不同的编号,实现不同的功能:小写字母向大写字母的转换;大写字母向小写字母的转换;二进制数向十六进制数的转换;
2.3详细设计功能
2.3.1大小写字母间的转换
当用户选择编号1,便选择了这一个功能。通过判断标识符,程序跳转到标识符所在的位置。通过改变ASSIC码值,实现大小写字母间的转换。显示转换后的字母,然后跳转到主菜单。
2.3.2二进制与十六进制数间的转换
当用户选择编号3,便选择了这一个功能。根据提示首先输入一个数字表示二进制的位数,在程序中有变量记录二进制的位数。再根据提示输入一个二进制数。其转换的主要思想是二进制数的每位代表十六进制的,通过移位来逐一将四个二进制位数的和转换成十六进制数保存在一个寄存器中,然后再继续按照每四位一求和的方法保存十六进制数的每一位,直到二进制数的所有位计算完毕,当对四位二进制数相加完毕后,将保存和的寄存器清零,采用相对寻址改变十六进制数每一位存放的位置。其中还会对十六进制每一位上的数字进行判断,若是大于9,则转换成相应的数字,最后采用相对寻址的方式将十六进制的每一位依次输出。显示完毕后,跳转到主菜单。
2.3.3退出
当用户选择编号q,便选择了退出。通过判断标识符,程序跳转到标识符所在的位置,实现退出。
2.4主程序功能
显示程序所能执行的四种功能选项以及推出选项,用户可根据给出的选项通过输入其序号来进入各子程序。
2.4.1主程序功能流程
主程序流程如图1。
图1 主程序流程图
2.4.2大小写字母转换子程序功能
该子程序能够实现从键盘读取字符后输出其对应大写或小写字符。
大小写字母之间的转换如图2、图3。
图2 小写字母向大写字母转换流程图
图3 大写字母向小写字母转换流程图
2.4.3进制转换子程序功能
该子程序能实现二进制与十进制之间的转换,二进制与十六进制之间的转换以及十进制和十六进制之间的转换。
二进制向十六进制数的转换如图4。
图4 二进制向十六进制数的转换流程图
3. 设计结果与分析
3.1调试程序
启动DEBUG:C>DEBUG EXAM1.EXE
A汇编
U反汇编:
T单步执行:
G执行:
3.2运行程序
3.2.1进入主程序段显示提示信息,程序功能实现如图5所示:
图5 程序主界面图
3.2.2选择编号1进入大小写字母转换子程序,程序功能实现如图6所示:
图6大小写字母转换界面图
3.2.3选择编号2进入进制转换子程序,程序功能实现如图7所示:
图7二进制和十六进制转换界面图
3.2.4在运行过程中按“q”键为返回主页面。如图8所示:
图8 回到主界面图
4. 总结
通过本书的学习,我深入的掌握了汇编语言的编程方法、思路和技巧,并对计算机的底层编程有一定认识;还对计算机底层运行程序的机制及计算机的工作原理有了深入的了解。在学汇编的过程中,最重要的就是要掌握汇编语言中的指令的一些基本用法。当然要能够真正的了解其中的内涵,这样在实际的编程中也能够像运用高级语言一样灵活的变通。汇编语言作为一种低级程序设计语言,既然是低级所以应该是最底层的,与计算机内部的结构联系应该联系很密切,而且我在学习中也深刻的了解到了这一点。汇编程序给人感觉最烦的就是好多程序的结果不能直接通过运行EXE文件显示出来,而更多的是经过DEBUG单步调试才能看到其内在变化,看是否正确。汇编程序不像其他的高级语言一样需要编译器,而是直接的就能在记事本上编写,然后进行汇编和连接就可以了。
我认为汇编语言本身还是一门很重要的应用技术。首先由于汇编的操作由于跟硬件紧密相关,所以,很多硬件设施的嵌入式编程使用的都是使用的汇编语言,因为汇编语言更直接有效率。现在的数码产品很多,而这些数码产品赖以生存的芯片,主板等,都包含了嵌入式程序,而这些程序中,汇编语言的使用是相当重要的。 通过一段时间的自主学习,我常常上网搜索资料辅助理解,遇到难以理解的问题时也学会自己解决,我想这不仅是知识层面上的提升,更是自己在学习能力上的提升。这样的学习能力将非常有助于我今后的个人能力提高,我会把这种自主学习培养成为习惯,持之以恒下去。
5. 参考文献
[1] 王爽 汇编语言[M]. 第二版. 北京:清华大学出版社,2003:96-124
[2] 李真香,刘红海,赵润林. 汇编语言课程设计案例精编[M]. 第二版. 2004.4:73-82
[3] 仇玉章.32位微型计算机原理与接口技术[M].北京:清华大学出版社,2003.5:63-95
[4] 朱田,学峰,周豫滨译. 80386/80486编程指南[M],第1版.北京:电子工业出版社,1994:49-71
[5] 龚尚福. 微型计算机汇编语言程序设计[M]. 第一版. 西安:电子科技大学出版社,2003.7:45-71
6.附录(源代码)
DATAS SEGMENT
menu DB 0AH, 0DH, '-----------------------------------------'
DB 0AH, 0DH, 'Please choice action:', 0AH, 0DH
DB 0AH, 0DH, '1.Letter change'
DB 0AH, 0DH, '2.Binary to Hexadecimal'
DB 0AH, 0DH, 'q.Exit'
DB 0AH, 0DH, '-----------------------------------------', 0AH, 0DH,'$'
STR1 DB 0AH, 0DH, 'Please input a Letter', 0AH, 0DH,'$'
STR11 DB 0AH, 0DH, 'The big Letter is:', 0AH, 0DH,'$'
STR12 DB 0AH, 0DH, 'The litte Letter is:', 0AH, 0DH,'$'
STR13 DB 0AH, 0DH, 'Please confirm you just inputed is a Letter', 0AH, 0DH,'$'
STR2 DB 0AH, 0DH, 'Please input the binary string, Enter to confirm', 0AH, 0DH, '$'
STR21 DB 0AH, 0DH, 'The string Hexadecimal is:', 0AH, 0DH, '$'
STR3 DB 0AH, 0DH, 'Please input the Hexadecimal string, Enter to confirm', 0AH, 0DH, '$'
STR31 DB 0AH, 0DH, 'change to binary is:', 0AH, 0DH, '$'
STR4 DB 0AH, 0DH, 'change to Decimal is:', 0AH, 0DH, '$'
DATAS ENDS
CODES SEGMENT
ASSUME CS: CODES, DS: DATAS
;宏定义 字符输入
CHARIN MACRO ;宏定义无参数的字符输入功能
MOV AH, 01H ;系统调用 输入一个字符用于功能选择
INT 21H ;字符默认输入到AL中
ENDM
;宏定义 数字输入 数字输入到AL中
NUMIN MACRO
CHARIN
SUB AL, 48
ENDM
;宏定义 字符串输入
STRIN MACRO STRINGIN ;将字符串输入到字符串STRINGIN中
LEA DX, STRINGIN ;将STRINGIN的偏移地址送到DX寄存器
MOV AH, 0AH ;0AH字符串输入功能
INT 21H ;调用系统中断
ENDM
;宏定义 字符输出
CHAROUT MACRO OUTCHAR ;宏定义 将字符outchar输出
PUSH AX
PUSH DX
MOV DL, OUTCHAR
MOV AH, 02H ;系统调用 输出字符outchar
INT 21H ;调用系统中断 调用过程中会改变AL中的值,故将AX中的值入栈保存
POP DX
POP AX
ENDM
;宏定义 数字输出
NUMOUT MACRO OUTNUM
PUSH AX
PUSH DX
MOV DL, OUTNUM
ADD DL, 48 ;将数值转换为对应得数值字符
MOV AH, 02H ;系统调用 输出字符outchar
INT 21H ;调用系统中断 调用过程中会改变AL中的值,故将AX中的值入栈保存
POP DX
POP AX
ENDM
;宏定义 字符串输出
STROUT MACRO STRINGOUT ;将字符串STRINGOUT输出
PUSH AX
PUSH DX
LEA DX, STRINGOUT ;将STRIN的偏移地址送到DX寄存器
MOV AH, 9 ;09H字符串输出功能
INT 21H ;调用系统中断
POP DX
POP AX
ENDM
;宏定义 换行
ENDL MACRO ;宏定义换行
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV DL, 0AH ;先输出垂直Tab键
MOV AH, 2
INT 21H ;调用系统中断实现输出
MOV DL, 0DH ;再将输出输出调至段首
INT 21H ;调用系统中断
POP DX
POP CX
POP BX
POP AX
ENDM
;宏定义 以baseNum进制输出AX中的数值
OUTAX MACRO BASENUM ;宏定义换行
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BX, BASENUM ;将要转换成的进制存入BX作为除数
CALL OUTAXP ;调用进制输出过程
POP DX
POP CX
POP BX
POP AX
ENDM
;过程定义 以baseNum进制形式输出存放在AX中的数值过程
OUTAXP PROC
MOV DX, 0 ;初始化DX配合AX一起进行处罚操作
MOV CX, 0 ;用CX计数取得个余数个数
OUTAXP_CIRCLE:
CMP AX, 0 ;判断AX中的值是否为0
JE OUTAXP_NEXT ;是则跳转
DIV BX ;不是则进行除10运算 商保存在AX中 余数保存在DX中
PUSH DX ;将对10取到的余数入栈保存
MOV DX, 0 ;将DX中的余数清空 以便下一步对AX中的数进行除10运算
INC CX ;计数循环取得的余数个数
JMP OUTAXP_CIRCLE
OUTAXP_NEXT: ;循环输出取得的余数
POP AX
CMP AL, 10 ;当余数小于10时,直接将数值输出
JB NOUT
ADD AL, 55 ;否则将余数转化为对应的字符10对应字符'A'
CHAROUT AL
JMP COUT
NOUT: NUMOUT AL
COUT: LOOP OUTAXP_NEXT
RET
OUTAXP ENDP
;宏定义 以baseNum进制输入数据串到AX中,可输入2-37进制
INAX MACRO BASENUM ;宏定义换行
PUSH BX
PUSH CX
PUSH DX
MOV CX, BASENUM ;将要转换成的进制存入BX作为除数
CALL INAXP ;调用进制输入过程
POP DX
POP CX
POP BX
ENDM
;过程定义 以baseNum进制形式输出存放在AX中的数值过程
INAXP PROC
MOV AX, 0
INAXP0: PUSH AX
INAXP1: CHARIN ;逐个字符进行输入, 结果存放到AX中
CMP AL, 13
JE INAXE ;当按下Enter键后跳转AX的输出
CMP AL, '0'
JB INAXP1 ;当输入字符小于'0'时,跳转inAXp1,跳转重新进行字符输入
CMP AL, '9'
JA INAXNEXT1 ;当输入字符大于'9'时,跳转inAXnext1进一步进行比较
SUB AL, 48 ;当字符在'0'-'9'之间时,将字符转化为对应的数值
JMP INAXNUM ;跳转数值输入
INAXNEXT1:
CMP AL, 'A'
JB INAXP1 ;当输入字符小于'A'时,跳转重新进行字符输入
CMP AL, 'Z'
JA INAXNEXT2 ;当输入字符大于'Z'时,跳转inAXnext2进一步进行比较
SUB AL, 55 ;当字符在'A'-'Z'之间时,将字符转化为对应的数值,并跳转到数值输入
JMP INAXNUM
INAXNEXT2:
CMP AL, 'a'
JB INAXP1 ;当输入字符小于'A'时,跳转重新进行字符输入
CMP AL, 'z'
JA INAXP1 ;当输入字符小于'A'时,跳转重新进行字符输入
SUB AL, 87 ;当字符在'a'-'z'之间时,将字符转化为对应的数值,并跳转到数值输入
JMP INAXNUM
INAXNUM: MOV BH, 0 ;将数值送到AX中
MOV BL, AL
POP AX
CMP AX, 0 ;当AX中的数值为0时,跳过乘法操作
JE INAXADD
MUL CX ;乘以CX中的进制基数
INAXADD: ADD AX, BX
JMP INAXP0
INAXE: POP AX ;将计算得到的数值出栈到AX中
RET
INAXP ENDP
START:
MOV AX, DATAS ;将数据段地址送到AX中
MOV DS, AX ;由AX转送到送到DS
P0: STROUT MENU ;字符串输出宏调用 输出menu的提示菜单
CHARIN ;宏调用 字符输入 选择相应功能
CMP AL, '1'
JE P1
CMP AL, '2'
JE P2
CMP AL, '3'
;JE P3
CMP AL, '4'
;JE P4
CMP AL, 'q'
;JE Pq
CMP AL, 'Q'
;JE PQ
JMP P0
P1: ENDL
STROUT STR1
CHARIN ;输入字母到AL中
CMP AL, 'A'
JB OUTRANGE ;当字符小于'A'时超出范围,给出提示信息
CMP AL, 'Z'
JA CMPNEXT ;当字符大于'Z'时进一步进行范围的确定
ADD AL, 32 ;输入的字符范围在'A'-'Z'之间时转换为小写字母
STROUT STR12 ;输出AL中的字符前给出提示信息
JMP OUTAL
CMPNEXT:
CMP AL, 'a'
JB OUTRANGE ;当字符小于'a'时超出范围,给出提示信息
CMP AL, 'z'
JA OUTRANGE ;当字符大于'z'时超出范围,给出提示信息
SUB AL, 32 ;输入的字符范围在'a'-'z'之间时转换为小写字母
STROUT STR11 ;输出AL中的字符前给出提示信息 OUTAL: CHAROUT AL
JMP P0
OUTRANGE:
STROUT STR13 ;超出范围,给出提示信息
JMP P0
P2: STROUT STR2
INAX 2 ;以2进制输入数据串到到AX中
ENDL
STROUT STR21
OUTAX 16 ;以16进制的形式输出AX中的数值
JMP P0
PQ: MOV AH, 4CH ;调用 系统结束
INT 21H
JMP P0
CODES ENDS
END START下载本文