80x86汇编语言--输入表达式,再计算


;键盘输入一个算术表达式,计算表达式的值,以十进制、十六进制、及二进制格式输出结果。


;题目链接:http://zhidao.baidu.com/question/1988322359970071147.html


;其中表达式中包含的整数均为十进制非符号数(其值 < pow(2, 32));

;表达式中包含的运算符包括+、*两个;

;计算时不考虑运算符的优先级,即一律从左到右计算;

;计算过程中若有值超过32位,则一律忽略超过32位的部分,故计算的最终结果不会超过32位。


;例如:

;输入:

;1234*5678+98765*54321+12345678

;输出:

;1234*5678+98765*54321+12345678=

;3733613191

;DE8A6A87h

;1101 1110 1000 1010 0110 1010 1000 0111B


;做而论道编写程序如下:


ASSUME   CS:CC, DS:QW


;1234*5678+98765*54321+12345678=

;37 33 61 31 91

;DE8A6A87h

;1101 1110 1000 1010 0110 1010 1000 0111B



QW  SEGMENT


    S1  DB   '1234*5678+98765*54321+12345678= '


    MSG DB   'Input arithmetic expression:', 13, 10, 36


    SN  DB   80

    SX  DB   ?

    S2  DB   85 DUP(?)


    N1  DW   0

    N2  DW   0


    M1  DW   0134

    M2  DW   0


    X   DW   ?, ?, ?, ?, ?, ?, ?, ?

    Y   DB   0, 0, 0, 0, 0, 0, 0, 0, 0, 0   ;存放BCD码


QW  ENDS

;--------------------

CC  SEGMENT


START:

    MOV   AX, QW

    MOV   DS, AX


    LEA   DX, MSG

    MOV   AH, 9

    INT   21H

    LEA   DX, SN

    MOV   AH, 10

    INT   21H


    MOV   CL, SX

    MOV   CH, 0

    MOV   SN, 13

    MOV   SX, 10

    LEA   DI, S2

    ADD   DI, CX

    MOV   BYTE PTR [DI], '='

    INC   DI

    MOV   BYTE PTR [DI], 13

    INC   DI

    MOV   BYTE PTR [DI], 10

    INC   DI

    MOV   BYTE PTR [DI], 36


    LEA   DX, SN

    MOV   AH, 9

    INT   21H


;    LEA   SI, S1      ;使用内定的表达式来计算

    LEA   SI, S2      ;使用键入的表达式来计算


    MOV   N1, 0

    MOV   N2, 0


    CALL  READ_STR_N1

    MOV   AX, N1

    MOV   M1, AX

    MOV   AX, N2

    MOV   M2, AX


M_LOOP:

    CMP   BYTE PTR [SI], '*'

    JZ    M_CHE

    CMP   BYTE PTR [SI], '+'

    JZ    M_JIA

    CMP   BYTE PTR [SI], '='

    JZ    M_END

    JMP   EXIT

M_CHE:


    INC   SI

    MOV   N1, 0

    MOV   N2, 0

    CALL  READ_STR_N1

    CALL  MUL32_32

    MOV   AX, X + 0

    MOV   M1, AX

    MOV   AX, X + 2

    MOV   M2, AX

    JMP   M_LOOP

M_JIA:

    INC   SI

    MOV   N1, 0

    MOV   N2, 0

    CALL  READ_STR_N1

    MOV   AX, N1

    ADD   AX, M1

    MOV   M1, AX

    MOV   AX, N2

    ADC   AX, M2

    MOV   M2, AX

    JMP   M_LOOP

M_END:

    MOV   AX, M1

    MOV   X + 0, AX

    MOV   AX, M2

    MOV   X + 2, AX

    MOV   X + 4, 0

    MOV   X + 6, 0


    CALL  BIN2BCD

    CALL  DISP

    CALL  CR_LF

    CALL  DISP_HEX

    CALL  CR_LF

    CALL  DISP_BIN


EXIT:

    MOV   AH, 4CH

    INT   21H

;---------------------------

CR_LF:

    MOV   AH, 2

    MOV   DL, 13    ;回车换行

    INT   21H

    MOV   DL, 10

    INT   21H

RET

;---------------------------

DISP_HEX:           ;十六进制显示

    MOV   BX, M2

    CALL  @F

    MOV   BX, M1

    CALL  @F

    MOV   DL, 'H'

    INT   21H

    RET

@@: MOV   CH, 4

    MOV   CL, 4

@@: ROL   BX, CL

    MOV   AL, BL

    AND   AL, 0FH

    ADD   AL, 90H

    DAA

    ADC   AL, 40H

    DAA

    MOV   DL, AL

    MOV   AH, 2

    INT   21H

    DEC   CH

    JNZ   @B

RET

;---------------------------

DISP_BIN:

    MOV   BX, M2

    CALL  @F

    MOV   BX, M1

    CALL  @F

    MOV   DL, 8

    INT   21H

    MOV   DL, 'B'

    INT   21H

    RET

@@: MOV   CX, 16

    MOV   AH, 2

@@: MOV   DL, '0'

    TEST  BX, 8000H

    JE    PP1

    INC   DL

PP1:INT   21H

    ADD   BX, BX

    DEC   CX

    TEST  CX, 03H

    JNE   PP2

    MOV   DL, ' '

    INT   21H

PP2:INC   CX

    LOOP  @B

RET

;---------------------------

READ_STR_N1:

    CMP   BYTE PTR [SI], '*'

    JZ    READ_END

    CMP   BYTE PTR [SI], '+'

    JZ    READ_END

    CMP   BYTE PTR [SI], '='

    JZ    READ_END


    MOV   AX, N1

    MOV   BX, 10

    MUL   BX

    MOV   N1, AX

    MOV   AX, N2

    MOV   N2, DX

    MUL   BX

    ADD   N2, AX


    MOV   AL, [SI]

    AND   AL, 0FH

    MOV   AH, 0

    ADD   N1, AX

    ADC   N2, 0


    INC   SI

    JMP   READ_STR_N1

READ_END:

    RET

;---------------------------

MUL32_32:

    MOV   AX, N1

    MOV   BX, M1

    MUL   BX

    MOV   X + 0, AX

    MOV   X + 2, DX

    MOV   X + 4, 0

    MOV   X + 6, 0


    MOV   AX, N2

    MOV   BX, M1

    MUL   BX

    ADD   X + 2, AX

    ADC   X + 4, DX


    MOV   AX, N1

    MOV   BX, M2

    MUL   BX

    ADD   X + 2, AX

    ADC   X + 4, DX

    ADC   X + 6, 0


    MOV   AX, N2

    MOV   BX, M2

    MUL   BX

    ADD   X + 4, AX

    ADC   X + 6, DX

RET

;---------------------------

BIN2BCD:

    MOV   CX, 64        ;64位数变换成BCD码

_L0_:

    PUSH  CX


    LEA   BX, X

    MOV   CX, 8

    CLC

_L1_:

    MOV   AL, [BX]

    ADC   AL, AL

    MOV   [BX], AL

    INC   BX

    LOOP  _L1_


    LEA   BX, Y + 9

    MOV   CX, 10

_L2_:

    MOV   AL, [BX]

    ADC   AL, AL

    DAA

    MOV   [BX], AL

    DEC   BX

    LOOP  _L2_


    POP   CX

    LOOP  _L0_

RET

;---------------------------

DISP:

    LEA   BX, Y + 5

    MOV   CX, 5

_L3_:

    MOV   AL, [BX]

    MOV   AH, 0

    MOV   DL, 16

    DIV   DL

    MOV   DL, AL

    AND   DL, 0FH

    ADD   DL, 30H

    MOV   AH, 02H

    INT   21H

    MOV   DL, [BX]

    AND   DL, 0FH

    ADD   DL, 30H

    MOV   AH, 02H

    INT   21H

    INC   BX

    LOOP  _L3_

RET

;---------------------------

CC  ENDS

    END   START


本程序运行后,输入、输出,完全符合题目的要求。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值