您的位置:首页 > 其它

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

2016-01-25 12:10 357 查看
;键盘输入一个算术表达式,计算表达式的值,以十进制、十六进制、及二进制格式输出结果。

;题目链接: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

本程序运行后,输入、输出,完全符合题目的要求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: