请各位帮看看,怎么改 25,35,45行的错误,都是instruction operands must be the same size。
先谢谢了。==..==
.model small
.386
.387
.stack
.data
msg1 db'please input a=' , '$'
msg2 db'please input b=', '$'
msg3 db'please input c=', '$'
msg4 db'tag=1, this formulia has root', '$'
msg5 db'tag=0, this formulia has not root', '$'
ftwo dd 2.0
ffour dd 4.0
_fa dd 3.0 ;二次方程的系数a
_fb dd 8.0 ;二次方程的系数b
_fc dd 5.0 ;二次方程的系数c
fr1 dd ? ;二次方程的第一个根
fr2 dd ? ;二次方程的第二个根
.code
.startup
mov dx,offset msg1 ;20
mov ah,9
int 21h
xor ax,ax
call read ;调用输入10进制数的子程式
mov _fa,ax ;25
mov dl,al
mov ah,2
int 21h
call dpcrlf
mov dx,offset msg2
mov ah,9
int 21h
xor ax,ax
call read ;调用输入10进制数的子程式
mov _fb, ax ;35
mov dl,al
mov ah,2
int 21h
call dpcrlf
mov dx,offset msg3
mov ah,9
int 21h
xor ax,ax
call read
mov _fc,ax ;45
mov dl,al
mov ah,2
int 21h
call dpcrlf
stsrt1: finit
fld ftwo
fmul _fa ;计算2a
fld ffour
fmul _fa
fmul _fc ;计算4ac
fld _fb
fmul_fb ;计算b*b
fsubr ;计算b*b-4ac
start2: ftst
fstsw ax
sahf
jz froot1 ;b*b-4ac=0,转移到froo1
fsqrt
fstsw ax
test ax,1
jz froot1 ;b*b-4ac>0,转移到froo1
fcompp
mov ah,9 ;显示无实根
mov dx,offset msg5
int 21h
jmp start3
froot1: fld _fb ;求第一个根
fchs ;计算-b
fsub st(0),st(1)
fdiv st(0),st(2)
fstp fr1
froot2: fld _fb
fchs
fadd
fdivr
fstp fr2
start3: .exit 0
read proc ; 输入有符号10进制数的子程式
push bx ;出口参数:AX=补码表示的二进制数值
push cx ;说明:负数用"-"引导,数据范围是+32767~-32768
push dx
xor bx,bx ;BX保存结果
xor cx,cx ;CX为正负标志,0为正,-1为负
mov ah,1 ;输入一个字符
int 21h
cmp al,'+' ;是"+",继续输入字符
jz read1
cmp al,'-' ;是"-",设置-1标志
jnz read2
mov cx,-1
read1:mov ah,1 ;继续输入字符
int 21h
read2: cmp al,'0' ;不是以0~9之间的字符,则输入数据结束
jb read3
cmp al,'9'
ja read3
sub al,30h ;是以0~9之间的字符,则转换为二进制数
shl bx,1 ; 利用移位指令,实现数值乘10:BX*10到BX
mov dx,bx
shl bx,1
shl bx,1
add bx,dx
;
mov ah,0
add bx,ax ;已输入数值乘10后,与新输入数值相加
jmp read1 ;继续输入字符
read3:cmp cx,0 ;是负数,进行求补
jz read4
neg bx
read4:mov ax,bx ;设置出口参数
pop dx
pop cx
pop bx
ret ;子程序返回
read endp
dpcrlf proc ;使光标回车换行的子程序
push ax
push dx
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
pop dx
pop ax
ret
dpcrlf endp
end