NASM 协处理器 - 计算平方方程
NASM coprocessor - calculating square equation
下面显示了计算平方方程解的代码(同时我们计算了 delta)。结果我们得到两个值:增量和最终解决方案。
我对当前值的增量元素有一些问题:而不是 3 (49-4x10=9, sqrt(9)=3)
,我得到 9。考虑到我们有 9 而不是 3,作为最终结果,我们收到 1 而不是 2。我想寻求你的帮助。
section .text
global _start
_start:
FINIT
FLD dword [zmA] ; zmA - st0
FLD dword [zmB] ; zmB - st0, zmA - st1
FLD dword [zmB] ; zmC - st0, zmB - st1, zmC - st2
FLDZ ; 0 - st0, zmC - st1, zmB - st2, zmC - st3
FADD st0,st2 ; zmB,zmC,zmB,zmA
FMUL st0,st2 ; ZmB^2, zmC, zmB, zmA
mov eax,4
mov [delta],eax
FILD dword [delta] ; 4, zmB^2, zmC, zmB, zmA
FMUL st0,st4 ; 4zmA,zmB^2,zmC,zmB,zmA
FMUL st0,st2 ; 4zmAzmC,zmB^2,zmC,zmB,zmA
FSUBP st1,st0 ; zmB^2-4zmAzmC,zmC,zmB,zmA
FSQRT ; making element of delta
FIST dword [delta]
xor ebx,ebx
mov ebx,[delta]
add ebx,48
mov [delta],ebx
mov eax,4
mov ebx,1
mov ecx,delta
mov edx,4
int 80h
FLDZ ; 0, sqrt. delta, zmC, zmB, zmA
FSUB st0,st3 ; -zmB, sqrt. delta, zmC, zmB, zmA
FSUB st0,st1 ; -zmB - sqrt. delta, zmC, zmB, zmA
FXCH st4 ; zmA, sqrt. delta, zmC, zmB, -zmB- sqrt. delta
FLD dword [zmA] ; zmA, sqrt. delta, zmC, zmB, -zmB - sqrt. delta
FADDP st1,st0 ; 2zmA, sqrt. delta, zmC, zmB, -zmB - sqrt. delta
FXCH st4 ; -zmB - sqrt. delta, sqrt. delta, zmC, zmB, 2zmA
FISTP dword [result]
xor ebx,ebx
mov ebx,[result]
add ebx,48
mov [result],ebx
mov eax,4
mov ebx,1
mov ecx,result
mov edx,4
int 80h
mov eax,1
int 80h
section .data
zmA dd 1.0
zmB dd -7.0
zmC dd 10.0
delta dd 0
result dd 0
你这里有错字:
FLD dword [zmB] ; zmC - st0, zmB - st1, zmC - st2
那个指令应该是FLD dword [zmC]
顺便说一句,你可以替换这两行:
FLDZ ; 0 - st0, zmC - st1, zmB - st2, zmC - st3
FADD st0,st2 ; zmB,zmC,zmB,zmA
与:
FLD st1
下面显示了计算平方方程解的代码(同时我们计算了 delta)。结果我们得到两个值:增量和最终解决方案。
我对当前值的增量元素有一些问题:而不是 3 (49-4x10=9, sqrt(9)=3)
,我得到 9。考虑到我们有 9 而不是 3,作为最终结果,我们收到 1 而不是 2。我想寻求你的帮助。
section .text
global _start
_start:
FINIT
FLD dword [zmA] ; zmA - st0
FLD dword [zmB] ; zmB - st0, zmA - st1
FLD dword [zmB] ; zmC - st0, zmB - st1, zmC - st2
FLDZ ; 0 - st0, zmC - st1, zmB - st2, zmC - st3
FADD st0,st2 ; zmB,zmC,zmB,zmA
FMUL st0,st2 ; ZmB^2, zmC, zmB, zmA
mov eax,4
mov [delta],eax
FILD dword [delta] ; 4, zmB^2, zmC, zmB, zmA
FMUL st0,st4 ; 4zmA,zmB^2,zmC,zmB,zmA
FMUL st0,st2 ; 4zmAzmC,zmB^2,zmC,zmB,zmA
FSUBP st1,st0 ; zmB^2-4zmAzmC,zmC,zmB,zmA
FSQRT ; making element of delta
FIST dword [delta]
xor ebx,ebx
mov ebx,[delta]
add ebx,48
mov [delta],ebx
mov eax,4
mov ebx,1
mov ecx,delta
mov edx,4
int 80h
FLDZ ; 0, sqrt. delta, zmC, zmB, zmA
FSUB st0,st3 ; -zmB, sqrt. delta, zmC, zmB, zmA
FSUB st0,st1 ; -zmB - sqrt. delta, zmC, zmB, zmA
FXCH st4 ; zmA, sqrt. delta, zmC, zmB, -zmB- sqrt. delta
FLD dword [zmA] ; zmA, sqrt. delta, zmC, zmB, -zmB - sqrt. delta
FADDP st1,st0 ; 2zmA, sqrt. delta, zmC, zmB, -zmB - sqrt. delta
FXCH st4 ; -zmB - sqrt. delta, sqrt. delta, zmC, zmB, 2zmA
FISTP dword [result]
xor ebx,ebx
mov ebx,[result]
add ebx,48
mov [result],ebx
mov eax,4
mov ebx,1
mov ecx,result
mov edx,4
int 80h
mov eax,1
int 80h
section .data
zmA dd 1.0
zmB dd -7.0
zmC dd 10.0
delta dd 0
result dd 0
你这里有错字:
FLD dword [zmB] ; zmC - st0, zmB - st1, zmC - st2
那个指令应该是FLD dword [zmC]
顺便说一句,你可以替换这两行:
FLDZ ; 0 - st0, zmC - st1, zmB - st2, zmC - st3
FADD st0,st2 ; zmB,zmC,zmB,zmA
与:
FLD st1