Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extern printf
- section .data
- fmt db "log(2) = %.10lf",10,0
- section .text
- global main
- main:
- ; log2 = 2*(1/3 + 1/3 * 1/3^3 + 1/5 * 1/3^5 +..)
- ; xmm0 = log2/2, xmm1 = 1/3^(2k-1), xmm2 = 1/9, xmm3 = 2k-1, xmm4 = xmm1 / xmm3
- push rbp
- mov rbp, rsp
- sub rsp, 0x10 ; make space for 2 doubles
- mov rax, 0x0
- mov qword [rbp - 0x8], rax
- movsd xmm0, qword [rbp - 0x8]
- mov rax, 0x3fd5555555555555 ; hex form of 1./3
- mov qword [rbp - 0x8], rax
- movsd xmm1, qword [rbp - 0x8]
- mov rax, 0x3fbc71c71c71c71c ; hex for 1./9
- mov qword [rbp - 0x8], rax
- movsd xmm2, qword [rbp - 0x8]
- mov rax, 0x1
- mov ecx, 15
- movsd xmm4, xmm1
- series_sum:
- addsd xmm0, xmm4
- mulsd xmm1, xmm2
- movsd xmm4, xmm1
- add rax, 2
- cvtsi2sd xmm3, rax
- divsd xmm4, xmm3
- loop series_sum
- mult_by_two:
- addsd xmm0, xmm0
- print_log2:
- mov rdi, fmt ; string print format
- mov rax, 0x1 ; 1 floating point number, xmm0
- call printf
- end_program:
- mov rsp, rbp
- pop rbp
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement