⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exp.asm

📁 用汇编语言实现的+/-表达式求值算法。可带括号。
💻 ASM
字号:
DATA    SEGMENT
    D0          DW  10000
    D1          DW  1000
    D2          DW  100
    D3          DW  10
    ASCII       DW  48
    RESULT      DW  0
    TEMP        DW  0
    BUF         DB  100 DUP ('$')
    ;BUF         DB  '32000-2000='            ;for debug
DATA ENDS
;=============================
STACK   SEGMENT PARA STACK 'STACK'
        DB  100 DUP (0)
STACK   ENDS
;========================================
;=表达式格式: exp-> (exp) | digit op exp
;=             digit-> '0~9'+
;=             op-> + | -
;========================================
CODE    SEGMENT
        ASSUME CS:CODE, DS:DATA, SS:STACK
MAIN:   ;================================Initialization
        MOV     AX,     DATA
        MOV     DS,     AX
        MOV     AX,     0
        ;================================
        CALL    SCAN
        CALL    CAL
        CALL    PRINT

        ;JMP     MAIN
        mov     ah,     4ch
        int     21h
;========================================
;=calculate the result
;========================================
CAL     PROC    NEAR
        PUSH    AX
        PUSH    BX
        PUSH    CX
        PUSH    DX
        PUSH    DI
        
        MOV     RESULT, 0
        MOV     AX,     0
        MOV     DX,     0
        MOV     CX,     '+'
        MOV     BX,     OFFSET BUF
        MOV     DI,     0
        
L0:     CMP     [BX+DI], BYTE PTR '+'
        JZ      L1
        CMP     [BX+DI], BYTE PTR '-'
        JZ      L2
        CMP     [BX+DI], BYTE PTR '('
        JZ      L3
        CMP     [BX+DI], BYTE PTR ')'
        JZ      L4
        CMP     [BX+DI], BYTE PTR '='
        JZ      QUIT
        
        ;================================[BX+DI] = 0~9
        MOV     DX,     0
        MUL     D3
        MOV     DL,     [BX+DI]
        ADD     AX,     DX
        MOV     DX,     0
        SUB     AX,     ASCII
        INC     DI
        JMP     L0        
        
L1:     MOV     DX,     RESULT
        CMP     CX,     '+'
        JNE     M0
        ADD     DX,     AX
        JMP     N0
M0:     SUB     DX,     AX
N0:     MOV     RESULT, DX
        MOV     AX,     0
        MOV     CX,     '+'
        INC     DI
        JMP     L0
        
L2:     MOV     DX,     RESULT
        CMP     CX,     '+'
        JNE     M1
        ADD     DX,     AX
        JMP     N1
M1:     SUB     DX,     AX
N1:     MOV     RESULT, DX
        MOV     AX,     0
        MOV     CX,     '-'
        INC     DI
        JMP     L0
        
L3:     PUSH    CX
        PUSH    RESULT
        MOV     AX,     0
        MOV     CX,     '+'
        MOV     RESULT,  0
        INC     DI
        JMP     L0
        
L4:     MOV     DX,     RESULT
        CMP     CX,     '+'
        JNE     M2
        ADD     DX,     AX
        JMP     N2
M2:     SUB     DX,     AX
N2:     MOV     AX,     DX
        POP     RESULT
        POP     CX
        INC     DI
        JMP     L0

QUIT:   MOV     DX,     RESULT
        CMP     CX,     '+'
        JNE     M3
        ADD     DX,     AX
        JMP     N3
M3:     SUB     DX,     AX
N3:     MOV     RESULT, DX
        
        POP     DI
        POP     DX
        POP     CX
        POP     BX
        POP     AX
        RET
CAL     ENDP
;========================================
        
;========================================
;=input the expression
;========================================
SCAN    PROC    NEAR
        PUSH    AX
        PUSH    BX
        PUSH    DI
        
        MOV     BX,     OFFSET BUF
        MOV     DI,     0
NEXT:   MOV     AH,     1
        INT     21H
        MOV     [BX+DI],AL
        INC     DI
        ;MOV     [BX+DI],    BYTE PTR '$'
        CMP     AL,     '='
        JNE     NEXT
        
        POP     DI
        POP     BX
        POP     AX
        RET
SCAN    ENDP      
;========================================  
        
;========================================
;=output the result
;========================================
PRINT   PROC    NEAR
        ;================================保护现场
        PUSH    AX
        PUSH    DX
        PUSH    RESULT
        ;================================   
        CMP     RESULT,   WORD PTR 0
        JGE     POS
        MOV     DL,     '-'     ;Its negative
        MOV     AH,     6
        INT     21H
        MOV     DX,     RESULT
        NEG     DX
        MOV     RESULT, DX
        
POS:    MOV     DX,     0
        MOV     AX,     RESULT
        DIV     D0
        MOV     RESULT, DX
        MOV     DX,     AX
        ADD     DX,     ASCII
        MOV     AH,     6
        INT     21H
        
        MOV     DX,     0
        MOV     AX,     RESULT
        DIV     D1
        MOV     RESULT, DX
        MOV     DX,     AX
        ADD     DX,     ASCII
        MOV     AH,     6
        INT     21H
        
        MOV     DX,     0
        MOV     AX,     RESULT
        DIV     D2
        MOV     RESULT, DX
        MOV     DX,     AX
        ADD     DX,     ASCII
        MOV     AH,     6
        INT     21H
        
        MOV     DX,     0
        MOV     AX,     RESULT
        DIV     D3
        MOV     RESULT, DX
        MOV     DX,     AX
        ADD     DX,     ASCII
        MOV     AH,     6
        INT     21H
        
        MOV     DX,     RESULT
        ADD     DX,     ASCII
        MOV     AH,     6
        INT     21H
        
        ;================================恢复现场
        POP     RESULT
        POP     DX
        POP     AX
        RET
PRINT   ENDP
;================================
CODE    ENDS
        END MAIN

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -