📄 加减乘除四则运算.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 + -