汇编语言程序设计代码转换.docx
《汇编语言程序设计代码转换.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计代码转换.docx(18页珍藏版)》请在冰点文库上搜索。
汇编语言程序设计代码转换
课程设计任务书
专业
计算机科学与技术
班级
姓名
设计起止日期
设计题目:
代码转换
设计任务(主要技术参数):
[1]硬件环境:
CPU:
1.6GH以上
内存:
4GB以上
[2]软件环境:
操作系统:
MicrosoftWindowsxp
运行环境:
TE.EXE
MASM.EXE
LINK.EXE
DEBUG.EXE
[3]设计任务:
本程序分为3个部分,运行程序,首先会显示主界面,用户可依据提示选择不同的编号,实现不同的功能:
小写字母向大写字母的转换;大写字母向小写字母的转换;二进制数向十六进制数的转换;
指导教师评语:
成绩:
签字:
年月日
1.课程设计的目的
本课程设计是在学完教学大纲规定的全部内容、完成所有实践环节的基础上,旨在深化学生学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。
2设计方案论证
2.1开发环境
软件环境:
操作系统:
Windowsxp
硬件环境:
处理器:
英特尔第三代酷睿i3-3110M@2.40GHz双核
内存:
4GB(三星DDR31333MHz)
主硬盘:
希捷ST500LM012HN-M500MBB(500GB/5400转/分)
显示器:
三星SEC3649(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>DEBUGEXAM1.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.附录(源代码)
DATASSEGMENT
menuDB0AH,0DH,'-----------------------------------------'
DB0AH,0DH,'Pleasechoiceaction:
',0AH,0DH
DB0AH,0DH,'1.Letterchange'
DB0AH,0DH,'2.BinarytoHexadecimal'
DB0AH,0DH,'q.Exit'
DB0AH,0DH,'-----------------------------------------',0AH,0DH,'$'
STR1DB0AH,0DH,'PleaseinputaLetter',0AH,0DH,'$'
STR11DB0AH,0DH,'ThebigLetteris:
',0AH,0DH,'$'
STR12DB0AH,0DH,'ThelitteLetteris:
',0AH,0DH,'$'
STR13DB0AH,0DH,'PleaseconfirmyoujustinputedisaLetter',0AH,0DH,'$'
STR2DB0AH,0DH,'Pleaseinputthebinarystring,Entertoconfirm',0AH,0DH,'$'
STR21DB0AH,0DH,'ThestringHexadecimalis:
',0AH,0DH,'$'
STR3DB0AH,0DH,'PleaseinputtheHexadecimalstring,Entertoconfirm',0AH,0DH,'$'
STR31DB0AH,0DH,'changetobinaryis:
',0AH,0DH,'$'
STR4DB0AH,0DH,'changetoDecimalis:
',0AH,0DH,'$'
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
;宏定义字符输入
CHARINMACRO;宏定义无参数的字符输入功能
MOVAH,01H;系统调用输入一个字符用于功能选择
INT21H;字符默认输入到AL中
ENDM
;宏定义数字输入数字输入到AL中
NUMINMACRO
CHARIN
SUBAL,48
ENDM
;宏定义字符串输入
STRINMACROSTRINGIN;将字符串输入到字符串STRINGIN中
LEADX,STRINGIN;将STRINGIN的偏移地址送到DX寄存器
MOVAH,0AH;0AH字符串输入功能
INT21H;调用系统中断
ENDM
;宏定义字符输出
CHAROUTMACROOUTCHAR;宏定义将字符outchar输出
PUSHAX
PUSHDX
MOVDL,OUTCHAR
MOVAH,02H;系统调用输出字符outchar
INT21H;调用系统中断调用过程中会改变AL中的值,故将AX中的值入栈保存
POPDX
POPAX
ENDM
;宏定义数字输出
NUMOUTMACROOUTNUM
PUSHAX
PUSHDX
MOVDL,OUTNUM
ADDDL,48;将数值转换为对应得数值字符
MOVAH,02H;系统调用输出字符outchar
INT21H;调用系统中断调用过程中会改变AL中的值,故将AX中的值入栈保存
POPDX
POPAX
ENDM
;宏定义字符串输出
STROUTMACROSTRINGOUT;将字符串STRINGOUT输出
PUSHAX
PUSHDX
LEADX,STRINGOUT;将STRIN的偏移地址送到DX寄存器
MOVAH,9;09H字符串输出功能
INT21H;调用系统中断
POPDX
POPAX
ENDM
;宏定义换行
ENDLMACRO;宏定义换行
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVDL,0AH;先输出垂直Tab键
MOVAH,2
INT21H;调用系统中断实现输出
MOVDL,0DH;再将输出输出调至段首
INT21H;调用系统中断
POPDX
POPCX
POPBX
POPAX
ENDM
;宏定义以baseNum进制输出AX中的数值
OUTAXMACROBASENUM;宏定义换行
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVBX,BASENUM;将要转换成的进制存入BX作为除数
CALLOUTAXP;调用进制输出过程
POPDX
POPCX
POPBX
POPAX
ENDM
;过程定义以baseNum进制形式输出存放在AX中的数值过程
OUTAXPPROC
MOVDX,0;初始化DX配合AX一起进行处罚操作
MOVCX,0;用CX计数取得个余数个数
OUTAXP_CIRCLE:
CMPAX,0;判断AX中的值是否为0
JEOUTAXP_NEXT;是则跳转
DIVBX;不是则进行除10运算商保存在AX中余数保存在DX中
PUSHDX;将对10取到的余数入栈保存
MOVDX,0;将DX中的余数清空以便下一步对AX中的数进行除10运算
INCCX;计数循环取得的余数个数
JMPOUTAXP_CIRCLE
OUTAXP_NEXT:
;循环输出取得的余数
POPAX
CMPAL,10;当余数小于10时,直接将数值输出
JBNOUT
ADDAL,55;否则将余数转化为对应的字符10对应字符'A'
CHAROUTAL
JMPCOUT
NOUT:
NUMOUTAL
COUT:
LOOPOUTAXP_NEXT
RET
OUTAXPENDP
;宏定义以baseNum进制输入数据串到AX中,可输入2-37进制
INAXMACROBASENUM;宏定义换行
PUSHBX
PUSHCX
PUSHDX
MOVCX,BASENUM;将要转换成的进制存入BX作为除数
CALLINAXP;调用进制输入过程
POPDX
POPCX
POPBX
ENDM
;过程定义以baseNum进制形式输出存放在AX中的数值过程
INAXPPROC
MOVAX,0
INAXP0:
PUSHAX
INAXP1:
CHARIN;逐个字符进行输入,结果存放到AX中
CMPAL,13
JEINAXE;当按下Enter键后跳转AX的输出
CMPAL,'0'
JBINAXP1;当输入字符小于'0'时,跳转inAXp1,跳转重新进行字符输入
CMPAL,'9'
JAINAXNEXT1;当输入字符大于'9'时,跳转inAXnext1进一步进行比较
SUBAL,48;当字符在'0'-'9'之间时,将字符转化为对应的数值
JMPINAXNUM;跳转数值输入
INAXNEXT1:
CMPAL,'A'
JBINAXP1;当输入字符小于'A'时,跳转重新进行字符输入
CMPAL,'Z'
JAINAXNEXT2;当输入字符大于'Z'时,跳转inAXnext2进一步进行比较
SUBAL,55;当字符在'A'-'Z'之间时,将字符转化为对应的数值,并跳转到数值输入
JMPINAXNUM
INAXNEXT2:
CMPAL,'a'
JBINAXP1;当输入字符小于'A'时,跳转重新进行字符输入
CMPAL,'z'
JAINAXP1;当输入字符小于'A'时,跳转重新进行字符输入
SUBAL,87;当字符在'a'-'z'之间时,将字符转化为对应的数值,并跳转到数值输入
JMPINAXNUM
INAXNUM:
MOVBH,0;将数值送到AX中
MOVBL,AL
POPAX
CMPAX,0;当AX中的数值为0时,跳过乘法操作
JEINAXADD
MULCX;乘以CX中的进制基数
INAXADD:
ADDAX,BX
JMPINAXP0
INAXE:
POPAX;将计算得到的数值出栈到AX中
RET
INAXPENDP
START:
MOVAX,DATAS;将数据段地址送到AX中
MOVDS,AX;由AX转送到送到DS
P0:
STROUTMENU;字符串输出宏调用输出menu的提示菜单
CHARIN;宏调用字符输入选择相应功能
CMPAL,'1'
JEP1
CMPAL,'2'
JEP2
CMPAL,'3'
;JEP3
CMPAL,'4'
;JEP4
CMPAL,'q'
;JEPq
CMPAL,'Q'
;JEPQ
JMPP0
P1:
ENDL
STROUTSTR1
CHARIN;输入字母到AL中
CMPAL,'A'
JBOUTRANGE;当字符小于'A'时超出范围,给出提示信息
CMPAL,'Z'
JACMPNEXT;当字符大于'Z'时进一步进行范围的确定
ADDAL,32;输入的字符范围在'A'-'Z'之间时转换为小写字母
STROUTSTR12;输出AL中的字符前给出提示信息
JMPOUTAL
CMPNEXT:
CMPAL,'a'
JBOUTRANGE;当字符小于'a'时超出范围,给出提示信息
CMPAL,'z'
JAOUTRANGE;当字符大于'z'时超出范围,给出提示信息
SUBAL,32;输入的字符范围在'a'-'z'之间时转换为小写字母
STROUTSTR11;输出AL中的字符前给出提示信息OUTAL:
CHAROUTAL
JMPP0
OUTRANGE:
STROUTSTR13;超出范围,给出提示信息
JMPP0
P2:
STROUTSTR2
INAX2;以2进制输入数据串到到AX中
ENDL
STROUTSTR21
OUTAX16;以16进制的形式输出AX中的数值
JMPP0
PQ:
MOVAH,4CH;调用系统结束
INT21H
JMPP0
CODESENDS
ENDSTART