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

📄 cac.asm

📁 汇编语言源程序:计算器程序
💻 ASM
字号:
;EXTRN MUSIC:FAR
STACK SEGMENT STACK
   DB 50H DUP(?)
STACK ENDS
DATA SEGMENT
   X DW ?
   Y DW ?
   M DW ?
   N DB ?
   MESS1 DB '<Q=QUIT>',0AH,0DH,'$'
   MESS2 DB 'SELECT',' ','0-10',';','1-16',0AH,0DH,'$'
   MESS3 DB 'PLEASE INPUT DEC-DATA',0AH,0DH,'$'
   MESS4 DB 'PLEASE INPUT HEX-DATA',0AH,0DH,'$'
DATA ENDS
CODE SEGMENT
   ASSUME CS:CODE,DS:DATA,SS:STACK
START:
   MOV AX,DATA
   MOV DS,AX
   CALL CUR    ;程序初始化(清屏,*窗口)
 ;CALL MUSIC
POS_CURSE:
   MOV AH,02H
   MOV DH,09      
   MOV DL,44
   MOV BH,0
   INT 10H      ;光标定位(9,44)
   MOV DX,OFFSET MESS1  
   MOV AH,09
   INT 21H      ;显示提示信息
   MOV AH,02H
   MOV DH,10      
   MOV DL,44
   MOV BH,0
   INT 10H      ;光标定位(10,44)
   MOV DX,OFFSET MESS2  
   MOV AH,09
   INT 21H      ;显示提示信息
   MOV AH,02H
   MOV DH,8
   MOV DL,30
   MOV BH,0
   INT 10H      ;光标定位(8,30)  
   MOV AH,07
   INT 21H
   SUB AL,30H
   MOV N,AL
   CMP N,0
   JZ NEXT1
   CMP N,1
   JZ NEXT11
   JMP PANDUAN
NEXT1:
   MOV M,1
   MOV AH,02H
   MOV DH,11      
   MOV DL,44
   MOV BH,0
   INT 10H      ;光标定位(11,44)
   MOV DX,OFFSET MESS3  
   MOV AH,09
   INT 21H      ;显示提示信息
   MOV AH,02H
   MOV DH,8
   MOV DL,30
   MOV BH,0
   INT 10H      ;光标定位(8,30)
   MOV AH,06
   MOV AL,1
   MOV CH,5
   MOV CL,30
   MOV DH,8
   MOV DL,50
   MOV BH,7
   INT 10H       ;屏幕上卷
   CALL ADD_TO   ;表达式输入
   CMP AL,51H    
   JZ EXIT1      ;输入'Q',则退出
   JMP NEXT1
NEXT11:
   
   MOV AH,02H
   MOV DH,11      
   MOV DL,44
   MOV BH,0
   INT 10H      ;光标定位(11,44)
   MOV DX,OFFSET MESS4  
   MOV AH,09
   INT 21H      ;显示提示信息
   MOV AH,02H
   MOV DH,8
   MOV DL,30
   MOV BH,0
   INT 10H      ;光标定位(8,30)
   MOV AH,06
   MOV AL,1
   MOV CH,5
   MOV CL,30
   MOV DH,8
   MOV DL,50
   MOV BH,7
   INT 10H       ;屏幕上卷
   CALL ADD_TO   ;表达式输入
   CMP AL,51H    
   JZ EXIT1      ;输入'Q',则退出
   JMP NEXT11
PANDUAN:
   CMP AL,51H    
   JZ EXIT1      ;输入'Q',则退出
   JMP POS_CURSE
EXIT1:
   MOV AH,4CH
   INT 21H

ADD_TO PROC NEAR
   CALL CHAR     ;输入一个运算数(输入10/16进制数转换为2进制数BX)
   MOV X,BX
   CMP AL,2DH
   JZ MINU
   CMP AL,2AH
   JZ MUL_
   CMP AL,2FH
   JZ DIV_
   CMP AL,51H
   JZ EXIT8
   CALL CHAR    
   CALL CR_      ;显示'='    
   MOV Y,BX
   ADD BX,X
   JMP TO_
MINU:
   CALL CHAR
   CALL CR_
   MOV Y,BX
   MOV BX,X
   CMP BX,Y
   JL T_
   SUB BX,Y
   JMP TO_
MUL_:
   CALL CHAR
   CALL CR_
   MOV Y,BX
   MOV AX,X
   MUL Y
   MOV BX,AX
   JMP TO_
DIV_:
   CALL CHAR
   CALL CR_
   MOV Y,BX
   MOV DX,0
   MOV AX,X
   DIV Y
   MOV BX,AX
   JMP TO_
T_:
   MOV DL,2DH
   MOV AH,02H
   INT 21H
   MOV BX,Y
   SUB BX,X
TO_:
   CALL BIN     ;把BX结果转换为10/16进制输出
EXIT8:
   RET

CR_  PROC NEAR
   CMP AL,0DH
   JNZ ESC_
   MOV AH,02H
   MOV DH,8
   MOV DL,46
   MOV BH,0
   INT 10H     ;光标定位(8,46)
   MOV DL,3DH
   MOV AH,02H  
   INT 21H     ;显示=
ESC_:
   RET
CR_  ENDP

CHAR PROC NEAR
   CMP N,0
   JZ NEXT2
   CMP N,1
   JZ NEXT3
NEXT2:
   MOV BX,0
NEWCHAR1:
   MOV AH,01H
   INT 21H
   CMP AL,30H
   JL EXIT
   CMP AL,39H
   JG EXIT
   SUB AL,30H
   MOV AH,0
   XCHG AX,BX
   MOV CX,10
   MUL CX
   XCHG AX,BX
   ADD BX,AX
   JMP NEWCHAR1
NEXT3:
   MOV BX,0
NEWCHAR2:
   MOV AH,01H
   INT 21H
   CMP AL,30H
   JL EXIT
   CMP AL,3AH
   JL NEXT4
   CMP AL,41H
   JL EXIT
   CMP AL,46H
   JGE EXIT
   SUB AL,7
NEXT4:
   MOV CL,4
   SHL BX,CL
   MOV AH,0
   SUB AL,30H
   ADD BX,AX
   JMP NEWCHAR2 
EXIT:
   RET
CHAR ENDP

BIN PROC NEAR
   CMP N,0
   JZ NEXT5
   CMP N,1
   JZ NEXT6
NEXT5:
   MOV  CX,10000
   CALL DEC_DIV
   MOV CX,1000
   CALL DEC_DIV
   MOV CX,100
   CALL DEC_DIV
   MOV CX,10
   CALL DEC_DIV
   MOV CX,1
   CALL DEC_DIV1
   JMP EXIT9
NEXT6:
   MOV CH,4       
ROTATE:  
   MOV CL,4
   ROL BX,CL
   MOV DL,BL
   AND DL,0FH
   ADD DL,30H
   CMP DL,3AH
   JL PRINT
   ADD DL,7H
   JMP PRINT1
PRINT: 
   CMP DL,30H
   JZ ROTATE1
PRINT1:
   MOV AH,2
   INT 21H
ROTATE1:
   DEC CH
   JNZ ROTATE
EXIT9:
   RET
BIN ENDP

DEC_DIV PROC NEAR
   MOV AX,BX
   MOV DX,0
   DIV CX
   MOV BX,DX
   CMP M,0           ;高位0不显示
   JZ TO1_
   CMP AL,0
   JZ TO2_    
TO1_:
   MOV DL,AL
   ADD DL,30H
   MOV AH,02H
   INT 21H
   MOV AL,0
   MOV M,AL
TO2_:
   RET
DEC_DIV ENDP

DEC_DIV1 PROC NEAR
   MOV AX,BX
   MOV DX,0
   DIV CX
   MOV BX,DX
   MOV DL,AL
   ADD DL,30H
   MOV AH,02H
   INT 21H
   RET
DEC_DIV1 ENDP
ADD_TO ENDP

CUR PROC NEAR
   MOV AH,6
   MOV AL,0
   MOV CH,0
   MOV CL,0
   MOV DH,24
   MOV DL,79
   MOV BH,7
   INT 10H      ;清屏
   MOV AH,2
   MOV BH,0
   MOV DH,4
   MOV DL,25
   INT 10H      ;设光标位置(4,25)
   MOV AH,9
   MOV AL,'*'
   MOV BH,0
   MOV BL,9
   MOV CX,42
   INT 10H      ;显示字符42个'*'
   MOV AH,2
   MOV BH,0
   MOV DH,12
   MOV DL,25
   INT 10H      ;设光标位置(12,25)
   MOV AH,9
   MOV AL,'*'
   MOV BH,0
   MOV BL,9
   MOV CX,42
   INT 10H      ;显示字符42个*
   MOV DH,4
   CALL A
   CALL A
   CALL A
   CALL A
   CALL A
   CALL A
   CALL A
   CALL A       ;显示字符1列*(*,25)
   MOV DH,4
   CALL B
   CALL B
   CALL B
   CALL B
   CALL B
   CALL B
   CALL B        
   CALL B       ;显示字符*1列(*,66)
   RET
CUR ENDP

A PROC NEAR
   MOV AH,2
   MOV BH,0
   INC DH
   MOV DL,25
   INT 10H      ;设置光标位置(DH,25)
   MOV AH,9
   MOV AL,'*'
   MOV BH,0
   MOV BL,9
   MOV CX,1
   INT 10H       ;显示一个*
   RET
A ENDP

B PROC NEAR
   MOV AH,2
   MOV BH,0
   INC DH
   MOV DL,66
   INT 10H
   MOV AH,9
   MOV AL,'*'
   MOV BH,0
   MOV BL,9
   MOV CX,1
   INT 10H
   RET
B ENDP

CODE ENDS
   END START

⌨️ 快捷键说明

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