如何:x86中的pow(真实,真实)

Mac*_*rko 31 x86 assembly pow

我正在寻找pow(real, real)x86汇编中的实现.另外,我想了解算法的工作原理.

Eug*_*ith 64

只需将其计算为2^(y*log2(x)).

有一个x86指令FYL2X来计算y*​​log2(x)和一个x86指令F2XM1来进行求幂.F2XM1需要[-1,1]范围内的参数,因此您必须在两者之间添加一些代码以提取整数部分和余数,对余数进行取幂,使用FSCALE以适当的2的幂来缩放结果.

  • 我知道这是一个老线程,但这是一个实现:[madwizard.org](http://www.madwizard.org/programming/snippets?id=36) (5认同)
  • 只是为了在这里有代码: `fld power` `fld x` `fyl2x` `fld1` `fld st(1)` `fprem` `f2xm1` `fadd` `fscale` `fxch st(1)` `fstp st` `;st0 = X^power` (2认同)

Mac*_*rko 16

好的,我power(double a, double b, double * result);按照你的建议在x86中实现了.

代码:http://pastebin.com/VWfE9CZT

%define a               QWORD [ebp+8]
%define b               QWORD [ebp+16]
%define result          DWORD [ebp+24]
%define ctrlWord            WORD [ebp-2]
%define tmp             DWORD [ebp-6]

segment .text
    global power

power:
    push ebp
    mov ebp, esp
    sub esp, 6
    push ebx

    fstcw ctrlWord
    or ctrlWord, 110000000000b
    fldcw ctrlWord

    fld b
    fld a
    fyl2x

    fist tmp

    fild tmp
    fsub
    f2xm1
    fld1
    fadd
    fild tmp
    fxch
    fscale

    mov ebx, result
    fst QWORD [ebx]

    pop ebx
    mov esp, ebp
    pop ebp
    ret
Run Code Online (Sandbox Code Playgroud)

  • 我可以建议您继续并在答案中包含该代码吗? (4认同)
  • 你应该'sub esp,8`来保持它对齐以推动ebx.你也可以交换tmp和ControlWord,例如'%define tmp DWORD [ebp-4]`,所以它是对齐的. (2认同)