版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实用标准文案数字计算器的汇编语言实现1项目特点及目的本课程设计是一次程序设计方法及技能的基本训练,通过实际程序的开发及调试,巩固课堂上学到的关于程序设计的基本知识和基本方法,进一步熟悉汇编语言的结构特点和使用,达到能独立阅读、设计编写和调试具有一定规模的汇编 程序的水平。2题目简介用8086汇编语言编写一个能实现四则混合运算、带括号功能的整数计算器 程序。程序能实现键盘十进制运算表达式的输入和显示(例如输入: “ 1+2*(3-4) ”,按“=”后输出十进制表示的运算结果。3程序设计要求遵循模块化、结构化的编程思路程序必须正确运行程序简明易懂,多标明注释,具有良好的程序书写风格适当优化程序,提
2、高程序的运行效率4工作条件使用的设备及软件为8086兼容机及MASM汇编开发软件。5题目分析根据题目要求,可以把程序的工作过程划分为运算表达式输入、计算、结果输出三部分。因此在编写程序时可以按此把程序大致划分为三个模块。5.1运算表达式输入用户通过键盘输入的运算表达式为一个 ASCII码字符串,字符串的最后一个字符是“=”号。对于这个运算表达式,“ +、-、*、/、(、)、09、= ”是合法 的表达式内容,其他的字符则是无法进行运算的非法内容, 因此需要首先进行表 达式合法性检查。另外,由于计算机能进行计算的是2进制的补码,因此还需要 把以ASCII码表示的数值转换为补码的形式并加以保存。当然
3、,控制运算方式的符号也要进行保存。因此,“运算表达式输入”这个模块可以细化为:表达式合 法性检查、数值的 ASCII码到补码转换及保存、符号的保存三个小部分,如图6-1所示。图6-1“运算表达式输入”的流程图5.1.1运算表达式合法性的检查方法观察“ ASCII字符编码表”,可以发现“ +、-、*、/、(、)”的ASCII码由28H到2FH,而“ 09”的ASCII码则由30H到39H,因此只需对输入的字 符一个一个地进行数值范围比较,看看是否处于28H39H这个范围里面,即可区分输入的表达式是否合法,流程图如图6-2所示。此流程图是采用循环输入 字符的方法,每输入一个字符即进行判断。读者也可
4、以采用输入字符串的方法, 把整个运算表达式接收完毕后再进行判断。精彩文档输入字符是是“=是否 小于28H输入结束口否1疋 大于39H否1是小于30H是符号,执 行相应处理图6-3运算表达式合法性检查流程图否是数值,执行相应处理图6-2运算表达式合法性检查流程图一另一方面,对于含有括号的运算表达式,当左括号的数量与右括号数量不相 等时,表达式也是非法的。因此,可以设置一个起始值为 0的变量(下面称其为 配对标志),当输入“(”时此变量加一,当输入“)”时减一,则当表达式输入结束时,只需判定此配对标志是否为 0,即可判定左右括号数量是否相等。5.1.2数值的补码转换方法要进行数值的ASCII码到补
5、码的转换,首先就得判断输入的字符是数值还是符号。根据上文所提,“ +、-、*、/、(、)”的ASCII码由28H到2FH,而“09”的ASCII码则由30H到39H,只需比较字符是否小于等于 2FH (或小于30H )即可判断是否为符号,否则则是数值,如图6-2所示。众所周知,要把一个ASCII码数值转换为二进制补码的形式,只需要对其减30H即可实现。但如果输入的是多位数,例如 123,那么计算机获得的是31H、32H、33H三个字节,即使分别对这三个字节进行减 30H操作,也只是获得1、2、3三个数而已。实际上可以利用加权的方法合并这几个数:123 = 1 X100 + 2 X10 + 3
6、X1但另一个问题是,由于输入是随机的,即输入的运算数有多少位是未知的,因此无法使用上面的方面静态确定每一位的权重。这里介绍的方法是,每输入运 算数的一位,则把前面的合并结果(称为原值)乘以 10再与这一位相加,实现 动态的加权合并。例如:令原值为0,输入1,结果为:0 X10 + 1 = 1输入2,结果为:1X10 + 2 = 12输入3,结果为:12 X10 + 3 = 123即: 123 = (0X10 + 1 )X10 + 2)X10 )+ 3。数值的补码转换流程如图6-4所示,当然,在获得第一个数值输入前要先把原值设置为0。图6-4数值的补码转换流程图由于符号全部是一个字节,无需进行任
7、何转换即可保存,处理简单,这里不作探讨 5.2计算由于运算表达式有多个数值和符号, 而符号有不同的优先级别,因此上文提到的数值保存和符号保存应该分开两个地方进行保存, 这样有利于表达式的计算算法设计。下面把“ +、-、*、/”称为运算符,把“(、)”称为优先符。12*(34+56-8)12*21-(34+56-8)+1)数值存储符号存储12345612*34+56*+图6-5运算表达式的存储举例观察图6-5的三条运算表达式,再联系四则混合运算的优先原则, 可以归纳 出几点:(a)数值的数量是运算符的数量加(优先符不算),第1个运算符代表第1、 2个数值的运算操作,第N个运算符代表第N、N+1个
8、数值的运算操 作(b)每进行一次运算,相应的运算符即被消除,而参与运算的两个数值合并 为一个数值,仍然满足(a)。例如图6-5 (a),当完成乘法运算后,数 值存储区有408、56两个数,符号存储区有“ + ” 一个运算符。(c)括号(优先符)的作用是把括号内的运算符的优先级别提高到比外部高。 因此,要实现运算表达式的运算,最重要的就是确定所有运算符的优先级别。下面讨论运算符优先级别的编程设计方法。5.2.1运算优先级别的静态确定法此方法是完成了把整条运算表达式全部存入数值存储区和符号存储区后才开始对运算符优先级进行判断的方法:设置“ *、/”的优先级为2、“ +、- ”的优先级为1 ;括号内
9、部的所有运算符的优先级全部加2。运用优先级别静态确定法处理图 6-5的三条表达式的运算符,结果如图6-6所示。其中图6-6(c)的“ 34+56-8 ”由于被括号括起两次,因此其两个运算符“ +、- ”的优先级别均加了两次2数值存储符号存储优先级12345612*34+56*+2112*(34+56-8)图6-6运算符的静态优先级别12*21-(34+56-8)+1)最后,由于四则混合运算遵循从左往右计算的原则,即相同优先级别的运算符靠左的优先。因此,只需计算出符号存储区里面的所有运算符的优先级别,然 后根据优先级的大小先后执行运算符对应的运算即可实现计算(当然每进行一次 运算,相应的运算符即
10、被消除,而参与运算的两个数值合并为一个数值) 。当数 值存储区里面剩下一个数值时,运算结束,这个最后的数值就是运算的最终结果。读者请自行设计此算法的流程图。5.2.2运算优先级别的动态确定法运算优先级别静态确定法具有容易理解、实现简单的优点,而其缺点是:如 果运算表达式太长、太多数值和符号时,则会占用较多的存储空间,而且计算优 先级的工作量也会增多。动态确定法是在运算表达式未结束输入即开始计算的一 种方法。由于在表达式输入阶段已开始计算,因此计算结果的速度比静态确定法 快。观察图6-5(a),当用户输入“ +”时,已经可以开始计算“ 12*34 ”;观察图6-5 (b),当用户输入“-”时,已
11、经可以开始计算“34+56 ”;观察图6-5 (c), 当用户输入第一个“-”时,已经可以开始计算“ 12*21 ”。也就是说,当用户输 入的运算符的优先级不大于前一个运算符时,即可开始前一个运算符的计算。问题是,对于有括号的运算表达式,在用户没有完成运算表达式的全部输入前,很难提前确定括号内部运算符的优先级。为了解决这个问题,动态确定法把优先符(括号)也赋予了优先级:“(”,优先级为5 ;“*、/”,优先级为4 ;“ +、- ”,优先级为3 ;“)”,优先级为1。计算图6-5三条运算表达式的所有符号的优先级别,结果如图6-7所示数值存储符号存储优先级12345612*34+56*+43数值存
12、储|12|34|56| 8数值存储1221345681符号存储 *(+ - | )符号存储* | -( ( +-)+)优先级4533 | 1优先级435533 13112*(34+56-8)12*21-(34+56-8)+1)(b)(c)图6-7运算符的动态优先级别设计计算的条件:(1) 只有优先级为3、4的符号(即+、-、*、/ )可以进行计算;(2) 如果某符号的优先级大于等于下一个的优先级时,对此符号进行相应运算(当然每进行一次运算,相应的运算符即被消除,而参与运算的两个数值 合并为一个数值);(3) 如果左右括号相邻,且左括号在右括号左边时(即在符号存储区里面出现()”的情况,或者在优
13、先级队列里出现“ 51 ”的情况),把这对括号消 除掉。最后,当数值存储区里面剩下一个数值(或者符号存储区里面没有符号) 时, 运算结束,这个最后的数值就是运算的最终结果。 读者请自行设计此算法的流程 图。5.3结果输出当数值存储区里面剩下一个数值(或者符号存储区里面没有符号)时,运算 结束,需要把运算结果输出显示。分析运算结果的特点:运算结果为一个 2进制补码,整数,如果数据长度为 16位,则运算结果范围是:-3276832767 。运算结果的输出要解决的主要问 题是:正负数区分、补码到ASCII码转换并输出显示。运算结果的输出流程如图 6-8所示。图6-8结果输出流程图5.3.1正负数区分
14、运算结果有三种情况:正整数、负整数、零。运算结果以补码形式对这三种情况进行统一的存储,但显示输出时则有所不同。负整数前面需要显示“-”号,因此需要对运算结果的符号进行判断。另一方面,正整数和零的补码与原码相同, 而负整数的补码则不一样。把负整数进行取补码运算,把它转换为原码,可以实 现运算结果统一的ASCII码转换输出方法,而不需要分别为正整数和零、负整数 分别设计两个不同的ASCII码转换程序,如图6-9所示。图6-9正负数区分流程图532补码到ASCII码转换计算结果在屏幕上的输出显示实际上是 ASCII码的输出显示。假设程序采用 的数据长度为16位,则运算结果范围是:-327683276
15、7 ,即屏幕最多得显示 5位ASCII码。由于上文已经把结果统一为原码,下面介绍如何把原码转换为 ASCII 码。这个转换过程实际上跟上文的“数值的补码转换方法”是相反操作。例如要 把123在屏幕上输出显示,即要把123的百位、十位、个位分离,得到 1、2、 3,然后转换为31H、32H、33H三个ASCII码。众所周知,把一位数转换为 ASCII码只需加30H即可,下面介绍把一个多位数的各位分离的方法。(一)除十法分离方法是:对一个多位数进行除 10处理,得到的余数即为个位数,而商 则是删除个位后的多位数。对商反复进行除 10处理,直到商为0为止,即可把 各位数分离。例如对123进行除十法处
16、理:123/10,商是12,余数是312/10,商是1,余数是21/10,商是0,余数是1可见经过三次除十计算,得到的三个余数刚好就是对123的各位的分离结 果。接着只需分别对这些余数加 30H即可转换为ASCII码,实现输出转换。除十法的优点是不需要理会要输出的数值有多少位,不断除以10直到商为0即可;缺点是得到的余数的顺序跟输出的方向相反,不方便输出。例如上例得到的三个余数的顺序是3、2、1,加30H转换输出后屏幕显示为“ 321”,跟期 望显示的顺序相反,要作进一步处理。处理方法是把余数放进堆栈里面, 然后再 出栈显示。由于堆栈是先进后出的,即可解决该输出的顺序问题。图6-10除十法流程
17、图(二)除最咼位法分离方法是先除以10位数-1,得到的商即为最高位,余数为删除最高位后的多位数。接着令余数除以10位数-2,得到的商为次高位,。例如123,其位 数是3 (个位、十位、百位),则计算过程为:123/10 3-1,商是1,余数是2323/10 3-2,商是2,余数是33/10 3-3,商是3,余数是0可见经过三次计算,得到的三个商刚好是对123的各位的分离结果,而且顺 序跟输出方向相同。可以直接加 30H转换输出,屏幕显示为“ 123 ”。实用标准文案该方法的缺点是:必须首先确定要输出的数值有多少位,编程者必须十分清 楚需要输出的数值的数值范围。图6-11除最高位法流程图源程序代
18、码(与上面讲解的方法有点出入);-数据段DATA SEGMENTTAB1 DB 13,10,HUI BIAN JI SUAN QI SHE Jl$TAB2DB 13,10,1234$TAB3DB 13,10,5678$TAB4DB 13,10,90+ -$TAB5DB 13,10,*/()$TAB6DB 13,10, PLEASE INPUT A FORMULA:$TAB7DB 13,10,$精彩文档实用标准文案NUM1 DW 100 DUPNUM3 DW 100 DUPNUM4 DW 100 DUPCO DW 0C1 DW 0C2 DW 0SUM1 DW 0SUM2 DW 0OLT DW 0
19、RESULT DW 0TABLE DW 10000,1000,100,10,1;定义输出时要用到的除数WRONG DB 13,10,WRONG INPUT!$;OVER DB 13,10,NOT OPERATIONAL CHARACTERDATA ENDS;-代码段CODE SEGMENTASSUME CS:CODE,DS:DATA;主程序START:MOV AX,DATAMOV DS,AXCALL DISPMENU ;显示汇编计算器菜单STARTA:MOV BX,-1MOV SI,0MOV DI,30MOV CX,0MOV C0,0MOV C1,0MOV C2,0;初始化各个变量CALL I
20、NPUTCALLYUNSUANCALL OUTPUTEXIT:MOV AH,4CHINT 21H;计算器显示菜单子程序 DISPMENU PROC NEARMOV DX,OFFSET TAB1MOV AH,09HINT 21HMOV DX,OFFSET TAB2MOV AH,09HINT 21HMOV DX,OFFSET TAB3MOV AH,09HINT 21HMOV DX,OFFSET TAB4MOV AH,09HINT 21HMOV DX,OFFSET TAB5MOV AH,09HINT 21HMOV DX,OFFSET TAB6MOV AH,09HINT 21HMOV DX,OFFSE
21、T TAB7MOV AH,09HINT 21HRETDISPMENU ENDPNUM1;输入字符及转换程序模块;-输入并转换子程序,结果式存入INPUT PROC NEARSTARTW:MOV AH,1INT 21HMOV AH,0CMP AL,1BH ; ESCJZ EXITCMP AL,2AH ; *JZ MARKCMP AL,2FH ; TJZ MARKCMP AL,2BH ; +JZ MARKCMP AL,2DH ;-JZ MARKCMP AL,29H ;)JZ MARKCMP AL,28H ;(JZ MARKCMP AL,3DH ;=JZ EQUALSUB AL,30HCMP AL,
22、0JL ERRORCMP AL,9JA ERRORJMP ARITHERROR:;显示输入错误LEA DX,WRONGMOV AH,9INT 21HJMP STARTAARITH:CMP C1,0JE TTOMMANA:;数值的补码转换MOV C0,AXADD C1,1MOV AX,BXMOV CX,10MUL CXADD AX,C0MOV BX,AXJMP STARTWTTOM:MOV BX,0JMP MANAMARK:CMP BX,-1JE GGONMOV NUM1SI,BXADD SI,2MOV NUM1SI,AXMOV BX,-1MOV C1,0ADD SI,2JMP STARTWGG
23、ON:MOV NUM1SI,AXADD SI,2JMP STARTWEQUAL:;输入是等号时,调到主程序执行运算CMP BX,-1JE LLOP精彩文档实用标准文案MOV NUM1SI,BXADD SI,2MOV NUM1SI,AXJMP ENDWLLOP:MOV NUM1SI,AXJMP ENDWENDW:RETINPUT ENDP;-运算的子程序;使括号内的运算先进行,别用算出的结果代替对应括号及括号内的运算的子程序YUNSUAN PROC NEARAAAA:MOV BP ,0MOV DI,0MOV BX,0MOV C0,0MOV C1,0MOV SUM2,0MOV SI,0精彩文档实用
24、标准文案MOV NUM3DI,AX;把括号里的计算式存入NUM3精彩文档BBBB:RSEE:SUB SI,2MOV AX,NUM1SICMP AX,28H ;(JE MOTTJMP RSEEMOTT:MOV AX,NUM1SICMP AX,29H ;)先查找最左边的右括号JE RSEEADD SI,2CMP AX,3DH ;=JE LASTLJMP BBBBMOV SUM2,SIKKTY:MOV DI,0ADD SI,2MOV AX,NUM1SICMP AX,29H ;)实用标准文案JE RCOUNTADD Dl,2JMP KKTYRCOUNT:MOV SUM1,SICALL CALCMOV
25、DI,SUM2MOV AX,RESULTMOV NUM1DI,AXMOV SI,SUM2CCOO:ADD SI,2ADD DI,2MOV AX,NUM1SIMOV NUM1DI,AXCMP AX,3DH ;JE AAAAJMP CCOOLASTL:MOV SI,0UUCC:MOV NUM3SI,AXADD SI,2CMP AX,3DH ;JE ENDLJMP UUCCENDL:CALL CALCRETYUNSUAN ENDP;-计算混合运算的子程序(不含括号的) CALC PROC NEARMOV AX,NUM3MOV NUM4,AXMOV DI,2MOV C0,SIMOV SI,2INT1:
26、MOV BX,NUM3SICMP BL,2AH ;*JE MULLCMP BL,2FH ;/精彩文档实用标准文案JE DIVVCMP BL,3DH ;=JE CHUBUCMP BL,29H ;)JE CHUBUCMP BL,2BH ;+JE POTTCMP BL,2DH ;-JE POTTINT2:MOV NUM4DI,BXADD DI,2ADD SI,2MOV AX,NUM3SIMOV NUM4DI,AXADD DI,2ADD SI,2JMP INT1POTT:SUB DI,2ADD DI,2JMP INT2MULL:ADD SI,2MOV BX,NUM3SIMUL BXADD SI,2JMP INT1D
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度环境管理体系认证与安全服务协议3篇
- 2024年资料员权益保障协议3篇
- 亲子乐园租赁合同模板
- 造船企业备用金内部控制
- 建筑防水审查合同
- 养老院人工打水井施工合同
- 食品添加剂安全使用条例
- 酒店服务分包协议
- 航空航天董事长聘用合同模板
- 2025年家具行业绿色生产标准认证合同汇编3篇
- 道路、桥梁、隧道、地铁施工标准化手册(专业篇)
- 住宅小区室外道路及管网配套工程施工方案
- 公共事业管理概论(娄成武版)各章知识点归纳
- 风电分部工程验收签证表地基与基础008
- 机电设备安装作业指导书
- 申克转子秤安装图片指引ppt课件
- 山东昌乐二中“271高效课堂”教学模式
- 工程竣工保修期满移交书
- 高等数学同济大学第7版 课后习题答案解析完整版
- 单模光缆检验报告
- 化工原理课程设计甲醇和水
评论
0/150
提交评论