求一汇编语言计算器程序

求一汇编语言计算器程序,第1张

这是从网上下载下来的一个计算程序,能实现加、减、乘、除的计算。该程序接受

的是16进制数。

执行时,态慧哗需在文件名后直接跟上计算表达式,如在命令碧慧提示符下执行结果如下:

c:\masm>js 3+2

5

c:\masm>js 6*7

2A

c:\masm>js 10-4

c

c:\masm>js 12/3

6

B_P EQU BYTE PTR

W_P EQU WORD PTR

D_P EQU DWORD PTR

CODESEGMENT

ASSUME CS:CODE,DS:CODE

ORG 100H

主程序开始

NEWSTAR:

JMP STAR

EVEN

NUM1DW 0,0

NUM2DW 0,0

NUM3DW 0,0

JGV4DW 0,0

YSF LABEL WORD

YSF1DB 0

YSF2DB 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

输出一个回车换行符

CRLFLABEL NEAR

MOV AL,13

CALL DISP

MOV AL,10

显示一个字符

DISPLABEL 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

检查是否是加减运算

ISJJLABEL NEAR

CMP AL,'+'

JZ ISYSF1

CMP AL,'-'

RET

检查是否为乘除运算

ISIILABEL NEAR

CMP AL,'*'

JZ ISYSF1

CMP AL,'/'

JZ ISYSF1

CMP AL,'\'

RET

数据输出

CX=10 十进制

CX=16 十六进制

DOUTLABEL 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进制

DATELABEL 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进行加减运算

JSJJLABEL 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

显示结果

XUJGLABEL 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中

JSJGLABEL 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

进行四则运算

SZYSLABEL 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

数制处理

UVILLABEL 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

预置结果

YVJGLABEL 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

保存结果

BCJGLABEL 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

MESS1 DB 13,10,' Syntax:',13,10

DB ' JS <Expression> [10]',13,10,'$'

MESS2 DB 'Error in expression !$'

MESS3 DB 13,10,'$'

CODEENDS

END NEWSTAR

CODE SEGMENT

ASSUME CS:CODE

MAIN PROC FAR

START:

        mov cx,5

        mov si,cx

  LOOP1:

        MOV CX,SI

        MOV BX,0

GET_CHAR0:MOV AH,1

         INT 21H

         CMP AL,0DH

         JE T0

        枯羡数 SUB AL,30H

         JL T0

         CMP AL,9

         JG T0

         CBW

         XCHG AX,BX

         MOV CX,10

         MUL CX

         XCHG AX,BX

         ADD BX,AX

         JMP GET_CHAR0

      T0:ADD AL,30H

         CMP AL,2BH

         JE JIA

         CMP AL,2DH

         JE JIAN

   派碧      CMP AL,2AH

         JE CHENG

         CMP AL,2FH

         JE CHU

         JMP EXIT0

     JIA:MOV DI,BX

         CALL JIAFA

         JMP EXIT0

    JIAN:MOV DI,BX

         CALL JIANFA

         JMP EXIT0

   CHENG:MOV DI,BX

         CALL CHENGFA

         JMP EXIT0

     CHU:MOV DI,BX

         CALL CHUFA

   EXIT0:CALL SHUCHU

          MOV DL,0AH

          MOV AH,2

          INT 21H

          DEC SI

          MOV CX,SI

          LOOP LOOP1

         MOV AH,4CH

         INT 21H

         RET

      MAIN ENDP

shuru PROC NEAR

         MOV BX,0

GET_CHAR:MOV AH,1

         INT 21H

         CMP AL,0DH

         JE EXIT

         SUB AL,30H

         JL EXIT

         CMP AL,9

         JG EXIT

         CBW

         XCHG AX,BX

         MOV CX,10

         MUL CX

         XCHG AX,BX

         ADD BX,AX

         JMP GET_CHAR

EXIT:

     RET

    shuru ENDP

JIAFA PROC NEAR

      CALL SHURU

      ADD BX,DI

      RET

JIAFA ENDP

JIANFA PROC NEAR

       CALL SHURU

       MOV AX,DI

       SUB AX,BX

       MOV BX,AX

       RET

JIANFA ENDP

CHENGFA PROC NEAR

        CALL SHURU

        MOV AL,BL

        MOV BX,DI

        MUL BL

        MOV BX,AX

        RET

CHENGFA ENDP

CHUFA PROC NEAR

      CALL SHURU

      MOV AX,DI

      SUB AH,AH

      DIV BL

      MOV BL,AL

      RET

CHUFA ENDP

shuchu PROC NEAR                  

      MOV CX,1000      

      CALL DEC_DIV      

      MOV CX,100      

      CALL DEC_DIV       

      MOV CX,10      

      CALL DEC_DIV       

      MOV CX,1      

      CALL DEC_DIV      

      RET 

shuchu ENDP 

DEC_DIV  PROC NEAR        

        MOV AX,BX          

        MOV DX,0               

        DIV CX       

        MOV BX,DX 

        CMP AL,9 

        ADD AL,30H 

        MOV DL,AL            

        MOV AH,2       

        INT 21H   

        RET 

DEC_DIV  ENDP

CODE ENDS

END START

此程序会循没首环四次,输入四次后自动退出。

可以输入加减乘除。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12437914.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存