📄 dad.asm
字号:
;二位十进制计算
fo macro p1 ;输出字符串
mov ah,9h
mov dx,offset &p1
int 21h
endm
fl macro ;清屏
mov ah,06
mov al,0
mov bh,0
mov cx,0
mov dh,24
mov dl,79
int 10h
endm
d1 macro ;余数乘10除以被除数
pop dx
mov ax,dx
mov x,100d
mul x
mov dx,0
div yy
endm
data segment ;数据段
jia db 'add +','$'
jian db 'sub -','$'
chen db 'mul *','$'
chu db 'div /','$'
lk db 'exit','$'
err db ' error!','$'
be1 db 'Press up and down to choose','$'
be2 db 'Press enter to get in!','$'
ti db 'Ji Suan Qi','$'
mak db '---Zip.Boy.New','$'
ver db 'version 1.0','$'
jshu db 0
ts db 'press any key to continue(esc quit).','$'
z1 db 'input first number: ','$'
z2 db 'input second number: ','$'
z3 db 'the result is: ','$'
fh db '-','$'
yu db '.','$'
x db 0h
y db 0h
xx dw 0h
yy dw 0h
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
;=============================
;清全屏为蓝色
;=============================
xuanj: mov dh,0 ;列
mov dl,0 ;行
mov ah,2
int 10h ;置光标于(0,0)
mov ah,9
mov al,' ' ;字符
mov bh,0 ;显示页
mov bl,1fh ;背景色为黑
mov cx,80*25 ;字符重复次数
int 10h ;光标位置显示字符及其属性
call zcd ;画主菜单
;-----------------------------------
xuan: mov dh,10
mov dl,34
call xcd
mov dh,10 ;选单jia高亮
mov dl,37
mov ah,2
int 10h
fo jia
;-----------------------------------
deng: xor ax,ax ;等待键盘输入
int 16h
cmp al,27
jz aexi ;esc退出
cmp ax,5000h ;判断是否为向下
jnz shang ;不是则转到判断是否向上
inc jshu ;向下则计数器加一
jmp xia ;进入画高亮菜单段
shang: cmp ax,4800h
jnz hch
cmp jshu,0 ;计数器为0则循环置为4
jnz wjx
mov jshu,4
jmp xia
wjx: dec jshu ;计数器减一
jmp xia ;进入画高亮菜单段
hch: cmp al,0dh ;跳转缓冲/判断是否为回车
jz jsuan
jmp deng
aexi: mov jshu,4
jsuan: cmp jshu,0
jz s1 ;进入加法运算
cmp jshu,1
jz s2 ;进入减法运算
cmp jshu,2
jz hhcch ;进入乘法运算
cmp jshu,3
jz hhcc ;进入除法运算
jmp exit
hhcch: jmp s3
hhcc: jmp s4
s1: call zcx ;画程序运算窗口
mov dh,6 ;加法运算
mov dl,22
mov ah,2
int 10h
fo z1 ;输出提示1
call numb
mov xx,cx
mov dh,7
mov dl,22
mov ah,2
int 10h
fo z2 ;输出提示2
call numb
add cx,xx
mov dh,8
mov dl,22
mov ah,2
int 10h
fo z3 ;输出提示3
mov bx,cx
call cmpc
okk: call resu
mov dl,al
add dl,30h
ok1: mov ah,2
int 21h
sub cx,1
cmp cx,0
jnz okk
jmp et ;跳转到判断是否结束的代码段
s2: call zcx
mov y,3
mov dh,6 ;输出减
mov dl,22
mov ah,2
int 10h
fo z1 ;输出提示1
call numb
mov xx,cx
mov dh,7
mov dl,22
mov ah,2
int 10h
fo z2 ;输出提示2
call numb
cmp xx,cx
jb fushu
sub xx,cx
mov cx,xx
jmp goo
fushu: sub cx,xx
mov y,1
goo: mov dh,8
mov dl,22
mov ah,2
int 10h
fo z3 ;输出提示3
cmp y,2
jb fuhao
jmp gooo
fuhao: fo fh ;输出负号
gooo: mov bx,cx
call cmpc
okj: call resu
mov dl,al
add dl,30h
mov ah,2
int 21h
sub cx,1
cmp cx,0
jnz okj
jmp et
s3: call zcx
mov dh,6 ;乘法运算
mov dl,22
mov ah,2
int 10h
fo z1 ;输出提示1
call numb
mov xx,cx
mov dh,7
mov dl,22
mov ah,2
int 10h
fo z2 ;输出提示2
call numb
mov ax,cx
mul xx
mov cx,ax
mov dh,8
mov dl,22
mov ah,2
int 10h
fo z3 ;输出提示3
mov bx,cx
call cmpc
okc: call resu
mov dl,al
add dl,30h
mov ah,2
int 21h
sub cx,1
cmp cx,0
jnz okc
jmp et
s4: call zcx
mov dh,6 ;除法运算
mov dl,22
mov ah,2
int 10h
fo z1 ;输出提示1
call numb
mov xx,cx
mov dh,7
mov dl,22
mov ah,2
int 10h
fo z2 ;输出提示2
call numb
cmp cx,0
jnz chuf
fo err
jmp et
chuf: mov yy,cx
mov ax,xx
mov dx,0
div yy
push dx
mov cx,ax
mov dh,8
mov dl,22
mov ah,2
int 10h
fo z3 ;输出提示3
mov bx,cx
call cmpc
okq: call resu
mov dl,al
add dl,30h
mov ah,2
int 21h
sub cx,1
cmp cx,0
jnz okq
fo yu ;小数
d1
push dx
call d2
d1
push dx
call d2
d1
push dx
call d2
d1
call d2
et: mov bx,0
mov dh,12 ;判断是否结束程序
mov dl,22
mov ah,2
int 10h
fo ts ;输出选择提示
xz2: mov ah,7h ;选择
int 21h
cmp al,27
jz axit
jmp hhc2
axit: jmp exit
hhc2: mov jshu,0
jmp xuanj
;----------------------------------
;画高亮菜单
;----------------------------------
xia: call zcd ;画主菜单
cmp jshu,0
jz hhc ;跳转缓冲
cmp jshu,1
jz zjian
cmp jshu,2
jz zchen
cmp jshu,3
jz zchu
cmp jshu,4
jz zlk
mov jshu,0
jmp xia
hhc: jmp xuan
zjian: mov dh,11
mov dl,34
call xcd
mov dh,11 ;选单jian高亮
mov dl,37
mov ah,2
int 10h
fo jian
jmp deng
zchen: mov dh,12
mov dl,34
call xcd
mov dh,12 ;选单chen高亮
mov dl,37
mov ah,2
int 10h
fo chen
jmp deng
zchu: mov dh,13
mov dl,34
call xcd
mov dh,13 ;选单chu高亮
mov dl,37
mov ah,2
int 10h
fo chu
jmp deng
zlk: mov dh,14
mov dl,34
call xcd
mov dh,14 ;选单exit高亮
mov dl,37
mov ah,2
int 10h
fo lk
jmp deng
exit: fl
mov ah,4ch
int 21h
xcd proc near
mov ah,2
int 10h
mov ah,9
mov al,' '
mov bh,0
mov bl,94h
mov cx,12
int 10h
ret
xcd endp
;--------------------------------------
;画主菜单
;--------------------------------------
zcd proc near
push ax
push bx
push cx
push dx
mov dh,3
mov dl,35
mov ah,2
int 10h
fo ti
mov dh,5
mov dl,26
mov ah,2
int 10h
fo be1
mov dh,6
mov dl,28
mov ah,2
int 10h
fo be2
mov dh,21
mov dl,65
mov ah,2
int 10h
fo mak
mov dh,22
mov dl,68
mov ah,2
int 10h
fo ver
mov dh,9 ; 行 菜单(9,34)--(15,46)红色背景,白色字
mov dl,34 ;列
cd1: mov ah,2
int 10h ;10h-2
mov ah,9
mov al,' '
mov bh,0
mov bl,77h
mov cx,12
int 10h ;10h-9
inc dh
cmp dh,16
jnz cd1
mov dh,10
mov dl,35
cd: mov ah,2
int 10h
mov ah,9
mov al,' '
mov bh,0
mov bl,4fh
mov cx,10
int 10h
inc dh
cmp dh,15
jnz cd
mov dh,10 ;输出选单+
mov dl,37
mov ah,2
int 10h
fo jia
mov dh,11 ;输出选单-
mov dl,37
mov ah,2
int 10h
fo jian
mov dh,12 ;输出选单*
mov dl,37
mov ah,2
int 10h
fo chen
mov dh,13 ;输出选单/
mov dl,37
mov ah,2
int 10h
fo chu
mov dh,14 ;输出选单exit
mov dl,37
mov ah,2
int 10h
fo lk
pop dx
pop cx
pop bx
pop ax
ret
zcd endp
zcx proc near ;计算界面
mov dh,5
mov dl,20
hui: mov ah,2
int 10h
mov ah,9
mov al,' '
mov bh,0
mov bl,0fh
mov cx,40
int 10h
inc dh
cmp dh,17
jnz hui
ret
zcx endp
numb proc near ;数字输入
abc: mov ah,07h ;十位
int 21h
cmp al,27
jz exi
cmp al,'0'
jb abc
cmp al,'9'
jg abc
mov dl,al
mov ah,02h
int 21h
sub al,30h
mov x,10
mul x
mov cx,ax
sub ax,ax
bbb: mov ah,07h ;个位
int 21h
cmp al,27
jz exi
cmp al,'0'
jb bbb
cmp al,'9'
jg bbb
mov dl,al
mov ah,02h
int 21h
mov x,1
mul x
sub al,30h
add cx,ax
ret
exi: fl
mov ah,4ch
int 21h
numb endp
cmpc proc near ;比较出bx的位数
cmp bx,1000
jb c100
mov cx,4
jmp c0
c100: cmp bx,100
jb c10
mov cx,3
jmp c0
c10: cmp bx,10
jb c1
mov cx,2
jmp c0
c1: mov cx,1
c0: ret
cmpc endp
resu proc near ;输出bx
cmp cx,4
jnz cx3
mov ax,bx
mov dx,0
mov xx,1000d
div xx
jmp cx0
cx3: cmp cx,3
jnz cx2
mov ax,bx
mov dx,0
mov xx,100d
div xx
jmp cx0
cx2: cmp cx,2
jnz cx1
mov ax,bx
mov dx,0
mov xx,10d
div xx
jmp cx0
cx1: cmp cx,1
jnz cx0
mov ax,bx
mov dx,0
mov xx,1d
div xx
cx0: mov bx,dx
ret
resu endp
d2 proc near ;输出余数
mov bx,ax
call cmpc
oky: call resu
mov dl,al
add dl,30h
mov ah,2
int 21h
sub cx,1
cmp cx,0
jnz oky
ret
d2 endp
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -