四则运算计算器
更新时间:2024-03-15 21:26:01 阅读量: 综合文库 文档下载
前言
本次课程设计的题目是用汇编语言实现一个简单的计算器,要求:编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。通过使用汇编语言设计实现简单计算器,以此进一步了解和掌握对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用。本次课程设计以实现一个基本功能完善,界面友好,操作简便易行的计算器为最终目的。通过对具有加减乘除基本功能的计算器的设计实现,学会使用汇编语言实现输入输出模块的设计,模块合理调用的设计,加减乘除运算的判断以及退出程序的判断的设计。通过对各种指令的合理使用,熟悉并加深对各种指令的用法。学会使用汇编语言设计各个功能模块。当实现各个程序模块后,学会通过程序的调用最终实现一个具有基本计算功能的简单计算器。
1
中文摘要
实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。
设计当用户根据提示信息输入一个算式后,按下enter键或是‘=’符号键时,程序依据输入的算式进行计算,并将结果显示在屏幕上。如果用户输入错误,则返回,提示信息让用户重新输入算式,当用户按下Q或q键时退出程序。在各个子功能模块设计好的情况下,通过主题模块的合理调用,最终实现一个具有简单运算功能的计算
关键字:计算器、四则运算、进位、错位、清屏
目录
1系统分析 ------------------------------------------------- 2系统总体设计---------------------------------------------- 3详细设计-------------------------------------------------- 4统测试 --------------------------------------------------- 5软件使用说明书 ------------------------------------------- 设计总结---------------------------------------------------- 参考文献---------------------------------------------------- 致 谢———————————————————————————————————
3
1. 系统分析
本次汇编语言课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。比如,十进制数的加减乘除四则运算。我们曾经学习过两个具体数字进行加减法运算,但是对于简单计算器用汇编语言实现难点在于这两个要做运算的数是未知的,是由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。
第一步,我要解决的是输入时是用INT 21H的10号功能调用还是用INT 21H的1号功能调用来进行输入。若是用10号功能调用则我们进行多字符输入,可以将输入的字符都存储到一个数据区里面,并调用9号功能调用输出存进去的字符,这种输入和输出的方案是可行的。我选择的是利用1号功能调用来输入,即把单个字符一个个的输入并存储到一个数据区里。我们要做的是两个数的运算,先认定输入的格式为1234+5678=或者1111*2222=,当然如果输入不是这样的格式计算出来的结果就不一定是我们想要的结果了。在存储的时候也是有选择的存储,当输入的并非格式里所要求的字符时则报错。
第二步,设计程序进行判断所输入的算式是做加法运算、减法运算、乘法运算还是除法运算,即判断输入的运算符是‘+’号、‘-’号、‘*’号、‘/’号中的哪一个,因为输入的格式固定了,所以只需要把存进数据区的第三个字符拿来与加减乘除四个运算符号进行比较,和哪一个运算符号一样就调用相对应的运算模块进行计算。
第三步,根据计算器程序所要实现的功能完成各个功能模块。设计程序主体部分,根据主体部分所需的功能模块对各个子模块一一进行设计编写。子模块中包含有:do_add加法运算模块,do_sub减法运算模块,do_mul乘法运算模块,do_div除法运算模块,input输入模块等。
最后还要对这个简易计算器进行功能完善。为了使程序符合我们使用者的操作
习惯,设计当用户根据提示信息输入一个算式后,按下enter键或是‘=’符号键时,程序依据输入的算式进行计算,并将结果显示在屏幕上。如果用户输入错误,则返回,提示信息让用户重新输入算式,当用户按下Q或q键时退出程序。在各个子功能模块设计好的情况下,通过主题模块的合理调用,最终实现一个具有简单运算功能的计算
5
2.系统总体设计
程序开始 输出提示语句 输入一个算式 输入出错 Y ‘Q’/‘q’? 退出 N N ‘0~f'‘+’‘-’‘*’‘/’? Y 存储数据 判断运算符号 调用运算功能模块 按下Enter或=键 Y Y 显示结果
7
3.详细设计
B_P EQU BYTE PTR W_P EQU WORD PTR D_P EQU DWORD PTR CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100H ;主程序开始 NEWSTAR:
JMP STAR EVEN NUM1 DW 0,0 NUM2 DW 0,0 NUM3 DW 0,0 JGV4 DW 0,0 YSF LABEL WORD YSF1 DB 0 YSF2 DB 0 JUV DB 0 UV DB 0 ;使DS:SI指向第一有效字符 OVERS LABEL NEAR CLD PUSH AX OVERS1:
LODSB CMP AL,' ' JZ OVERS1 CMP AL,9 JZ OVERS1 DEC SI
CMP AL,13 POP AX RET ;输出一个制表符
TAB LABEL NEAR MOV AL,9 JMP SHORT ;输出一个回车换行符 CRLF LABEL NEAR MOV AL,13 CALL DISP MOV AL,10 ;显示一个字符
DISP LABEL NEAR PUSH AX PUSH DX MOV AH,2 MOV DL,AL INT 21H POP DX POP AX RET ;检查是否为运算符 ISYSF LABEL NEAR CLD LODSB CALL ISJJ JZ ISYSF1 CALL ISII JZ ISYSF1 DEC SI
DISP 9
ISYSF1:
RET ;检查是否是加减运算 ISJJ LABEL NEAR CMP AL,'+' JZ ISYSF1 CMP AL,'-' RET ;检查是否为乘除运算 ISII LABEL NEAR CMP AL,'*' JZ ISYSF1 CMP AL,'/' JZ ISYSF1 CMP AL,'\\' RET ;数据输出 ;CX=10 十进制 ;CX=16 十六进制 DOUT LABEL NEAR PUSH AX PUSH BX PUSH DX PUSH BP XOR BP,BP DOUT1:
INC BP PUSH AX MOV AX,DX XOR DX,DX DIV CX
MOV BX,AX POP AX DIV CX PUSH DX MOV DX,BX OR BX,AX JNZ DOUT1 DOUT2:
POP AX ADD AL,'0' CMP AL,'9' JBE DOUT3 ADD AL,'A'-'9'-1 DOUT3:
CALL DISP DEC BP JNZ DOUT2 POP BP POP DX POP BX POP AX RET ;输入数据在DX:AX中返回 ;CX=0 数据为10进制 ;CX#0 数据为16进制 DATE LABEL NEAR PUSH BX PUSH BP PUSH DI XOR AX,AX XOR DX,DX
11
DATE1:
MOV DI,AX LODSB CMP AL,'0' JB DATE7 CMP AL,'9' JA DATE6 DATE2:
AND AX,0FH SHL DI,1 RCL DX,1 MOV BX,DI MOV BP,DX SHL DI,1 RCL DX,1 SHL DI,1 RCL DX,1 JCXZ DATE3 SHL DI,1 RCL DX,1 Jmp short DATE4 DATE3:
ADD DI,BX ADC DX,BP DATE4:
ADD AX,DI ADC DX,0 JMP DATE1 DATE5:
ADD AL,9 JMP DATE2
DATE6:
JCXZ DATE7 CMP AL,'A' JB DATE7 CMP AL,'F' JBE DATE5 CMP AL,'a' JB DATE7 CMP AL,'f' JBE DATE5 DATE7:
MOV AX,DI DEC SI OR DI,DX POP DI POP BP POP BX RET
;数据1与数据2根据YSF1进行加减运算 JSJJ LABEL NEAR MOV AX,NUM2 MOV DX,NUM2+2 CMP YSF1,'+' JZ JSJJ1 SUB NUM1,AX SBB NUM1+2,DX JMP SHORT JSJJ2 JSJJ1:
ADD NUM1,AX ADC NUM1+2,DX JSJJ2:
13
RET
;数据1与数据2根据YSF1进行乘除运算 JSII1 LABEL NEAR
MOV BX,OFFSET NUM1 JMP SHORT JSII2_1 ;数据2与数据3根据YSF2进行乘除运算 JSII2 JSII2_1:
JSII2_2:
JSII2_3:
LABEL NEAR
MOV BX,OFFSET NUM2 DB 66H MOV AX,[BX] DB 66H MOV CX,[BX+4] CMP YSF2,'*' JNZ JSII2_2 DB 66H IMUL CX
JMP SHORT JSII2_3 DB 66H CWD DB 66H IDIV CX CMP YSF2,'/' JZ JSII2_3 DB 66H XCHG DX,AX DB 66H MOV [BX],AX RET
;显示结果
XUJG LABEL NEAR MOV AX,JGV4 MOV DX,JGV4+2 MOV CX,10 CMP UV,10 JZ XUJG0 MOV CX,16 XUJG0:
TEST DX,8000H JZ XUJG1 CMP UV,10 JZ XUJG2 CALL DOUT XUJG2:
NOT AX NOT DX ADD AX,1 ADC DX,0 PUSH AX CMP UV,10 JZ XUJG3 MOV AL,' ' CALL DISP MOV AL,'(' CALL DISP XUJG3:
MOV AL,'-' CALL DISP POP AX CMP UV,10
15
JZ XUJG1 CALL DOUT MOV AL,')' CALL DISP RET XUJG1:
CALL DOUT RET ;计算结果放入DX:AX中 JSJG LABEL NEAR CALL JSJJ MOV AX,NUM1 MOV DX,NUM1+2 RET ;从DS:SI处取一个数据 LOADATE LABEL NEAR LODSB CMP AL,'(' JZ LOADATE1 DEC SI PUSH CX XOR CX,CX CMP UV,10 JZ LOADATE0
INC CX LOADATE0:
CALL DATE POP CX RET LOADATE1:
PUSH NUM1 ;取16进制数 取数据放入DX:AX中 保存数据1数据2及运算符 ; ;
PUSH NUM1+2 PUSH NUM2 PUSH NUM2+2 PUSH YSF INC JUV
MOV JGV4,0 ;结果值清零 MOV JGV4+2,0 ;进行四则运算
SZYS LABEL NEAR
CALL ISYSF JZ SZYS2
CALL LOADATE MOV NUM1,AX MOV NUM1+2,DX SZYS1:
XOR AX,AX MOV NUM2,AX MOV NUM2+2,AX
CALL ISYSF JZ SZYS3 JNZ SZYS6 SZYS2:
PUSH AX
MOV AX,JGV4 MOV NUM1,AX MOV AX,JGV4+2 MOV NUM1+2,AX POP AX SZYS3:
MOV YSF1,AL MOV YSF2,AL
;首字符是运算符? ;不是,取数并保存 ;数据2清零 ;下个是运算符? ;将结果作为数据1 17
CALL ISJJ ;是加减运算转 JZ SZYS4
CALL LOADATE ;取数据2 MOV NUM2,AX MOV NUM2+2,DX
CALL JSII1 ;数据1与数据2根据YSF1进行乘除运算
SZYS4:
SZYS4_1:
算
SZYS5:
算
JMP SZYS1 CALL LOADATE MOV NUM2,AX MOV NUM2+2,DX CALL ISYSF JNZ SZYS6
CALL ISJJ JNZ SZYS5 PUSH AX
CALL JSJJ POP AX MOV YSF1,AL JMP SZYS4 MOV YSF2,AL CALL LOADATE MOV NUM3,AX MOV NUM3+2,DX
CALL JSII2 JMP SZYS4_1 ; 结果保存在数据1中 ;取数据2并保存 ;运算符2是加减运算? ;不是转 ;数据1与数据2根据YSF1进行加减运 ; 结果保存在数据1中 ;保存新的运算符 ;保存运算符2 ;取数据3 ;数据2与数据3根据YSF2进行乘除运; 结果保存在数据2中
SZYS6:
MOV CL,AL CMP AL,13 JNZ SZYS9 SZYS7:
CALL JSJG SZYS8:
SZYS9:
SZYS10:
SZYS11:
CMP JUV,0 JZ SZYS8 DEC JUV POP YSF POP NUM2+2 POP NUM2 POP NUM1+2 POP NUM1 RET CMP CL,')' JZ SZYS10 MOV JGV4,AX MOV JGV4+2,DX JNZ SZYS12 CMP AL,')' JNZ SZYS11 INC SI JMP SZYS7 MOV NUM1,AX MOV NUM1+2,DX JMP SZYS1 19
STC RET SZYS12:
CLC RET ;数制处理
UVIL LABEL NEAR PUSH SI UVIL1:
LODSB CMP AL,' ' JZ UVIL2 CMP AL,9 JZ UVIL2 CMP AL,13 JZ UVIL4 JNZ UVIL1 UVIL2:
MOV BX,SI CALL OVERS JZ UVIL3 LODSW CALL OVERS POP SI JNZ SZYS11 CMP AX,'01' JNZ SZYS11 PUSH SI MOV UV,10 UVIL3:
MOV AL,13
MOV [BX-1],AL UVIL4:
POP SI CLC RET ;预置结果
YVJG ;保存结果
BCJG LABEL NEAR MOV AH,52H INT 21H
MOV AX,ES:[BX-2] MOV DS,AX MOV AX,DS:[0CH] MOV CS:JGV4,AX MOV AX,DS:[0EH] MOV CS:JGV4+2,AX PUSH CS POP DS PUSH CS POP ES RET LABEL NEAR MOV AH,52H INT 21H
MOV AX,ES:[BX-2] MOV DS,AX MOV AX,CS:JGV4 MOV DS:[0CH],AX MOV AX,CS:JGV4+2 MOV DS:[0EH],AX PUSH CS
21
POP DS PUSH CS POP ES RET STAR:
MOV SI,81H STAR0:
STAR1:
STAR4:
SAVESP MESS1 CLD CALL OVERS JNZ STAR1 MOV DX,OFFSET MESS1 JMP STAR4 CALL YVJG CALL UVIL JB STAR0 MOV SAVESP,SP CALL SZYS MOV SP,SAVESP MOV DX,OFFSET MESS2 JB STAR4 CALL CRLF CALL XUJG CALL BCJG
MOV DX,OFFSET MESS3 MOV AH,9 INT 21H INT 20H DW 0
DB 13,10,' Syntax:',13,10
DB ' JS
END NEWSTAR
23
4.系统测试 4.1 运行界面分析 将源程序输入编辑程序中,检查无误后经汇编、连接后装入系统运行界面如图4-1所示:
图4-1 运行界面
程序的运行界面显示成功,屏幕上显示“input a suanshi(input q exit):”
提示用户输入一个算式。
4.2 调试过程及分析
对程序源代码进行功能调试和功能验证。程序代码运行成功后,分别检验测试其加、减、乘、除功能,并对结果进行分析。再者,要对当用户输入Q或q时,退出程序的功能进行检测。
加法运算,计算1122+1658,如图4-2所示:
图4-2 加法运算
减法运算,计算2345-2533,如图4-3所示:
图4-3 减法运算
乘法运算,计算1233*3000,如图4-4所示:
图4-4 乘法运算
除法运算,计算98/10,如图4-5所示:
图4-5 除法运算
当用户输入Q或q时,程序退出,如图4-6所示:
图4-6 退出程序测试
25
5.软件使用说明书
此程序流程图简要地表现出了所要实现的功能以及一些功能的大概算法,同时也是我编写的程序的一个总体的框架。
程序流程图说明:通过流程图,可以看出程序开始运行时,首先输出提示语句,当用户输入后,程序根据所输入的内容进行判断,通过判断的结果来决定调用哪个功能模块,首先要判断输入的字符是否为Q或q,若是,则退出程序,不是则继续输入。还要判断输入的是否为0--9,‘+’,‘-’,‘*’,‘/’这些字符,若不是会报错,是则将根据运算符号调用相应的功能模块完成运算。最后将运算的结果显示在屏幕上,并返回主题程序,使用户可以重新输入。
设计总结
本次课程设计我认为最需要改进的就是程序的健壮性。通过这次课程设计,我发现一个好的汇编程序不仅要正确可行,还要有健壮性,当用户输入数据非法,使运行环境改变时,程序能恰当地作出反应或进行处理,不会产生莫名其妙的输出结果。一个正确可行的算法如果缺乏健壮性,那么这个程序也不能算真正的成功。
汇编语言是本专业的一门重要的程序语言。在刚开始学习时,一直担心自己、也没把握自己能否学好,也曾担心过不了考试这一关。经过近大半学期老师您不厌其烦的教导,引导我们去学习。我对汇编语言语言有了一定的了解,但那绝对是远远不够的,还是要不断地把它应用到实践中去,融会贯通。
经过为期一周的汇编语言课程设计,亲身感受体验敲、改写程序代码的乐趣,我对汇编语言有了较为深入的了解,不仅巩固了以前在课本上学到的知识,还学会了很多其他东西。作为一个程序编程人员,要保持清醒的头脑,以现实为依据,让自己的每一行代码都能实现自己的意义。
27
参考文献
[1] 温冬蝉、沈美明.IBM PC汇编语言程序设计.北京:清华大学出版社,2007.5 [2] 刘其明.汇编语言程序设计教程.徐州:中国矿业大学出版社,2010 [3] 钱晓捷.新版汇编语言程序设计.北京:电子工业出版社,2007 [4] 何小海,严华. 微机原理与接口技术.北京:科学出版社,2006
致谢
一周的汇编语言课程设计结束了,我的收获很大。通过课程设计的编程和对编程过程中遇到的问题的思考,有效的提高了我对汇编的认识和理解,切实的提高了我的编程能力,补全了我的不足。通过这次课程设计,我巩固所了学过的知识,能用汇编语言熟练地运用顺序、选择、循环三大结构,进一步掌握了各个指令的功能,特别是转向指令,掌握了子程序的定义及调用,以及正确地运用DEBUG指令。在整个程序的编写中,调试占了很大部分的时间。要想写好汇编语言的程序,必须认真对待代码的每一个细节,还必须熟练的掌握debug命令,这对程序的调试是非常重要的。通过这次实际动手能力的培养,我进一步熟悉了汇编语言的结构和使用方法,基本达到了能独立阅读、编制和调试 B_P EQU BYTE PTR W_P EQU WORD PTR D_P EQU DWORD PTR CODE SEGMENT
ASSUME CS:CODE,DS:CODE ORG 100H ;主程序开始 NEWSTAR:
JMP STAR EVEN NUM1 DW 0,0 NUM2 DW 0,0 NUM3 DW 0,0 JGV4 DW 0,0
YSF LABEL WORD YSF1 DB 0 YSF2 DB 0 JUV DB 0 UV DB 0
;使DS:SI指向第一有效字符 OVERS LABEL NEAR CLD
PUSH AX OVERS1:
LODSB CMP AL,' ' JZ OVERS1 CMP AL,9 JZ OVERS1 DEC SI CMP AL,13
29
POP AX RET ;输出一个制表符
TAB LABEL NEAR MOV AL,9
JMP SHORT DISP ;输出一个回车换行符 CRLF LABEL NEAR MOV AL,13 CALL DISP MOV AL,10 ;显示一个字符
DISP LABEL NEAR PUSH AX PUSH DX MOV AH,2 MOV DL,AL INT 21H POP DX POP AX RET
;检查是否为运算符
ISYSF LABEL NEAR CLD LODSB CALL ISJJ JZ ISYSF1 CALL ISII JZ ISYSF1 DEC SI ISYSF1:
RET
;检查是否是加减运算 ISJJ LABEL NEAR CMP AL,'+' JZ ISYSF1 CMP AL,'-' RET
;检查是否为乘除运算 ISII LABEL NEAR CMP AL,'*' JZ ISYSF1 CMP AL,'/' JZ ISYSF1 CMP AL,'\\' RET ;数据输出
;CX=10 十进制 ;CX=16 十六进制
DOUT LABEL NEAR PUSH AX PUSH BX PUSH DX PUSH BP XOR BP,BP DOUT1:
INC BP PUSH AX MOV AX,DX XOR DX,DX DIV CX
MOV BX,AX POP AX DIV CX PUSH DX MOV DX,BX OR BX,AX JNZ DOUT1 DOUT2:
POP AX ADD AL,'0' CMP AL,'9' JBE DOUT3 ADD AL,'A'-'9'-1 DOUT3:
CALL DISP DEC BP JNZ DOUT2 POP BP POP DX POP BX POP AX RET
;输入数据在DX:AX中返回;CX=0 数据为10进制 ;CX#0 数据为16进制 DATE LABEL NEAR PUSH BX PUSH BP PUSH DI XOR AX,AX XOR DX,DX DATE1:
MOV DI,AX LODSB CMP AL,'0' JB DATE7 CMP AL,'9'
31
JA DATE6 DATE2:
AND AX,0FH SHL DI,1 RCL DX,1 MOV BX,DI MOV BP,DX SHL DI,1 RCL DX,1 SHL DI,1 RCL DX,1 JCXZ DATE3 SHL DI,1 RCL DX,1
Jmp short DATE4 DATE3:
ADD DI,BX ADC DX,BP DATE4:
ADD AX,DI ADC DX,0 JMP DATE1 DATE5:
ADD AL,9 JMP DATE2 DATE6:
JCXZ DATE7 CMP AL,'A' JB DATE7 CMP AL,'F' JBE DATE5 CMP AL,'a' JB DATE7 CMP AL,'f' JBE DATE5 DATE7:
MOV AX,DI DEC SI OR DI,DX POP DI POP BP POP BX RET
;数据1与数据2根据YSF1进行加减运算 JSJJ LABEL NEAR MOV AX,NUM2 MOV DX,NUM2+2 CMP YSF1,'+' JZ JSJJ1
SUB NUM1,AX
SBB NUM1+2,DX JMP SHORT JSJJ2 JSJJ1:
ADD NUM1,AX ADC NUM1+2,DX JSJJ2:
RET
;数据1与数据2根据YSF1进行乘除运算 JSII1 LABEL NEAR
MOV BX,OFFSET NUM1 JMP SHORT JSII2_1
;数据2与数据3根据YSF2进行乘除运算 JSII2 LABEL NEAR
MOV BX,OFFSET NUM2 JSII2_1:
DB 66H
MOV AX,[BX] DB 66H
MOV CX,[BX+4] CMP YSF2,'*' JNZ JSII2_2 DB 66H IMUL CX
JMP SHORT JSII2_3 JSII2_2:
DB 66H CWD DB 66H IDIV CX CMP YSF2,'/' JZ JSII2_3 DB 66H
XCHG DX,AX JSII2_3:
DB 66H
MOV [BX],AX RET ;显示结果
XUJG LABEL NEAR MOV AX,JGV4 MOV DX,JGV4+2 MOV CX,10 CMP UV,10 JZ XUJG0 MOV CX,16 XUJG0:
TEST DX,8000H JZ XUJG1 CMP UV,10
33
JZ XUJG2 CALL DOUT XUJG2:
NOT AX NOT DX ADD AX,1 ADC DX,0 PUSH AX CMP UV,10 JZ XUJG3 MOV AL,' ' CALL DISP MOV AL,'(' CALL DISP XUJG3:
MOV AL,'-' CALL DISP POP AX CMP UV,10 JZ XUJG1 CALL DOUT MOV AL,')' CALL DISP RET XUJG1:
CALL DOUT RET
;计算结果放入DX:AX中 JSJG LABEL NEAR CALL JSJJ
MOV AX,NUM1 MOV DX,NUM1+2 RET
;从DS:SI处取一个数据 LOADATE LABEL NEAR LODSB CMP AL,'(' JZ LOADATE1 DEC SI PUSH CX XOR CX,CX CMP UV,10 JZ LOADATE0
INC CX ;取16进制数 LOADATE0:
CALL DATE ;取数据放入DX:AX中 POP CX RET LOADATE1:
PUSH NUM1 ;保存数据1数据2及运算符 PUSH NUM1+2 PUSH NUM2 PUSH NUM2+2 PUSH YSF INC JUV
MOV JGV4,0 ;结果值清零 MOV JGV4+2,0 ;进行四则运算
SZYS LABEL NEAR
CALL ISYSF ;首字符是运算符? JZ SZYS2
CALL LOADATE ;不是,取数并保存 MOV NUM1,AX MOV NUM1+2,DX SZYS1:
XOR AX,AX ;数据2清零 MOV NUM2,AX MOV NUM2+2,AX
CALL ISYSF ;下个是运算符? JZ SZYS3 JNZ SZYS6 SZYS2:
PUSH AX
MOV AX,JGV4 ;将结果作为数据1 MOV NUM1,AX MOV AX,JGV4+2 MOV NUM1+2,AX POP AX SZYS3:
MOV YSF1,AL MOV YSF2,AL
CALL ISJJ ;是加减运算转 JZ SZYS4
CALL LOADATE ;取数据2 MOV NUM2,AX MOV NUM2+2,DX
CALL JSII1 ;数据1与数据2根据YSF1进行乘除运算 JMP SZYS1 ; 结果保存在数据1中 SZYS4:
CALL LOADATE ;取数据2并保存 MOV NUM2,AX MOV NUM2+2,DX SZYS4_1:
CALL ISYSF JNZ SZYS6
CALL ISJJ ;运算符2是加减运算? JNZ SZYS5 ;不是转
35
PUSH AX
CALL JSJJ ;数据1与数据2根据YSF1进行加减运算 POP AX ; 结果保存在数据1中 MOV YSF1,AL ;保存新的运算符 JMP SZYS4 SZYS5:
MOV YSF2,AL ;保存运算符2 CALL LOADATE ;取数据3 MOV NUM3,AX MOV NUM3+2,DX
CALL JSII2 ;数据2与数据3根据YSF2进行乘除运算 JMP SZYS4_1 ; 结果保存在数据2中 SZYS6:
MOV CL,AL CMP AL,13 JNZ SZYS9 SZYS7:
CALL JSJG CMP JUV,0 JZ SZYS8 DEC JUV POP YSF
POP NUM2+2 POP NUM2 POP NUM1+2 POP NUM1 RET SZYS8:
CMP CL,')' JZ SZYS10 MOV JGV4,AX MOV JGV4+2,DX JNZ SZYS12 SZYS9:
CMP AL,')' JNZ SZYS11 INC SI
JMP SZYS7 SZYS10:
MOV NUM1,AX MOV NUM1+2,DX JMP SZYS1 SZYS11:
STC RET SZYS12:
CLC RET ;数制处理
UVIL LABEL NEAR PUSH SI UVIL1:
LODSB CMP AL,' ' JZ UVIL2 CMP AL,9 JZ UVIL2 CMP AL,13 JZ UVIL4 JNZ UVIL1 UVIL2:
MOV BX,SI CALL OVERS JZ UVIL3 LODSW
CALL OVERS POP SI
JNZ SZYS11 CMP AX,'01' JNZ SZYS11 PUSH SI MOV UV,10 UVIL3:
MOV AL,13 MOV [BX-1],AL UVIL4:
POP SI CLC RET ;预置结果
YVJG LABEL NEAR MOV AH,52H INT 21H
MOV AX,ES:[BX-2] MOV DS,AX
MOV AX,DS:[0CH] MOV CS:JGV4,AX MOV AX,DS:[0EH] MOV CS:JGV4+2,AX PUSH CS POP DS PUSH CS POP ES RET ;保存结果
BCJG LABEL NEAR MOV AH,52H INT 21H
MOV AX,ES:[BX-2]
37
MOV DS,AX
MOV AX,CS:JGV4 MOV DS:[0CH],AX MOV AX,CS:JGV4+2 MOV DS:[0EH],AX PUSH CS POP DS PUSH CS POP ES RET STAR:
MOV SI,81H CLD
CALL OVERS JNZ STAR1 STAR0:
MOV DX,OFFSET MESS1 JMP STAR4 STAR1:
CALL YVJG CALL UVIL JB STAR0
MOV SAVESP,SP CALL SZYS
MOV SP,SAVESP
MOV DX,OFFSET MESS2 JB STAR4 CALL CRLF CALL XUJG CALL BCJG
MOV DX,OFFSET MESS3 STAR4:
MOV AH,9 INT 21H INT 20H SAVESP DW 0
MESS1 DB 13,10,' Syntax:',13,10
DB ' JS
END NEWSTAR
[10]',13,10,'$'
正在阅读:
四则运算计算器03-15
一种基于提升算法的自适应小波变换及应用05-28
三年级作文说说我自己02-06
关于工会在改善职工民生,促进社会和谐中作用的调研报告04-04
中秋节抒情散文03-30
龙湾党校工程基坑专项方案05-10
晚会主持词(开场白+串词+闭幕词)12-15
2018届二轮复习完形填空专题训练(1)11-26
资产评估例题12-03
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 四则运算
- 计算器