Как: pow (реальный, реальный) в x86
Я ищу реализацию pow(real, real)
в сборке x86. Также я хотел бы понять, как работает алгоритм.
2 ответов
просто вычислите его как 2^(y*log2(x))
.
существует инструкция x86 FYL2X для вычисления y * log2 (x) и инструкция x86 F2XM1 для возведения в степень. F2XM1 требует аргумента в диапазоне [-1,1], поэтому вам придется добавить некоторый код между ними, чтобы извлечь целочисленную часть и остаток, экспоненциально остаток, использовать FSCALE для масштабирования результата соответствующей степенью 2.
ОК, я реализовал 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