Advertisement
sarker306

log(2) in NASM x86-64

Dec 27th, 2019
330
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     extern  printf
  2.     section .data
  3. fmt db      "log(2) = %.10lf",10,0
  4.     section .text
  5.     global  main
  6. main:
  7.     ; log2 = 2*(1/3 + 1/3 * 1/3^3 + 1/5 * 1/3^5 +..)
  8.     ; xmm0 = log2/2, xmm1 = 1/3^(2k-1), xmm2 = 1/9, xmm3 = 2k-1, xmm4 = xmm1 / xmm3
  9.     push    rbp
  10.     mov     rbp, rsp
  11.     sub     rsp, 0x10               ; make space for 2 doubles
  12.  
  13.     mov     rax, 0x0
  14.     mov     qword [rbp - 0x8], rax
  15.     movsd   xmm0, qword [rbp - 0x8]
  16.     mov     rax, 0x3fd5555555555555  ; hex form of 1./3
  17.     mov     qword [rbp - 0x8], rax
  18.     movsd   xmm1, qword [rbp - 0x8]
  19.     mov     rax, 0x3fbc71c71c71c71c ; hex for 1./9
  20.     mov     qword [rbp - 0x8], rax
  21.     movsd   xmm2, qword [rbp - 0x8]
  22.     mov     rax, 0x1
  23.  
  24.     mov     ecx, 15
  25.     movsd   xmm4, xmm1
  26. series_sum:
  27.     addsd   xmm0, xmm4
  28.     mulsd   xmm1, xmm2
  29.     movsd   xmm4, xmm1
  30.     add     rax, 2
  31. cvtsi2sd    xmm3, rax
  32.     divsd   xmm4, xmm3
  33.     loop    series_sum
  34.  
  35. mult_by_two:
  36.     addsd   xmm0, xmm0
  37.  
  38. print_log2:
  39.     mov     rdi, fmt ; string print format
  40.     mov     rax, 0x1 ; 1 floating point number, xmm0
  41.     call    printf
  42.  
  43. end_program:
  44.     mov     rsp, rbp
  45.     pop     rbp
  46.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement