数字计算器的汇编语言实现
1 项目特点及目的
本课程设计是一次程序设计方法及技能的基本训练, 通过实际程序的开发及 调试, 巩固课堂上学到的关于程序设计的基本知识和基本方法, 进一步熟悉汇编 语言的结构特点和使用, 达到能独立阅读、 设计编写和调试具有一定规模的汇编 程序的水平。
2 题目简介
用 8086 汇编语言编写一个能实现四则混合运算、带括号功能的整数计算器 程序。程序能实现键盘十进制运算表达式的输入和显示(例如输入:“1+2*(3-4)”), 按“= ”后输出十进制表示的运算结果。
3 程序设计要求
遵循模块化、结构化的编程思路
程序必须正确运行
程序简明易懂,多标明注释,具有良好的程序书写风格
适当优化程序,提高程序的运行效率
4 工作条件
使用的设备及软件为 8086 兼容机及 MASM 汇编开发软件。
5 题目分析
根据题目要求, 可以把程序的工作过程划分为运算表达式输入、 计算、 结果 输出三部分。因此在编写程序时可以按此把程序大致划分为三个模块。
5.1 运算表达式输入
用户通过键盘输入的运算表达式为一个 ASCII 码字符串,字符串的最后一 个字符是“= ”号。对于这个运算表达式, “+、-、*、/、(、)、0~9、= ”是合法 的表达式内容, 其他的字符则是无法进行运算的非法内容, 因此需要首先进行表 达式合法性检查。 另外, 由于计算机能进行计算的是 2 进制的补码, 因此还需要 把以 ASCII 码表示的数值转换为补码的形式并
加以保存。当然,控制运算方式 的符号也要进行保存。因此, “运算表达式输入”这个模块可以细化为:表达式
合法性检查、数值的 ASCII 码到补码转换及保存、符号的保存三个小部分,如 图 6-1 所示。
图 6-1 “运算表达式输入”的流程图
5.1.1 运算表达式合法性的检查方法
观察“ASCII 字符编码表”, 可以发现“+、-、*、/、(、)”的 ASCII 码由 28H 到 2FH,而“0~9”的 ASCII 码则由 30H 到 39H,因此只需对输入的字符一个 一个地进行数值范围比较, 看看是否处于 28H~39H 这个范围里面, 即可区分输 入的表达式是否合法,流程图如图 6-2 所示。此流程图是采用循环输入字符的方 法, 每输入一个字符即进行判断。 读者也可以
采用输入字符串的方法, 把整个运 算表达式接收完毕后再进行判断。
图 6-2 运算表达式合法性检查流程图一
另一方面, 对于含有括号的运算表达式, 当左括号的数量与右括号数量不相 等时,表达式也是非法的。因此,可以设置一个起始值为 0 的变量(下面称其为 配对标志),当输入“(”时此变量加一,当输入“)”时减一,则当表达式输入 结束时,只需判定此配对标志是否为 0,即可判定左右括号数量是否相等。
图 6-3 运算表达式合法性检查流程图二
5.1.2 数值的补码转换方法
要进行数值的 ASCII 码到补码的转换,首先就得判断输入的字符是数值还 是符号。根据上文所提,“+、-、*、/、(、)”的 ASCII 码由 28H 到 2FH,而“0~ 9”的 ASCII 码则由 30H 到 39H,只需比较字符是否小于等于 2FH (或小于 30H) 即可判断是否为符号,否则则是数值,如图 6-2 所示。
众所周知,要把一个 ASCII 码数值转换为二进制补码的形式,只需要对其 减 30H 即可实现。
但如果输入的是多位数, 例如 123,那么计算机获得的是 31H、 32H、33H 三个字节,即使分别对这三个字节进行减 30H 操作,也只是获得 1、 2、3 三个数而已。实际上可以利用加权的方法合并这几个数:
123=1 × 100+2×10+3×1
但另一个问题是,由于输入是随机的,即输入的运算数有多少位是未知的, 因此无法使用上面的方面静态确定每一位的权重。 这里介绍的方法是, 每输入运 算数的一位,则把前面的合并结果(称为原值)乘以 10 再与这一位相加,实现 动态的加权合并。例如:
令原值为 0,输入 1,结果为: 0×10+1= 1
输入 2,结果为: 1 × 10+2= 12
输入 3,结果为: 12×10+3= 123
即: 123=(((0×10+1) × 10+2) × 10) +3。数值的补码转换流程如图 6-4 所示,当然,在获得第一个数值输入前要先把原值设置为 0。
图 6-4 数值的补码转换流程图
由于符号全部是一个字节, 无需进行任何转换即可保存, 处理简单, 这里不 作探讨。
5.2 计算
由于运算表达式有多个数值和符号, 而符号有不同的优先级别, 因此上文提 到的数值保存和符号保存应该分开两个地方进行保存, 这样有利于表达式的计算
算法设计。下面把“+、-、*、/”称为运算符,把“(、)”称为优先符。
12*34+56 数值存储 12 34 56
符号存储2进制转十进制在线计算器 * +
(a)
12*(34+56-8) 数值存储 12 34 56 8
符号存储 * ( + - )
(b)
12*21-((34+56-8)+1)
数值存储 12 21 34 56 8 1
符号存储 * - ( ( + - ) + )
(c)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论