总汇编语言课程设计四则运算计算器.docx

上传人:b****4 文档编号:4314312 上传时间:2023-05-07 格式:DOCX 页数:15 大小:72.64KB
下载 相关 举报
总汇编语言课程设计四则运算计算器.docx_第1页
第1页 / 共15页
总汇编语言课程设计四则运算计算器.docx_第2页
第2页 / 共15页
总汇编语言课程设计四则运算计算器.docx_第3页
第3页 / 共15页
总汇编语言课程设计四则运算计算器.docx_第4页
第4页 / 共15页
总汇编语言课程设计四则运算计算器.docx_第5页
第5页 / 共15页
总汇编语言课程设计四则运算计算器.docx_第6页
第6页 / 共15页
总汇编语言课程设计四则运算计算器.docx_第7页
第7页 / 共15页
总汇编语言课程设计四则运算计算器.docx_第8页
第8页 / 共15页
总汇编语言课程设计四则运算计算器.docx_第9页
第9页 / 共15页
总汇编语言课程设计四则运算计算器.docx_第10页
第10页 / 共15页
总汇编语言课程设计四则运算计算器.docx_第11页
第11页 / 共15页
总汇编语言课程设计四则运算计算器.docx_第12页
第12页 / 共15页
总汇编语言课程设计四则运算计算器.docx_第13页
第13页 / 共15页
总汇编语言课程设计四则运算计算器.docx_第14页
第14页 / 共15页
总汇编语言课程设计四则运算计算器.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

总汇编语言课程设计四则运算计算器.docx

《总汇编语言课程设计四则运算计算器.docx》由会员分享,可在线阅读,更多相关《总汇编语言课程设计四则运算计算器.docx(15页珍藏版)》请在冰点文库上搜索。

总汇编语言课程设计四则运算计算器.docx

总汇编语言课程设计四则运算计算器

 

 

汇编语言课程设计报告

(2012--2013年度第1学期)

 

实验名称:

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

 

专业

生物医学工程

学生姓名

周炳威

班级

B100904

学号

B10090406

指导教师

乐洋

 

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

1实验目的

深化学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。

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

2实验内容

课题名称:

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

主要功能:

实现一个简单的计算器,要求:

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

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

3实现方法

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

由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。

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

第一步,用INT21H的1号功能调用来进行输入。

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

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

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

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

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

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

子模块中包含有:

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

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

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

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

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

3.2程序流程图及说明

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

程序流程图说明:

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

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

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

源程序清单

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

        RET

SZYS12:

        CLC

        RET

;数制处理

UVIL    LABEL NEAR

        PUSH SI

UVIL1:

        LODSB

        CMP AL,' '

        JZ UVIL2

        CMP AL,9

        JZ UVIL2

        CMP AL,13

        JZ UVIL4

        JNZ UVIL1

UVIL2:

        MOV BX,SI

        CALL OVERS

        JZ UVIL3

        LODSW

        CALL OVERS

        POP SI

        JNZ SZYS11

        CMP AX,'01'

        JNZ SZYS11

        PUSH SI

        MOV UV,10

UVIL3:

        MOV AL,13

        MOV [BX-1],AL

UVIL4:

        POP SI

        CLC

        RET

;预置结果

YVJG    LABEL NEAR

        MOV AH,52H

        INT 21H

        MOV AX,ES:

[BX-2]

        MOV DS,AX

        MOV AX,DS:

[0CH]

        MOV CS:

JGV4,AX

        MOV AX,DS:

[0EH]

        MOV CS:

JGV4+2,AX

        PUSH CS

        POP DS

        PUSH CS

        POP ES

        RET

;保存结果

BCJG    LABEL NEAR

        MOV AH,52H

        INT 21H

        MOV AX,ES:

[BX-2]

        MOV DS,AX

        MOV AX,CS:

JGV4

        MOV DS:

[0CH],AX

        MOV AX,CS:

JGV4+2

        MOV DS:

[0EH],AX

        PUSH CS

        POP DS

        PUSH CS

        POP ES

        RET

STAR:

        MOV SI,81H

        CLD

        CALL OVERS

        JNZ STAR1

STAR0:

        MOV DX,OFFSET MESS1

        JMP STAR4

STAR1:

        CALL YVJG

        CALL UVIL

        JB STAR0

        MOV SAVESP,SP

        CALL SZYS

        MOV SP,SAVESP

        MOV DX,OFFSET MESS2

        JB STAR4

        CALL CRLF

        CALL XUJG

        CALL BCJG

        MOV DX,OFFSET MESS3

STAR4:

        MOV AH,9

        INT 21H

        INT 20H

SAVESP  DW 0

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2