assembly 如何在masm组装中计算log和ln?[已关闭]

9vw9lbht  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(113)

已关闭。此问题需要超过focused。当前不接受答案。
**想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

四年前关闭了。
Improve this question
我知道在java中通过Math.log来计算日志很容易,但是在汇编中没有这样的就绪函数,这是如何工作的呢?

nqwrtyyt

nqwrtyyt1#

要方便地计算对数,请使用x87 FPU的FYL2X指令。此指令计算st1 * log2(st0),然后弹出寄存器堆栈。由于这是一个双对数,因此需要首先压入合适的转换因子。幸运的是,FPU的ROM中内置了合适的转换因子,可通过特殊指令访问:

num     real8 1.234          ; the datum you want to convert
out     real8 ?              ; the memory location where you want to place the result

...

; dual logarithm (base 2)
        fld1                 ; st: 1
        fld num              ; st: 1 num
        fyl2x                ; st: log2(num)
        fstp out             ; store to out and pop

; decadic logarithm (base 10)
        fldlg2               ; st: log10(2)
        fld num              ; st: log10(2) num
        fyl2x                ; st: log10(num)
        fstp out             ; store to out and pop

; natural logarithm (base e)
        fldln2               ; st: ln(2)
        fld num              ; st: ln(2) num
        fyl2x                ; st: ln(num)
        fstp out             ; store to out and pop

注意SSE或AVX没有类似的指令;如果不想使用x87 FPU,则必须通过数值近似手动计算对数。不过,这通常比直接使用fyl2x要快。
可以在使用SSE进行浮点数学运算的程序中使用此代码;只需将数据移到x87 FPU来计算对数。由于无法直接从SSE寄存器移到x87 FPU,因此必须遍历堆栈:

sub rsp, 8           ; allocate stack space

; SSE -> x87
        movsd real8 ptr [rsp], xmm0
        fld real8 ptr [rsp]

; x87 -> SSE with pop
        fstp real8 ptr [rsp] ; store and pop
        movsd xmm0, real8 ptr [rsp]

; x87 -> SSE without pop
        fst real8 ptr [rsp] ; just store
        movsd xmm0, real8 ptr [rsp]

相关问题