汇编语言课程设计.docx

上传人:b****7 文档编号:9680596 上传时间:2023-02-05 格式:DOCX 页数:19 大小:127.60KB
下载 相关 举报
汇编语言课程设计.docx_第1页
第1页 / 共19页
汇编语言课程设计.docx_第2页
第2页 / 共19页
汇编语言课程设计.docx_第3页
第3页 / 共19页
汇编语言课程设计.docx_第4页
第4页 / 共19页
汇编语言课程设计.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

汇编语言课程设计.docx

《汇编语言课程设计.docx》由会员分享,可在线阅读,更多相关《汇编语言课程设计.docx(19页珍藏版)》请在冰豆网上搜索。

汇编语言课程设计.docx

汇编语言课程设计

 

汇编语言课程设计报告

(2010--2011年度第2学期)

课题名称:

实现加减乘除四则运算的计算器

专业

计算机科学与技术

学生姓名

班级

B计算机092

学号

指导教师

完成日期

2011年6月24日

实现加减乘除四则运算的计算器

1设计目的

本课程设计是在学完教学大纲规定的全部内容、完成所有实践环节的基础上,旨在深化学生学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。

2设计内容

课题名称:

实现加减乘除四则运算的计算器

主要功能:

能实现加减乘除的计算;该程序接受的是16进制数;执行时,需在文件名后直接跟上计算表达式,如在命令提示符下执行结果如下:

C:

\tasm>js3+2

5

3实现方法

3.1系统目标

本次汇编语言课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。

比如,十进制数的加减乘除四则运算。

我们曾经学习过两个具体数字进行加减法运算,但是对于简单计算器用汇编语言实现难点在于这两个要做运算的数是未知的,是由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。

此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。

第一步,我要解决的是输入时是用INT21H的10号功能调用还是用INT21H的1号功能调用来进行输入。

若是用10号功能调用则我们进行多字符输入,可以将输入的字符都存储到一个数据区里面,并调用9号功能调用输出存进去的字符,这种输入和输出的方案是可行的。

我选择的是利用1号功能调用来输入,即把单个字符一个个的输入并存储到一个数据区里。

我们要做的是两个数的运算,先认定输入的格式为1234+5678=或者1111*2222=,当然如果输入不是这样的格式计算出来的结果就不一定是我们想要的结果了。

在存储的时候也是有选择的存储,当输入的并非格式里所要求的字符时则报错。

第二步,设计程序进行判断所输入的算式是做加法运算、减法运算、乘法运算还是除法运算,即判断输入的运算符是‘+’号、‘-’号、‘*’号、‘/’号中的哪一个,因为输入的格式固定了,所以只需要把存进数据区的第三个字符拿来与加减乘除四个运算符号进行比较,和哪一个运算符号一样就调用相对应的运算模块进行计算。

第三步,根据计算器程序所要实现的功能完成各个功能模块。

设计程序主体部分,根据主体部分所需的功能模块对各个子模块一一进行设计编写。

子模块中包含有:

do_add加法运算模块,do_sub减法运算模块,do_mul乘法运算模块,do_div除法运算模块,input输入模块等。

最后还要对这个简易计算器进行功能完善。

为了使程序符合我们使用者的操作习惯,设计当用户根据提示信息输入一个算式后,按下enter键或是‘=’符号键时,程序依据输入的算式进行计算,并将结果显示在屏幕上。

如果用户输入错误,则返回,提示信息让用户重新输入算式,当用户按下Q或q键时退出程序。

在各个子功能模块设计好的情况下,通过主题模块的合理调用,最终实现一个具有简单运算功能的计算器。

3.2程序流程图及说明

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

程序流程图说明:

通过流程图,可以看出程序开始运行时,首先输出提示语句,当用户输入后,程序根据所输入的内容进行判断,通过判断的结果来决定调用哪个功能模块,首先要判断输入的字符是否为Q或q,若是,则退出程序,不是则继续输入。

还要判断输入的是否为0--9,‘+’,‘-’,‘*’,‘/’这些字符,若不是会报错,是则将根据运算符号调用相应的功能模块完成运算。

最后将运算的结果显示在屏幕上,并返回主题程序,使用户可以重新输入。

 

图3-1程序流程图

3.2主体功能

本次课程设计的题目是用汇编语言实现一个简单的计算器,要求:

编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。

计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。

通过使用汇编语言设计实现简单计算器,以此进一步了解和掌握对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用。

本次课程设计以实现一个基本功能完善,界面友好,操作简便易行的计算器为最终目的。

通过对具有加减乘除基本功能的计算器的设计实现,学会使用汇编语言实现输入输出模块的设计,模块合理调用的设计,加减乘除运算的判断以及退出程序的判断的设计。

通过对各种指令的合理使用,熟悉并加深对各种指令的用法。

学会使用汇编语言设计各个功能模块。

当实现各个程序模块后,学会通过程序的调用最终实现一个具有基本计算功能的简单计算器。

4程序调试

4.1运行界面分析

将源程序输入编辑程序中,检查无误后经汇编、连接后装入系统运行界面如图4-1所示:

图4-1运行界面

程序的运行界面显示成功,屏幕上显示“inputasuanshi(inputqexit):

”提示用户输入一个算式。

4.2调试过程及分析

对程序源代码进行功能调试和功能验证。

程序代码运行成功后,分别检验测试其加、减、乘、除功能,并对结果进行分析。

再者,要对当用户输入Q或q时,退出程序的功能进行检测。

加法运算,计算1122+1658,如图4-2所示:

图4-2加法运算

减法运算,计算2345-2533,如图4-3所示:

图4-3减法运算

乘法运算,计算1233*3000,如图4-4所示:

图4-4乘法运算

除法运算,计算98/10,如图4-5所示:

图4-5除法运算

当用户输入Q或q时,程序退出,如图4-6所示:

图4-6退出程序测试

5小结

本次课程设计我认为最需要改进的就是程序的健壮性。

通过这次课程设计,我发现一个好的汇编程序不仅要正确可行,还要有健壮性,当用户输入数据非法,使运行环境改变时,程序能恰当地作出反应或进行处理,不会产生莫名其妙的输出结果。

一个正确可行的算法如果缺乏健壮性,那么这个程序也不能算真正的成功。

汇编语言是本专业的一门重要的程序语言。

在刚开始学习时,一直担心自己、也没把握自己能否学好,也曾担心过不了考试这一关。

经过近大半学期老师您不厌其烦的教导,引导我们去学习。

我对汇编语言语言有了一定的了解,但那绝对是远远不够的,还是要不断地把它应用到实践中去,融会贯通。

经过为期一周的汇编语言课程设计,亲身感受体验敲、改写程序代码的乐趣,我对汇编语言有了较为深入的了解,不仅巩固了以前在课本上学到的知识,还学会了很多其他东西。

通过这次课程设计,我收获的不仅仅是课程上的知识得到实际应用,还有编程的基本习惯和开发系统时应注意的流程。

作为一个程序编程人员,要保持清醒的头脑,以现实为依据,让自己的每一行代码都能实现自己的意义。

参考文献

[1]温冬蝉、沈美明.IBMPC汇编语言程序设计.北京:

清华大学出版社,2007.5

[2]刘其明.汇编语言程序设计教程.徐州:

中国矿业大学出版社,2010

[3]钱晓捷.新版汇编语言程序设计.北京:

电子工业出版社,2007

[4]何小海,严华.微机原理与接口技术.北京:

科学出版社,2006

附录

附录1源程序清单

B_P     EQU BYTE PTR

W_P     EQU WORD PTR

D_P     EQU DWORD PTR

CODE    SEGMENT

ASSUME  CS:

CODE,DS:

CODE

        ORG 100H

;主程序开始

NEWSTAR:

        JMP STAR

        EVEN

NUM1    DW 0,0

NUM2    DW 0,0

NUM3    DW 0,0

JGV4    DW 0,0

YSF     LABEL WORD

YSF1    DB 0

YSF2    DB 0

JUV     DB 0

UV      DB 0

;使DS:

SI指向第一有效字符

OVERS   LABEL NEAR

        CLD

        PUSH AX

OVERS1:

        LODSB

        CMP AL,' '

        JZ OVERS1

        CMP AL,9

        JZ OVERS1

        DEC SI

        CMP AL,13

        POP AX

        RET

;输出一个制表符

TAB     LABEL NEAR

        MOV AL,9

        JMP SHORT DISP

;输出一个回车换行符

CRLF    LABEL NEAR

        MOV AL,13

        CALL DISP

        MOV AL,10

;显示一个字符

DISP    LABEL NEAR

        PUSH AX

        PUSH DX

        MOV AH,2

        MOV DL,AL

        INT 21H

        POP DX

        POP AX

        RET

;检查是否为运算符

ISYSF   LABEL NEAR

        CLD

        LODSB

        CALL ISJJ

        JZ ISYSF1

        CALL ISII

        JZ ISYSF1

        DEC SI

ISYSF1:

        RET

;检查是否是加减运算

ISJJ    LABEL NEAR

        CMP AL,'+'

        JZ ISYSF1

        CMP AL,'-'

        RET

;检查是否为乘除运算

ISII    LABEL NEAR

        CMP AL,'*'

        JZ ISYSF1

        CMP AL,'/'

        JZ ISYSF1

        CMP AL,'\'

        RET

;数据输出

;CX=10 十进制

;CX=16 十六进制

DOUT    LABEL NEAR

        PUSH AX

        PUSH BX

        PUSH DX

        PUSH BP

        XOR BP,BP

DOUT1:

        INC BP

        PUSH AX

        MOV AX,DX

        XOR DX,DX

        DIV CX

        MOV BX,AX

        POP AX

        DIV CX

        PUSH DX

        MOV DX,BX

        OR BX,AX

        JNZ DOUT1

DOUT2:

        POP AX

        ADD AL,'0'

        CMP AL,'9'

        JBE DOUT3

        ADD AL,'A'-'9'-1

DOUT3:

        CALL DISP

        DEC BP

        JNZ DOUT2

        POP BP

        POP DX

        POP BX

        POP AX

        RET

;输入数据在DX:

AX中返回

;CX=0 数据为10进制

;CX#0 数据为16进制

DATE    LABEL NEAR

        PUSH BX

        PUSH BP

        PUSH DI

        XOR AX,AX

        XOR DX,DX

DATE1:

        MOV DI,AX

        LODSB

        CMP AL,'0'

        JB DATE7

        CMP AL,'9'

        JA DATE6

DATE2:

        AND AX,0FH

        SHL DI,1

        RCL DX,1

        MOV BX,DI

        MOV BP,DX

        SHL DI,1

        RCL DX,1

        SHL DI,1

        RCL DX,1

        JCXZ DATE3

        SHL DI,1

        RCL DX,1

        Jmp short DATE4

DATE3:

        ADD DI,BX

        ADC DX,BP

DATE4:

        ADD AX,DI

        ADC DX,0

        JMP DATE1

DATE5:

        ADD AL,9

        JMP DATE2

DATE6:

        JCXZ DATE7

        CMP AL,'A'

        JB DATE7

        CMP AL,'F'

        JBE DATE5

        CMP AL,'a'

        JB DATE7

        CMP AL,'f'

        JBE DATE5

DATE7:

        MOV AX,DI

        DEC SI

        OR DI,DX

        POP DI

        POP BP

        POP BX

        RET

;数据1与数据2根据YSF1进行加减运算

JSJJ    LABEL NEAR

        MOV AX,NUM2

        MOV DX,NUM2+2

        CMP YSF1,'+'

        JZ JSJJ1

        SUB NUM1,AX

        SBB NUM1+2,DX

        JMP SHORT JSJJ2

JSJJ1:

        ADD NUM1,AX

        ADC NUM1+2,DX

JSJJ2:

        RET

;数据1与数据2根据YSF1进行乘除运算

JSII1   LABEL NEAR

        MOV BX,OFFSET NUM1

        JMP SHORT JSII2_1

;数据2与数据3根据YSF2进行乘除运算

JSII2   LABEL NEAR

        MOV BX,OFFSET NUM2

JSII2_1:

        DB 66H

        MOV AX,[BX]

        DB 66H

        MOV CX,[BX+4]

        CMP YSF2,'*'

        JNZ JSII2_2

        DB 66H

        IMUL CX

        JMP SHORT JSII2_3

JSII2_2:

        DB 66H

        CWD

        DB 66H

        IDIV CX

        CMP YSF2,'/'

        JZ JSII2_3

        DB 66H

        XCHG DX,AX

JSII2_3:

        DB 66H

        MOV [BX],AX

        RET

;显示结果

XUJG    LABEL NEAR

        MOV AX,JGV4

        MOV DX,JGV4+2

        MOV CX,10

        CMP UV,10

        JZ XUJG0

        MOV CX,16

XUJG0:

        TEST DX,8000H

        JZ XUJG1

        CMP UV,10

        JZ XUJG2

        CALL DOUT

XUJG2:

        NOT AX

        NOT DX

        ADD AX,1

        ADC DX,0

        PUSH AX

        CMP UV,10

        JZ XUJG3

        MOV AL,' '

        CALL DISP

        MOV AL,'('

        CALL DISP

XUJG3:

        MOV AL,'-'

        CALL DISP

        POP AX

        CMP UV,10

        JZ XUJG1

        CALL DOUT

        MOV AL,')'

        CALL DISP

        RET

XUJG1:

        CALL DOUT

        RET

;计算结果放入DX:

AX中

JSJG    LABEL NEAR

        CALL JSJJ

        MOV AX,NUM1

        MOV DX,NUM1+2

        RET

;从DS:

SI处取一个数据

LOADATE LABEL NEAR

        LODSB

        CMP AL,'('

        JZ LOADATE1

        DEC SI

        PUSH CX

        XOR CX,CX

        CMP UV,10

        JZ LOADATE0

        INC CX          ;取16进制数

LOADATE0:

        CALL DATE       ;取数据放入DX:

AX中

        POP CX

        RET

LOADATE1:

        PUSH NUM1       ;保存数据1数据2及运算符

        PUSH NUM1+2

        PUSH NUM2

        PUSH NUM2+2

        PUSH YSF

        INC JUV

        MOV JGV4,0      ;结果值清零

        MOV JGV4+2,0

;进行四则运算

SZYS    LABEL NEAR

        CALL ISYSF      ;首字符是运算符?

        JZ SZYS2

        CALL LOADATE    ;不是,取数并保存

        MOV NUM1,AX

        MOV NUM1+2,DX

SZYS1:

        XOR AX,AX       ;数据2清零

        MOV NUM2,AX

        MOV NUM2+2,AX

        CALL ISYSF      ;下个是运算符?

        JZ SZYS3

        JNZ SZYS6

SZYS2:

        PUSH AX

        MOV AX,JGV4     ;将结果作为数据1

        MOV NUM1,AX

        MOV AX,JGV4+2

        MOV NUM1+2,AX

        POP AX

SZYS3:

        MOV YSF1,AL

        MOV YSF2,AL

        CALL ISJJ       ;是加减运算转

        JZ SZYS4

        CALL LOADATE    ;取数据2

        MOV NUM2,AX

        MOV NUM2+2,DX

        CALL JSII1      ;数据1与数据2根据YSF1进行乘除运算

        JMP SZYS1       ;    结果保存在数据1中

SZYS4:

        CALL LOADATE    ;取数据2并保存

        MOV NUM2,AX

        MOV NUM2+2,DX

SZYS4_1:

        CALL ISYSF

        JNZ SZYS6

        CALL ISJJ       ;运算符2是加减运算?

        JNZ SZYS5       ;不是转

        PUSH AX

        CALL JSJJ       ;数据1与数据2根据YSF1进行加减运算

        POP AX          ;    结果保存在数据1中

        MOV YSF1,AL     ;保存新的运算符

        JMP SZYS4

SZYS5:

        MOV YSF2,AL     ;保存运算符2

        CALL LOADATE    ;取数据3

        MOV NUM3,AX

        MOV NUM3+2,DX

        CALL JSII2      ;数据2与数据3根据YSF2进行乘除运算

        JMP SZYS4_1     ;    结果保存在数据2中

SZYS6:

        MOV CL,AL

        CMP AL,13

        JNZ SZYS9

SZYS7:

        CALL JSJG

        CMP JUV,0

        JZ SZYS8

        DEC JUV

        POP YSF

        POP NUM2+2

        POP NUM2

        POP NUM1+2

        POP NUM1

        RET

SZYS8:

        CMP CL,')'

        JZ SZYS10

        MOV JGV4,AX

        MOV JGV4+2,DX

        JNZ SZYS12

SZYS9:

        CMP AL,')'

        JNZ SZYS11

        INC SI

        JMP SZYS7

SZYS10:

        MOV NUM1,AX

        MOV NUM1+2,DX

        JMP SZYS1

SZYS11:

        STC

  

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

当前位置:首页 > 高等教育 > 文学

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

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