# 基于汇编语言实现的带小数的四则运算
# 一 需求分析
从键盘输入一个简单的表达式,如“ S=4+6\*9-1+8/5”,按回车键结束输入,则屏幕显示S=58.6,小数点保留1位。假设输入的表达式中只含个位十进制数和 “+”、“-”、“\*”、“/”运算符,且同一运算符最多出现2次。
# 二 程序设计
## 2.1 设计思想
这个程序应该能正确处理数字和数学表达式的输入。我的设想是使其进一步处理最多12位十进制小数的输入,以及带有括号、四则运算算式的正确处理,并给出可以精确到小数点后五位的正确结果。
该程序应完成工作:
- 公式的输入,包括处理数字输入、符号输入,以及正确处理输入公式的句法
- 公式的计算。其中包括正确处理各种符号运算的优先级和结合性、中间数的临时保存、小数的正确处理等
- 结果的正确显示
**主程序的大致框图**如下:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/5fe6abb5a85ab5eca42718454150bb85.writebug)
## 2.2 PARSEEXP
逐字符进行读取,并根据读取到的字符判断算式中出现的token属于什么类型。若是数字,则调用INPUTDECIMAL将其处理成双精度浮点数;若是运算符,则对应处理(见下)。
对于算式的处理和运算,采用了调度场算法(Shunting yard algorithm)。采用两个堆栈,一个放数字,一个放运算符。当算法执行到将运算符放置到数字上的步骤时,立即进行运算。这样,分析完算式后,数字栈顶便是结果。
运算用Intel处理器的FLD、FADD等指令完成。
流程见下图,省略了对部分错误状况的处理,详见源码。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/40b40cb033cc663fd317212c9c5a0fbc.writebug)
## 2.3 INPUTDECIMAL
利用了英特尔处理器的FBLD指令,将十进制的小数转换为浮点数。
FBLD指令可以将一段长度为10字节空间中的前9字节中的18位BCD码从十进制整数转换为FPU寄存器中的REAL10浮点数,后一字节最高位决定符号位。
如一系列从低位到高位排列的字节:21 43 65 87 00 00 00 00 00 80可以转换为-87654321.0,存储在FPU的栈顶。
对字符串倒序、去掉小数点转BCD码后,用FBLD转换为大浮点数;再根据小数点位置,用FBLD构造一个是10的若干次幂的浮点数,除前者,得到字符串表示的浮点数。再用FSTP将其作为双精度数存储于内存,该功能即得以实现。
大致框图见下图。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/082d22c16d6009449309abb0312cbb6f.writebug)
## 2.4 OUTPUTDECIMAL
利用的是FBLD的逆向指令FBSTP。将双精度数用FLD载入FPU的寄存器后,乘以100000,用FBSTP转换为包含小数点后五位的BCD数码,再从右往左解析输出,在第五位加小数点即可。
# 三 程序实现
共四个源码文件:
- MAIN.ASM
- ID.ASM
- OD.ASM
- PARSEEXP.ASM
### 3.1 处理十进制小数的转换:ID.ASM
- 包含过程:INPUTDECIMAL,负责将内存中的十进制小数字符串转换为双精度浮点数,仍然存在内存中
- 输入参数包括字符串的起始位置DS:SI,和输出位置ES:BX
### 3.2 处理十进制小数的输出:OD.ASM
- 包含过程:OUTPUTDECIMAL,负责将内存中的双精度浮点数以十进制小数形式输出
- 输入参数包括字符串的起始位置DS:SI
### 3.3 处理算式:PARSEEXP.ASM
- 包含过程:PARSEEXP,负责将内存中的一串算式字符串进行解析运算,并将最终结果存在内存中
- 也同时输出算式的逆波兰符号形式,方便调试找出错误
- 会调用ID.ASM、OD.ASM中的功能
- 输入参数包括字符串的起始位置DS:SI和输出位置DS:BX
### 3.4 主程序:MAIN.ASM
- 包含过程MAIN,是程序的入口
- 功能包括显示输入提示、让用户输入算式,以及调用PARSEEXP处理算式,最后用OUTPUTDECIMAL输出计算结果
# 四 运行测试
## 4.1 程序环境、适用范围
本程序应运行于:
- Intel 的16位处理器(或模拟其工作的模拟器上),如8086,并且应支持浮点运算功能
- MS-DOS,或Windows 7及以下x86操作系统的命令提示符中(在NTVDM中运行)
本程序的测试环境为:
- DOSBox,以及VMWare Workstation下的Windows 7 x86虚拟机的cmd.exe
本程序适用于:
- 简单的、输入式的、包括+、-、\*、/、()的数学运算式,结果精度不超过5位小数
## 4.2 使用方法
- 启动MS-DOS操作系统(或DOSBox),或Windows x86系统的命令提示符(CMD.exe)
- 用cd命令和盘符命令,将当前路径定位到本程序可执行文件的目录下
- 输入MAIN.EXE,按回车键
- 此时程序提示用户输入“S=”。用户应该输入一个算式,之后按回车键
- 程序应能给出S的最终结果
## 4.3 测试数据
![](http://www.writebug.com/myres/static/uploads/2021/10/19/97527a938d6147c903c1cf56e6b4eeae.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/8514cbde880913b9ec6a19c79d3c5163.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/367bc2bb000291dca2812e3e63ff5366.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/2f0365a5a6ee1b5885aa7a72e14dec8d.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/6f6da6e0ec97f5ceb2e1897e0ec1e45c.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/76cc9f5974e7df385c34a575f372ff9b.writebug)
精选_毕业设计_基于汇编语言实现的带小数的四则运算_完整源码
版权申诉
50 浏览量
2022-03-05
15:17:31
上传
评论
收藏 338KB ZIP 举报
工具盒子
- 粉丝: 60
- 资源: 1313
最新资源
- ISOSAE21434.D1-2020SAE美国汽车标准
- 奥比中光RGBD在JETSON ORIN NX的ROS程序
- SerialNumberUtil.java
- autojspro写的木鱼小软件,模拟木鱼的敲击声,提供源代码
- 修改windows服务器远程桌面端口批处理
- 黑马Java八股文面试题视频教程,Java面试八股文宝典(含阿里、腾迅大厂java面试真题,java数据结构,java并发
- java调用科大讯飞在线语音合成API -完整代码
- Python爬虫基础知识.zip
- Java八股文和面试项目介绍-春招秋招校招社招
- 其他类别JSP网页HTML编辑器 v1.0 beat-jsphtmleditor.7z
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈