微机课程设计报告.docx
《微机课程设计报告.docx》由会员分享,可在线阅读,更多相关《微机课程设计报告.docx(31页珍藏版)》请在冰点文库上搜索。
微机课程设计报告
微机课程设计报告
摘要
汇编语言实质就是机器语言的一个高级的形式。
《微机原理与接口技术》课程要求掌握汇编语言编辑,调试技术及接口芯片的编程与使用。
作为自动化专业的学生这门课更是必须掌握的,是我们学习更深层次的专业知识的基础。
本次课程设计利用汇编语言的特点,编写程序,通过键盘输入一个16进制数,通过屏幕提示菜单选择转换成2进制,8进制或者10进制数并显示。
程序设计由一个输入16进制数的子程序、输出2进制的子程序、输出8进制的子程序、输出10进制的子程序,然后利用CALL指令及DOS指令编写出主程序及将结果在屏幕上显示出来。
编写程序的过程,包括程序功能分析、划分程序模块、设计程序流程图、编写程序、调试程序和结果分析。
通过此课程设计的汇编语言练习,可以熟悉汇编语言的寻址方式和指令系统,BIOS和DOS系统功能调用,程序设计方法并熟悉汇编的编程环境。
关键字:
汇编语言数制转换DOS调用程序调试
数制转换程序设计
1设计意义及要求
1.1设计意义
通过课程设计,能够对所学知识有更进一步的理解,并能掌握学习理论时没有注意的细节。
调试程序,排除故障有助于提高分析问题、解决问题的能力。
课程设计中碰到的挫折,有助于养成良好的学习习惯、严谨的工作作风。
通过此课程设计的汇编语言练习,可以熟悉汇编语言的寻址方式和指令系统,BIOS和DOS系统功能调用,程序设计方法并熟悉汇编的编程环境。
1.2设计要求
设计内容:
编写程序,通过键盘输入一个16进制数,通过屏幕提示菜单选择转换成2进制,8进制或者10进制数并显示。
设计要求:
1)按屏幕提示要求输入,从屏幕上获得正确结果。
2)了解汇编语言的设计方法,熟悉汇编语言的寻址方式、指令系统和DOS系统功能调用画出流程图,按照自己目的编写源程序,并以模块化方式注释源程序。
3)画出流程图,按照自己目的编写源程序,并以模块化方式注释源程序。
4)撰写实验报告,认真完成报告。
报告内容包括:
软件思想,流程图,源程序及程序注释调试记录及结果分析;总结;参考资料;附录:
芯片资料或程序清单。
附加设计要求:
若输入的16进制不是0至F间的数字,则显示出错信息,并要求重新输入。
2方案论证
2.1需求分析
1)十六进制转换成二进制:
输入一个十六进制数,用二进制数表示输出;最多能把四位十六进制数用十六位二进制数表示输出。
2)十六进制转换成十进制数:
输入一个十六进制数,用十进制数表示输出;最大能把十六进制数FFFF转换成十进制数65535表示输出。
3)十六进制转换成八进制数:
输入一个十六进制数,用八进制数表示输出;最大能把十六进制数FFFF转换成八进制数177777表示输出。
2.2设计思路
要求通过键盘输入一个16进制数,通过屏幕提示菜单选择转换成2进制,8进制或者10进制数并显示。
根据此要求需要设计一个输入16进制数的子程序、输出2进制的子程序、输出8进制的子程序、输出10进制的子程序,然后利用CALL指令及DOS指令编写出主程序及将结果在屏幕上显示出来。
2.3设计过程
2.3.1进制介绍
1)十进制数:
十进制的基本运算规则是“逢十进一”的。
上例中右边第一位为个位,记作100;第二位为十位,记作101;第三、四位为百位和千位,记作102和103。
通常把100、101、102、103……称为是对应数位的权,各数位的权都是基数的幂。
每个数位对应的数字符号称为系数。
显然,某数位的数值等于该位的系数和权的乘积。
2)二进制数(Binary):
与十进制类似,二进制的基数为2,即二进制中只有两个数字符号(0和1)。
二进制的基本运算规则是“逢二进一”,各位的权为2的幂。
3)八进制数(Octal):
在八进制中,基数为8,它有0至8八个数字符号,八进制的基本运算规则是“逢八进一”,各数位的权是8的幂。
4)十六进制数(Decimal):
在十六进制中,基数为16,它有0~F十六个数字符号,十六进制的基本运算规则是“逢十六进一”,各数位的权是16的幂。
2.3.2进制转换
1)十六进制数转换成二进制数
因为四位二进制数正好表示0~F16个数字,所以一个十六进制数要转换成二进制数时,以小数点为界分别向左向右开始,每四位分为一组,一组一组地转换成对应的十六进制数字。
若最后不足四位时,整数部分在最高位前面加0补足四位再转换
十六进制与二进制对照表如下:
表2-1十六进制与二进制对照表
16进制
0
1
2
3
4
5
6
7
2进制
0000
0001
0010
0011
0100
0101
0110
0111
16进制
8
9
A
B
C
D
E
F
2进制
1000
1001
1010
1011
1100
1101
1110
1111
2)十六进制数转换成十进制数
把任意十六进制写成位权展开式后,再求和,就可以得到对应的十进制数。
3)十六进制数转换成八进制数
先将十六进制数转换成二进制数,再将二进制数转换成八进制数。
八进制与二进制对照表如下:
表2-2八进制与二进制对照表
8进制
0
1
2
3
4
5
6
7
2进制
000
001
010
011
100
101
110
111
由表2-1和表2-2可从16进制转换到2进制,再从2进制转换到8进制。
综合以上,可编写16进制转换成2进制、16进制转换成10进制、16进制转换成8进制的子程序。
2.3.3概要设计
整个程序由四个主要的子程序和若干个辅助子程序组成,实现3个转换功能:
主要的子程序:
INHEX用来输入一个十六进制数,并放在BX中;
OUTBIN用来把一个十六进制数转换成二进制数输出;
OUTDEC用来把一个十六进制数转换成十进制数输出;
OUTOCT用来把一个十六进制数转换成八进制数输出;
辅助子程序:
CRLF用来换行;
DEC2用来除以各位十进制的权
主程序框架:
L1:
调用INHEX,输入一个十六进制数;再调用CRLF,换行;调用OUTBIN,输出一个二进制数;再调用CRLF,换行;再跳转到START。
L2:
调用INHEX,输入一个十六进制数;再调用CRLF,换行;调用OUTDEC,
输出一个十进制数;再调用CRLF,换行;再跳转到START。
L3:
调用INHEX,输入一个十六进制数;再调用CRLF,换行;调用OUTOCT,
输出一个八进制数;再调用CRLF,换行;再跳转到START。
L0:
输入为0时,则跳出。
3流程图
图3-1主程序流程图
程序开始可以由提示页面选择需要将十六进制转换成二进制、十进制、八进制,程序调用过程中,要是出现非十六进制字符便会出现出错提示返回重新填写,根据选项有1(十六进制转换成二进制)、2(十六进制转换成十进制)、3(十六进制转换成八进制);输入0则退出程序。
数制转换方式选择调用过程如图3-2,3-3,3-4:
图3-2是调用输出八进制的过程,通过调用CRLF、接着调用OUTOCT、然后再调用CRLF,这样的调用之后可以通过对输入数值的判断可以完成相应的由十六进制向十进制的转换功能。
图3-3、图3-4的原理跟上述一样,同样可以完成十六进制向二进制和十进制的转换功能。
INHEX子程序流程图如3-5:
图3-5输入十六进制数子程序流程图
流程图为输入一个四位十六进制的数,显示操作提示,并对输入的四位十六进制数进行判断,十六进制数的各位上要是出现超出0-9、a-f,就出现错误提示,程序将不会执行,返回重新输入。
OUTBIN子程序如图3-6,OUTOCT子程序如图3-7:
图3-6转换成二进制子程序流程图图3-7转换成八进制子程序流程图
图3-6、图3-7分别为十六进制转换成二进制和八进制的流程图,二进制的转换过程根据位权转换;而转换成八进制则是先转换成2进制再向八进制转换。
图OUTDEC子程序如图3-8,除权子程序DECIV如图3-9:
4程序模块
1)换行子程序CRLF:
将0DH(回车),0AH(换行)输出,达到换行的效果,子程序模块如下:
CRLFPROC;定义换行子程序
MOVAH,02H
MOVDL,0DH
INT21H
MOVDL,0AH
INT21H
RET
CRLFENDP
2)输入一个四位十六进制数,当输入不是0~F之间的数时,则显示出错提示“inputerror”,将输入的十六进制数存放在BX中。
子程序模块INHEX如下:
INHEXPROCNEAR;定义输入一个十六进制数子程序
LEADX,mess1;把mess3的首地址给DX
MOVAH,09H
INT21H;调用DOS功能,输出DX中字符串并显示
MOVBX,0;把BX清零
IHL1:
MOVAH,01H;输入一个字符并显示
INT21H
CMPAL,0DH
JZIHEXIT;按回车键时返回
SUBAL,30H;判断是否数字或字母
JLKKK;小于30H时显示出错信息
CMPAL,10;判断是否数字
JLIHL2
SUBAL,7;把AL内容减7转为字母
CMPAL,10;判断是否小写字母(a~f)
JLKKK
CMPAL,16
JBIHL2;小于则跳转
SUBAL,20H;判断是否大写字母(A~F)
CMPAL,10
JLKKK
CMPAL,16
JGEKKK
IHL2:
MOVCL,4;作为循环条件
SHLBX,CL
ORBL,AL
JMPIHL1
KKK:
MOVAH,09H;输入不是0~F之间的数时,则提示输入错误
LEADX,mess2
INT21H
JMPL
IHEXIT:
RET
INHEXENDP
3)输出二进制,将BX中数据循环左移1位,再将BL中数据送给DL,将DL中数据转换为ASCII码30H或31H,调用DOS功能,输出0或1,即输出二进制。
子程序模块OUTBIN如下所示:
OUTBINPROC
LEADX,mess3;把mess3的首地址给DX
MOVAH,09H
INT21H;调用DOS功能,输出DX中字符串并显示
MOVCX,16;计数
OBL1:
ROLBX,1;循环左移一位,将BX中最到位转换成最低位
MOVDL,BL;将BL中数据给DL
ANDDL,01H;DL中最低位取反
ORDL,30H;将DL中高四位转换为3,低四位不变
MOVAH,02H;调用DOS2号功能,将DL中数据输出并显示为0或1
INT21H
LOOPOBL1;循环OBL1
RET
OUTBINENDP
4)输出十进制,将各位的权送给CX,调用除权子程序,余数送入BX,将商送给DL输出,子程序模块OUTDEC如下所示:
OUTDECPROC
LEADX,mess4;把mess4的首地址给DX
MOVAH,9
INT21H;调用DOS功能,输出DX中字符串并显示
DEC1:
MOVCX,10000;把10000给CX,作为万位的权
CALLDEC2;调用DEC2除权子程序
MOVCX,1000;把1000给CX,作为千位的权
CALLDEC2;调用DEC2除权子程序
MOVCX,100;把100给CX,作为百位的权
CALLDEC2;调用DEC2除权子程序
MOVCX,10;把10给CX,作为十位的权
CALLDEC2;调用DEC2除权子程序
MOVCX,1;把1给CX,作为各位的权
CALLDEC2;调用DEC2除权子程序
RET
OUTDECENDP
5)除权子程序DEC2如下所示:
DEC2PROCNEAR;除以各位十进制的权
MOVAX,BX;把BX内容给AX
MOVDX,0;DX清零
DIVCX
MOVBX,DX
MOVDL,AL
ADDDL,30H;转换为ASCII码
MOVAH,2
INT21H
RET
DEC2ENDP
6)输出八进制,因为输入的是四位十六进制数,将BX送入AX,循环左移1位,将AL中高7位屏蔽,再将AL转换为ASCII码显示输出;将循环计数值置为5,BX循环左移3位,将BL送入AL,将高5位屏蔽,转换为ASCII码,显示输出,直到循环计数值减为0(即循环5次,一次转换3位,共转换15位)。
子程序模块OUTOCT如下所示:
OUTOCTPROCNEAR
LEADX,mess5;把mess4的首地址给DX
MOVAH,09H
INT21H;调用DOS功能,输出DX中字符串并显示
OCT1:
ROLBX,1;循环左移1位
MOVAX,BX;把输入的数送给AL
ANDAL,01H;将高七位屏蔽
ADDAL,30H;转换为ASCII码
MOVDL,AL;输出AL中数据
MOVAH,2
INT21H
MOVCH,5;剩余显示15位
OCT2:
MOVCL,3;移位数字3
ROLBL,CL;循环左移三位
MOVAL,BL;把输入的数送AL
ANDAL,07H;将高5位屏蔽
ADDAL,30H;转换为ASCII码
MOVDL,AL;输出AL
MOVAH,2
INT21H
DECCH;递减CH
JNZOCT2;CH不为0则跳转
RET
OUTOCTENDP
CODEENDS
ENDSTART
5调试结果分析
5.1调试过程
调试过程主要由编辑、汇编、链接和执行等几个步骤组成。
1)源程序的编辑:
编辑好汇编语言源程序后,保存为.asm文件。
2)源程序的汇编:
调用汇编程序对源程序进行翻译,生成.OBJ的目标文件。
在汇编过程中,源程序有错误生不成目标文件,经过多次修改最终生成目标文件。
3)目标程序的连接:
调用链接程序(LINK)将用户目标程序和库文件进行链接、定位,生成.EXE可执行文件。
4)调试可执行程序:
刚开始可执行程序运行之后没有得到预想的结果,又重新检查源程序的算法错误,重新编辑、汇编、链接和执行,得到了预想的结果。
5.2结果记录
经过多次调试、修改,测试结果胜利通过,符合要求:
1)键盘输入1时,提示输入一个十六进制数,输入之后按回车键,则输出一个二进制数,如图5-1所示:
由图5-1所示,调试
源程序,出现选择界面。
当
从键盘输入1时,提示输入
一个十六进制,输入2A时,
则输出的16位二进制数为:
0000000000101010,结果正
确。
图5-1十六进制转换为二进制
2)键盘输入2时,提示输入一个十六进制数,输入之后按回车键,则输出一个十进制数,如图5-2:
如右图5-2所示,调
试源程序,出现选择界面。
当从键盘输入2时,提示
输入一个十六进制,输入
2A时,则输出的五位十进
制数为:
00042,结果正确。
图5-2十六进制转换为十进制
3)键盘输入3时,提示输入一个十六进制数,输入之后按回车键,则输出一个八进制数,如图5-3:
如右图5-3所示,调
试源程序,出现选择界面。
当从键盘输入3时,提示
输入一个十六进制,输入
2A时,则输出的八进制数
为:
00052,结果正确。
图5-3十六进制转换为八进制
4)键盘输入1或2或3时,会提示输入一个十六进制数,若此时输入的输入十六进制数不是0~F之间的数,则会提示出错信息“inputerror”并提示重新输入,如图5-4:
如右图5-4所示,调
试源程序,出现选择界面。
当从键盘输入1或2或3
时,提示输入一个十六进
制,输入K时,则显示出
错信息“inputerror”,
并提示重新输入,与预期
结果一致。
图5-4输入出错提示
5)键盘输入0时,则退出DOS界面。
6)修改选择界面,输入四位十六进制数的进制转换结果如图5-5:
如图5-5所示,修改后的选择界面
比较简短,当从键盘输入1时,输入四
位十六进制数2A34时,输出二进制为:
0010101000110100;当从键盘输入2时,
输入四位十六进制数6586时,此时输
出十进制为25990;当从键盘输入3时,
输入四位十六进制数6BD1,此时输出八
进制数为65721。
与预期结果一致。
图5-5输入四位十六进制数
由以上调试得到的图形可知,调试结果与预期结果是一致的,程序可实现预期的功能。
6创新设计
在源程序的基础上通过修改程序过增加不同功能的子程序,通过过程间的相互调用,即可增加程序的功能,比如通过改进程序增加数制之间的转换,或者使出错信息显示出颜色等等。
6.1增加数制转换功能
原程序要求从十六进制转换到二进制、十进制、八进制,现利用原程序框架增加辅助子程序,可以增加以下辅助功能:
1)从二进制转换到十六进制,子程序如下:
INBINPROCNEAR;输入十六位二进制数
MOVBX,0
MOVCX,0
PUTIN:
CMPCX,16
JNBEXIT6;不小于则跳转
MOVAH,1
INT21H;输入一个字符并显示
CMPAL,1BH
JZEXIT6;相等则跳转
SUBAL,30H
JLEXIT6
CMPAL,1
JGEXIT6
CBW
INCCX
XCHGAX,BX;AX和BX内容交换
MOVDX,2
MULDX
XCHGAX,BX
ADDBX,AX
JMPPUTIN
EXIT6:
RET
INBINENDP
BETOHEPROCNEAR;把一个十六位二进制数转换成十六进制输出
START3:
LEADX,BUF5
MOVAH,9
INT21H
PUSHDS
SUBAX,AX
PUSHAX
CALLINBIN
CMPAL,1BH
JZEXIT5
CALLCRLF
CALLBINIHEX
CALLCRLF
JMPSTART3
EXIT5:
RET
BETOHEENDP
调用子程序即可实现从二进制数转换到十六进制数,具体实现过程与源程序相似,主程序是类似的,不多加叙述,具体调试结果也不作记录。
6.2显色功能
当输入不是十六进制数时,会显示出错信息‘inputerror’,此时出错信息是黑底白字的。
现在改进程序,利用BIOS中10H号功能调用,显示字符串为黑底蓝字。
BIOS中10H号功能调用表在附录中,在此不作详述。
对数据段定义改变如下:
DATASEGMENT
MENUdb'PleaseInputyourChoice:
',0dh,0ah
db'1:
Hex-->Bin',0dh,0ah
db'2:
Hex-->Dec',0dh,0ah
db'3:
Hex-->Oed',0dh,0ah
db'0:
Exit.',0dh,0ah,'$'
mess1db'PleaseinputaHexnumber:
$'
mess2db'inputerror',0DH,0AH
LENMEEQU$-mess2;mess2定义的数据段长度
mess4db'OutputBinis:
$'
mess5db'OutputDecis:
$'
mess6db'OutputOecis:
$'
TABLEdwL0,L1,L2,L3
DATAENDS
利用INT10H中AH设置显示方式,显示字符串方式,设置字符串属性,则可改变出错信息的显示。
INHEX子程序中标号KKK定义改变如下:
KKK:
MOVAL,3;设置彩色方式
MOVAH,0;设置显示方式
INT10H
MOVBP,SEGmess2
MOVES,BP;把串mess2基地址给ES
MOVBP,OFFSETmess2;把串mess2偏移地址给BP
MOVCX,LENME;把串mess2长度给CX
MOVDX,0;DX清零
MOVBL,01H;设置为黑底蓝字
MOVAL,1;光标跟随移动
MOVAH,13H;显示字符串
INT10H
JMPL;跳转到L
将改变后的程序,重新在源程序中编辑,则可实现预期功能,出错信息显示为蓝字。
调试结果如图6-1,6-2:
图6-1输入正确时调试结果图6-2输入错误时调试结果
由图6-1可以看出,当输入为0至F之间的十六进制数时,没有出错信息提示,调试结果为预期结果;由图6-2可以看出,当输入不为0至F之间的十六进制数时,有出错信息的提示,并且出错信息‘inputerror’显示为蓝色,得到了预期结果。
由以上设计可知,在源程序的基础上,稍作修改或增加辅助的子程序,通过过程间的相互调用,即可增加程序的功能。
7心得体会
通过这次的课程设计,让我对汇编有了更进一步的认识,加强了我对汇编语言编程的应用能力。
汇编语言程序设计是一门很抽象的学科,只是通过课堂的学习,会让我们刚开始很难接受,也不知道学这个最后能够有什么作用,学起来也比较乏味。
在理论学习中感到课程的困难,甚至想要放弃。
但在这次课程设计中,让我逐渐熟悉了汇编语言的一些基本的指令;掌握了汇编语言的一些基本的中断调用功能,突然发现原来语言的功能是很强大的,能够给我们带来不少乐趣。
这次的汇编课程设计,我自己所选的题目是《数制转换程序设计》,要求实现十六进制向二进制、十进制、八进制的转换。
在程序设计过程中遇到了不少问题,比如运行界面出现乱码、不能得到相应的转换等等问题,不断对程序进行修改、改进,增强了自己分析问题、解决问题的能力;在不断的调试中,也让自己发现了自己存在的一些错误以及一些调试时应注意的问题,同时也更深的理解了寄存器、存储器等工作原理以及一些指令执行后对它们的改变,例如INT指令会改变AL的值,在编程时应注意这方面的问题。
当设计一步步接近成功,每一个子程序的