没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
1 项目特点及目的
本课程设计是一次程序设计方法及技能的基本训练,通过实际程序的开发及调试,巩固
课堂上学到的关于程序设计的基本知识和基本方法,进一步熟悉汇编语言的结构特点和使
用,达到能独立阅读、设计编写和调试具有一定规模的汇编程序的水平。
2 题目简介
用 8086 汇编语言编写一个能实现四则混合运算、带括号功能的整数计算器程序。程序能
实现键盘十进制运算表达式的输入和显示(例如输入:“1+2*(3-4)”),按“ =”后输出十进
制表示的运算结果。
3 程序设计要求
遵循模块化、结构化的编程思路
程序必须正确运行
程序简明易懂,多标明注释,具有良好的程序书写风格
适当优化程序,提高程序的运行效率
4 工作条件
使用的设备及软件为 8086 兼容机及 MASM 汇编开发软件。
5 题目分析
根据题目要求,可以把程序的工作过程划分为运算表达式输入、计算、结果输出三部
分。因此在编写程序时可以按此把程序大致划分为三个模块。
5.1 运算表达式输入
用户通过键盘输入的运算表达式为一个 ASCII 码字符串,字符串的最后一个字符是“=”
号。对于这个运算表达式,“+、-、*、/、(、)、 0~9、=”是合法的表达式内容,其他的
字符则是无法进行运算的非法内容,因此需要首先进行表达式合法性检查。另外,由于计
算机能进行计算的是 2 进制的补码,因此还需要把以 ASCII 码表示的数值转换为补码的形
式并加以保存。当然,控制运算方式的符号也要进行保存。因此,“运算表达式输入”这个
模块可以细化为:表达式合法性检查、数值的 ASCII 码到补码转换及保存、符号的保存三
个小部分,如图 1 所示。
图 1 “运算表达式输入”的流程图
5.1.1 运算表达式合法性的检查方法
观察“ASCII 字符编码表”,可以发现“+、-、*、/、(、)”的 ASCII 码由 28H 到 2FH,而
“0~9”的 ASCII 码则由 30H 到 39H,因此只需对输入的字符一个一个地进行数值范围比较,
看看是否处于 28H~39H 这个范围里面,即可区分输入的表达式是否合法,流程图如图 2
所示。此流程图是采用循环输入字符的方法,每输入一个字符即进行判断。读者也可以采
用输入字符串的方法,把整个运算表达式接收完毕后再进行判断。
图 2 运算表达式合法性检查流程图一
另一方面,对于含有括号的运算表达式,当左括号的数量与右括号数量不相等时,表达
式也是非法的。因此,可以设置一个起始值为 0 的变量(下面称其为配对标志),当输入
“(”时此变量加一,当输入“)”时减一,则当表达式输入结束时,只需判定此配对标志是否为
0,即可判定左右括号数量是否相等。
图 3 运算表达式合法性检查流程图二
5.1.2 数值的补码转换方法
要进行数值的 ASCII 码到补码的转换,首先就得判断输入的字符是数值还是符号。根
据上文所提,“+、-、*、/、(、)”的 ASCII 码由 28H 到 2FH,而“0~9”的 ASCII 码则由
30H 到 39H,只需比较字符是否小于等于 2FH(或小于 30H)即可判断是否为符号,否则
则是数值,如图 2 所示。
众所周知,要把一个 ASCII 码数值转换为二进制补码的形式,只需要对其减 30H 即可
实现。但如果输入的是多位数,例如 123,那么计算机获得的是 31H、32H、33H 三个字节,
2
即使分别对这三个字节进行减 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。数值的补码转换流程如图 4 所示,当
然,在获得第一个数值输入前要先把原值设置为 0。
图 4 数值的补码转换流程图
由于符号全部是一个字节,无需进行任何转换即可保存,处理简单,这里不作探讨。
5.2 计算
由于运算表达式有多个数值和符号,而符号有不同的优先级别,因此上文提到的数值保
存和符号保存应该分开两个地方进行保存,这样有利于表达式的计算算法设计。下面把
“+、-、*、/”称为运算符,把“(、)”称为优先符。
图 5 运算表达式的存储举例
观察图 5 的三条运算表达式,再联系四则混合运算的优先原则,可以归纳出几点:
(a) 数值的数量是运算符的数量加 1(优先符不算),第 1 个运算符代表第 1、2 个数
值的运算操作,第 N 个运算符代表第 N、N+1 个数值的运算操作……
(b)每进行一次运算,相应的运算符即被消除,而参与运算的两个数值合并为一个数
值,仍然满足(a)。例如图 5(a),当完成乘法运算后,数值存储区有
408、56 两个数,符号存储区有“+”一个运算符。
(c) 括号(优先符)的作用是把括号内的运算符的优先级别提高到比外部高。
因此,要实现运算表达式的运算,最重要的就是确定所有运算符的优先级别。下面讨
论运算符优先级别的编程设计方法。
3
剩余13页未读,继续阅读
资源评论
buduwenzhang
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功