汇编语言课程设计四则运算计算器设计.docx
- 文档编号:1858487
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:30
- 大小:68.66KB
汇编语言课程设计四则运算计算器设计.docx
《汇编语言课程设计四则运算计算器设计.docx》由会员分享,可在线阅读,更多相关《汇编语言课程设计四则运算计算器设计.docx(30页珍藏版)》请在冰点文库上搜索。
汇编语言课程设计四则运算计算器设计
目录
1设计目的1
2概要设计1
2.1系统总体分析1
2.2主模块框图及说明2
3详细设计3
3.1主模块及子模块说明3
3.2各模块详细设计3
3.2.1判定运算符模块设计3
3.2.2取运算数模块3
3.2.3计算模块4
3.2.4结果处理模块5
3.2.5输出模块5
3.2.6错误处理模块6
4程序调试7
4.1运行界面分析7
4.2调试过程及分析7
5心得体会8
5.1设计体会8
5.2系统改进8
参考文献10
附录11
实现加减乘除四则运算的计算器
1设计目的
汇编语言是继机器语言后出现的计算机程序设计语言,是计算机所能提供给用户使用的最快而又最有效的语言,也是能够利用计算机所有硬件特征并能够直接控制硬件的惟一语言。
因而了解之一语言的特性,并熟练掌握这一语言并应用于开发中便是计算机专业学生所必需掌握的技能之一。
本课程设计通过加减乘除四则运算计算器的设计,增强对于汇编语言寄存器、指令、伪指令、中断等的理解。
可通过编写的汇编程序完成基本的加减乘除四则运算。
主要功能:
能实现加减乘除的计算;该程序接受的是16进制数;执行时,需在文件名后直接跟上计算表达式,如在命令提示符下执行结果如下:
C:
\tasm>js3+2
5
2概要设计
2.1系统总体分析
四则运算计算器应当实现对用户输入表达式的处理。
根据用户输入的表达式,完成加减乘除四则运算。
程序自动判定表达式输入,并完成对于输入的16进制数的转换,同时计算结果并以10进制数输出。
对于异常情况程序应当进行处理,保证程序的正确运行。
设计一个计算器,在DOS界面下输入<程序名><表达式>可直接输出运算结果。
例如在DOS界面中输入JS3+6,可直接输出9。
程序接受16进制数输入,以十进制数输出运算结果。
对于输出错误情况,程序自动给出错误提示,若输入的格式有误,程序给出“JS
”(即表达式错误)提示。
程序需根据用户输入的表达式自动提取出运算符和操作数,之后根据用户输入的操作符进行四则运算,后将寄存器中存储的二进制数转换为10进制数输出。
程序应自动判断用户输入表达式的正确性,若输入的表达式有误,程序应输出错误提示后退出,防止因输入错误造成的程序崩溃。
程序流程图如下:
2.2主模块框图及说明
3详细设计
3.1主模块及子模块说明
模块设计是程序编制中的重要环节。
将复杂的程序模块化有助于程序的调试和修改,同时极大的方便了编程人员对于程序的调整。
在本程序中,将四则运算计算器分为了判定运算符模块,取运算数模块,计算模块,结果处理模块,输出模块和错误处理模块。
以下对这几个模块分别进行详细叙述。
3.2各模块详细设计
3.2.1判定运算符模块设计
判定运算符子程序主要通过调用判定加减运算符子程序和判定乘除运算符子程序完成对于运算符的判定。
在判定运算符子程序中,通过LODSB取输入串,之后通过CALL指令调用判定加减运算符子程序ISJJ,若判定不是加减运算,则程序顺序执行判定是否为乘除运算。
在加减、乘除判断子程序中,采用CMP指令判定运算符情况。
并根据运算符情况条转至相应的计算子程序。
注意,在此部分中考虑到用户输入的除法运算符可能有“\”或“/”两种情况,故在乘除判定子程序中分别考虑了两种情况的判定,保证程序的健壮性,使程序不会因输入错误产生错误提示。
故有如下指令:
CMPAL,'*'
JZISYSF1;*判定,若为/则转制*/\运算
CMPAL,'/'
JZISYSF1;/判定,若为/则转制*/\运算
CMPAL,'\'
3.2.2取运算数模块
取运算数模块主要用来将参与计算的运算数取出。
通过LODSB载入串后,程序判定输入的是“1”-“9”间的数还是“A”-“F”间的数(输入数以十六进制表示)并进行相应的处理,通过CMP指令判定输入的运算数类型,将其对应的ASCII码转换为数值,通过寄存器寻址方式将其数值(二进制)保存在DX:
AX寄存器中。
具体实现如下(部分代码省略,见附录1):
ANDAX,0FH
SHLDI,1
RCLDX,1
MOVBX,DI
MOVBP,DX
SHLDI,1
RCLDX,1
SHLDI,1
RCLDX,1
JCXZDATE3
SHLDI,1
RCLDX,1
JmpshortDATE4
……
针对用户可能存在的在输入“A”-“F”时的大小写问题,程序中采用了两条CMP语句判定输入情况并根据输入的情况跳转至DATA5地址进行数据的处理。
即为如下指令:
JCXZDATE7
CMPAL,'A'
JBDATE7
CMPAL,'F'
JBEDATE5
CMPAL,'a'
JBDATE7
CMPAL,'f'
JBEDATE5
3.2.3计算模块
根据前两个模块的处理结果,将运算符和运算数取出后便可进行计算。
通过调用加减子程序和乘除子程序完成计算。
由于允许用户输入的数据为32位整数,超出了AX/DX单寄存器所能保存的范围,故通过DX:
AX寄存器存储运算后的数。
故在加减运算中,需使用ADDNUM1,AX;ADCNUM1+2,DX或SUBNUM1,AX;SBBNUM1+2,DX语句序列完成运算以确保进位不会丢失。
在乘法运算中,将乘数保存在CX寄存器中,在除法运算中,将除数保存在CX寄存器中以完成运算。
具体实现如下:
CMPYSF1,'+'
SUBNUM1,AX
SBBNUM1+2,DX;减法运算
ADDNUM1,AX
ADCNUM1+2,DX;加法运算
……
CMPYSF2,'*'
JNZJSII2_2
DB66H
IMULCX;乘法运算
……
DB66H
IDIVCX;除法运算
CMPYSF2,'/'
JZJSII2_3
3.2.4结果处理模块
结果处理模块主要包括运算结果由二进制向十进制的转化和保存运算结果两个子程序。
由于运算后,在DX:
AX寄存器中保存的操作数为二进制数,在输出前需将其转换成十进制数并将其对应的ASCII码保存在寄存器中。
二进制转化为十进制即从最高位开始,每次除以最高位整数。
保存商在AX中,余数在DX中。
之后除以次高位循环,一直除到最后一位为止。
在保存结果模块中,将通过数制转换模块形成的十进制数的ASCII码保存在寄存器中,使用寄存器寻址方式和基址变址寻址方式。
MOVAH,52H
INT21H
MOVAX,ES:
[BX-2]
MOVDS,AX
MOVAX,CS:
JGV4
MOVDS:
[0CH],AX
MOVAX,CS:
JGV4+2
MOVDS:
[0EH],AX
3.2.5输出模块
输出模块包括换行符,制表符和运算结果的输出。
程序在完成计算后将寄存器中的数取出,通过INT21H中断的2号功能将结果输出到屏幕上。
同时为了保证输出结果的美观,在用户按下Enter键后,首先输入一个回车符和一个制表符,这样可以保证输出的结果与用户输入的表达式对齐,使程序人机界面更加美观。
输出模块具体实现如下:
MOVAL,9
JMPSHORTDISP
9即代表制表符的ASCII码。
程序将9送入AL中,通过调用DISP子程序输出一个制表符。
MOVAL,13
CALLDISP
MOVAL,10
13即代表回车符的ASCII码。
程序将13送入AL寄存器中,通过调用DISP子程序输出一个回车符。
PUSHAX
PUSHDX
MOVAH,2
MOVDL,AL
INT21H
程序通过调用21号中断的2号功能实现对于单个字符的输出。
单个字符可以表示运算结果,也可以表示回车符或换行符。
在需要输出单个字符时,程序均通过调用DISP子程序实现。
3.2.6错误处理模块
虽然在程序编制过程中已经考虑到了一些潜在错误的处理,如除号输入方式的不同,和16位A-F数输入大小写的问题,但是仍不能保证程序的健壮性。
在针对用户输入的错误表达式时,仍然需要程序做出相应的反应避免因输入错误造成的可能的程序崩溃。
因此仍然需要进行错误处理。
针对于用户可能出现的表达式形式错误,如输入诸如“+32”等错误表达式,程序将跳转至MESS1符号地址处同时输出错误,针对用户可能出现的表达式错误,如输入“3+g”等,程序将跳转至MESS2符号地址处同时输出错误,之后程序将自动退出,以避免崩溃。
此部分实现如下:
MESS1DB13,10,'Syntax:
',13,10
DB'JS
MESS2DB'Errorinexpression!
$'
MESS3DB13,10,'$'
4程序调试
4.1运行界面分析
本程序直接在DOS提示符下出入JS+表达式,回车后即自动输出运算结果,故无传统意义上的运行界面。
4.2调试过程及分析
分别输入加、减、乘、除四个运算表达式,查看程序的运行结果,以测试程序的正确性和功能的完整性。
输入错误的表达式格式,查看程序运行结果。
输入错误的表达式,查看程序运行结果以测试程序的健壮性。
输入JS3+2,程序运行结果如下:
输入JS5-4,程序运行结果如下:
输入JS5*1,程序运行结果如下:
输入JSa/2,程序运行结果如下:
输入JSA\2,程序运行结果如下:
输入JS+11,程序运行结果如下:
输入JS1+G,程序运行结果如下:
测试表明,程序可以自动判定输入的运算符和运算数,并根据用户输入的表达式自动将2进制转换为10进制并输出计算结果,在输入的表达式错误时,程序可以输出不同类型的错误提示。
综上,根据测试,程序功能符合要求。
5心得体会
5.1设计体会
本程序通过对四则运算计算器的编写,用汇编语言时间了加、减、乘、除四则运算功能,根据用户输入的表达式可以自动计算出结果并输出在屏幕上。
经测试表明程序运行结果与预期结果一致,较好地实现了课程设计所预设的各项功能。
通过在程序编写过程中,考虑到了一定的错误情况,并针对可能的错误进行了一定的处理,保证了程序的健壮性。
通过课程设计过程,综合运用到了汇编语言寄存器、操作数、指令与伪指令、分支、循环程序设计、子程序和中断调用等方面的知识,通过模块的合理划分降低了程序编写的难度,在程序写作过程中及时添加注释以方便程序错误的查找和对程序的修改。
使我对于汇编语言的理解更加深入,对于程序设计的过程也有了一定的了解,同时培养了良好的编程风格,为今后对于其他计算机语言的学习打下了坚实的基础。
5.2系统改进
同时应当看到,这个程序还存在着很大的不足。
例如只能完成对于两个操作数表达式的运算,在一次运算结束后无法根据用于意愿进行下次输入或是退出的选择,每次只能执行一个表达式的运算,无法处理括号等复杂的运算符,程序健壮性仍然有待改进等等。
在今后的改进中,应当重点改进用户界面上。
现有的用户界面的用户交互性不足,直接输入表达式虽然简便,但是容易造成用户表达式的输入错误,从而造成程序发生错误。
虽然在设计过程中已经针对于此考虑到了一些情况,但是在测试过程中仍会发现CPU运行错误等未预料到的问题。
因此在改进中,应当增加用户界面。
在输入JS后,可以提示用户输入运算数和运算符,从而避免输入错误造成的程序错误。
参考文献
[1]姚燕南,薛钧义主编.微型计算机原理与接口技术.高等教育出版社,2004.11
[2]温冬蝉,沈美明.IBM PC汇编语言程序设计.第2版.北京:
清华大学出版社,2002.3
[3]齐志儒,高福祥主编.汇编语言程序设计.第2版.东北大学出版社,2001.1
[4]张弥左,王兆月,邢立军编著.微型计算机接口技术.机械工业出版社
[5]吴秀清.微型计算机原理与接口技术.合肥:
中国科技大学出版社,2003
[6]易先清.微型计算机原理与应用.北京:
电子工业出版社,2001
[7]李敬兆.8086/8088和基于ARM核汇编语言程序设计.第二版.合肥:
中国科学技术大学出版社,2008.9
[8]王爽.汇编语言.北京:
清华大学出版
附录
附录1源程序清单
B_PEQUBYTEPTR
W_PEQUWORDPTR
D_PEQUDWORDPTR
CODESEGMENT
ASSUMECS:
CODE,DS:
CODE
ORG100H
START:
;主程序开始
JMPSTAR
EVEN
NUM1DW0,0
NUM2DW0,0
NUM3DW0,0
JGV4DW0,0
YSFLABELWORD
YSF1DB0
YSF2DB0
JUVDB0
UVDB0
OVERSLABELNEAR;使DS:
SI指向第一有效字符
CLD
PUSHAX
OVERS1:
LODSB
CMPAL,'';判定是空格否
JZOVERS1
CMPAL,9;判定是水平制表符否
JZOVERS1
DECSI
CMPAL,13;判定是垂直制表符否
POPAX
RET
TABLABELNEAR;输出一个制表符
MOVAL,9
JMPSHORTDISP
CRLFLABELNEAR;输出一个回车换行符
MOVAL,13
CALLDISP
MOVAL,10
DISPLABELNEAR;显示一个字符
PUSHAX
PUSHDX
MOVAH,2
MOVDL,AL
INT21H
POPDX
POPAX
RET
ISYSFLABELNEAR;检查是否为运算符
CLD
LODSB
CALLISJJ;调用+/-运算符判定
JZISYSF1;-判定,若为-则转至+/-运算
CALLISII;调用*/\运算符判定
JZISYSF1;/判定,若为/则转制*/\运算
DECSI
ISYSF1:
RET
ISJJLABELNEAR;检查是否是加减运算
CMPAL,'+'
JZISYSF1;+判定,若为+则转至+/-运算
CMPAL,'-'
RET
ISIILABELNEAR;检查是否为乘除运算
CMPAL,'*'
JZISYSF1;*判定,若为/则转制*/\运算
CMPAL,'/'
JZISYSF1;/判定,若为/则转制*/\运算
CMPAL,'\'
RET
DOUTLABELNEAR;数据输出CX=10十进制,CX=16十六进制
PUSHAX
PUSHBX
PUSHDX
PUSHBP
XORBP,BP
DOUT1:
INCBP
PUSHAX
MOVAX,DX
XORDX,DX
DIVCX
MOVBX,AX
POPAX
DIVCX
PUSHDX
MOVDX,BX
ORBX,AX
JNZDOUT1
DOUT2:
POPAX
ADDAL,'0'
CMPAL,'9'
JBEDOUT3
ADDAL,'A'-'9'-1
DOUT3:
CALLDISP
DECBP
JNZDOUT2
POPBP
POPDX
POPBX
POPAX
RET
;输入数据在DX:
AX中返回
;CX=0数据为10进制
;CX#0数据为16进制
DATELABELNEAR
PUSHBX
PUSHBP
PUSHDI
XORAX,AX
XORDX,DX
DATE1:
MOVDI,AX
LODSB
CMPAL,'0'
JBDATE7
CMPAL,'9'
JADATE6
DATE2:
ANDAX,0FH
SHLDI,1
RCLDX,1
MOVBX,DI
MOVBP,DX
SHLDI,1
RCLDX,1
SHLDI,1
RCLDX,1
JCXZDATE3
SHLDI,1
RCLDX,1
JmpshortDATE4
DATE3:
ADDDI,BX
ADCDX,BP
DATE4:
ADDAX,DI
ADCDX,0
JMPDATE1
DATE5:
ADDAL,9
JMPDATE2
DATE6:
JCXZDATE7
CMPAL,'A'
JBDATE7
CMPAL,'F'
JBEDATE5
CMPAL,'a'
JBDATE7
CMPAL,'f'
JBEDATE5
DATE7:
MOVAX,DI
DECSI
ORDI,DX
POPDI
POPBP
POPBX
RET
;数据1与数据2根据YSF1进行加减运算
JSJJLABELNEAR
MOVAX,NUM2
MOVDX,NUM2+2
CMPYSF1,'+'
JZJSJJ1
SUBNUM1,AX
SBBNUM1+2,DX
JMPSHORTJSJJ2
JSJJ1:
ADDNUM1,AX
ADCNUM1+2,DX
JSJJ2:
RET
;数据1与数据2根据YSF1进行乘除运算
JSII1LABELNEAR
MOVBX,OFFSETNUM1
JMPSHORTJSII2_1
;数据2与数据3根据YSF2进行乘除运算
JSII2LABELNEAR
MOVBX,OFFSETNUM2
JSII2_1:
DB66H
MOVAX,[BX]
DB66H
MOVCX,[BX+4]
CMPYSF2,'*'
JNZJSII2_2
DB66H
IMULCX
JMPSHORTJSII2_3
JSII2_2:
DB66H
CWD
DB66H
IDIVCX
CMPYSF2,'/'
JZJSII2_3
DB66H
XCHGDX,AX
JSII2_3:
DB66H
MOV[BX],AX
RET
;显示结果
XUJGLABELNEAR
MOVAX,JGV4
MOVDX,JGV4+2
MOVCX,10
CMPUV,10
JZXUJG0
MOVCX,16
XUJG0:
TESTDX,8000H
JZXUJG1
CMPUV,10
JZXUJG2
CALLDOUT
XUJG2:
NOTAX
NOTDX
ADDAX,1
ADCDX,0
PUSHAX
CMPUV,10
JZXUJG3
MOVAL,''
CALLDISP
MOVAL,'('
CALLDISP
XUJG3:
MOVAL,'-'
CALLDISP
POPAX
CMPUV,10
JZXUJG1
CALLDOUT
MOVAL,')'
CALLDISP
RET
XUJG1:
CALLDOUT
RET
;计算结果放入DX:
AX中
JSJGLABELNEAR
CALLJSJJ
MOVAX,NUM1
MOVDX,NUM1+2
RET
;从DS:
SI处取一个数据
LOADATELABELNEAR
LODSB
CMPAL,'('
JZLOADATE1
DECSI
PUSHCX
XORCX,CX
CMPUV,10
JZLOADATE0
INCCX;取16进制数
LOADATE0:
CALLDATE;取数据放入DX:
AX中
POPCX
RET
LOADATE1:
PUSHNUM1;保存数据1数据2及运算符
PUSHNUM1+2
PUSHNUM2
PUSHNUM2+2
PUSHYSF
INCJUV
MOVJGV4,0;结果值清零
MOVJGV4+2,0
;进行四则运算
SZYSLABELNEAR
CALLISYSF;首字符是运算符?
JZSZYS2
CALLLOADATE;不是,取数并保存
MOVNUM1,AX
MOVNUM1+2,DX
SZYS1:
XORAX,AX;数据2清零
MOVNUM2,AX
MOVNUM2+2,AX
CALLISYSF;下个是运算符?
JZSZYS3
JNZSZYS6
SZYS2:
PUSHAX
MOVAX,JGV4;将结果作为数据1
MOVNUM1,AX
MOVAX,JGV4+2
MOVNUM1+2,AX
POPAX
SZYS3:
MOVYSF1,AL
MOVYSF2,AL
CALLISJJ;是加减运算转
JZSZYS4
CALLLOADATE;取数据2
MOVNUM2,AX
MOVNUM2+2,DX
CALLJSII1;数据1与数据2根据YSF1进行乘除运算
JMPSZYS1;结果保存在数据1中
SZYS4:
CALLLOADATE;取数据2并保存
MOVNUM2,AX
MOVNUM2+2,DX
SZYS4_1:
CALLISYSF
JNZSZYS6
CALLISJJ;运算符2是加减运算?
JNZSZYS5;不是转
PUSHAX
CALLJSJJ;数据1与数据2根据YSF1进行加减运算
POPAX;结果保存在数据1中
MOVYSF1,AL;保存新的运算符
JMPSZYS4
SZYS5:
MOVYSF2,AL;保存运算符2
CALLLOADATE;取数据3
MOVNUM3,AX
MOVNUM3+2,DX
CALLJSII2;数据2与数据3根据YSF2进行乘除运算
JMPSZYS4_1;结果保存在数据2中
SZYS6:
MOVCL,AL
CMPAL,13
JNZSZYS9
SZYS7:
CALLJSJG
CMPJUV,0
JZSZYS8
DECJUV
POPY
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 课程设计 四则运算 计算器 设计