2022年2022年汇编计算器 .pdf
《2022年2022年汇编计算器 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年汇编计算器 .pdf(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1 项目特点及目的本课程设计是一次程序设计方法及技能的基本训练,通过实际程序的开发及调试,巩固课堂上学到的关于程序设计的基本知识和基本方法,进一步熟悉汇编语言的结构特点和使用,达到能独立阅读、设计编写和调试具有一定规模的汇编程序的水平。2 题目简介用 8086 汇编语言编写一个能实现四则混合运算、带括号功能的整数计算器程序。程序能实现键盘十进制运算表达式的输入和显示(例如输入:“1+2*(3-4) ” ) ,按“ =”后输出十进制表示的运算结果。3 程序设计要求遵循模块化、结构化的编程思路程序必须正确运行程序简明易懂,多标明注释,具有良好的程序书写风格适当优化程序,提高程序的运行效率4 工作条
2、件使用的设备及软件为8086 兼容机及 MASM 汇编开发软件。5 题目分析根据题目要求,可以把程序的工作过程划分为运算表达式输入、计算、结果输出三部分。因此在编写程序时可以按此把程序大致划分为三个模块。5.1 运算表达式输入用户通过键盘输入的运算表达式为一个ASCII 码字符串,字符串的最后一个字符是“=”号。对于这个运算表达式,“+、 -、* 、/、 (、 ) 、09、=”是合法的表达式内容,其他的字符则是无法进行运算的非法内容,因此需要首先进行表达式合法性检查。另外,由于计算机能进行计算的是2 进制的补码,因此还需要把以ASCII 码表示的数值转换为补码的形式并加以保存。当然,控制运算方
3、式的符号也要进行保存。因此,“运算表达式输入”这个模块可以细化为:表达式合法性检查、数值的ASCII 码到补码转换及保存、符号的保存三个小部分,如图1 所示。数值的补码转换及保存运算表达式合法性检查运算符的保存图 1 “运算表达式输入”的流程图名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 14 页 - - - - - - - - - 2 5.1.1 运算表达式合法性的检查方法观察“ ASCII 字符编码表” ,可以发现“ +、-、*、 /、 (、 ) ”的 ASCII
4、码由 28H 到 2FH,而“ 09”的 ASCII 码则由 30H 到 39H,因此只需对输入的字符一个一个地进行数值范围比较, 看看是否处于28H39H 这个范围里面,即可区分输入的表达式是否合法,流程图如图 2 所示。 此流程图是采用循环输入字符的方法,每输入一个字符即进行判断。读者也可以采用输入字符串的方法,把整个运算表达式接收完毕后再进行判断。输入字符是“ =”小于 28H大于 39H小于 30H输入结束是否是是是否否否是符号,执行相应处理是数值,执行相应处理图 2 运算表达式合法性检查流程图一另一方面, 对于含有括号的运算表达式,当左括号的数量与右括号数量不相等时,表达式也是非法的
5、。 因此, 可以设置一个起始值为0 的变量(下面称其为配对标志),当输入 “(”时此变量加一,当输入“)”时减一,则当表达式输入结束时,只需判定此配对标志是否为0,即可判定左右括号数量是否相等。输入是符号是“ (”是“ )”否配对标志加 1配对标志减 1是是保存符号否输入结束配对标志为 0出错,退出进行计算是否图 3 运算表达式合法性检查流程图二5.1.2 数值的补码转换方法要进行数值的ASCII码到补码的转换,首先就得判断输入的字符是数值还是符号。根据上文所提, “+、 -、*、/、 (、 ) ”的 ASCII 码由 28H 到 2FH,而“ 09”的 ASCII 码则由30H 到 39H,
6、只需比较字符是否小于等于2FH(或小于30H)即可判断是否为符号,否则则是数值,如图2 所示。众所周知,要把一个ASCII 码数值转换为二进制补码的形式,只需要对其减30H 即可实现。但如果输入的是多位数,例如123,那么计算机获得的是31H、32H、33H 三个字节,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 14 页 - - - - - - - - - 3 即使分别对这三个字节进行减30H 操作,也只是获得1、2、3 三个数而已。实际上可以利用加权的方法合并这几个
7、数:1231100 210 31 但另一个问题是,由于输入是随机的,即输入的运算数有多少位是未知的,因此无法使用上面的方面静态确定每一位的权重。这里介绍的方法是,每输入运算数的一位,则把前面的合并结果(称为原值)乘以10 再与这一位相加,实现动态的加权合并。例如:令原值为 0,输入 1,结果为: 01011 输入 2,结果为: 110212 输入 3,结果为: 12 103123 即: 123( ( (0101) 102) 10) 3。数值的补码转换流程如图4 所示,当然,在获得第一个数值输入前要先把原值设置为0。输入是数值结果作为新的原值保存减 30H与原值的 10倍相加图 4 数值的补码转
8、换流程图由于符号全部是一个字节,无需进行任何转换即可保存,处理简单,这里不作探讨。5.2 计算由于运算表达式有多个数值和符号,而符号有不同的优先级别,因此上文提到的数值保存和符号保存应该分开两个地方进行保存,这样有利于表达式的计算算法设计。下面把“+、-、*、 /”称为运算符,把“ (、 ) ”称为优先符。1212*34+5634 56*+数值存储符号存储(a)1212*(34+56-8)34 56*(数值存储符号存储(b)8+-)1212*21-(34+56-8)+1)21 34*(数值存储符号存储(c)56+-)81-(+)图 5 运算表达式的存储举例观察图 5 的三条运算表达式,再联系四
9、则混合运算的优先原则,可以归纳出几点:(a)数值的数量是运算符的数量加1(优先符不算) ,第 1 个运算符代表第1、2 个数值的运算操作,第N 个运算符代表第N、N+1 个数值的运算操作 ,(b)每进行一次运算,相应的运算符即被消除,而参与运算的两个数值合并为一个数值,仍然满足( a) 。例如图 5(a) ,当完成乘法运算后,数值存储区有408、56 两个数,符号存储区有“+”一个运算符。(c)括号(优先符)的作用是把括号内的运算符的优先级别提高到比外部高。因此,要实现运算表达式的运算,最重要的就是确定所有运算符的优先级别。下面讨论运算符优先级别的编程设计方法。名师资料总结 - - -精品资料
10、欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 14 页 - - - - - - - - - 4 5.2.1 运算优先级别的静态确定法此方法是完成了把整条运算表达式全部存入数值存储区和符号存储区后才开始对运算符优先级进行判断的方法:设置“ * 、/”的优先级为2、 “+、 -”的优先级为1;括号内部的所有运算符的优先级全部加2。运用优先级别静态确定法处理图5 的三条表达式的运算符,结果如图6 所示。其中图 6(c)的“ 34+56-8”由于被括号括起两次,因此其两个运算符“+、-”的优先级别均加了两次
11、2。1212*34+5634 56*+数值存储符号存储(a)1212*(34+56-8)34 56*(数值存储符号存储(b)8+-)1212*21-(34+56-8)+1)21 34*(数值存储符号存储(c)56+-)81-(+)21优先级2优先级332优先级5513图 6 运算符的静态优先级别最后,由于四则混合运算遵循从左往右计算的原则,即相同优先级别的运算符靠左的优先。因此, 只需计算出符号存储区里面的所有运算符的优先级别,然后根据优先级的大小先后执行运算符对应的运算即可实现计算(当然每进行一次运算,相应的运算符即被消除,而参与运算的两个数值合并为一个数值)。当数值存储区里面剩下一个数值时
12、,运算结束,这个最后的数值就是运算的最终结果。请同学们自行设计此算法的流程图。5.2.2 运算优先级别的动态确定法运算优先级别静态确定法具有容易理解、实现简单的优点,而其缺点是:如果运算表达式太长、 太多数值和符号时,则会占用较多的存储空间,而且计算优先级的工作量也会增多。动态确定法是在运算表达式未结束输入即开始计算的一种方法。由于在表达式输入阶段已开始计算,因此计算结果的速度比静态确定法快。观察图5(a) ,当用户输入“+”时,已经可以开始计算“12*34” ;观察图5(b) ,当用户输入“ -”时,已经可以开始计算“34+56” ;观察图 5(c) ,当用户输入第一个“-”时,已经可以开始
13、计算“12*21” 。也就是说, 当用户输入的运算符的优先级不大于前一个运算符时,即可开始前一个运算符的计算。问题是,对于有括号的运算表达式,在用户没有完成运算表达式的全部输入前,很难提前确定括号内部运算符的优先级。为了解决这个问题,动态确定法把优先符(括号)也赋予了优先级:“ (” ,优先级为5;“* 、/” ,优先级为4;“+、-” ,优先级为3;“) ” ,优先级为1。计算图 5 三条运算表达式的所有符号的优先级别,结果如图7 所示。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - -
14、第 4 页,共 14 页 - - - - - - - - - 5 1212*34+5634 56*+数值存储符号存储(a)1212*(34+56-8)34 56*(数值存储符号存储(b)8+-)1212*21-(34+56-8)+1)21 34*(数值存储符号存储(c)56+-)81-(+)43优先级4优先级334优先级3333551115图 7 运算符的动态优先级别设计计算的条件:(1) 只有优先级为3、4 的符号(即 +、 -、*、/)可以进行计算;(2) 如果某符号的优先级大于等于下一个的优先级时,对此符号进行相应运算(当然每进行一次运算,相应的运算符即被消除,而参与运算的两个数值合并为
15、一个数值);(3) 如果左右括号相邻,且左括号在右括号左边时(即在符号存储区里面出现“() ”的情况,或者在优先级队列里出现“51”的情况),把这对括号消除掉。最后,当数值存储区里面剩下一个数值(或者符号存储区里面没有符号)时,运算结束,这个最后的数值就是运算的最终结果。请同学们自行设计此算法的流程图。5.3 结果输出当数值存储区里面剩下一个数值(或者符号存储区里面没有符号)时,运算结束,需要把运算结果输出显示。分析运算结果的特点:运算结果为一个2 进制补码,整数,如果数据长度为16 位,则运算结果范围是:-3276832767。运算结果的输出要解决的主要问题是:正负数区分、补码到 ASCII
16、 码转换并输出显示。运算结果的输出流程如图8 所示。补码到 ASCII码转换正负数区分输出显示图 8 结果输出流程图5.3.1 正负数区分运算结果有三种情况:正整数、负整数、零。运算结果以补码形式对这三种情况进行统一的存储,但显示输出时则有所不同。负整数前面需要显示“-”号,因此需要对运算结果的符号进行判断。另一方面,正整数和零的补码与原码相同,而负整数的补码则不一样。把负整数进行取补码运算,把它转换为原码,可以实现运算结果统一的ASCII码转换输出方法,而不需要分别为正整数和零、负整数分别设计两个不同的ASCII 码转换程序,如图9所示。开始小于 0输出“ -”是否取补码ASCII 码转换图
17、 9 正负数区分流程图名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 14 页 - - - - - - - - - 6 5.3.2 补码到 ASCII 码转换计算结果在屏幕上的输出显示实际上是ASCII 码的输出显示。假设程序采用的数据长度为 16 位,则运算结果范围是:-3276832767,即屏幕最多得显示5 位 ASCII 码。由于上文已经把结果统一为原码,下面介绍如何把原码转换为ASCII 码。这个转换过程实际上跟上文的“数值的补码转换方法”是相反操作。例如要把1
18、23 在屏幕上输出显示,即要把123 的百位、十位、个位分离,得到1、2、3,然后转换为31H、32H、33H 三个 ASCII 码。众所周知,把一位数转换为ASCII 码只需加30H 即可,下面介绍把一个多位数的各位分离的方法。(一)除十法分离方法是:对一个多位数进行除10 处理,得到的余数即为个位数,而商则是删除个位后的多位数。 对商反复进行除10 处理, 直到商为 0 为止,即可把各位数分离。例如对 123进行除十法处理:123/10,商是 12,余数是 3 12/10,商是 1,余数是 2 1/10,商是 0,余数是 1 可见经过三次除十计算,得到的三个余数刚好就是对123 的各位的分
19、离结果。接着只需分别对这些余数加30H 即可转换为ASCII 码,实现输出转换。除十法的优点是不需要理会要输出的数值有多少位,不断除以10 直到商为0 即可;缺点是得到的余数的顺序跟输出的方向相反,不方便输出。 例如上例得到的三个余数的顺序是3、2、1,加 30H 转换输出后屏幕显示为“321” ,跟期望显示的顺序相反,要作进一步处理。处理方法是把余数放进堆栈里面,然后再出栈显示。由于堆栈是先进后出的,即可解决该输出的顺序问题。输出数 /10余数加 30H入堆栈商为 0否输出数商出栈,显示是开始结束图 10 除十法流程图(二)除最高位法分离方法是先除以10位数-1,得到的商即为最高位,余数为删
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年2022年汇编计算器 2022 汇编 计算器
限制150内