在 x86 汇编中计算 exp(x)
Calculating exp(x) in x86 assembly
我正在尝试为我自己的简单编程语言制作一个编译器。它应该输出英特尔语法 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' 是什么,在该代码之后 "result" 似乎都是零。你能找到代码中的错误吗?谢谢!
尝试:
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
我很抱歉没有解释我所做的更改,但这对我来说真的很难弄清楚。
我正在尝试为我自己的简单编程语言制作一个编译器。它应该输出英特尔语法 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' 是什么,在该代码之后 "result" 似乎都是零。你能找到代码中的错误吗?谢谢!
尝试:
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
我很抱歉没有解释我所做的更改,但这对我来说真的很难弄清楚。