NASM协处理器 - 计算方程

时间:2015-01-21 18:16:11

标签: assembly x86 nasm equation

下面显示了计算平方方程解的代码(同时我们计算了一个delta)。结果我们得到两个值:delta和final解决方案。 我对当前值的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

1 个答案:

答案 0 :(得分:3)

你这里有一个错字:

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