基于汇编语言实现的带小数的四则运算

Nightfall

发布日期: 2018-11-04 10:29:53 浏览量: 1349
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

一 需求分析

从键盘输入一个简单的表达式,如“ S=4+6*9-1+8/5”,按回车键结束输入,则屏幕显示S=58.6,小数点保留1位。假设输入的表达式中只含个位十进制数和 “+”、“-”、“*”、“/”运算符,且同一运算符最多出现2次。

二 程序设计

2.1 设计思想

这个程序应该能正确处理数字和数学表达式的输入。我的设想是使其进一步处理最多12位十进制小数的输入,以及带有括号、四则运算算式的正确处理,并给出可以精确到小数点后五位的正确结果。

该程序应完成工作:

  • 公式的输入,包括处理数字输入、符号输入,以及正确处理输入公式的句法

  • 公式的计算。其中包括正确处理各种符号运算的优先级和结合性、中间数的临时保存、小数的正确处理等

  • 结果的正确显示

主程序的大致框图如下:

2.2 PARSEEXP

逐字符进行读取,并根据读取到的字符判断算式中出现的token属于什么类型。若是数字,则调用INPUTDECIMAL将其处理成双精度浮点数;若是运算符,则对应处理(见下)。

对于算式的处理和运算,采用了调度场算法(Shunting yard algorithm)。采用两个堆栈,一个放数字,一个放运算符。当算法执行到将运算符放置到数字上的步骤时,立即进行运算。这样,分析完算式后,数字栈顶便是结果。

运算用Intel处理器的FLD、FADD等指令完成。

流程见下图,省略了对部分错误状况的处理,详见源码。

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将其作为双精度数存储于内存,该功能即得以实现。

大致框图见下图。

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 测试数据

上传的附件 cloud_download 基于汇编语言实现的带小数的四则运算.zip ( 329.29kb, 124次下载 )
error_outline 下载需要11点积分

发送私信

上辈子一千次的卖萌,终于换来你今生一次的回眸

18
文章数
23
评论数
最近文章
eject