汇编语言程序设计计算器.docx
《汇编语言程序设计计算器.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计计算器.docx(13页珍藏版)》请在冰豆网上搜索。
汇编语言程序设计计算器
课程设计说明书
题目:
表达式计算器
学号:
班级:
计算机创新实验班姓名:
廖福轩
一.设计内容2
二.设计方案错误!
未定义书签
1.主程序模块.错误!
未定义书签
2.赋权值模块.错误!
未定义书签
3.加减乘除运算子程序模块.错误!
未定义书签
4.调用赋权宏子程序模块.错误!
未定义书签
5.回车换行宏模块.错误!
未定义书签。
号功能显示字符串宏模块.2
三.设计框图3
四.程序代码4
五.运行结果
六.设计总结
错误!
未定义书签
错误!
未定义书签
计算器汇编语言程序设计
一.设计内容
从键盘输入一个十进制两位数的四则运算表达式,如23*56—(8*19)/6+67—8=,编程计算
表达式的值,输出十进制结果(有可能是三位或四位十进制),+-*/位置任意。
并要求程序能
反复执行直道对“还要继续吗(y/n)”之类的提示回答“n”或“N”为止。
四则运算主要包括以下几个模块:
主程序模块.
赋权宏模块.加减乘除运算子程序模块.
调用赋权宏子程序模块.回车换行宏模块.
9号功能显示字符串宏模块.
二.设计方案
1.主程序模块.
主程序初始化数据段,调用显示宏show显示界面,输入字符或数字并判断,调用子程序dyfq
调用赋权宏fq为符号赋权,从而判断优先级,调用加减乘除运算子程序ys对判断出的相应运算
符进行运算,输出运算结果,判断是否继续,继续则返回输入,不继续则退出程序.
2.赋权宏模块.
通过定义宏fq,定义了变元a,b进行参数传递,并使用替换运算符&使变元a与标号s对应.接着给对应的符号赋予权值,将其权值存入ch中.
3.加减乘除运算子程序模块.
运算模块实现了将ax入栈保存,然后将ax,bx赋值为0,判断cl中的符号是否为乘号*,若为乘号*则将number中的数字与其下一位的数字相乘,并把结果存入该位置,类似的若不为乘号*
则接着判断是否为除号/,若为除号/则进行除法运算,然后判断是否为加法,为加法则进行加法运算,接着判断是否为减法,为减法则进行减法运算并将结果存入当前的计算的第二个数的位置.
4.调用赋权宏子程序模块.
该模块实现了调用赋权宏fq为(,),*,/,+,-,=等符号分别赋权值为5,1,4,4,3,3,0.从而可以通过设定的权值来判断优先级.
5.回车换行宏模块.
通过2号功能的输出功能,将0dh赋予dl输出,再调用2号功能,将0ah赋予dl输出,从而实现回车换行功能.
号功能显示字符串宏模块.
通过定义宏show,用9号显示功能,通过变元str将字符串显示出来。
.设计框图
四.程序代码
DATASSEGMENT
STR1DBOAH,ODH,'*******************************************$
STR2
DB13,10,'*
1
2
3
4
5
STR3
DB13,10,'*
6
7
8
9
0
STR4
DB13,10,'*
+
-
*
/
=
STR5
DB0AH,0DH,
*$'
*$'
*$'
STR6DB13,10,'PLEASEINPUTAFORMULA:
$'
STR7DB'CONTINUE(Y/N)$'
SIGN1DW0;值为0代表输入的不是数字,为1代表输入的是数字
SIGN2DW0;值为0代表输入的符号是匹配的,为1输入的符号不匹配
NUMBERDW20DUP(0);保存输入的数值
OPERATORDB'$';判断输入的运算符是否为空
DB10DUP(0);保存该运算符对应的权值ERRORDB'WRONG!
$'
DATASENDS
SHOWMACROSTR;宏定义,显示字符串
LEADX,STR
MOVAH,9
INT21H
ENDM
FQMACROASCII,A,B;宏定义,给运算符赋权值
CMPAL,ASCII
JNES&A
MOVCH,B
JMPS7
ENDM
HCHHMACRO;宏定义,回车换行
MOVAH,2
MOVDL,0DH
INT21H
MOVAH,2
MOVDL,0AH
INT21H
ENDM
CODESSEGMENT
MAINPROCFAR
ASSUMECS:
CODES,DS:
DATASSTART:
MOVAX,DATAS
MOVDS,AX
LEADI,NUMBER
LEASI,OPERATOR
SHOWSTR1
SHOWSTR2
SHOWSTR3
SHOWSTR4
SHOWSTR5
SHOWSTR6
MOVAX,0
MOVBX,0
MOVCX,0
MOVDX,0
START1:
HCHH
INPUT:
MOVAH,1
INT21H
CMPAL,'='
JELET0
CMPAL,28H;第二种情况,第一次输入的与28H也就是‘('比较
JBINPUT;小于28H=(则重新输入
CMPAL,39H
JAINPUT;大于39H=9则重新输入
CMPAL,2FH;判断是数字还是符号
JBELET1;是符号转入响应操作
INCWORDPTRSIGN1;是数字的话将数字标志位加1
SUBAL,30H
MOVAH,0
XCHGAX,[DI]
MULBX
MOVBX,10
XCHGAX,[DI]
ADD[DI],AX
JMPINPUT
CALLFUN
RET
MAINENDP
FUNPROCNEAR;
***********************************************************
LET0:
CMPWORDPTRSIGN2,0判断配对标志位
JELET1
JMPLET8
LET1:
;经过左括号和右括号抵消为0则跳转
;否则跳转到BC显示输入错误
CMPWORDPTRSIGN1,0
JELET2
ADDDI,2;
MOVWORDPTRSIGN1,0将数字标志位复0LET2:
CALLDYFQ
CMPCH,5
;设定优先级
;判断输入的符号是否是左括号
JNELET3;不是则判断输入的是否是右括号
INCWORDPTRSIGN2;是左括号,括号标志位加1
LET3:
CMPCH,1;判断输入的是否是右括号
JNELET4
DECWORDPTRSIGN2;是右括号,括号标志位减1
LET4:
;判断运算符存储区是否为空
CMPBYTEPTR[SI],'$'
JELET6
CMPCH,[SI]
JALET6
CMPBYTEPTR[SI],'('
JNELET5
DECSI
JMPINPUT
LET5:
DECSI
MOVCL,[SI]
CALLYS
JMPLET4
LET6:
CMPCH,0
JEOUTPUT
CMPCH,1
JEINPUT
INCSI
MOV[SI],AL
INCSI
CMPCH,5
JNELET7
MOVCH,2
LET7:
MOV[SI],CH
JMPINPUT
LET8:
LEADX,ERROR
MOVAH,9
INT21H
JMPEXIT
;[SI]的内容为前一个符号或其权值
;判断是什么运算符并进行相应的计算
;判断是否是等号
;“)”不保存,输入下一个数
;保存符号
;判断是否是左括号
;改变(的权值
;紧跟着保存符号的权值
RET
FUNENDP;
**********************************************************************
FQ28H,1,5
S1:
FQ29H,2,1
;调用宏FQ为(赋权值
;调用宏FQ为)赋权值
DYFQPROC
;子程序DYFQ调用宏FQ,判断优先级
S2:
FQ2AH,3,4
;调用宏
FQ为*赋权值
S3:
FQ2FH,4,4
;调用宏
FQ为/赋权值
S4:
FQ2BH,5,3
;调用宏
FQ为+赋权值
S5:
FQ2DH,6,3
;调用宏
FQ为-赋权值
S6:
FQ3DH,7,0
;调用宏
FQ为=赋权值
S7:
RET
DYFQENDP;
*********************************************
OUTPUT:
输出运算结果
SUBDI,2
CMPWORDPTR[DI],0
JGEK1
NEGWORDPTR[DI];求负数的绝对值
MOVDL,'-'
MOVAH,2
INT21H
K1:
MOVBX,10000
MOVCX,5
MOVSI,0
K2:
MOVAX,[DI]
CWD
DIVBX
MOV[DI],DX
CMPAL,0
JNEK3
CMPSI,0
JNEK3
CMPCX,1
JEK3
JMPK4
K3:
MOVDL,AL
ADDDL,30H
MOVAH,2
INT21H
MOVSI,1
K4:
MOVAX,BX;实现将10000变为1000,100,10
MOVDX,0
MOVBX,10
DIVBX
MOVBX,AX
LOOPK2
HCHH
SHOWSTR7
MOVAH,1
INT21H
n则结束操作
CMPAL,'n';判断是否继续输入,输入
JEEXIT
CMPAL,'N'
JEEXIT
MOVWORDPTR[DI+2],0
LEADI,NUMBER
LEASI,OPERATOR
JMPSTART1
EXIT:
MOVAH,4CH
INT21H
YSPROCNEAR子程序,进行相应的运算
PUSHAX
MOVAX,0
MOVBX,0
CMPCL,2AH;乘法运算
JNECHU
SUBDI,2
XCHGBX,[DI]
SUBDI,2
XCHGAX,[DI]
IMULBX
MOV[DI],AX
ADDDI,2
JMPFINISH
CHU:
CMPCL,2FH;除法运算
JNEJIA
SUBDI,2
XCHGBX,[DI]
SUBDI,2
XCHGAX,[DI]
CWD
IDIVBX
MOV[DI],AX
ADDDI,2
JMPFINISH
JIA:
CMPCL,2BH;加法运算
JNEJIAN
SUBDI,2
XCHGBX,[DI]
SUBDI,2
ADD[DI],BX
ADDDl,2
JMPFINISH
;减法运算
JIAN:
CMPCL,2DH
JNEFINISH
SUBDI,2
XCHGBX,[DI]
SUBDI,2
SUB[DI],BX
ADDDI,2
FINISH:
POPAX
RET
YSENDP;
**************************************************************
CODESENDS
ENDSTART
五.运行结果
六.设计总结
本次设计让我学到了很多关于汇编的知识,首先,本次设计是以四则运算为主题,通过在课堂上
学习的基本知识和基本方法以及平时积累的知识和方法来实现对带符号数的加减乘除运算,在设
计过程中,对我已有的知识进行了巩固,对我之前不太了解的知识有了一定的了解,通过亲身去
编写程序,使得自己的实际动手能力得以增强。
其次,通过本次设计,使我对模块化,结构化的程序设计方法掌握的更加透彻,再者,就是对于宏的定义,调用以及子程序的定义,调用的方法
掌握的更加熟练。
本次设计是要实现对有符号数的加减乘除等四则运算,程序开始先定义了显示界面的诸多字符
串,经过显示界面,接下来,定义了判断数字和判断运算符的存储区,通过这两个存储区来判断
当前位置输入的是数字还是运算符,然后,定义了保存数字和保存运算符的存储区,提示错误的
字符串,显示宏,赋权宏,回车换行宏等,通过主程序对各个宏及子程序的调用,判断岀输入的是数字还是运算符,若是运算符又是运算符中的哪类运算符,然后,进行加减乘除运算,最后将运算结果存入保存数字的存储区中,运用到显示输岀模块将最后的运算结果显示岀来,从而实现
了对带符号数的四则运算功能。
通过这次设计,我在汇编语言方面收获了很多东西,具体而言,在宏定义,宏调用和子程序定义,
调用方面我学到了比以前更多的知识,尤其是通过子程序调用宏这种嵌套模式可以简化许多复杂
的程序,让程序更加简洁易懂,此外,这次设计让我认识到了上课认真听讲的必要性,老师在课
堂上讲解的许多知识都很重要,在本次设计中就充分体现了这一点,所以学好课堂老师讲解的知
识是很有必要的。