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

📄 qq.asm

📁 一个用汇编语言写的计算器能进行科学计算有一个小的框架
💻 ASM
字号:
DSEG SEGMENT 
SIGN1 DW 0 ;判断数字是否输入完毕 
SIGN2 DW 0 ;判断括号是否配对 
SIGN3 DW 0  ; 
NUMB DW 20H DUP(0) ;保存输入的数值 
MARK DB 'A' ;保存输入的运算符  
DB 10H DUP(0) ; 
ERROR DB 'YOUR INPUT ARE WRONG$'  
DSEG ENDS 
 

CHOICE MACRO ASC1,HAO1,HH ;宏定义,给运算符赋权值 
CMP AL,ASC1  ; 
JNE OTHER&HAO1 ; 
MOV CH,HH  ; 
JMP OTHER7  ; 
ENDM  

CSEG SEGMENT   ; 
ASSUME CS:CSEG,DS:DSEG 
START: call clear        
MOV AX,DSEG  ; 
MOV DS,AX  ; 
call cur
LEA DI,NUMB  ; 
LEA SI,MARK  ;         
;disp    error         
MOV     AX,0         
MOV     DX,0         
MOV     BX,0         
MOV     CX,0 

STA1 : CALL     CR 
INPUT: 
MOV AH,1 
INT 21H                  
CMP     AL,'!'         
JE      J_SHU0 
CMP AL,'='   
JE PD ;是等号,进一步判断输入括号是否配对 
CMP AL,28H  
JB INPUT   
CMP AL,39H   
JA INPUT 
CMP AL,2FH ;判断是数字还是符号 
JBE JUD ;是符号转入响应操作
    
INC WORD PTR SIGN1 ;将数字标志位加一 
SUB AL,30H ;将asc码转16进制 
MOV AH,0   
XCHG AX,[DI]   
MOV BX,10   
MUL BX   
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 FUH1  ; 
ADD DI,2  ; 
MOV WORD PTR SIGN1,0; 
 
FUH1: CALL ADVANCE ;判定优先级, 
CMP CH,5 ;判断输入的是否是左括号 
JNE PY ;不是则判断输入的是否是右括号 
INC WORD PTR SIGN2 ;是左括号,括号标志位1 
MOV WORD PTR SIGN3,1; 
PY: CMP CH,1 ;判断输入的是否是右括号 
JNE AGAIN  ; 
DEC WORD PTR SIGN2 ;是右括号,括号标志位减1 
AGAIN: CMP BYTE PTR[SI],'A' ;判断运算符存储区是否为空 
JE SAVE  ; 
CMP CH,[SI]  ; 
JA SAVE  ;         
CMP     BYTE PTR[SI],'('         
JNE     YIDO         
DEC     SI         
JMP     INPUT 

YIDO: DEC SI  ; 
MOV CL,[SI]  ; 
CALL MATCH ;判断是什么运算符并进行相应的计算 
;DEC SI  ; 
JMP AGAIN  ; 

Z_Z: JMP INPUT 
J_SHU0: JMP J_SHU; 
SAVE: CMP CH,0  ; 
JE OVER1  ; 
CMP CH,1  ; 
JE Z_Z ;“)”不保存,输入下一个数 
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  ; 
OVER1: JMP OVER  ;  

MATCH PROC ;子程序,进行相应的运算 
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] 
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  ;( 
OTHER1: CHOICE 29H,2,1  ;) 
OTHER2: CHOICE 2AH,3,4  ;* 
OTHER3: CHOICE 2FH,4,4  ;/ 
OTHER4: CHOICE 2BH,5,3  ;+ 
OTHER5: CHOICE 2DH,6,3  ;- 
OTHER6: CHOICE 3DH,7,0  ;= 
OTHER7: RET 
ADVANCE ENDP  ;
 
clear proc near       
push ax       
push bx       
push cx       
push dx       
mov  ah,06h       
mov al,00h       
mov ch,0       
mov cl,0       
mov bh,0fH       
mov dh,18H       
mov dl,4FH        
int 10h       
mov bh,0       
mov dx,0       
MOV AH,02H      ; 
MOV DL,2       
INT 10H          
pop dx       
pop cx       
pop bx       
pop ax     
ret 
clear endp  ;****回车换行****  

CR  PROC          
PUSH  AX        
PUSH  DX        
MOV  ah,2        
MOV   dl,13        
INT     21H 
mov    ah,2      
MOV    dl,10        
INT     21H        
POP    DX        
POP    AX        
RET 
CR ENDP 

OVER:          
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] 
MOV DX,0 
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        

J_SHU1: 
MOV WORD PTR[DI+2],0           
CALL    CR        
LEA DI,NUMB  ; 
LEA SI,MARK          
JMP STA1 

J_SHU: 
MOV AH,4CH  
INT 21H 
 

CUR PROC NEAR
MOV AH,6
MOV AL,0
MOV CH,0
MOV CL,0
MOV DH,3
MOV DL,0
MOV BH,7
INT 10H
MOV AH,2
MOV BH,0
MOV DH,15
MOV DL,0
INT 10H
MOV AH,9
MOV AL,"-"
MOV BH,0
MOV BL,5
MOV CX,30
INT 10H
;
MOV AH,2
MOV BH,0
MOV DH,4
MOV DL,0
INT 10H
MOV AH,9
MOV AL,"-"
MOV BH,0
MOV BL,5
MOV CX,30
INT 10H
RET
CUR ENDP

CSEG ENDS 
 END START


⌨️ 快捷键说明

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