简易计算器的汇编语言程序设计报告

广东技术师范学院天河学院

汇编语言

课程设计报告

实训题目 简易计算器

系 别 计 算 机 系 专业班级 软件设计 111 班

姓 名 沈学发 孟欣、陈法威、陈建维、李斯恺、曾炳忠、李智超 学 号 (20110411431)29、28、33、30、36、31、32

指导教师 胡安明 所属系部 计算机科学与技术系

目录

一、 程序功能设计论证 ................................ 2

二、程序流程图及其说明 ............................... 3

1 程序流程图 ...................................... 3

2 流程图说明 ...................................... 4

三、程序调试 ......................................... 4

1.初始界面 ........................................ 4

2.加法运算实现界面 ................................ 4

3.除法运算实现 .................................... 5

4.减法运算 ........................................ 5

5. 乘法运算实现 ................................... 6

6.清屏后的界面 .................................... 6

四、心得体会 ......................................... 7

五、参考文献 ......................................... 7

六、附录(代码) ....................................... 8

1

一、程序功能设计论证

该课程设计的任务是做一个简易计算器,可以实现加减乘除四则运算。我们要解决的问题有:以什么方式输入数字、判断是进行什么运算、运算过程中的进位和借位问题以及如何实现清屏等问题。

首先我们要解决的是输入问题,这里我们用INT 21H的一号功能调用来进行输入;然后我们要进行的是判断是进行何种运算,当输入的运算符号不是“+、-、*、/”中的一种时,则报错,提示重新输入。当输入的是 c或C时,则清屏;当输入的是q或Q时,则退出程序。

由于运算过程中出现的进借位问题,会导致输出的结果为一位数,二位数,三位数或者是负数,所以在选择输出的方式时若是选9号功能调用会很不方便,因为9号功能调用要求有一个输出字符的缓冲区,由于输出的结果形式太多,缓冲区太难确定,而且若结果为负数,负号也得事先进行设置,所以单字符输出是一个合理的选择。

最后还要对这个简易计算器进行功能完善,例如为了使程序符合我们使用者的操作习惯,我们可以添加按回车键换行输入,即当键入回车键后,可以换行重新输入;可以设置按C或c键清屏,当键入C或c键时,清除整个屏幕上的输入和输出的字符并可以重新输入并运算;当按下Q或q键退出程。

2

二、程序流程图及其说明

1 程序流程图

简易计算器的汇编语言程序设计报告

3

2 流程图说明

该程序流程图简要地表现出了所要实现的功能以及一些功能的大概算法,同时也是我编写的程序的一个总体的框架。

通过流程图,可以看出程序开始运行时,首先输出提示语句,再输入字符,并判断输入的字符是否为Q或q,若是,则退出,不是则继续输入;判断输入的字符是否为C或c,若是,则清屏重新输入,否则继续输入;判断输入的是不是回车键,若是就回车换行输入,不是则继续输入;判断输入的是否为数字以及+,-,=这些字符,若不是会报错,是则将其存储到定义的数据区里面,再判断输入的是进行什么运算符,进行相应的运算,输出结果。继续上面的步骤

三、程序调试

1.初始界面

运行程序后,进入程序运行初始界面,如图:

简易计算器的汇编语言程序设计报告

2.加法运算实现界面

不是0~9,+,-,=号或输入不正确时,程序会有报错提示,并提示重新输入,运行界面如图:

4

3.除法运算实现 如图:

简易计算器的汇编语言程序设计报告

4.减法运算 如图:

简易计算器的汇编语言程序设计报告

简易计算器的汇编语言程序设计报告

5

5. 乘法运算实现

如图:

简易计算器的汇编语言程序设计报告

6.清屏后的界面

当输入C或c时则清屏,程序运行后清除整个窗口内输入和输出的字符并可以继续输入并计算。如图:

简易计算器的汇编语言程序设计报告

6

四、心得体会

经调试,基本上任务要求设计的所有功能都实现,调试出的计算结果均正确。一周的课程设计结束了,给我的总体感觉就是忙碌但充实,而且真正学到了东西。

以前做课程课计的时候总是前几天时间玩,后面几天才开始做,不过这次却是一直都在做这个课程设计,因为在网上我根本搜不到别人写的简易计算机的资料,所以从构思到设计流程图到编写源程序都是我一个人独立完成的,虽然这个过程比较痛苦,但是我真正的去体验了,当我编写的程序一遍一遍地报错,出的结果一次次和正确结果有出入的时候我真的好想放弃,但是我选择了坚持,通过调试程序,一步步地看寄存器和数据区的变化,最终发现了错误并改正了错误,当运行的结果全都正确的时候我真的好激动,好有成就感,因为这是我第一次自己独立地编写的长达两百多条的程序,虽然结构看上去有点乱,语句不够精练,但是不管怎样,我终于能够实现要求的功能了。

另外,这次无论是设计个这程序还是写课程设计报告都让我学到了好多东西,有对课本知识更加深入的了解和掌握,也有对于流程图的设计以及绘制还有word的一些用法和排版等,都让我受益匪浅,

总之,非常感谢学校和老师给我们安排了这次课程设计,不仅让我掌握了更多的知识,还让我领会到要把一件事情做好并真正有所收获还得靠自己独立地去完成并坚持不懈!希望在以后的学习中还能多搞几次这种课程设计。

五、参考文献

[1] 周佩玲、彭虎、傅忠谦.微机原理与接口技术(基于16位机). 北京:电子工业出版社.,2005

[2] 马春燕.微机原理与接口技术(基于32位机)实验与学习辅导. 北京:电子工业出版社.,2007

[3] 何小海、严华. 微机原理与接口技术.北京:科学出版社,2006

[4] 钱晓捷. 新版汇编语言程序设计. 北京:电子工业出版社,2007

7

六、附录(代码)

完整的程序代码如下

;简单四则运算

DATAS SEGMENT

DATA0 DB ' WELCOME TO USE OUR SYSTEM ',0DH,0AH,'MADE BY YABUSHAN ',0DH,0AH,'PLEASE INPUT A NUMBER:',0DH,0AH,'$'

DATA1 DB ' over flow input again:','$'

DATA2 DB 'PLEASE INPUT ANOTHER NUMBER(EXP:123)','$'

DATA3 DB 'PLEASE INPUT AN OPREATOR:','$'

DATA4 DB 'THE OPERATOR IS WRONG,INPUT AGAIN:','$'

TUICHU DB 'Please press any key to continue!','$'

OPER DB ?

FLAG DB 0

FLAG1 DB 0

DATA DW 3 DUP(?)

DATAS ENDS

STACKS SEGMENT

DW 256 DUP(?)

STACKS ENDS

DISP MACRO VAR

MOV AH,2

MOV DL,VAR

INT 21H

ENDM

CODES SEGMENT

8

ASSUME CS:CODES,DS:DATAS,SS:STACKS START:

MOV AX,DATAS

MOV DS,AX

MOV DI,OFFSET DATA0 ;提示信息 CALL DISPL

MOV SI,0 ;SI CALL INPUT

CALL NEWLINE

MOV DI,OFFSET DATA3 ;

CALL DISPL

AGAIN:

MOV AH,1 ;1 INT 21H

CMP AL,'Q'

JE EXIT

CMP AL,'q'

JE EXIT

CMP AL,'C'

JE QINGPING

CMP AL ,'c'

JE QINGPING

CMP AL,'+' ;

JE NEXT0

CMP AL,'-'

JE NEXT0

CMP AL,'*'

JE NEXT0

CMP AL,'/'

JE NEXT0

作为数组下标 提示信息 号功能输入四则运算符 判断输入的是不是+,-,*,/ 9

CALL NEWLINE ;输入的运算符不合法,重新输入 MOV DI, OFFSET DATA4

CALL DISPL

JMP AGAIN

NEXT0:

MOV OPER,AL ;保存运算符

CALL NEWLINE

MOV DI,OFFSET DATA2 ;输入第二个操作数

CALL DISPL

MOV SI,2

CALL INPUT

MOV AX,DATA[0]

MOV BX,DATA[2]

CMP OPER,'+' ;判断是那种操作,进行运算 JE NEXT1

CMP OPER,'-'

JE NEXT2

CMP OPER,'*'

JE NEXT3

CMP OPER,'/'

JE NEXT4

NEXT1: ;加法运算

CLC

ADC AX,BX

JNC N1

MOV FLAG,1 ;判断是否进位

N1: MOV DATA[4],AX ;运算结果放入内存

JMP OUTPUT

NEXT2: ;减法运算

10

CLC

SBB AX,BX

JNC N2

MOV FLAG,1 ;判断是否借位 NEG AX

N2: MOV DATA[4],AX ;运算结果放入内存 JMP OUTPUT

NEXT3: ;乘法运算

CLC

MOV DX,0

MUL BX

MOV DATA[4],AX ;运算结果放入内存 JMP OUTPUT

NEXT4: ;除法运算 CLC

MOV DX,0

CMP BX,0

JNZ N4 ;判断除数是否为0 CALL NEWLINE

CALL ERROR

CALL NEWLINE

MOV DI,OFFSET DATA2

CALL DISPL

MOV SI,2

CALL INPUT

JMP NEXT4

N4: DIV BX

MOV DATA[4],AX ;运算结果放入内存

OUTPUT:

11

CALL NEWLINE

MOV DI,0 ;输出第一个操作数 CALL PRINT

DISP OPER ;输出运算符 MOV DI,2

CALL PRINT ;输出第二个操作数 DISP '='

CMP FLAG,1

JNZ NEXT5

DISP '-'

NEXT5:

MOV DI,4

CALL PRINT ;输出结果

MOV AH,4CH

INT 21H

;-----------输入函数------------

INPUT PROC NEAR

PUSH AX

PUSH BX

PUSH CX

PUSH DX

MOV BX,0 ;BX存放十进制数

CLC

MOV DX,0

L0:

;----------输入数字----------

12

MOV AH,1 ;判断数字是否合法 INT 21H

CMP AL,0DH

JE L2

SUB AL,30H

JL L1

CMP AL,9

JG L1

;---------转换成十进制数-------

MOV AH,0 ;转换成10进制数放入内存 XCHG AX,BX

MOV CX,10

MUL CX

ADD AX,BX

JC L1

XCHG AX,BX

JMP L0

L1:

MOV DX,0

MOV BX,0

CALL NEWLINE

CALL ERROR

JMP L0

L2:

CMP DX,0

JNZ L1

MOV DATA[SI],BX

MOV DX,0

13

POP DX

POP CX

POP BX

POP AX

RET

INPUT ENDP

;--------------提示信息------------ DISPL PROC NEAR

MOV AH,9

MOV DX,DI

INT 21H

RET

DISPL ENDP

;-------回车换行--------

NEWLINE PROC NEAR

PUSH AX

PUSH DX

MOV DL,0AH

MOV AH,2

INT 21H

MOV DL,0DH

MOV AH,2

INT 21H

POP DX

POP AX

RET

NEWLINE ENDP

;----------错误提示---------------- 14

ERROR PROC NEAR

PUSH AX

PUSH DX

MOV DX,OFFSET DATA1 MOV AH,9

INT 21H

POP DX

POP AX

RET

ERROR ENDP

;-----------显示函数-------- PRINT PROC NEAR

PUSH AX

PUSH BX

PUSH CX

PUSH DX

MOV CX,0

MOV BX,10

MOV AX,DATA[DI]

LAST:

MOV DX,0 ;除10压栈 DIV BX

PUSH DX

INC CX

CMP AX,0

JNZ LAST

AGE:

POP DX ;出栈输出

15

OR DX,30H

MOV AH,2

INT 21H

LOOP AGE

POP DX

POP CX

POP BX

POP AX

RET

PRINT ENDP

JMP START

QINGPING: MOV AL,0 ; MOV BH,7

MOV CH,0

MOV CL,0

MOV DH,24H

MOV DL, 79H

MOV AH,6

INT 10H

MOV DX,0

MOV AH,2

INT 10H

JMP START

EXIT: LEA DX,TUICHU ; MOV AH,9

INT 21H

MOV AH,4CH

INT 21H

CODES ENDS

END START

实现清屏功能退出程序 16

17

相关推荐