数字计算器的汇编语言实现Word文档下载推荐.docx

上传人:b****5 文档编号:19196108 上传时间:2023-01-04 格式:DOCX 页数:19 大小:120.98KB
下载 相关 举报
数字计算器的汇编语言实现Word文档下载推荐.docx_第1页
第1页 / 共19页
数字计算器的汇编语言实现Word文档下载推荐.docx_第2页
第2页 / 共19页
数字计算器的汇编语言实现Word文档下载推荐.docx_第3页
第3页 / 共19页
数字计算器的汇编语言实现Word文档下载推荐.docx_第4页
第4页 / 共19页
数字计算器的汇编语言实现Word文档下载推荐.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

数字计算器的汇编语言实现Word文档下载推荐.docx

《数字计算器的汇编语言实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数字计算器的汇编语言实现Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。

数字计算器的汇编语言实现Word文档下载推荐.docx

令原值为0,输入1,结果为:

10+1=1

输入2,结果为:

10+2=12

输入3,结果为:

12×

10+3=123

即:

123=(((0×

10+1)×

10+2)×

10)+3。

数值的补码转换流程如图6-4所示,当然,在获得第一个数值输入前要先把原值设置为0。

图6-4数值的补码转换流程图

由于符号全部是一个字节,无需进行任何转换即可保存,处理简单,这里不作探讨。

5.2计算

由于运算表达式有多个数值和符号,而符号有不同的优先级别,因此上文提到的数值保存和符号保存应该分开两个地方进行保存,这样有利于表达式的计算算法设计。

下面把“+、-、*、/”称为运算符,把“(、)”称为优先符。

图6-5运算表达式的存储举例

观察图6-5的三条运算表达式,再联系四则混合运算的优先原则,可以归纳出几点:

(a)数值的数量是运算符的数量加1(优先符不算),第1个运算符代表第1、2个数值的运算操作,第N个运算符代表第N、N+1个数值的运算操作……

(b)每进行一次运算,相应的运算符即被消除,而参与运算的两个数值合并为一个数值,仍然满足(a)。

例如图6-5(a),当完成乘法运算后,数值存储区有408、56两个数,符号存储区有“+”一个运算符。

(c)括号(优先符)的作用是把括号内的运算符的优先级别提高到比外部高。

因此,要实现运算表达式的运算,最重要的就是确定所有运算符的优先级别。

下面讨论运算符优先级别的编程设计方法。

5.2.1运算优先级别的静态确定法

此方法是完成了把整条运算表达式全部存入数值存储区和符号存储区后才开始对运算符优先级进行判断的方法:

⏹设置“*、/”的优先级为2、“+、-”的优先级为1;

⏹括号内部的所有运算符的优先级全部加2。

运用优先级别静态确定法处理图6-5的三条表达式的运算符,结果如图6-6所示。

其中图6-6(c)的“34+56-8”由于被括号括起两次,因此其两个运算符“+、-”的优先级别均加了两次2。

图6-6运算符的静态优先级别

最后,由于四则混合运算遵循从左往右计算的原则,即相同优先级别的运算符靠左的优先。

因此,只需计算出符号存储区里面的所有运算符的优先级别,然后根据优先级的大小先后执行运算符对应的运算即可实现计算(当然每进行一次运算,相应的运算符即被消除,而参与运算的两个数值合并为一个数值)。

当数值存储区里面剩下一个数值时,运算结束,这个最后的数值就是运算的最终结果。

读者请自行设计此算法的流程图。

5.2.2运算优先级别的动态确定法

运算优先级别静态确定法具有容易理解、实现简单的优点,而其缺点是:

如果运算表达式太长、太多数值和符号时,则会占用较多的存储空间,而且计算优先级的工作量也会增多。

动态确定法是在运算表达式未结束输入即开始计算的一种方法。

由于在表达式输入阶段已开始计算,因此计算结果的速度比静态确定法快。

观察图6-5(a),当用户输入“+”时,已经可以开始计算“12*34”;

观察图6-5(b),当用户输入“-”时,已经可以开始计算“34+56”;

观察图6-5(c),当用户输入第一个“-”时,已经可以开始计算“12*21”。

也就是说,当用户输入的运算符的优先级不大于前一个运算符时,即可开始前一个运算符的计算。

问题是,对于有括号的运算表达式,在用户没有完成运算表达式的全部输入前,很难提前确定括号内部运算符的优先级。

为了解决这个问题,动态确定法把优先符(括号)也赋予了优先级:

⏹“(”,优先级为5;

⏹“*、/”,优先级为4;

⏹“+、-”,优先级为3;

⏹“)”,优先级为1。

计算图6-5三条运算表达式的所有符号的优先级别,结果如图6-7所示。

图6-7运算符的动态优先级别

设计计算的条件:

(1)只有优先级为3、4的符号(即+、-、*、/)可以进行计算;

(2)如果某符号的优先级大于等于下一个的优先级时,对此符号进行相应运算(当然每进行一次运算,相应的运算符即被消除,而参与运算的两个数值合并为一个数值);

(3)如果左右括号相邻,且左括号在右括号左边时(即在符号存储区里面出现“()”的情况,或者在优先级队列里出现“51”的情况),把这对括号消除掉。

最后,当数值存储区里面剩下一个数值(或者符号存储区里面没有符号)时,运算结束,这个最后的数值就是运算的最终结果。

5.3结果输出

当数值存储区里面剩下一个数值(或者符号存储区里面没有符号)时,运算结束,需要把运算结果输出显示。

分析运算结果的特点:

运算结果为一个2进制补码,整数,如果数据长度为16位,则运算结果范围是:

-32768~32767。

运算结果的输出要解决的主要问题是:

正负数区分、补码到ASCII码转换并输出显示。

运算结果的输出流程如图6-8所示。

图6-8结果输出流程图

5.3.1正负数区分

运算结果有三种情况:

正整数、负整数、零。

运算结果以补码形式对这三种情况进行统一的存储,但显示输出时则有所不同。

负整数前面需要显示“-”号,因此需要对运算结果的符号进行判断。

另一方面,正整数和零的补码与原码相同,而负整数的补码则不一样。

把负整数进行取补码运算,把它转换为原码,可以实现运算结果统一的ASCII码转换输出方法,而不需要分别为正整数和零、负整数分别设计两个不同的ASCII码转换程序,如图6-9所示。

图6-9正负数区分流程图

5.3.2补码到ASCII码转换

计算结果在屏幕上的输出显示实际上是ASCII码的输出显示。

假设程序采用的数据长度为16位,则运算结果范围是:

-32768~32767,即屏幕最多得显示5位ASCII码。

由于上文已经把结果统一为原码,下面介绍如何把原码转换为ASCII码。

这个转换过程实际上跟上文的“数值的补码转换方法”是相反操作。

例如要把123在屏幕上输出显示,即要把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的各位的分离结果。

接着只需分别对这些余数加30H即可转换为ASCII码,实现输出转换。

除十法的优点是不需要理会要输出的数值有多少位,不断除以10直到商为0即可;

缺点是得到的余数的顺序跟输出的方向相反,不方便输出。

例如上例得到的三个余数的顺序是3、2、1,加30H转换输出后屏幕显示为“321”,跟期望显示的顺序相反,要作进一步处理。

处理方法是把余数放进堆栈里面,然后再出栈显示。

由于堆栈是先进后出的,即可解决该输出的顺序问题。

图6-10除十法流程图

(二)除最高位法

分离方法是先除以10位数-1,得到的商即为最高位,余数为删除最高位后的多位数。

接着令余数除以10位数-2,得到的商为次高位,……。

例如123,其位数是3(个位、十位、百位),则计算过程为:

123/103-1,商是1,余数是23

23/103-2,商是2,余数是3

3/103-3,商是3,余数是0

可见经过三次计算,得到的三个商刚好是对123的各位的分离结果,而且顺序跟输出方向相同。

可以直接加30H转换输出,屏幕显示为“123”。

该方法的缺点是:

必须首先确定要输出的数值有多少位,编程者必须十分清楚需要输出的数值的数值范围。

图6-11除最高位法流程图

源程序代码(与上面讲解的方法有点出入)

;

------数据段-------------

DATASEGMENT

TAB1DB13,10,"

HUIBIANJISUANQISHEJI$"

TAB2DB13,10,"

1234$"

TAB3DB13,10,"

5678$"

TAB4DB13,10,"

90+-$"

TAB5DB13,10,"

*/()$"

TAB6DB13,10,"

PLEASEINPUTAFORMULA:

$"

TAB7DB13,10,"

$"

NUM1DW100DUP(?

NUM3DW100DUP(?

NUM4DW100DUP(?

C0DW0

C1DW0

C2DW0

SUM1DW0

SUM2DW0

OLTDW0

RESULTDW0

TABLEDW10000,1000,100,10,1;

定义输出时要用到的除数

WRONGDB13,10,"

WRONGINPUT!

;

OVERDB13,10,"

NOTOPERATIONALCHARACTER!

DATAENDS

----------------------------

------代码段----------------

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

------主程序---------------

START:

MOVAX,DATA

MOVDS,AX

CALLDISPMENU;

显示汇编计算器菜单

STARTA:

MOVBX,-1

MOVSI,0

MOVDI,30

MOVCX,0

MOVC0,0

MOVC1,0

MOVC2,0;

初始化各个变量

CALLINPUT

CALLYUNSUAN

CALLOUTPUT

EXIT:

MOVAH,4CH

INT21H

------计算器显示菜单子程序--------

DISPMENUPROCNEAR

MOVDX,OFFSETTAB1

MOVAH,09H

INT21H

MOVDX,OFFSETTAB2

MOVDX,OFFSETTAB3

MOVDX,OFFSETTAB4

MOVDX,OFFSETTAB5

MOVDX,OFFSETTAB6

MOVDX,OFFSETTAB7

RET

DISPMENUENDP

---------------------------

输入字符及转换程序模块

----输入并转换子程序,结果式存入NUM1-------

INPUTPROCNEAR

STARTW:

MOVAH,1

MOVAH,0

CMPAL,1BH;

'

ESC'

JZEXIT

CMPAL,2AH;

*'

JZMARK

CMPAL,2FH;

/'

CMPAL,2BH;

+'

CMPAL,2DH;

-'

JZMARK

CMPAL,29H;

)'

CMPAL,28H;

('

CMPAL,3DH;

='

JZEQUAL

SUBAL,30H

CMPAL,0

JLERROR

CMPAL,9

JAERROR

JMPARITH

ERROR:

显示输入错误

LEADX,WRONG

MOVAH,9

JMPSTARTA

ARITH:

CMPC1,0

JETTOM

MANA:

数值的补码转换

MOVC0,AX

ADDC1,1

MOVAX,BX

MOVCX,10

MULCX

ADDAX,C0

MOVBX,AX

JMPSTARTW

TTOM:

MOVBX,0

JMPMANA

MARK:

CMPBX,-1

JEGGON

MOVNUM1[SI],BX

ADDSI,2

MOVNUM1[SI],AX

MOVC1,0

JMPSTARTW

GGON:

MOVNUM1[SI],AX

ADDSI,2

EQUAL:

输入是等号时,调到主程序执行运算

JELLOP

MOVNUM1[SI],BX

JMPENDW

LLOP:

ENDW:

RET

INPUTENDP

---------------------------

-----运算的子程序----------

使括号内的运算先进行,别用算出的结果代替对应括号及括号内的运算的子程序

YUNSUANPROCNEAR

AAAA:

MOVBP,0

MOVDI,0

MOVSUM2,0

BBBB:

MOVAX,NUM1[SI]

CMPAX,29H;

)先查找最左边的右括号

JERSEE

CMPAX,3DH;

=

JELASTL

JMPBBBB

RSEE:

SUBSI,2

CMPAX,28H;

JEMOTT

JMPRSEE

MOTT:

MOVSUM2,SI

MOVDI,0

KKTY:

MOVNUM3[DI],AX;

把括号里的计算式存入NUM3

JERCOUNT

ADDDI,2

JMPKKTY

RCOUNT:

MOVSUM1,SI

CALLCALC

MOVDI,SUM2

MOVAX,RESULT

MOVNUM1[DI],AX

MOVSI,SUM2

CCOO:

MOVAX,NUM1[SI]

JEAAAA

JMPCCOO

LASTL:

MOVSI,0

UUCC:

MOVNUM3[SI],AX

JEENDL

JMPUUCC

ENDL:

CALLCALC

YUNSUANENDP

---------------------------------

------计算混合运算的子程序(不含括号的)------------------

CALCPROCNEAR

MOVAX,NUM3

MOVNUM4,AX

MOVDI,2

MOVC0,SI

MOVSI,2

INT1:

MOVBX,NUM3[SI]

CMPBL,2AH;

'

JEMULL

CMPBL,2FH;

JEDIVV

CMPBL,3DH;

JECHUBU

CMPBL,29H;

JECHUBU

CMPBL,2BH;

JEPOTT

CMPBL,2DH;

JEPOTT

INT2:

MOVNUM4[DI],BX

ADDDI,2

MOVAX,NUM3[SI]

MOVNUM4[DI],AX

JMPINT1

POTT:

SUBDI,2

JMPINT2

MULL:

MOVBX,NUM3[SI]

MULBX

DIVV:

DIVBX

ADDD:

MOVBX,NUM4[DI]

ADDAX,BX

JMPINT3

SUBB:

SUBAX,BX

CHUBU:

MOVAX,NUM4

MOVDI,2

INT3:

CMPBX,2BH;

JEADDD

CMPBX,2DH;

JESUBB

MOVRESULT,AX

CALCENDP

-----输出最终结果的子程序---------------

OUTPUTPROCNEAR

LEASI,TABLE

ADDC0,8

MOVCX,5

MOVAX,RESULT

MOVOLT,0

OUTT:

XORDX,DX;

异或清零

DIVWORDPTR[SI];

求万位,千位,百位,十位,个位;

商存在了AX中,余数存在了DX中

ORAL,30H;

转换成ASCLL码

MOVBX,DX;

将DX的值存入BX中,因为下面输出AX值时会改变DX值

CMPSI,C0

JEOUT2

CMPOLT,0

JNEOUT2

CMPAX,30H

JEOUT1

JNEAADD

OUT2:

MOVDX,AX;

输出商值

MOVAH,02

OUT1:

MOVAX,BX;

将余数赋还给AX因为除数十16位,所以余数在DX中

ADDSI,2;

BP加二,用以调用下一个被除数

LOOPOUTT

CALLENTER

JMPSTARTA;

跳回程序开始

AADD:

INCOLT

JMPOUT2

OUTPUTENDP

---------回车换行的子程序---------------------

ENTERPROCNEAR

MOVDL,0DH;

回车

MOVAH,02H

MOVDL,0AH;

换行

ENTER

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 动态背景

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1