主题:对用户输入的一个包含两个十进制的操作数的加减乘除表达式求出其结果并输出,对用户的输入需要进行有效性判
我的代码如下
只是只有当两操作数均为正数时调试结果是对的
不知道为什么 请高手指教
小弟先谢谢了
common macro p1
div m5
add dx,3030h
mov [p1+5],dl
mov dx,0
div m5
add dx,3030h
mov [p1+4],dl
div m1
add ah,30h
mov [p1+3],ah
mov ah,0
div m1
add ax,3030h
mov [p1+2],ah
mov [p1+1],al
endm
common1 macro p1,p2
mov ax,yushu
xor dx,dx
mul m5
div b
mov yushu,dx
add ax,3030h
mov [p1+p2],al
endm
;********************两正数相加********************
addd macro p1
mov ax,a
mov bx,b
mov dx,0
clc
add ax,bx
adc dx,0
common p1
endm
;********************两正数相减********************
subb macro p1
local j1
local j2
local j3
mov ax,a
mov bx,b
mov dx,0
clc
cmp ax,bx
jl j1
jnl j2
j1:
sub ax,bx
neg ax
mov [p1],2dh
jmp j3
j2:
sub ax,bx
j3:
common p1
endm
;********************两正数相乘********************
mull macro p1
mov ax,a
mov dx,0
mul b
div m4
mov yushu,dx
xor dx,dx
common c3
mov ax,yushu
mov dx,0
div m5
add dx,3030h
mov [p1+9],dl
mov dx,0
div m1
add ah,30h
mov [p1+8],ah
mov ah,0
div m1
add ax,3030h
mov [p1+7],ah
mov [p1+6],al
endm
;********************两正数相除********************
divv macro p1
mov ax,a
xor dx,dx
div b
mov yushu,dx
mov dx,0
common c4
mov [p1+6],2eh
common1 p1,7
common1 p1,8
common1 p1,9
common1 p1,10
common1 p1,11
endm
;**************************************************
datarea segment
string db 'Enter two operands(<10000 and qufen by","end by Enter):',13,10,'$'
hh db 13,10,'$'
operands db 100 dup(?)
a dw ?
b dw ?
c1 db 6 dup(?),13,10,'$'
c2 db 6 dup(?),13,10,'$'
c3 db 10 dup(?),13,10,'$'
c4 db 12 dup(?),'(baoliu 5 wei xiaoshu)',13,10,'$'
var1 dw ?
var2 dw ?
m1 db 10
m2 db 100
m3 dw 1000
m4 dw 10000
m5 dw 10
yushu dw ?
datarea ends
prognam segment
main proc far
assume cs:prognam,ds:datarea
start:
push ds
push es
mov ax,0
push ax
mov ax,datarea
mov ds,ax
mov es,ax
mov bx,0
mov cx,0
;*********************************************
lea dx,string
mov ah,09h
int 21h
printit:
mov ah,01h
int 21h
mov operands[bx],al
inc bx
cmp al,0dh
jz next
jnz printit
;*********************************************
next:
lea di,operands
mov bx,0
mov ax,0
mov dx,0
m11:
mov al,2ch
scasb
jz m22
inc cx
jmp m11
m22:
mov al,0dh
scasb
jz move
inc bx
jmp m22
;*********************************************
move:
mov var1,cx
mov var2,bx
mov bx,var1
dec bx
lea di,operands
cmp [di],2dh
jnz numa
dec cx
numa:
mov ax,0
mov dx,0
mov al,[di+bx]
sub al,30h
add dx,ax
dec bx
dec cx
cmp cx,0
jz numb
mov ax,0
mov al,[di+bx]
sub al,30h
mul m1
add dx,ax
dec bx
dec cx
cmp cx,0
jz numb
mov ax,0
mov al,[di+bx]
sub al,30h
mul m2
add dx,ax
dec bx
dec cx
cmp cx,0
jz numb
mov ax,0
mov a,dx
xor dx,dx
mov al,[di+bx]
sub al,30h
mul m3
mov dx,a
add dx,ax
dec bx
dec cx
cmp cx,0
jz numb
mov ax,0
mov a,dx
xor dx,dx
mov al,[di+bx]
sub al,30h
mul m4
mov dx,a
add dx,ax
dec bx
dec cx
cmp cx,0
jz numb
numb:
mov a,dx
mov dx,0
mov bx,var1
mov cx,var2
lea di,operands
inc bx
add di,bx
mov bx,var2
dec bx
cmp [di],2dh
jnz bb
dec cx
bb:
mov ax,0
mov al,[di+bx]
sub al,30h
add dx,ax
dec bx
dec cx
cmp cx,0
jz operation
mov ax,0
mov al,[di+bx]
sub al,30h
mul m1
add dx,ax
dec bx
dec cx
cmp cx,0
jz operation
mov ax,0
mov al,[di+bx]
sub al,30h
mul m2
add dx,ax
dec bx
dec cx
cmp cx,0
jz operation
mov ax,0
mov b,dx
xor dx,dx
mov al,[di+bx]
sub al,30h
mul m3
mov dx,b
add dx,ax
dec bx
dec cx
cmp cx,0
jz operation
mov ax,0
mov b,dx
xor dx,dx
mov al,[di+bx]
sub al,30h
mul m4
mov dx,b
add dx,ax
dec bx
dec cx
cmp cx,0
jz operation
operation:
mov b,dx
mov cx,var1
inc cx
lea di,operands
cmp [di],2dh
jz op3
add di,cx
cmp [di],2dh
jz op2
jnz op1
;********************操作数a正b正********************
op1:
addd c1
subb c2
mull c3
divv c4
jmp out1
;********************操作数a正b负********************
op2:
subb c1
addd c2
mov [c3],2dh
mull c3
mov [c4],2dh
divv c4
jmp out1
;********************操作数a负b正********************
op3:lea di,operands
mov cx,var1
inc cx
add di,cx
cmp [di],2dh
jz op4
subb c1
cmp [c1],2dh
jz x1
jnz x2
x1:
mov [c1],0
jmp xx
x2:
mov [c1],2dh
xx:
addd c2
mov [c2],2dh
mull c3
mov [c3],2dh
divv c4
mov [c4],2dh
jmp out1
;********************操作数a负b负********************
op4:
addd c1
mov [c1],2dh
subb c2
cmp [c2],2dh
jz y1
jnz y2
y1:
mov [c2],0
jmp yy
y2:
mov [c2],2dh
yy:
mull c3
divv c4
;****************************************************
out1:
lea dx,hh
mov ah,09h
int 21h
lea dx,c1
mov ah,09h
int 21h
lea dx,c2
mov ah,09h
int 21h
lea dx,c3
mov ah,09h
int 21h
lea dx,c4
mov ah,09h
int 21h
exit:
mov ah,4ch
int 21h
main endp
prognam ends
end start
只是只有当两操作数均为正数时调试结果是对的
不知道为什么 请高手指教
小弟先谢谢了
common macro p1
div m5
add dx,3030h
mov [p1+5],dl
mov dx,0
div m5
add dx,3030h
mov [p1+4],dl
div m1
add ah,30h
mov [p1+3],ah
mov ah,0
div m1
add ax,3030h
mov [p1+2],ah
mov [p1+1],al
endm
common1 macro p1,p2
mov ax,yushu
xor dx,dx
mul m5
div b
mov yushu,dx
add ax,3030h
mov [p1+p2],al
endm
;********************两正数相加********************
addd macro p1
mov ax,a
mov bx,b
mov dx,0
clc
add ax,bx
adc dx,0
common p1
endm
;********************两正数相减********************
subb macro p1
local j1
local j2
local j3
mov ax,a
mov bx,b
mov dx,0
clc
cmp ax,bx
jl j1
jnl j2
j1:
sub ax,bx
neg ax
mov [p1],2dh
jmp j3
j2:
sub ax,bx
j3:
common p1
endm
;********************两正数相乘********************
mull macro p1
mov ax,a
mov dx,0
mul b
div m4
mov yushu,dx
xor dx,dx
common c3
mov ax,yushu
mov dx,0
div m5
add dx,3030h
mov [p1+9],dl
mov dx,0
div m1
add ah,30h
mov [p1+8],ah
mov ah,0
div m1
add ax,3030h
mov [p1+7],ah
mov [p1+6],al
endm
;********************两正数相除********************
divv macro p1
mov ax,a
xor dx,dx
div b
mov yushu,dx
mov dx,0
common c4
mov [p1+6],2eh
common1 p1,7
common1 p1,8
common1 p1,9
common1 p1,10
common1 p1,11
endm
;**************************************************
datarea segment
string db 'Enter two operands(<10000 and qufen by","end by Enter):',13,10,'$'
hh db 13,10,'$'
operands db 100 dup(?)
a dw ?
b dw ?
c1 db 6 dup(?),13,10,'$'
c2 db 6 dup(?),13,10,'$'
c3 db 10 dup(?),13,10,'$'
c4 db 12 dup(?),'(baoliu 5 wei xiaoshu)',13,10,'$'
var1 dw ?
var2 dw ?
m1 db 10
m2 db 100
m3 dw 1000
m4 dw 10000
m5 dw 10
yushu dw ?
datarea ends
prognam segment
main proc far
assume cs:prognam,ds:datarea
start:
push ds
push es
mov ax,0
push ax
mov ax,datarea
mov ds,ax
mov es,ax
mov bx,0
mov cx,0
;*********************************************
lea dx,string
mov ah,09h
int 21h
printit:
mov ah,01h
int 21h
mov operands[bx],al
inc bx
cmp al,0dh
jz next
jnz printit
;*********************************************
next:
lea di,operands
mov bx,0
mov ax,0
mov dx,0
m11:
mov al,2ch
scasb
jz m22
inc cx
jmp m11
m22:
mov al,0dh
scasb
jz move
inc bx
jmp m22
;*********************************************
move:
mov var1,cx
mov var2,bx
mov bx,var1
dec bx
lea di,operands
cmp [di],2dh
jnz numa
dec cx
numa:
mov ax,0
mov dx,0
mov al,[di+bx]
sub al,30h
add dx,ax
dec bx
dec cx
cmp cx,0
jz numb
mov ax,0
mov al,[di+bx]
sub al,30h
mul m1
add dx,ax
dec bx
dec cx
cmp cx,0
jz numb
mov ax,0
mov al,[di+bx]
sub al,30h
mul m2
add dx,ax
dec bx
dec cx
cmp cx,0
jz numb
mov ax,0
mov a,dx
xor dx,dx
mov al,[di+bx]
sub al,30h
mul m3
mov dx,a
add dx,ax
dec bx
dec cx
cmp cx,0
jz numb
mov ax,0
mov a,dx
xor dx,dx
mov al,[di+bx]
sub al,30h
mul m4
mov dx,a
add dx,ax
dec bx
dec cx
cmp cx,0
jz numb
numb:
mov a,dx
mov dx,0
mov bx,var1
mov cx,var2
lea di,operands
inc bx
add di,bx
mov bx,var2
dec bx
cmp [di],2dh
jnz bb
dec cx
bb:
mov ax,0
mov al,[di+bx]
sub al,30h
add dx,ax
dec bx
dec cx
cmp cx,0
jz operation
mov ax,0
mov al,[di+bx]
sub al,30h
mul m1
add dx,ax
dec bx
dec cx
cmp cx,0
jz operation
mov ax,0
mov al,[di+bx]
sub al,30h
mul m2
add dx,ax
dec bx
dec cx
cmp cx,0
jz operation
mov ax,0
mov b,dx
xor dx,dx
mov al,[di+bx]
sub al,30h
mul m3
mov dx,b
add dx,ax
dec bx
dec cx
cmp cx,0
jz operation
mov ax,0
mov b,dx
xor dx,dx
mov al,[di+bx]
sub al,30h
mul m4
mov dx,b
add dx,ax
dec bx
dec cx
cmp cx,0
jz operation
operation:
mov b,dx
mov cx,var1
inc cx
lea di,operands
cmp [di],2dh
jz op3
add di,cx
cmp [di],2dh
jz op2
jnz op1
;********************操作数a正b正********************
op1:
addd c1
subb c2
mull c3
divv c4
jmp out1
;********************操作数a正b负********************
op2:
subb c1
addd c2
mov [c3],2dh
mull c3
mov [c4],2dh
divv c4
jmp out1
;********************操作数a负b正********************
op3:lea di,operands
mov cx,var1
inc cx
add di,cx
cmp [di],2dh
jz op4
subb c1
cmp [c1],2dh
jz x1
jnz x2
x1:
mov [c1],0
jmp xx
x2:
mov [c1],2dh
xx:
addd c2
mov [c2],2dh
mull c3
mov [c3],2dh
divv c4
mov [c4],2dh
jmp out1
;********************操作数a负b负********************
op4:
addd c1
mov [c1],2dh
subb c2
cmp [c2],2dh
jz y1
jnz y2
y1:
mov [c2],0
jmp yy
y2:
mov [c2],2dh
yy:
mull c3
divv c4
;****************************************************
out1:
lea dx,hh
mov ah,09h
int 21h
lea dx,c1
mov ah,09h
int 21h
lea dx,c2
mov ah,09h
int 21h
lea dx,c3
mov ah,09h
int 21h
lea dx,c4
mov ah,09h
int 21h
exit:
mov ah,4ch
int 21h
main endp
prognam ends
end start