📄 asmd.asm
字号:
dat segment
a db 10 dup(0)
b db 10 dup(0)
z db 11 dup(0)
c db 20 dup(0)
d db ?
e db "输入十位以内的算术运算式",0ah,0dh,"$"
f db "输入错误,请重新$"
g db "继续运算吗?(y/n)[n]$"
dat ends
cod segment
assume cs:cod,ds:dat
start:
mov ax,dat
mov ds,ax ;置段寄存器
;_______________________________________________________
begin: ;以下清除a,b,c(qingling)
mov cx,10
mov bx,0
cls0:
mov a[bx],0
mov b[bx],0
mov z[bx],0
mov [c+10][bx],0
inc bx
loop cls0
mov z+10,0
mov cx,10
mov bx,0
qc:
mov c[bx],0
inc bx
loop qc
mov ah,9 ;显示提示信息字符串e
lea dx,e
int 21h
;_______________________________________________________
mov cx,10 ;以下输入a
mov bx,0
mov ah,1
ina:
int 21h
cmp al,"+"
je c1
cmp al,"-"
je c1
cmp al,"*" ;判断是否为"*"号
je c1
cmp al,"/"
jne la1
mov d,al ;"*"号保存
jmp movea ;转到移动a
la1:
cmp al,30h ;判断是数字
jb err ;否转错误自理
cmp al,39h
ja err
and al,0fh ;是转化为数值并存入a
mov a[bx],al
inc bx ;修改地址
loop ina ;循环输入
int 21h ;输入运算符
cmp al,"+"
je d1
cmp al,"-"
je d1
cmp al,"*" ;判断是否为运算符
je d1 ;否转错误处理
cmp al,"/"
jne err
d1:
mov d,al ;是保存
jmp inb ;转输入b
;____________________________________________________
err:
mov dl,0ah
mov ah,2
int 21h
mov dl,0dh
int 21h
mov ah,9
lea dx,f
int 21h
jmp begin ;错误处理
;____________________________________________________
c1:
mov d,al
movea:
mov dx,10
sub dx,cx
mov si,cx
mov cx,dx
dec bx
mova:
mov al,a[bx]
mov a[bx][si],al
mov a[bx],0
dec bx
loop mova ;循环移位a
;____________________________________________________
inb: ;输入b
mov cx,10
mov bx,0
mov ah,1
inb1:
int 21h
cmp al,"=" ;判断是否为"="号
jne lb1
jmp mov_b ;是转移动b
lb1:
cmp al,30h ;否判断是否为字符
jb err ;不是转错误处理
cmp al,39h
ja err
and al,0fh ;是转化为数字并保存
mov b[bx],al
inc bx ;修改地址
loop inb1 ;循环输入
int 21h ;输入"="
cmp al,"=" ;判断是否为等号
jne err
mov al,d ;否转错误处理
cmp al,"+"
je j_add
cmp al,"-"
je j_sub
cmp al,"*"
je d2
cmp al,"/"
jne err
jmp bj
d2:
jmp c_mul
mov_b: ;移位b
mov dx,10
sub dx,cx
mov si,cx
mov cx,dx
dec bx
movb:
mov al,b[bx]
mov b[bx][si],al
mov byte ptr b[bx],0
dec bx
loop movb
cmp d,"+"
je j_add
cmp d,"-"
je j_sub
cmp d,"*"
je w3
cmp d,"/"
je w4
jmp err
w3:
jmp c_mul
w4:
jmp bj
;____________________________________________________
j_add:
mov cx,10
mov bx,9
clc
j_ad:
mov al,a[bx]
adc al,b[bx]
aaa
mov [c+10][bx],al
dec bx
loop j_ad
adc [c+9],0
jmp out_c ;加法运算
;____________________________________________________
j_sub:
mov cx,10
mov bx,0
x:
mov al,a[bx]
cmp al,b[bx]
jb j_sub2
ja j_sub1
inc bx
loop x
j_sub1:
mov cx,10
mov bx,9
clc
j_su1:
mov al,a[bx]
sbb al,b[bx]
aas
mov [c+10][bx],al
dec bx
loop j_su1
jmp out_c
j_sub2:
mov ah,2
mov dl,2dh
int 21h
mov cx,10
mov bx,9
clc
j_su2:
mov al,b[bx]
sbb al,a[bx]
aas
mov [c+10][bx],al
dec bx
loop j_su2
jmp out_c ;减法运算
;____________________________________________________
c_mul:
mov bx,9
m1:
mov di,10
mov si,9
mov [z+1][si],0
mov cx,10
m2:
mov al,a[si]
mul b[bx]
aam
add al,[z+1][si]
aaa
mov [z+1][si],al
mov z[si],ah
dec si
loop m2
mov cx,11
mov si,10
clc
m3:
mov al,c[di][bx]
adc al,z[si]
aaa
mov c[di][bx],al
dec di
dec si
loop m3
cmp bx,0
jne w2
jmp out_c
w2:
dec bx
jmp m1 ;乘法运算
;_____________________________________________________
bj:
mov cx,10
mov bx,0
l1:
mov al,a[bx]
cmp al,b[bx]
ja j_subd
jb outcd
inc bx
loop l1
mov cx,10
mov bx,0
l2:
mov al,a[bx]
cmp al,0
jne j_subd
inc bx
loop l2
jmp outcd
j_subd:
mov cx,10
mov bx,9
clc
l3:
mov al,a[bx]
sbb al,b[bx]
aas
mov a[bx],al
dec bx
loop l3
j_addd:
mov bx,9
clc
mov al,c[bx]
adc al,1
aaa
mov c[bx],al
dec bx
mov cx,9
l4:
mov al,c[bx]
adc al,0
aaa
mov c[bx],al
dec bx
loop l4
jmp bj
outcd:
mov cx,10
mov bx,0
mov ah,2
l5:
mov al,c[bx]
cmp al,0
jne l6
inc bx
loop l5
mov dl,30h
int 21h
jmp sys
l6:
mov dl,c[bx]
or dl,30h
int 21h
inc bx
loop l6
sys:
mov cx,10
mov bx,0
k2:
mov al,a[bx]
cmp al,0
jne k3
inc bx
loop k2
jmp ts
k3:
push cx
mov cx,6
k4:
mov dl,"*"
int 21h
loop k4
pop cx
k5:
mov dl,a[bx]
or dl,30h
int 21h
inc bx
loop k5
jmp ts
;____________________________________________________
out_c:
mov cx,20 ;输出结果
mov ah,2
mov bx,0
cmp0:
mov al,c[bx]
cmp al,0 ;无效数字不输出
jne out_c1
inc bx
loop cmp0
mov dl,30h
int 21h
jmp ts
out_c1:
mov dl,c[bx]
or dl,30h
int 21h ;输出有效数字
inc bx
loop out_c1
mov dl,0ah
int 21h
mov dl,0dh
int 21h
;_______________________________________________________
ts:
mov ah,9 ;显示选择信息
lea dx,g
int 21h
mov ah,7 ;输入一个字符
int 21h
cmp al,"y" ;判断是否为Y或y
jne cmpy
jmp hc
cmpy:
cmp al,"Y"
jne exit_dos ;否返回操作系统
hc:
mov ah,2
mov dl,0ah
int 21h
mov dl,0dh
int 21h
jmp begin ;是重新开始运算
;_____________________________________________________
exit_dos:
mov ah,4ch
int 21h ;返回操作系统
;_____________________________________________________
cod ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -