汇编语言 四则运算

DATAS SEGMENT
    STR1 DB 0AH,0DH,'@******************************************@$'
    STR2 DB 0AH,0DH,'@*                                        *@$'
    STR3 DB 0AH,0DH,'@*            Welcome     you !           *@$'
    STR4 DB 0AH,0DH,'@*    This is programe of sizeyunsuan     *@$'
    STR5 DB 0AH,0DH,'@*          Rang(-32768 to 32767)         *@$'
    STR6 DB 0AH,0DH,'@*     JikeB082 Hanyou  200807014225      *@$'
    STR7 DB 0AH,0DH,'@*                                        *@$'
    STR8 DB 0AH,0DH,'@******************************************@$'
    MESG DB 0AH,0DH,'Do you want to continue? (y/n) $'
    SIGN1 DW 0         ;判断数字是否输入完毕
    SIGN2 DW 0         ;判断括号是否配对
    NUMB DW 20 DUP(0)  ;保存输入的数值
    MARK DB 'M'        ;保存输入的运算符
         DB 10 DUP(0)
    ERROR DB 'YOUR INPUT IS WRONG$'
DATAS ENDS
DISP MACRO STR
    LEA DX,STR
    MOV AH,9
    INT 21H
    ENDM
CHOICE MACRO ASC,HAO,H ;宏定义,给运算符赋权值
    CMP AL,ASC 
    JNE OTH&HAO
    MOV CH,H
    JMP OTH7 
    ENDM
CODES SEGMENT  
ASSUME CS:CODES,DS:DATAS
START:
    CALL CLEAR
    MOV AX,DATAS 
    MOV DS,AX 
    LEA DI,NUMB 
    LEA SI,MARK 
    DISP STR1
    DISP STR2
    DISP STR3
    DISP STR4
    DISP STR5
    DISP STR6  
    DISP STR7
    DISP STR8
    CALL CR      
    MOV AX,0  
    MOV BX,0
    MOV CX,0 
    MOV DX,0 
START1:
    CALL CR
INPUT: 
    MOV AH,1 
    INT 21H       
    CMP AL,'=' 
    JE PD                 ;是等号,进一步判断输入括号是否配对
    CMP AL,28H 
    JB INPUT 
    CMP AL,39H 
    JA INPUT 
    CMP AL,2FH            ;判断是数字还是符号
    JBE JUD               ;是符号转入响应操作 
    INC WORD PTR SIGN1    ;将数字标志位加1
    SUB AL,30H            ;将ASCII码转16进制
    MOV AH,0 
    XCHG AX,[DI] 
    MUL BX 
    MOV BX,10 
    XCHG AX,[DI] 
    ADD [DI],AX 
    JMP INPUT 
PD: CMP WORD PTR SIGN2,0  ;判断配对标志位
    JE JUD 
    JMP BC 
JUD:CMP WORD PTR SIGN1,0  ;判断数值指针是否已经下移一位
    JE FUH
    ADD DI,2 
    MOV WORD PTR SIGN1,0  ;将数字标志位复0
FUH:CALL ADVANCE          ;设定优先级
    CMP CH,5              ;判断输入的符号是否是左括号
    JNE PY                ;不是则判断输入的是否是右括号
    INC WORD PTR SIGN2    ;是左括号,括号标志位加1
PY:
    CMP CH,1              ;判断输入的是否是右括号
    JNE AGAIN 
    DEC WORD PTR SIGN2    ;是右括号,括号标志位减1
    
AGAIN:
    CMP BYTE PTR[SI],'M'  ;判断运算符存储区是否为空       如23*56-(8*19)/6+67-8=1322
    JE SAVE
    CMP CH,[SI]           ;[SI]的内容为前一个符号或其权值
    JA SAVE 
    CMP BYTE PTR[SI],'('    
    JNE YIDO
    DEC SI
    JMP INPUT
YIDO:
    DEC SI 
    MOV CL,[SI] 
    CALL MATCH            ;判断是什么运算符并进行相应的计算
    JMP AGAIN 
   
SAVE:
    CMP CH,0              ;判断是否是等号
    JE OUTPUT 
    CMP CH,1 
    JE INPUT              ;“)”不保存,输入下一个数
    INC SI 
    MOV [SI],AL           ;保存符号
    INC SI 
    CMP CH,5              ;判断是否是左括号
    JNE GO_ON 
    MOV CH,2              ;改变(的权值
GO_ON:
    MOV [SI],CH           ;紧跟着保存符号的权值
    JMP INPUT
     
BC: LEA DX,ERROR
    MOV AH,9 
    INT 21H 
    JMP J_SHU 
 
MATCH PROC NEAR           ;子程序,进行相应的运算
    PUSH AX 
    XOR AX,AX
    XOR BX,BX
    CMP CL,2AH            ;乘法运算
    JNE NEXT1
    SUB DI,2
    XCHG BX,[DI]
    SUB DI,2
    XCHG AX,[DI]
    IMUL BX
    MOV [DI],AX
    ADD DI,2
    JMP FINISH
NEXT1:CMP CL,2FH          ;除法运算
    JNE NEXT2
    SUB DI,2
    XCHG BX,[DI]
    SUB DI,2 
    XCHG AX,[DI]
    CWD
    IDIV BX
    MOV [DI],AX
    ADD DI,2
    JMP FINISH
NEXT2:CMP CL,2BH          ;加法运算
    JNE NEXT3
    SUB DI,2
    XCHG BX,[DI]
    SUB DI,2
    ADD [DI],BX
    ADD DI,2
    JMP FINISH
NEXT3:CMP CL,2DH          ;减法运算
    JNE FINISH
    SUB DI,2
    XCHG BX,[DI]
    SUB DI,2
    SUB [DI],BX 
    ADD DI,2
FINISH:
    POP AX
    RET
MATCH ENDP

ADVANCE PROC
    CHOICE 28H,1,5   ;(
OTH1:CHOICE 29H,2,1  ;)
OTH2:CHOICE 2AH,3,4  ;*
OTH3:CHOICE 2FH,4,4  ;/
OTH4:CHOICE 2BH,5,3  ;+
OTH5:CHOICE 2DH,6,3  ;-
OTH6:CHOICE 3DH,7,0  ;=
OTH7:RET
ADVANCE ENDP

CLEAR PROC NEAR           ;清屏
    PUSH AX
    PUSH BX
    PUSH CX
    PUSH DX
    MOV AX,0600H
    MOV BH,0FH
    MOV CX,0
    MOV DX,184FH    
    INT 10H
    POP AX
    POP BX
    POP CX
    POP DX
    RET
CLEAR ENDP

CR PROC NEAR              ;回车换行
    PUSH AX
    PUSH DX
    MOV AH,2
    MOV DL,0DH
    INT 21H
    MOV AH,2
    MOV DL,0AH
    INT 21H
    POP DX
    POP AX
    RET
CR ENDP

OUTPUT:                   ;输出运算结果
    SUB DI,2
    CMP WORD PTR[DI],0
    JGE W1
    NEG WORD PTR[DI]
    MOV DL,'-'
    MOV AH,2
    INT 21H
W1: MOV BX,10000
    MOV CX,5
    MOV SI,0
W2: MOV AX,[DI]
    CWD
    DIV BX
    MOV [DI],DX
    CMP AL,0
    JNE W3
    CMP SI,0
    JNE W3
    CMP CX,1
    JE W3
    JMP W4
W3: MOV DL,AL
    ADD DL,30H
    MOV AH,2
    INT 21H
    MOV SI,1
W4: MOV AX,BX
    MOV DX,0
    MOV BX,10
    DIV BX
    MOV BX,AX
    LOOP W2
   
    CALL CR             
    DISP MESG
    MOV AH,1
    INT 21H
    CMP AL,'n'
    JE J_SHU
    CMP AL,'N'
    JE J_SHU
    MOV WORD PTR[DI+2],0 
    CALL CR
    LEA DI,NUMB 
    LEA SI,MARK
    JMP START1
J_SHU:
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值