x86 assembly pow

Cómo: pow(real, real) en x86



assembly (2)

Estoy buscando la implementación de pow(real, real) en ensamblaje x86. También me gustaría entender cómo funciona el algoritmo.


OK, implementé la power(double a, double b, double * result); en x86 tal como lo recomienda.

Código: 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


Simplemente cómpralo como 2^(y*log2(x)) .

Hay una instrucción x86 FYL2X para calcular y * log2 (x) y una instrucción x86 F2XM1 para hacer exponenciación. F2XM1 requiere un argumento en el rango [-1,1], por lo que deberá agregar algún código intermedio para extraer la parte entera y el resto, exponer el resto, usar FSCALE para escalar el resultado con una potencia adecuada de 2.