Program ma obliczać log_2(x), gdzie x jest podany przez użytkownika.
Mam kod taki jak poniżej, jak go przerobić żeby nie było tych 0x17, 0x7e itd.
Asm kompilowane w nasm c w gcc
Kod asm:
[section .text]
global log2
log2:
push ebp
mov ebp, esp
mov eax, [ebp+8] ; pierwszy argument
and eax, 0x7F800000 ; eax = wykladnik
sar eax, 0x17
sub eax, 0x7F ; eax = czesc calkowita log2(x)
push eax ; zachowuje na stosie
mov eax, [ebp+8]
and eax, 0x007FFFFF ; eax = mantysa
sar eax, 0x14
mov ebx, 0x04
mul ebx
add eax, mantysa
finit
fld dword [eax] ; wrzucam na stos x87 mantyse
fild dword [ebp-4] ; wrzucam czesc calkowita
add esp, 0x04 ; wyrownuje stos x86 :>
faddp st1 ; st0 = mantysa + czesc calkowita
mov eax, [ebp+12]
fstp dword [eax] ; zapisuje wynik
mov esp, ebp
pop ebp
ret
[section .data]
mantysa:
dd 0
dd 0.169925
dd 0.321928
dd 0.459432
dd 0.584963
dd 0.700440
dd 0.807355
dd 0.906891
Kod w c:
#include <stdio.h>
extern void log2(float, float *);
int main(void)
{
float a, b;
printf("Podaj liczbe: ");
scanf("%f", &a);
log2(a, &b);
printf("Logarytm binarny z %f to %f\n", a, b);
return 0;
}