1、福建工程学院软件学院题 目: 汇编计算器班 级: 1301 姓 名 学 号: 指导老师:日 期: 课 设 报 告目录1、设计目的 32、概要设计 32.1 系统总体分析 32.2 主模块框图及说明 33、详细设计 43.1 主模块及子模块概述 43.2 各模块详运算 44、程序调试 74.1 运行界面分析 7算法分析 .74.2 调试过程与分析 95、心得体会 115.1 设计体会 115.2 系统改进 11附录: 111、设计目的本课程设计是一次程序设计方法及技能的基本训练,通过实际程序的开发及调试,巩固课堂上学到的关于程序设计的基本知识和基本方法,进一步熟悉汇编语言的结构特点和使用,达到能
2、独立阅读、设计编写和调试具有一定规模的汇编程序的水平。2、概要设计用 8086 汇编语言编写一个能实现四则混合运算、带括号功能的整数计算器程序。程序能实现键盘十进制运算表达式的输入和显示(例如输入:“1+2*(3-4)” ) ,按“=”后输出十进制表示的运算结果。2.1 系统总体分析在 8086 的操作环境下,该计算器分成输入,数据存储,运算功能,输出几个大模块,实现了使用者使用该计算器时输入一个算式,能让系统进行计算。此计算器的实现功能是基本的数学的四则运算,结果范围在 065535。2.2 主模块框图及说明此流程图简要的表现出了所要实现的功能以及一些功能的大概算法,同时也是我编写的一个总体
3、的框架。程序流程图说明:通过流程图,可以看出程序运行时,首先输出提示语气,当用户输入后,程序根据所输入内容进行判断,通过判断的结果来决定调用哪个功能模块,首要先要要判断的是否为 0-9, “+”“-”“*”“/”这些字符,若不是就会报错,实则根据运算符号调用其功能模块完成运算。最后将运算的结果显示在主频幕上,返回主程序,使用户可以重新输入。3、详细设计3.1 主模块及子模块概述根据题目要求,可以把程序的工作过程划分为运算表达式输入、计算、结果输出三部分。因此在编写程序时可以按此把程序大致划分为三个模块。输入:界面的显示设置,以及输入的字符问题进行设计计算:该模块为计算器的核心部分,其中包括运算
4、级的优先级转换和基本的加减乘除函数的函数的编写。显示:对其结果进行一个输出显示。3.2各模块详运算1 运算表达式输入.加减乘除函数(1)加法指令指令格式: 加法 ADD DST, SRC; (DST)(SRC)+(DST)带进位加法 ADC DST, SRC; (DST)(SRC )+(DST)+CF 加 1 INC OPR; (OPR)(OPR)+1 (2)减法指令格式: SUB DST,SRC ; (DST)(DST)-(SRC )带进位减法 SBB DST,SRC ; (DST)(DST)- (SRC)-CF减 1 DEC OPR ; (OPR)(OPR )-1求补 NEG OPR ;
5、(OPR)0FFFFH-(0PR )1比较 CMP OPR1, OPR2 ; (OPR1)-(OPR2) (3)乘法指令 乘法运算分为无符号数运算和有符号数运算,各有相应的指令,并使用双操作数。指令格式:无符号数乘法 MUL SRC;(AX)(AL) (SRC )8 位数乘法(DX,AX)(AX) (SRC )16 位数乘法(4)除法指令 除法运算分为无符号数运算和有符号数运算,各有相应的指令,并使用双操作数。当除数是 8 位或 16 位二进制数时,要求被除数是 16 位或 32 位的二进制数。指令格式:无符号数除法 DIV SRC;(AL )(AX)/ (SRC ) 8 位二进制数除法的商(
6、AH)(AX)/ (SRC)8 位二进制数除法的余数或(AX)(DX,AX)/(SRC ) 16 位二进制数除法的商(DX)(DX,AX)/(SRC ) 16 位二进制数除法的余数.输出显示指令格式: 当数值存储区里面剩下一个数值(或者符号存储区里面没有符号)时,运算结束,需要把运算结果输出显示。分析运算结果的特点:运算结果为一个 2 进制补码,整数,如果数据长度为 16 位,则运算结果范围是:065535。运算结果的输出要解决的主要问题是:正负数区分、补码到ASCII 码转换并输出显示。运算结果的输出流程如图所示。补码到 A S C I I码转换正负数区分 输出显示(1)正负数区分运算结果有
7、三种情况:正整数、负整数、零。运算结果以补码形式对这三种情况进行统一的存储,显示输出时不同。负整数前面需要显示“-”号,因此要在进行器转换该程序直接对执行结果一补码形式输出。 。另一方面,正整数和零的补码与原码相同。而负整数的补码则不一样。把负整数进行取补码运算,把它转换为原码,可以实现运算结果统一的ASCII 码转换输出方法,而不需要分别为正整数和零、负整数分别设计两个不同的 ASCII码转换程序。 (2)补码到 ASCII 码转换计算结果在屏幕上的输出显示实际上是 ASCII 码的输出显示。假设程序采用的数据长度为 16 位,则运算结果范围是:065535,即屏幕最多得显示 5 位 ASC
8、II 码。(3)利用除最高位法将一个多位数的各位进行一个输出。分离方法是先除以 10 位数-1 ,得到的商即为最高位,余数为删除最高位后的多位数。接着令余数除以 10 位数-2 ,得到的商为次高位,。例如 123,其位数是 3(个位、十位、百位) ,则计算过程为:123/103-1,商是 1,余数是 2323/103-2,商是 2,余数是 33/103-3,商是 3,余数是 0可见经过三次计算,得到的三个商刚好是对 123 的各位的分离结果,而且顺序跟输出方向相同。可以直接加 30H 转换输出,屏幕显示为“123 ”。该图的流程程图所示。输出数 / X商加 3 0 H ,输出余数为 0否输出数
9、 = 余数结束是开始X = 1 0位数 - 1X = X / 1 0把原码转换为 ASCII 码这个转换过程实际上跟上文的“数值的补码转换方法”是相反操作。例如要把 123 在屏幕上输出显示,即要把 123 的百位、十位、个位分离,得到 1、2、3,然后转换为31H、32H、33H 三个 ASCII 码。众所周知,把一位数转换为 ASCII 码只需加 30H 即可。4、程序调试4.1 运行界面分析整体一个架构可以直观的看出整个计算器界面和基本的加减运算以及输入提示。算法分析主程序模块.主程序模块首先实现调用子程序加减乘除,优先级运算等,初始化数据段,将寄存器ax,bx,cx,dx 初始化赋初值
10、为 0, ,输入字符或数字并判断,调用子程序 AAAA,等子程序,判断优先级,调用加减乘除运算子程序对所输入的式子判断出的相应运算符进行运算,输出运算结果,判断是否继续,继续则返回输入,不继续则退出程序.1显示计算器界面利用 09H 的功能号调用将所设计的界面直观的显示出来源代码:TAB1 DB 13,10,“HUI BIAN JI SUAN QI SHE JI$“TAB2 DB 13,10,“ 1 2 3 4 $“TAB3 DB 13,10,“ 5 6 7 8 $“TAB4 DB 13,10,“ 9 0 + - $“TAB5 DB 13,10,“ * / ( ) $“TAB6 DB 13,1
11、0,“PLEASE INPUT A FORMULA: $“TAB7 DB 13,10,“$“MOV DX,OFFSET TAB1MOV AH,09HINT 21H2 输入字符及转换程序模块在输入字符或数字该程序要需要将其所输入的子符进行转换,此模块包括运算符号和数字的 ASC码的转换、负数的补码(该计算器输出范围为 065535)转换。源程序代码:AC码的转换MANA: ;MOV C0,AX ADD C1,1MOV AX,BX MOV CX,10MUL CX ADD AX,C0MOV BX,AXJMP STARTW4 符号的优先级运算符号的运算优先问题,该程序利用静态的优先级判断所输入的式子的
12、四则运算优先顺序。5.子运算程序加减乘除的子程序调用例如:加法源程序代码:ADDD:ADD DI,2 MOV BX,NUM4DIADD AX,BX ADD DI,2JMP INT3 6.输出显示对于结果的一个输出,该计算器采用除最高位输出各位。源程序代码段:OUTPUT PROC NEAROUT1:MOV AX,BX ;将余数赋还给 AX 因为除数十 16 位,所以余数在 DX 中ADD SI,2 ;BP 加二,用以调用下一个被除数LOOP OUTT CALL ENTERJMP STARTA ;跳回程序开始 RET AADD:INC OLT JMP OUT2OUTPUT ENDP注:该计算器的
13、除法的结果以取整的形式输出4.2 调试过程与分析,1.初始化程序界面2.当操作错误时会报错注:该计算器只能是按“=”才正确的输出计算结果,按“enter ”等其他无效方式也会进行报错3.计算器的四则运算结果举例4 关于补码和溢出问题当在进行四则运算过程中,若结果为负数则结果一补码的形式输出,若结果超出结果范围则溢出。5、心得体会5.1 设计体会本次的课程设计对于计算器的设计要怎么用汇编语言编写四则运算。编写计算简单的不带括号的没有优先级的+、- 或 *、/、运算程序还是不太难的,因为没有优先级程序只要根据表达式运算符的顺序从左到右进行运算,最后输出结果。而该课程设计要求设计能进行简单的的 +、
14、- 或 *、/ 、混合运算的四则运算程序,这样程序设计时相对于有括号的计算要用到设定权值的办法来设置符号的优先级比起来简单很多。这次的课程设计等于将本学期所学习的汇编知识对其进行一个综合的应用,而且对其汇编有了基本的了解。在本次的课程设计中我主要负责四则函数的编写和输出显示,在过程中也遇到挺多的困难,对于汇编掌握的不透彻,只能通过查找资料和同学的帮助下来编写程序当然还是有效果的,对于这两部分的难点所在我觉得是输出部分,首先要分析计算结果为多位数的各位问题要采用哪种方法进行输出,在经过分析后最终采用除最高位法进行一个输出。此方法较为简单相比较于除十法,因为在除十法还设计到堆栈问题增加了程序量,且
15、该计算器纸对其进行简单的四则运算所以除最高位法适用。5.2 系统改进这个计算器设计的较为简单,只能进行一些简单的不带括号的进行运算,对于一些较为复杂的四则混合运算不适用。则此外界面系统可以利用 BIOS 中断和 DOS 中断和调用显示功能进行程序设计,显示相应的图形或字符对其进行界面美化。此外在输出方面在除法的运算的输出可以对其修改例如不能整除的可以一小数输出等以及除高位法有个缺陷必须首先确定要输出的数值有多少位,编程者必须十分清楚需要输出的数值的数值范围可以对其进行一个改进。附录:DATA SEGMENTTAB1 DB 13,10,“HUI BIAN JI SUAN QI SHE JI$“T
16、AB2 DB 13,10,“ 1 2 3 4 $“TAB3 DB 13,10,“ 5 6 7 8 $“TAB4 DB 13,10,“ 9 0 + - $“TAB5 DB 13,10,“ * / ( ) $“TAB6 DB 13,10,“PLEASE INPUT A FORMULA: $“TAB7 DB 13,10,“$“ NUM1 DW 100 DUP(0) NUM3 DW 100 DUP(0) NUM4 DW 100 DUP(0) C0 DW 0 C1 DW 0 C2 DW 0 SUM1 DW 0SUM2 DW 0 OLT DW 0RESULT DW 0TABLE DW 10000,1000
17、,100,10,1WRONG DB 13,10,“WRONG INPUT!$“;OVER DB 13,10,“NOT OPERATIONAL CHARACTER!$“ DATA ENDS;-;-代码段-CODE SEGMENT ASSUME CS:CODE,DS:DATA;-主程序- START:MOV AX,DATAMOV DS,AX CALL DISPMENU ; 显示汇编计算器菜单STARTA:MOV BX,-1 MOV SI,0 MOV DI,30MOV CX,0MOV C0,0 MOV C1,0 MOV C2,0 ; 初始化各个变量CALL INPUT CALL YUNSUAN CA
18、LL 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,OFFSET TAB7MOV AH,0
19、9HINT 21HRETDISPMENU ENDP ;-;输入字符及转换程序模块;-输入并转换子程序,结果式存入 NUM1-INPUT PROC NEARSTARTW:MOV AH,1 INT 21HMOV AH,0 CMP AL,1BH ; ESCJZ EXITCMP AL,2AH ; *JZ MARKCMP AL,2FH ; /JZ MARKCMP AL,2BH ; +JZ MARKCMP AL,2DH ; -JZ MARK CMP AL,29H ; )JZ MARK CMP AL,28H ; (JZ MARKCMP AL,3DH ; =JZ EQUAL SUB AL,30HCMP AL,
20、0JL ERRORCMP AL,9JA ERROR JMP ARITHERROR: ;显示输入错误LEA DX,WRONGMOV AH,9INT 21H JMP STARTAARITH: CMP C1,0JE TTOM MANA: ;数值的补码转换MOV C0,AX ADD C1,1MOV AX,BX MOV CX,10MUL CX ADD AX,C0MOV BX,AXJMP STARTWTTOM:MOV BX,0JMP MANA MARK: CMP BX,-1JE GGONMOV NUM1SI,BX ADD SI,2 MOV NUM1SI,AX MOV BX,-1 MOV C1,0ADD S
21、I,2 JMP STARTW GGON:MOV NUM1SI,AXADD SI,2JMP STARTW EQUAL: ;输入是等号时,调到主程序执行运算CMP BX,-1JE LLOPMOV NUM1SI,BXADD SI,2MOV NUM1SI,AX JMP ENDW LLOP:MOV NUM1SI,AXJMP ENDW ENDW: RET INPUT ENDP ;- ;-运算的子程序-; YUNSUAN PROC NEARAAAA:MOV BP,0 MOV DI,0MOV BX,0MOV C0,0 MOV C1,0 MOV SUM2,0MOV SI,0 BBBB:MOV AX,NUM1SI
22、CMP AX,29H ; JE RSEE ADD SI,2CMP AX,3DH ; =JE LASTLJMP BBBBRSEE:SUB SI,2MOV AX,NUM1SICMP AX,28H ; JE MOTTJMP RSEEMOTT:MOV SUM2,SI MOV DI,0 KKTY:ADD SI,2 MOV AX,NUM1SIMOV NUM3DI,AX ;CMP AX,29H ; JE RCOUNTADD DI,2JMP KKTYRCOUNT: MOV SUM1,SICALL CALCMOV DI,SUM2 MOV AX,RESULTMOV NUM1DI,AX MOV SI,SUM2CCO
23、O:ADD SI,2 ADD DI,2MOV AX,NUM1SI MOV NUM1DI,AX CMP AX,3DH ; =JE AAAAJMP CCOO LASTL:MOV SI,0UUCC: MOV AX,NUM1SI MOV NUM3SI,AXADD SI,2 CMP AX,3DH ; =JE ENDLJMP UUCC ENDL: CALL CALC RETYUNSUAN ENDP ;- ;- 计算混合运算的子程序-CALC PROC NEARMOV AX,NUM3 MOV NUM4,AX MOV DI,2 MOV C0,SIMOV SI,2INT1: MOV BX,NUM3SI CMP
24、BL,2AH ;*JE MULLCMP BL,2FH ;/JE DIVV CMP BL,3DH ;=JE CHUBU CMP BL,29H ;)JE CHUBUCMP BL,2BH ;+JE POTTCMP BL,2DH ;-JE POTT INT2:MOV NUM4DI,BXADD DI,2 ADD SI,2 MOV AX,NUM3SIMOV NUM4DI,AXADD DI,2ADD SI,2JMP INT1POTT:SUB DI,2MOV NUM4DI,AXADD DI,2 JMP INT2 MULL: ADD SI,2MOV BX,NUM3SIMUL BX ADD SI,2 JMP IN
25、T1DIVV:ADD SI,2MOV BX,NUM3SIDIV BX ADD SI,2 JMP INT1ADDD:ADD DI,2 MOV BX,NUM4DIADD AX,BX ADD DI,2JMP INT3 SUBB:ADD DI,2 MOV BX,NUM4DISUB AX,BX ADD DI,2JMP INT3 CHUBU: MOV NUM4DI,BXSUB DI,2MOV NUM4DI,AXMOV AX,NUM4 MOV DI,2INT3: MOV BX,NUM4DICMP BX,2BH ;+JE ADDD CMP BX,2DH ;- JE SUBB MOV RESULT,AXRET
26、CALC ENDP ;- ;-输出最终结果的子程序-OUTPUT PROC NEARLEA SI,TABLE MOV C0,SIADD C0,8MOV CX,5 MOV AX,RESULT MOV OLT,0OUTT:XOR DX,DX ;异或清零DIV WORD PTR SI ;求万位,千位,百位,十位,个位 ;商存在了 AX 中,余数存在了 DX 中OR AL,30H ;转换成 ASCLL 码 MOV BX,DX ;将 DX 的值存入 BX 中,因为下面输出 AX 值时会改变 DX 值 CMP SI,C0JE OUT2CMP OLT,0JNE OUT2CMP AX,30HJE OUT1 J
27、NE AADDOUT2: MOV DX,AX ;输出商值MOV AH,02INT 21H OUT1:MOV AX,BX ;将余数赋还给 AX 因为除数十 16 位,所以余数在 DX 中ADD SI,2 ;BP 加二,用以调用下一个被除数LOOP OUTT CALL ENTERJMP STARTA ;跳回程序开始 RET AADD:INC OLT JMP OUT2OUTPUT ENDP ;- ;-回车换行的子程序- ENTER PROC NEAR MOV DL,0DH ;回车MOV AH,02H INT 21H MOV DL,0AH ;换行MOV AH,02H INT 21H RET ENTER ENDP CODE ENDSEND START(完整程序)