当前位置:文档之家› 汇编语言程序设计————计算器.doc

汇编语言程序设计————计算器.doc

课程设计说明书题目 :表达式计算器学号:班级 : 计算机创新实验班姓名:廖福轩目录一.设计内容 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 将字符串显示出来。

三.设计框图开始加载数据段附加段显示界面input 输入数字或字符= 输入的是=,数字,符号符号数字保存数字SIGN1=0 ny 下移 2 位将设优先级,并判SIGN1赋 0断是何符号取 number,operator的偏移地址根据符号决定运算,将值存入numbOutput 通过 2 号Di+2功能显示结果y是否继续n结束四.程序代码DATAS SEGMENTSTR1DB 0AH,0DH,'*******************************************$' SIGN2=0n显示错误ySTR2 DB 13,10, '* 1 2 3 4 5 *$'STR3 DB 13,10, '* 6 7 8 9 0 *$'STR4 DB 13,10, '* + - * / = *$'STR5 DB 0AH,0DH,'*******************************************$'STR6 DB 13,10, 'PLEASE INPUT A FORMULA: $'STR7 DB 'CONTINUE(Y/N)$'SIGN1 DW 0;值为 0 代表输入的不是数字,为 1 代表输入的是数字SIGN2 DW 0;值为 0 代表输入的符号是匹配的,为 1 输入的符号不匹配NUMBER DW 20 DUP(0) ;保存输入的数值OPERATOR DB '$';判断输入的运算符是否为空DB 10 DUP(0);保存该运算符对应的权值ERROR DB 'WRONG!$'DATAS ENDSSHOW MACRO STR;宏定义 ,显示字符串LEA DX,STRMOV AH,9INT 21HENDMFQ MACRO ASCII,A,B;宏定义 ,给运算符赋权值CMP AL,ASCIIJNE S&AMOV CH,BJMP S7ENDMHCHH MACRO;宏定义 ,回车换行M OV AH,2M OV DL,0DHINT 21HM OV AH,2M OV DL,0AHINT 21HENDMCODES SEGMENTMAIN PROC FARASSUME CS:CODES,DS:DATASSTART:M OV AX,DATASM OV DS,AXLEA DI,NUMBERLEA SI,OPERATORSHOW STR1SHOW STR2SHOW STR3SHOW STR4SHOW STR5SHOW STR6M OV AX,0M OV BX,0M OV CX,0M OV DX,0START1:HCHHINPUT:MOV AH,1INT 21HCMP AL,'='JE LET0CMP AL,28H ;第二种情况,第一次输入的与28H 也就是‘(’比较JB INPUT ; 小于28H=( 则重新输入CMP AL,39HJA INPUT CMP AL,2FHJBE LET1 ;大于 39H=9 则重新输入;判断是数字还是符号;是符号转入响应操作INC WORD PTR SIGN1 ; 是数字的话将数字标志位加 1SUB AL,30HMOV AH,0XCHG AX,[DI]MUL BXM OV BX,10XCHG AX,[DI]ADD [DI],AXJMP INPUTCALL FUNRETMAIN ENDPFUN PROC NEAR;***********************************************************LET0:CMP WORD PTR SIGN2,0;判断配对标志位JE LET1;经过左括号和右括号抵消为JMP LET8;否则跳转到BC 显示输入错误LET1:CMP WORD PTR SIGN1,0JE LET2ADD DI,2;M OV WORD PTR SIGN1,0 将;数字标志位复0LET2:CALL DYFQ;设定优先级CMP CH,5;判断输入的符号是否是左括号0 则跳转JNE LET3;不是则判断输入的是否是右括号INC WORD PTR SIGN2 ;是左括号,括号标志位加 1LET3:CMP CH,1;判断输入的是否是右括号JNE LET4DEC WORD PTR SIGN2 ;是右括号,括号标志位减 1LET4:CMP BYTE PTR[SI],'$';判断运算符存储区是否为空JE LET6CMP CH,[SI];[SI]的内容为前一个符号或其权值JA LET6CMP BYTE PTR[SI],'('JNE LET5DEC SIJMP INPUTLET5:DEC SIM OV CL,[SI]CALL YS;判断是什么运算符并进行相应的计算JMP LET4LET6:CMP CH,0;判断是否是等号JE OUTPUTCMP CH,1JE INPUT;“ )”不保存,输入下一个数INC SIM OV [SI],AL; 保存符号INC SICMP CH,5;判断是否是左括号JNE LET7M OV CH,2;改变 (的权值LET7:M OV [SI],CH;紧跟着保存符号的权值JMP INPUTLET8:LEA DX,ERRORM OV AH,9INT 21HJMP EXITRETFUN ENDP;********************************************************************** DYFQ PROC ;子程序DYFQ调用FQ,判断优先级宏FQ 28H,1,5 ;调用宏FQ 为 (赋权值S1:FQ 29H,2,1 ;调用宏FQ 为)赋权值S2:FQ 2AH,3,4 S3:FQ 2FH,4,4 ;调用宏;调用宏FQ为*赋权值FQ 为 /赋权值S4:FQ 2BH,5,3 ;调用宏FQ 为 +赋权值S5:FQ 2DH,6,3 S6:FQ 3DH,7,0 ;调用宏;调用宏FQ 为 -赋权值FQ 为 =赋权值S7:RETDYFQ ENDP;********************************************* OUTPUT: ; 输出运算结果K1: K2:K3: K4: SUB DI,2CMP WORD PTR[DI],0JGE K1NEG WORD PTR[DI]M OV DL,'-'M OV AH,2INT 21HMOV BX,10000M OV CX,5M OV SI,0MOV AX,[DI]CWDDIV BXM OV [DI],DXCMP AL,0JNE K3CMP SI,0JNE K3CMP CX,1JE K3JMP K4MOV DL,ALADD DL,30HM OV AH,2INT 21HM OV SI,1MOV AX,BXM OV DX,0M OV BX,10;求负数的绝对值;实现将10000 变为1000,100,10DIV BXM OV BX,AXLOOP K2HCHHSHOW STR7M OV AH,1INT 21HCMP AL,'n';判断是否继续输入,输入n 则结束操作JE EXITCMP AL,'N'JE EXITM OV WORD PTR[DI+2],0LEA DI,NUMBERLEA SI,OPERATORJMP START1EXIT:M OV AH,4CHINT 21HYS PROC NEAR子;程序,进行相应的运算PUSH AXM OV AX,0M OV BX,0CMP CL,2AH;乘法运算JNE CHUSUB DI,2XCHG BX,[DI]SUB DI,2XCHG AX,[DI]IMUL BXM OV [DI],AXADD DI,2JMP FINISHCHU:CMP CL,2FH;除法运算JNE JIASUB DI,2XCHG BX,[DI]SUB DI,2XCHG AX,[DI]CWDIDIV BXM OV [DI],AXADD DI,2JMP FINISHJIA:CMP CL,2BH;加法运算JNE JIANSUB DI,2XCHG BX,[DI]SUB DI,2ADD [DI],BXADD DI,2JMP FINISHJIAN:CMP CL,2DH;减法运算JNE FINISHSUB DI,2XCHG BX,[DI]SUB DI,2SUB [DI],BXADD DI,2FINISH:POP AXRETYS ENDP;**************************************************************CODES ENDSEND START五.运行结果六.设计总结本次设计让我学到了很多关于汇编的知识,首先,本次设计是以四则运算为主题,通过在课堂上学习的基本知识和基本方法以及平时积累的知识和方法来实现对带符号数的加减乘除运算,在设计过程中,对我已有的知识进行了巩固,对我之前不太了解的知识有了一定的了解,通过亲身去编写程序,使得自己的实际动手能力得以增强。

相关主题