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

📄 加减乘除四则运算.asm

📁 加减乘除四则运算 对用户输入的一个包含两个十进制的操作数的加减乘除表达式求出结果并输出
💻 ASM
字号:
datas segment      ;定义数据段
	input     db  'Please input the math formula:','$'
	err       db  'The math formula is error!','$'
	resultoverflow      db  'overflowing!','$'
	overflow  db  'The data you have entered is overflow!','$'
	result    db  'The result is:','$'
	yushu     db  'The reminder is:','$'
	quit      db  'quit'    ;定义退出标志
    buf       db  20,?,20 dup(?) 
	operate1  dw  0	        ;定义第一个操作数
    operate2  dw  0         ;定义第二个操作数
    operate   dw  ?         ;定义操作符号
    flag1     db  0         ;定义第一个操作数符号标志
    flag2     db  0	       ;定义第二个操作数符号标志
	flag      db  0
	reminder  dw  0         ;定义除法操作的余数
	count     db  0         ;定义数学表达式字符串字符的数目
	crlf      db  0ah,0dh,'$'
datas ends

codes segment              ;定义代码段
main proc far                
	assume cs:codes,ds:datas
start:
    push ds
    sub ax,ax
    push ax
    mov ax,datas
    mov ds,ax
    mov es,ax
 begin: 
    mov operate1,0
    mov operate2,0   
    mov flag1,0
    mov flag2,0 
    mov flag,0
    mov count,0
    mov reminder,0
    
    lea dx,input     ;输出输入数学表达式的提示信息
    mov ah,09
    int 21h
    lea dx,buf       ;输入表达式
    mov ah,10
    int 21h
    
    lea si,buf+2
    lea di,quit      ;退出信息 
    mov cx,4
    repe cmpsb
    jz exit
    
    lea dx,crlf
    mov ah,9
    int 21h  

    lea si,buf+2
    mov dl,buf+1
    mov count,dl
    
 ;确定第一个操作数的符号标志
 next1:
    mov ax,0
    mov bx,0
    cmp byte ptr[si],2dh ;操作数的符号是否为负
    jnz sure1            ;操作数的符号不为负,跳转到next1
    mov flag1,1          ;操作数的符号为负,标志flag1设为1
    inc si      
    dec count
    
 ;确定第一个有效操作数  
 sure1: 
    mov al,[si]
    sub al,30h      
    jl error   
    cmp al,9   
    jg error    ;输入的操作数字符串中的字符为0-9则有效,否则显示错误信息
    cbw   
    xchg ax,bx   
    mov cx,10   
    mul cx  
    
    jnc cont1       ;判断操作数1是否溢出
    lea dx,overflow   
    mov ah,9
    int 21h         
    jmp next       ;若溢出,则显示溢出信息并跳转到next
  cont1: 
    xchg ax,bx   
    add bx,ax
    inc si
    dec count
    
 ;确定数学表达式的操作符号(“+”、“-”、“*”、“/”)
 follow:
     mov al,[si]
     cmp al,2bh           ;判断操作符号是否为“+”
     jnz follow1 
     mov operate,1        ;操作符号为“+”,operate置为1
     mov operate1,bx
     mov bx,0
     inc si
     dec count
     jnz next2
  follow1:
     cmp al,2dh           ;判断操作符号是否为“-”
     jnz follow2
     mov operate,2        ;操作符号为“-”,operate置为2
     mov operate1,bx
     mov bx,0
     inc si
     dec count
     jnz next2 
  follow2:
     cmp al,2ah           ;判断操作符号是否为“*”
     jnz follow3
     mov operate,3        ;操作符号为“*”,operate置为3
     mov operate1,bx
     mov bx,0
     inc si
     dec count
     jnz next2
  follow3:
     cmp al,2fh            ;判断操作符号是否为“/”
     jnz sure1
     mov operate,4         ;操作符号为“/”,operate置为4
     mov operate1,bx       ;确定第一个有效操作数 
     mov bx,0
     inc si
     dec count   
     
 ;确定第二个操作数的符号标志     
 next2:
     cmp byte ptr[si],2dh    ;操作数的符号是否为负
     jnz sure2               ;操作数的符号不为负,跳转到sure
     mov flag2,1             ;操作数的符号为负,标志flag2设为1
     inc si
     dec count  
 ;确定第二个有效操作数 
 sure2:
    mov al,[si]
    sub al,30h   
    jl error   
    cmp al,9d   
    jg error     ;输入的操作数字符串中的字符为0-9则有效,否则显示错误信息
    cbw   
    xchg ax,bx   
    mov cx,10d   
    mul cx  
    
    jnc cont2   ;判断操作数2是否溢出
    lea dx,overflow
    mov ah,9
    int 21h     
    jmp next   ;若溢出,则显示溢出信息并跳转到next
  cont2:
    xchg ax,bx   
    add bx,ax
    inc si
    dec count
    jnz sure2
    mov operate2,bx  ;确定第二个有效操作数 
    
    lea dx,result
    mov ah,09h
    int 21h
    
;进行加减乘除四则运算操作    
 yunsuan1:
    cmp operate,1    ;判断操作符号标志为operate是否为1
    jnz yunsuan2     ;若不为1,则跳转到yunsuan2继续判断
    ;进行加法运算操作
    cmp flag1,0       
    jnz go1
    cmp flag2,0
    jnz go2
    mov bx,operate1
    mov ax,operate2  
    call operadd    ;两操作数均为非负,调用加法运算函数,进行操作数1+操作数2的运算
    jmp next        
 go1:   
    cmp flag2,0
    jnz go3
    mov bx,operate2
    mov ax,operate1
    call opersub   ;操作数1为负,操作数2为非负,调用减法运算函数,进行操作数2-操作数1的运算
    jmp next
 go2:
    mov bx,operate1
    mov ax,operate2
    call opersub  ;操作数1为非负,操作数2为负,调用减法运算函数,进行操作数1-操作数2的运算
    jmp next
 go3: 
    mov dl,'-'
    mov ah,2
    int 21h
    mov bx,operate1
    mov ax,operate2  
    call operadd  ;两操作数均为负,则结果符号置负,调用加法运算函数,进行操作数1+操作数2的运算 
    jmp next
    
yunsuan2:          
   cmp operate,2  ;判断操作符号标志为operate是否为2
   jnz yunsuan3   ;若不为2,则跳转到yunsuan3继续判断
   ;进行减法运算操作
   cmp flag1,0
   jnz go11
   cmp flag2,0
   jnz go22
   mov bx,operate1
   mov ax,operate2
   call opersub   ;两操作数均为非负,调用减法运算函数,进行操作数1-操作数2的运算
   jmp next  
  go11:
   cmp flag2,0
   jnz go33
   mov dl,'-'
   mov ah,2
   int 21h
   mov bx,operate1
   mov ax,operate2  
   call operadd   ;操作数1为负,操作数2为非负,结果符号置负,调用加法运算函数,进行操作数1+操作数2的运算
   jmp next
  go22:
   mov bx,operate1
   mov ax,operate2
   call operadd   ;操作数1为非负,操作数2为负,调用加法运算函数,进行操作数1+操作数2的运算
   jmp next
  go33:
   mov bx,operate2
   mov ax,operate1
   call opersub   ;两操作数均为负,调用减法运算函数,进行操作数2-操作数1的运算 
   jmp next
   
yunsuan3: 
   cmp operate,3  ;判断操作符号标志为operate是否为3
   jnz yunsuan4   ;若不为3,则跳转到yunsuan4继续判断
   ;进行乘法运算操作
   mov ax,operate1
   mov bx,operate2
   call opermul   ;调用加法运算函数,进行操作数1*操作数2的运算
   jmp next
  ;进行除法运算操作
yunsuan4:
   mov ax,operate1
   mov bx,operate2
   call operdiv   ;调用加法运算函数,进行操作数1/操作数2的运算
   jmp next  
    
error:  
   lea dx,err     ;输出输入错误提示信息
   mov ah,9
   int 21h  
   
;进行下一次数学表达式输入操作   
next: 
   lea dx,crlf
   mov ah,9
   int 21h      ;换行
   jmp begin    ;跳转到 begin,进行下一次操作
exit:   
   ret          ;返回DOS
main endp

;下面的函数bin2dec调用函数decdiv把结果转换为十进制数输出
decdiv proc near   
     mov ax,bx   
     mov dx,0   
     div cx   
     mov bx,dx   
     mov dl,al 
     cmp flag,0
     jnz next3
     cmp dl,0
     jz  exit1   
  next3:
     mov flag,1  
     add dl,30h   
     mov ah,2   
     int 21h  
  exit1: 
     ret   
decdiv endp 
     
bin2dec proc near   
     cmp bx,0
     jnz next4
     mov dl,'0'
     mov ah,2
     int 21h
     jmp exit2 
  next4: 
     mov flag,0
     mov cx,10000d
     call decdiv
     mov cx,1000d   
     call decdiv   
     mov cx,100d   
     call decdiv   
     mov cx,10d   
     call decdiv   
     mov cx,1d   
     call decdiv  
  exit2: 
     ret   
bin2dec endp       

;加法运算操作函数    
operadd proc
     add bx,ax
     jc  out1              ;结果溢出 
     call bin2dec          ;调用结果转换函数,把结果转为十进制数并输出
     jmp exit3
  out1:
     lea dx,resultoverflow  ;结果溢出,则显示溢出提示信息
     mov ah,9
     int 21h
  exit3:   
     ret
operadd endp

;减法运算操作函数   
opersub proc
     cmp bx,ax
     jnc next5           ;结果不溢出
     xchg bx,ax
     push ax
     mov dl,'-'          
     mov ah,2
     int 21h
     pop ax              
 next5:
     sub bx,ax
     call bin2dec         ;调用结果转换函数,把结果转为十进制数并输出
     ret
opersub endp   
  
opermul proc
     mov cl,flag1
     xor cl,flag2 
     jz  go4              ;两操作数符号相同,结果为正,跳转到go4
     push ax              ;两操作数符号不同,结果为非正,执行以下操作
     mov dl,'-' 
     mov ah,2
     int 21h
     pop ax
  go4:
     mul bx
     jc out2              ;结果溢出
     mov bx,ax              
     call bin2dec         ;调用结果转换函数,把结果转为十进制数并输出
     jmp exit4
  out2:
     lea dx,resultoverflow ;结果溢出,则显示溢出提示信息
     mov ah,9
     int 21h
  exit4:
     ret
opermul endp
      
operdiv proc
    mov cl,flag1
    xor cl,flag2
    jz  go44               ;两操作数符号相同,结果为正,跳转到go44
    push ax                ;两操作数符号不同,结果为非正,执行以下操作
    mov dl,'-'
    mov ah,2
    int 21h
    pop ax
 go44:
    mov dx,0
    cwd                    ;转换为双字
    div bx
    mov reminder,dx        ;余数
    mov bx,ax
    call bin2dec           ;调用结果转换函数,把结果转为十进制数并输出商
   
    lea dx,crlf
    mov ah,9
    int 21h                ;换行
    cmp reminder,0         
    jz  exit5              ;若商为0,则不输出余数
    lea dx,yushu            ;若商不为0,则输出余数
    mov ah,9
    int 21h   
    mov bx,reminder        
    call bin2dec           ;调用结果转换函数,把结果转为十进制数并输出余数
  exit5:
    ret
operdiv endp

codes ends
    end start		     

⌨️ 快捷键说明

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