我正在尝试为自己的简单编程语言编写一个编译器。它应该输出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'是。你能在代码中找到错误吗?谢谢!
答案 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
我很抱歉没有解释我改变了什么,但这对我来说真的很难理解。