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

📄 count.asm

📁 这是用Masm for windows编写的一个实现计算器+ - * /功能的程序
💻 ASM
字号:
;一个多位数加,减,乘,除计算器的汇编程序(只能是非负数)
STACK SEGMENT
      DW 64 DUP(?)
STACK ENDS

CLEAR MACRO COLOR ;清屏 
   MOV AH,6       ;屏幕初始化 
   MOV AL,0       ;页号 
   MOV CH,0       ;设置左上角的坐标为(0,0) 
   MOV CL,0 
   MOV DL,100     ;设置右上角的坐标为(100,100) 
   MOV DH,100 
   MOV BH,COLOR   ;卷入行属性 
   INT 10H        ;BIOS调用 
 ENDM
 
DATA SEGMENT

STR1 DB '              ****** C O U N T ******    ',0DH,0AH,0DH,0AH,
'** Form Of Input: A + - * / B   (Only for plus)',0DH,0AH,
'** Then Press Enter To Get The Result.',0DH,0AH,
'** Input Q/q To Quit!',0DH,0AH,0DH,0AH,
'Please Input:    ','$'
;输入格式为:  输入一个数A(0<=A<65535)  再直接输入+-*/其中一个符号  
;再直接输入一个数B(<65535)  按回车即可得到结果  

STR2 DB 0DH,0AH,'Input error,please input again:','$'
STR3 DB '    remainder=$'         ;remainder:指余数
STR4 DB '        RESULT=$'
AB DB 12 DUP(?)                   ;存放输入的值
A DW 0                            ;第一个输入数
B DW 0                            ;第二个输入数
X DB 15 DUP(?)
C0 DB 14 DUP(?)
C1 DW 0
D DB ?
S DB 0                            ;存放+ - * /符号
COUNTA DW ?
COUNTB DW ?
H DW 0                            ;存放减法,乘法,除法结果的低位(AX)     
L DW 0                            ;存放减法,乘法,除法结果的高位(DX)

DATA ENDS


CODE SEGMENT
MAIN PROC FAR	
     ASSUME CS:CODE,DS:DATA,SS:STACK
START:
      PUSH DX
      SUB AX,AX
      PUSH AX
      
      MOV AX,DATA
      MOV DS,AX
      
      BACK: CLEAR 1BH           ;界面显示颜色    
      
      LEA DX,STR1               ;输出字符界面
      MOV AH,9
      INT 21H
SL:
      MOV DL,0DH                ;回车换行
      MOV AH,2
      INT 21H
      MOV DL,0AH
      MOV AH,2
      INT 21H
      
      MOV S,0                  
      MOV C1,0
      LEA SI,AB       
      MOV AH,1         
      INT 21H
      MOV [SI],AL
      MOV D,AL                   ;输入的数放在D里
      CMP D,'Q'
      JZ Q
      CMP D,'q'
      JZ Q
      CMP D,30H   
      JB ERO                      ;如果输入的不是数字范围就提示输入错误
      CMP D,39H
      JA ERO
      MOV BX,0       
LOOP1:
      INC BX
      MOV AH,1     
      INT 21H
      MOV [SI+BX],AL
      MOV D,AL                    ;输入的第二个字节,它是+ - * / 等符号
      CMP D,'Q'
      JZ Q
      CMP D,'q'
      JZ Q
      CMP D,'+'
      JZ A1
      CMP D,'-'
      JZ A1
      CMP D,'*'
      JZ A1
      CMP D,'/'
      JZ A1
      CMP D,'='
      JZ A2         
      CMP D,0dh                  ;按回车就可以得到答案
      JZ A3
      CMP D,30H
      JB ERO
      CMP D,39H
      JA ERO
      JMP LOOP1        ;当输入了第四个字节时如它不为=号或回车时,它就会出错了,因为循环到A1时S已经判断不为0了
      
Q:    JMP QUIT

ERO:  LEA DX,STR2      ;输入有误,输入的不是数字
      MOV AH,9
      INT 21H
      JMP SL
      
A1:   CMP S,0          ;如第四个输入数还跳到这里就会出错,S已经不为0了
      JNZ ERO
      DEC BX   
      MOV COUNTA,BX
      MOV AL,D
      MOV S,AL         ;第二个字节即符号放在S里面
      JMP LOOP1
      
A2:   CMP S,0         ;如果第二个字节输入=号提示错误
      JZ ERO      
      DEC BX
      MOV COUNTB,BX
      CALL ASC_BIN
      CMP S,'+'
      JZ P1
      CMP S,'-'
      JZ P2
      CMP S,'*'
      JZ P3
      CMP S,'/'
      JZ P4
      
A3:   
      MOV DL,0DH
      MOV AH,2
      INT 21H
      MOV DL,0AH
      MOV AH,2
      INT 21H
            
      LEA DX,STR4
      MOV AH,9
      INT 21H
      JMP A2
      
      
P1:   CALL ADD1         ;调用加法
      JMP SL
P2:   CALL SUB2         ;调用减法
      JMP SL
P3:   CALL MUL3         ;调用乘法 
      JMP SL
P4:   CALL DIV4         ;调用除法
      JMP SL
      
      
ADD1 PROC            ;加法
    MOV DX,0
    MOV AX,A
    ADD AX,B
    ADC DX,0
    MOV L,AX
    MOV H,DX
    CALL XS
    RET
ADD1 ENDP

SUB2 PROC            ;减法
    MOV AX,A
    CMP AX,B
    JA CNT
    CMP AX,B
    JZ CNT
    MOV BX,B
    MOV A,BX
    MOV B,AX
    MOV DL,'-'
    MOV AH,2
    INT 21H
CNT:MOV AX,A
    SUB AX,B
    MOV DX,0
    MOV L,AX
    MOV H,0
    CALL XS
    RET
SUB2 ENDP

MUL3 PROC         ;乘法
    MOV DX,0
    MOV AX,A
    MUL B
    MOV L,AX
    MOV H,DX
    CALL XS
    RET
MUL3 ENDP

DIV4 PROC          ;除法
    MOV DX,0
    MOV AX,A
    DIV B
    PUSH DX
    MOV H,0
    MOV L,AX
    CALL XS
    LEA DX,STR3
    MOV AH,9
    INT 21H
    mov c1,0
    POP DX
    MOV H,0
    MOV L,DX
    CALL XS
    RET
DIV4 ENDP

ASC_BIN PROC            ;把第一、第二个数分别给A和B
        INC COUNTA
        MOV CX,COUNTA
        MOV AX,0
        MOV BX,10
        LEA SI,AB
LOOP01: MOV DL,[SI]
        AND DL,0FH
        MOV [SI],DL
        MUL BX
        MOV DL,[SI]
        MOV DH,0
        ADD AX,DX
        INC SI
        LOOP LOOP01
        MOV DX,SI
        LEA SI,AB
        SUB DX,SI
        MOV SI,DX
        CMP SI,COUNTA
        JNZ LOOP02
        MOV A,AX
        MOV AX,COUNTB
        DEC COUNTA
        SUB AX,COUNTA
        MOV CX,AX
        LEA SI,AB
        INC COUNTA
        ADD SI,COUNTA
        MOV AX,0
        JMP LOOP01
LOOP02: MOV B,AX
        RET
ASC_BIN ENDP

BIN_ASC PROC              ;把结果转换成十进制
        MOV BX,10
        LEA DI,C0
LP1:    MOV DX,0
        MOV AX,H
        CMP AX,0
        JZ LP2
        DIV BX
        MOV H,AX
        MOV AX,L
        DIV BX
        MOV L,AX
        OR DL,30H
        MOV [DI],DL
        INC DI
        INC C1
        JMP LP1
LP2:    MOV AX,L
LP3:    CMP AX,0
        JZ LP4
        MOV DX,0
        DIV BX
        OR DL,30H
        MOV [DI],DL
        INC DI
        INC C1
        JMP LP3
LP4:    CMP C1,0
        JNZ LP5
        MOV AL,30H
        MOV [DI],AL
        INC C1
LP5:    RET
BIN_ASC ENDP

XS PROC             
   CALL BIN_ASC         ;把结果转换成十进制
   CALL SC              ;然后打印出来
   RET
XS ENDP

SC PROC                 ;打印结果
   MOV CX,C1
   DEC C1
   LEA SI,C0
   ADD SI,C1
   LEA DI,X
LP:MOV AL,[SI]
   MOV [DI],AL
   DEC SI
   INC DI
   LOOP LP
   MOV AL,'$'
   MOV [DI],AL
   LEA DX,X
   MOV AH,9
   INT 21H
   RET
SC ENDP

QUIT:                   ;退出
      MOV AH,4CH
      INT 21H
      
MAIN ENDP      
CODE ENDS
     END START

⌨️ 快捷键说明

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