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

时间:2018-02-09 20:35:26

标签: assembly compiler-construction x86 x87

我正在尝试为自己的简单编程语言编写一个编译器。它应该输出Intel-syntax 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 个答案:

答案 0 :(得分:2)

尝试:

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

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