主题:大家来帮忙,yey大哥请来看看,愿意给50分
以下的程序是关于加减运算器的程序,是yey大哥的帖子,小弟加上了乘法的运算,
但调不出来,请来帮帮忙
.model
.stack
.code
a dw ?
b dw ?
c dw ?
d dw ?
e dw ?
f dw ?
g dw ?
esc_key equ 1bh
win_ulc equ 30
win_lrr equ 16
main proc far
call clear_screen ;调用clear_screen段
mov dx,0
mov ah,2
mov dh,7
mov dl,29
mov bh,0
int 10h ;置光标位置
mov ah,9
mov al,'$'
mov bh,0
mov bl,0dah
mov cx,21
int 10h ;在光标处,画了21个'$'作窗口的头装饰
mov ah,2
mov dh,7
mov dl,30
mov bh,0
int 10h ;再一次将光标置位
mov cx,20
loop1:
;mov dl,'_'
;mov ah,2
;int 21h
;loop loop1 ;画20个'-'作为窗口头边框
locate1:
mov dx,0
mov ax,0
mov bx,0
mov cx,0
mov a,0
mov b,0
mov c,0
mov d,0
mov e,0
mov dh,7
mov cx,10
loop4:
mov ah,2
add dh,1
mov dl,29
mov bh,0
int 10h
mov dl,'|'
mov ah,2
int 21h
loop loop4
mov dh,7
mov cx,10
loop5:
mov ah,2
add dh,1
mov dl,49
mov bh,0
int 10h
mov dl,'|'
mov ah,2
int 21h
loop loop5 ;竖直画两列'|'作边框
mov ah,2
mov dh,17
mov dl,30
mov bh,0
int 10h
mov cx,19
loop2:
;mov ah,09
;mov dl,'$'
;mov bh,0
;mov bl,0dah
;mov cx,21
;int 10h
;mov dl,'_'
mov ah,2
int 21h
loop loop2 ;在下一轮计算中,以上的段又重新画图,达到滚动目的
locate:
mov ah,2
mov dh,16
mov dl,30
mov bh,0
int 10h ;将光标置位
mov dx,0
get_char:
call decibin ;调用decibin段
cheng:
cbw
mov a,bx
mov f,ax
mov ax,0
mov bx,0
call decibin
mov d,bx
mul1:
mov ax,a
mul d
jmp calls
jia:
cbw ;将符号扩展
mov a,bx ;第一输进来的数存入a
mov b,ax ;将运算符号存入b
mov bx,0
mov ax,0 ;归零
call decibin
mov d,bx ;第二个输进来的数存入d
jmp equal
jian:
cbw
mov a,bx
mov c,ax ;将运算符号存入c
mov ax,0
mov bx,0
call decibin
mov d,bx
equal:
mov bx,a ;释放第一个数
mov ax,d ;释放第二个数
cmp b,'+'
jz add1
cmp c,'-'
jz sub1 ;比较符号进入相应的运算代码段
cmp f,'*'
jz mul1
add1: cmp bx,ax
jz aa
aa: cmp ax,0
jz tt2 ;如果输入都是0则转tt2
jnz tt3
tt2:
mov dl,'0'
mov ah,2
int 21h ;输出0
call scroll ;进入下一轮计算
jmp locate1
tt3:
add bx,ax ;将结果存入bx寄存器
jmp calls
sub1:
cmp bx,ax
jl sub2 ;被减数小于减数
jz sub4 ;被减数等于减数
jg sub3 ;被减数大于减数
jmp ff
ff:
jmp jia
sub2:
xchg bx,ax ;将大的放在前面,交换,将永远保持存的是运算结果
sub bx,ax
mov dl,'-'
mov ah,2
int 21h
call binihex ;进入输出段
call scroll
jmp locate1
jmp sub4
tt:
jmp jian
sub4:
mov dl,'0'
mov ah,2
int 21h
call scroll
jmp locate1
sub3:
sub bx,ax
jmp calls ;进入输出段
tt4:
jmp equal
calls:
call binihex
call scroll
jmp locate1
exit2:
mov ax,4c00h
int 21h
main endp
decibin proc near
newchar:
mov ah,1
int 21h ;输入数字
cmp al,1bh ;如果用户输入ESC则程序结束
jz exit2
cmp al,0dh ;如果用户输入ENTER则换行
jz hh2
jmp hh1
hh2:
call scroll
hh1:
cmp al,'+'
jz ff
cmp al,'-'
jz tt
cmp al,'*'
jz cheng
sub al,30h
jl exit
cmp al,9d
jg exit ;进行合法检验
cmp al,'='
jz tt4
cbw
xchg ax,bx ;交换变量
mov cx,10d
mul cx ;将进来的数化作十进制储存
xchg ax,bx
add bx,ax
jmp newchar
exit:
ret
decibin endp
binihex proc near
mov cx,10000d
call dec_div
mov cx,1000d
call dec_div
mov cx,100d
call dec_div
mov cx,10d
call dec_div
mov cx,1d
call dec_div
ret
dec_div proc near
start2:
mov ax,bx
mov dx,0 ;除法时dx为扩展寄存器
div cx ;此时bx和dx存有结果
cmp ax,0
jg ii1
cmp e,0
jg ii1
cmp ax,0
jz ii
mov bx,dx
mov dl,al
add dl,30h
mov ah,2
int 21h
ii:
ret ;若数的非末位为0则不输出,符合习惯
ii1:
cmp ax,0
jz rr
mov e,ax ;将最高位的数存入e
rr:
mov ax,bx
mov dx,0
div cx
mov bx,dx ;bx存入了除后的结果
mov dl,al
add dl,30h
mov ah,2
int 21h ;输出
ret
dec_div endp
binihex endp
crlf proc near
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
int 21h
ret
crlf endp
cmp al,esc_key ;输出格式
hh:
scroll proc near
mov ah,6
mov al,1
mov ch,8
mov cl,30
mov dh,16
mov dl,50
mov bh,7
int 10h
mov ah,2
mov dh,win_lrr
mov dl,win_ulc ;模拟光标的运动
mov bh,0
int 10h
ret
scroll endp ;换行命令,让屏幕滚动
jmp hh1
jmp locate
exit1:
mov ax,4c00h
int 21h
clear_screen proc near ;清屏,确定窗口的大小,为画出窗口做准备
push ax
push bx
push cx
push dx
mov ah,6
mov al,0
mov bh,7
mov ch,0
mov cl,0
mov dh,24
mov dl,79
int 10h
mov dx,0 ;将光标置在首位置
mov ah,2
int 10h
pop dx
pop cx
pop bx
pop ax
ret
clear_screen endp
end main
[color=FF0000]cheng: [/color]
但调不出来,请来帮帮忙
.model
.stack
.code
a dw ?
b dw ?
c dw ?
d dw ?
e dw ?
f dw ?
g dw ?
esc_key equ 1bh
win_ulc equ 30
win_lrr equ 16
main proc far
call clear_screen ;调用clear_screen段
mov dx,0
mov ah,2
mov dh,7
mov dl,29
mov bh,0
int 10h ;置光标位置
mov ah,9
mov al,'$'
mov bh,0
mov bl,0dah
mov cx,21
int 10h ;在光标处,画了21个'$'作窗口的头装饰
mov ah,2
mov dh,7
mov dl,30
mov bh,0
int 10h ;再一次将光标置位
mov cx,20
loop1:
;mov dl,'_'
;mov ah,2
;int 21h
;loop loop1 ;画20个'-'作为窗口头边框
locate1:
mov dx,0
mov ax,0
mov bx,0
mov cx,0
mov a,0
mov b,0
mov c,0
mov d,0
mov e,0
mov dh,7
mov cx,10
loop4:
mov ah,2
add dh,1
mov dl,29
mov bh,0
int 10h
mov dl,'|'
mov ah,2
int 21h
loop loop4
mov dh,7
mov cx,10
loop5:
mov ah,2
add dh,1
mov dl,49
mov bh,0
int 10h
mov dl,'|'
mov ah,2
int 21h
loop loop5 ;竖直画两列'|'作边框
mov ah,2
mov dh,17
mov dl,30
mov bh,0
int 10h
mov cx,19
loop2:
;mov ah,09
;mov dl,'$'
;mov bh,0
;mov bl,0dah
;mov cx,21
;int 10h
;mov dl,'_'
mov ah,2
int 21h
loop loop2 ;在下一轮计算中,以上的段又重新画图,达到滚动目的
locate:
mov ah,2
mov dh,16
mov dl,30
mov bh,0
int 10h ;将光标置位
mov dx,0
get_char:
call decibin ;调用decibin段
cheng:
cbw
mov a,bx
mov f,ax
mov ax,0
mov bx,0
call decibin
mov d,bx
mul1:
mov ax,a
mul d
jmp calls
jia:
cbw ;将符号扩展
mov a,bx ;第一输进来的数存入a
mov b,ax ;将运算符号存入b
mov bx,0
mov ax,0 ;归零
call decibin
mov d,bx ;第二个输进来的数存入d
jmp equal
jian:
cbw
mov a,bx
mov c,ax ;将运算符号存入c
mov ax,0
mov bx,0
call decibin
mov d,bx
equal:
mov bx,a ;释放第一个数
mov ax,d ;释放第二个数
cmp b,'+'
jz add1
cmp c,'-'
jz sub1 ;比较符号进入相应的运算代码段
cmp f,'*'
jz mul1
add1: cmp bx,ax
jz aa
aa: cmp ax,0
jz tt2 ;如果输入都是0则转tt2
jnz tt3
tt2:
mov dl,'0'
mov ah,2
int 21h ;输出0
call scroll ;进入下一轮计算
jmp locate1
tt3:
add bx,ax ;将结果存入bx寄存器
jmp calls
sub1:
cmp bx,ax
jl sub2 ;被减数小于减数
jz sub4 ;被减数等于减数
jg sub3 ;被减数大于减数
jmp ff
ff:
jmp jia
sub2:
xchg bx,ax ;将大的放在前面,交换,将永远保持存的是运算结果
sub bx,ax
mov dl,'-'
mov ah,2
int 21h
call binihex ;进入输出段
call scroll
jmp locate1
jmp sub4
tt:
jmp jian
sub4:
mov dl,'0'
mov ah,2
int 21h
call scroll
jmp locate1
sub3:
sub bx,ax
jmp calls ;进入输出段
tt4:
jmp equal
calls:
call binihex
call scroll
jmp locate1
exit2:
mov ax,4c00h
int 21h
main endp
decibin proc near
newchar:
mov ah,1
int 21h ;输入数字
cmp al,1bh ;如果用户输入ESC则程序结束
jz exit2
cmp al,0dh ;如果用户输入ENTER则换行
jz hh2
jmp hh1
hh2:
call scroll
hh1:
cmp al,'+'
jz ff
cmp al,'-'
jz tt
cmp al,'*'
jz cheng
sub al,30h
jl exit
cmp al,9d
jg exit ;进行合法检验
cmp al,'='
jz tt4
cbw
xchg ax,bx ;交换变量
mov cx,10d
mul cx ;将进来的数化作十进制储存
xchg ax,bx
add bx,ax
jmp newchar
exit:
ret
decibin endp
binihex proc near
mov cx,10000d
call dec_div
mov cx,1000d
call dec_div
mov cx,100d
call dec_div
mov cx,10d
call dec_div
mov cx,1d
call dec_div
ret
dec_div proc near
start2:
mov ax,bx
mov dx,0 ;除法时dx为扩展寄存器
div cx ;此时bx和dx存有结果
cmp ax,0
jg ii1
cmp e,0
jg ii1
cmp ax,0
jz ii
mov bx,dx
mov dl,al
add dl,30h
mov ah,2
int 21h
ii:
ret ;若数的非末位为0则不输出,符合习惯
ii1:
cmp ax,0
jz rr
mov e,ax ;将最高位的数存入e
rr:
mov ax,bx
mov dx,0
div cx
mov bx,dx ;bx存入了除后的结果
mov dl,al
add dl,30h
mov ah,2
int 21h ;输出
ret
dec_div endp
binihex endp
crlf proc near
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
int 21h
ret
crlf endp
cmp al,esc_key ;输出格式
hh:
scroll proc near
mov ah,6
mov al,1
mov ch,8
mov cl,30
mov dh,16
mov dl,50
mov bh,7
int 10h
mov ah,2
mov dh,win_lrr
mov dl,win_ulc ;模拟光标的运动
mov bh,0
int 10h
ret
scroll endp ;换行命令,让屏幕滚动
jmp hh1
jmp locate
exit1:
mov ax,4c00h
int 21h
clear_screen proc near ;清屏,确定窗口的大小,为画出窗口做准备
push ax
push bx
push cx
push dx
mov ah,6
mov al,0
mov bh,7
mov ch,0
mov cl,0
mov dh,24
mov dl,79
int 10h
mov dx,0 ;将光标置在首位置
mov ah,2
int 10h
pop dx
pop cx
pop bx
pop ax
ret
clear_screen endp
end main
[color=FF0000]cheng: [/color]