Różne programy na zajęcia laboratoryjne z AK2
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

arctg.s 2.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. # Jan Potocki 2019
  2. # Szereg Taylora arctg(x) dla |x| < 1
  3. # y = (-1)^n * (x^(2n + 1)) / (2n + 1)
  4. .globl arctg
  5. .type arctg, @function
  6. arctg:
  7. pushq %rbp # Wejscie do funkcji
  8. movq %rsp, %rbp
  9. subq $8, %rsp # 64-bit double - tymczasowe miejsce w pamieci na x
  10. subq $4, %rsp # 32-bit int - tymczasowe miejsce w pamieci na 2n+1
  11. # Przygotowanie danych
  12. vmovsd %xmm0, -8(%rbp) # Umieszczenie w pamieci argumentu funkcji
  13. movq $0, %r8 # r8 - indeks sumy (n), na razie wyzerowany...
  14. fldz # Umieszczenie 0 na stosie FPU (do sumowania szeregu)
  15. szereg:
  16. # Glowna petla
  17. incq %r8 # ...trzeba zliczac od 1, indeks jest argumentem ciagu
  18. # Obliczenie 2n+1
  19. movq $2, %rax
  20. mulq %r8
  21. incq %rax
  22. movl %eax, -12(%rbp) # Zapisanie wyniku 2n+1 w pamieci
  23. # Potegowanie (iteracyjne)
  24. fldl -8(%rbp) # Umieszczenie na stosie FPU poczatkowej wartosci
  25. movq $1, %r9 # r9 - zliczanie wykladnika (zaczynamy od 1. potegi)
  26. potega:
  27. fmull -8(%rbp) # Mnozenie st(0) przez podstawe potegi (w pamieci)
  28. incq %r9 # Aktualizacja wykladnika
  29. cmpq %r9, %rax # Sprawdzenie czy wykladnik 2n+1 zostal osiagniety
  30. jne potega
  31. # Dzielenie
  32. fidivl -12(%rbp)
  33. # Sprawdzenie parzystosci wykladnika w (-1)^n
  34. movq $0, %rdx # rdx - starsza polowka bitow dzielnej
  35. movq %r8, %rax # rax - mlodsza polowka bitow dzielnej
  36. movq $2, %rcx # rcx - dzielnik
  37. divq %rcx
  38. cmpq $1, %rdx # rdx - reszta z dzielenia
  39. jne suma # Reszta 0 -> wykladnik parzysty, jest OK
  40. fchs # Reszta 1 -> wykladnik nieparzysty, potrzebny minus
  41. suma:
  42. faddp # st(1) - poprzednia iteracja, st(0) - aktualna
  43. cmpq %r8, %rdi # Sprawdzenie czy wyraz szeregu zostal osiagniety
  44. jne szereg
  45. fstl -8(%rbp) # Zapisanie wyniku w pamieci...
  46. movsd -8(%rbp), %xmm0 # i zwrocenie w xmm0 (bezposrednio sie nie da)
  47. addq $12, %rsp # Zwolnienie zmiennych lokalnych
  48. popq %rbp # Wyjscie z funkcji
  49. ret