Как сделать: Pow (реальный, реальный) в x86 - PullRequest
29 голосов
/ 09 января 2011

Я ищу реализацию pow(real, real) в сборке x86.Также я хотел бы понять, как работает алгоритм.

Ответы [ 2 ]

62 голосов
/ 09 января 2011

Просто вычислите его как 2^(y*log2(x)).

Существует инструкция x86 FYL2X для вычисления y * log2 (x) и инструкция x86 F2XM1 для возведения в степень.F2XM1 требует аргумент в диапазоне [-1,1], поэтому вам нужно добавить некоторый код между ними, чтобы извлечь целую часть и остаток, возвести в степень остаток, использовать FSCALE, чтобы масштабировать результат с соответствующей степенью 2.

16 голосов
/ 09 января 2011

ОК, я внедрил 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
...