代码之家  ›  专栏  ›  技术社区  ›  FlatAssembler

在x86程序集中计算exp(x)

  •  0
  • FlatAssembler  · 技术社区  · 6 年前

    我正在尝试为我自己的简单编程语言制作一个编译器。它应该输出Intel语法x86程序集。然而,我正在努力让它为十进制数字生成正确的代码。具体来说,我试图实现“exp”函数来计算“pow(e,x)”,其中“e”是自然对数的基。以下是一个示例:

    /*Preiously declared the variables 'result' and 'x' as global 32-bit floating-point numbers*/
    result=exp(x)
    

    以下是编译器为该示例输出的代码:

    finit
    fld dword [x]
    fldl2e
    fmulp st1,st0
    fst dword [result]
    fld1
    fscale
    fld1
    fld dword [result]
    fprem
    fxch
    f2xm1
    fld1
    faddp st1,st0
    fmulp st1,st0
    fstp dword [result]
    

    据我对x86汇编的了解,代码似乎是正确的。然而,似乎在该代码之后,“结果”是零,无论“x”是什么。你能在代码中找到错误吗?谢谢

    1 回复  |  直到 6 年前
        1
  •  2
  •   C_Elegans    6 年前

    尝试:

    finit
    fld dword [_x]
    fldl2e
    fmulp st1,st0       ;st0 = x*log2(e) = tmp1
    fld1
    fscale              ;st0 = 2^int(tmp1), st1=tmp1
    fxch
    fld1
    fxch                ;st0 = tmp1, st1=1, st2=2^int(tmp1)
    
    fprem               ;st0 = fract(tmp1) = tmp2
    f2xm1               ;st0 = 2^(tmp2) - 1 = tmp3
    faddp st1,st0       ;st0 = tmp3+1, st1 = 2^int(tmp1)
    fmulp st1,st0       ;st0 = 2^int(tmp1) + 2^fract(tmp1) = 2^(x*log2(e))
    fstp dword [_result]        
    ret
    

    我很抱歉没有解释我改变了什么,但这对我来说真的很难理解。