汇编语言程序设计计算器Word下载.docx
《汇编语言程序设计计算器Word下载.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计计算器Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
通过定义宏show,用9号显示功能,通过变元str将字符串显示出来。
三.设计框图
开始
加载数据段附加段
显示界面
input输入数字或字符
输入的是=,数字,符号
SIGN1=0
保存数字
显示错误
=
数字
符号
SIGN2=0
n
y
下移2位将SIGN1赋0
设优先级,并判断是何符号
根据符号决定运算,将值存入numb
Output通过2号功能显示结果
是否继续
结束
Di+2
取number,operator的偏移地址
四.程序代码
DATASSEGMENT
STR1DB0AH,0DH,'
*******************************************$'
STR2DB13,10,'
*12345*$'
STR3DB13,10,'
*67890*$'
STR4DB13,10,'
*+-*/=*$'
STR5DB0AH,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
MOVDL,0AH
INT21H
ENDM
CODESSEGMENT
MAINPROCFAR
ASSUMECS:
CODES,DS:
DATAS
START:
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
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
ADD[DI],AX
JMPINPUT
CALLFUN
RET
MAINENDP
FUNPROCNEAR;
***********************************************************
LET0:
CMPWORDPTRSIGN2,0;
判断配对标志位
JELET1;
经过左括号和右括号抵消为0则跳转
JMPLET8;
否则跳转到BC显示输入错误
LET1:
CMPWORDPTRSIGN1,0
JELET2
ADDDI,2;
MOVWORDPTRSIGN1,0;
将数字标志位复0
LET2:
CALLDYFQ;
设定优先级
CMPCH,5;
判断输入的符号是否是左括号
JNELET3;
不是则判断输入的是否是右括号
INCWORDPTRSIGN2;
是左括号,括号标志位加1
LET3:
CMPCH,1;
判断输入的是否是右括号
JNELET4
DECWORDPTRSIGN2;
是右括号,括号标志位减1
LET4:
CMPBYTEPTR[SI],'
判断运算符存储区是否为空
JELET6
CMPCH,[SI];
[SI]的内容为前一个符号或其权值
JALET6
('
JNELET5
DECSI
LET5:
DECSI
MOVCL,[SI]
CALLYS;
判断是什么运算符并进行相应的计算
JMPLET4
LET6:
CMPCH,0;
判断是否是等号
JEOUTPUT
CMPCH,1
JEINPUT;
“)”不保存,输入下一个数
INCSI
MOV[SI],AL;
保存符号
判断是否是左括号
JNELET7
MOVCH,2;
改变(的权值
LET7:
MOV[SI],CH;
紧跟着保存符号的权值
JMPINPUT
LET8:
LEADX,ERROR
MOVAH,9
JMPEXIT
FUNENDP;
**********************************************************************
DYFQPROC;
子程序DYFQ调用宏FQ,判断优先级
FQ28H,1,5;
调用宏FQ为(赋权值
S1:
FQ29H,2,1;
调用宏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:
DYFQENDP;
*********************************************OUTPUT:
输出运算结果
SUBDI,2
CMPWORDPTR[DI],0
JGEK1
NEGWORDPTR[DI];
求负数的绝对值
MOVDL,'
-'
INT21H
K1:
MOVBX,10000
MOVCX,5
MOVSI,0
K2:
MOVAX,[DI]
CWD
DIVBX
MOV[DI],DX
CMPAL,0
JNEK3
CMPSI,0
CMPCX,1
JEK3
JMPK4
K3:
MOVDL,AL
ADDDL,30H
MOVSI,1
K4:
MOVAX,BX;
实现将10000变为1000,100,10
MOVDX,0
MOVBX,10
MOVBX,AX
LOOPK2
HCHH
SHOWSTR7
MOVAH,1
n'
判断是否继续输入,输入n则结束操作
JEEXIT
N'
MOVWORDPTR[DI+2],0
LEASI,OPERATOR
JMPSTART1
EXIT:
MOVAH,4CH
YSPROCNEAR;
子程序,进行相应的运算
PUSHAX
MOVAX,0
CMPCL,2AH;
乘法运算
JNECHU
XCHGBX,[DI]
XCHGAX,[DI]
IMULBX
MOV[DI],AX
ADDDI,2
JMPFINISH
CHU:
CMPCL,2FH;
除法运算
JNEJIA
SUBDI,2
IDIVBX
ADDDI,2
JIA:
CMPCL,2BH;
加法运算
JNEJIAN
ADD[DI],BX
JIAN:
CMPCL,2DH;
减法运算
JNEFINISH
SUB[DI],BX
FINISH:
POPAX
RET
YSENDP;
**************************************************************
CODESENDS
ENDSTART
五.运行结果
六.设计总结
本次设计让我学到了很多关于汇编的知识,首先,本次设计是以四则运算为主题,通过在课堂上学习的基本知识和基本方法以及平时积累的知识和方法来实现对带符号数的加减乘除运算,在设计过程中,对我已有的知识进行了巩固,对我之前不太了解的知识有了一定的了解,通过亲身去编写程序,使得自己的实际动手能力得以增强。
其次,通过本次设计,使我对模块化,结构化的程序设计方法掌握的更加透彻,再者,就是对于宏的定义,调用以及子程序的定义,调用的方法掌握的更加熟练。
本次设计是要实现对有符号数的加减乘除等四则运算,程序开始先定义了显示界面的诸多字符串,经过显示界面,接下来,定义了判断数字和判断运算符的存储区,通过这两个存储区来判断当前位置输入的是数字还是运算符,然后,定义了保存数字和保存运算符的存储区,提示错误的字符串,显示宏,赋权宏,回车换行宏等,通过主程序对各个宏及子程序的调用,判断出输入的是数字还是运算符,若是运算符又是运算符中的哪类运算符,然后,进行加减乘除运算,最后将运算结果存入保存数字的存储区中,运用到显示输出模块将最后的运算结果显示出来,从而实现了对带符号数的四则运算功能。
通过这次设计,我在汇编语言方面收获了很多东西,具体而言,在宏定义,宏调用和子程序定义,调用方面我学到了比以前更多的知识,尤其是通过子程序调用宏这种嵌套模式可以简化许多复杂的程序,让程序更加简洁易懂,此外,这次设计让我认识到了上课认真听讲的必要性,老师在课堂上讲解的许多知识都很重要,在本次设计中就充分体现了这一点,所以学好课堂老师讲解的知识是很有必要的。