Advertisement
Guest User

Untitled

a guest
May 16th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.92 KB | None | 0 0
  1. .bss
  2. # zmienne
  3. .comm prec, 8
  4. .comm begin, 4
  5. .comm end, 4
  6. .comm suma, 4
  7. .comm _dx, 4
  8.  
  9. .comm x, 4
  10.  
  11. .comm xp, 4
  12. .comm i, 4
  13. .comm dx, 4
  14.  
  15. .comm result, 4
  16.  
  17. .data
  18.  
  19. two: .long 2
  20. cztery: .long 4
  21.  
  22. .moj:
  23. .string "wynik calkowania %f \n"
  24.  
  25. .text
  26. .global calka
  27.  
  28. .type calka, @function
  29.  
  30. calka:
  31. pushq %rbp
  32. movq %rsp, %rbp
  33.  
  34. #################################################
  35. # Do funkcji sa przekazywane 3 parametry #
  36. # Pierwszy arg to dokladnosc w %rsi #
  37. # Drugi to poczatek przedzialu calkowania %xmm0 #
  38. # Trzeci to koniec przedzialu calkowania %xmm1 #
  39. #################################################
  40.  
  41. #################################################
  42. # Pierwszym krokiem algorytmu jest wyznaczenie #
  43. # szerokosci prostokata dx: #
  44. # dx = (xk - xp)/n #
  45. #################################################
  46.  
  47.  
  48. movq %rdi, prec #pobranie precyzji
  49. movss %xmm0, begin #pobranie dolnej granicy
  50. movss %xmm1, end #pobranie gornej granicy
  51.  
  52. flds end #xk
  53. fsub begin #(xk - xp)
  54. fidiv prec #((xk - xp)/n
  55.  
  56. fstps _dx #pobranie wyliczonego przedzialu
  57.  
  58. movss x1, %xmm0
  59. movss %xmm0, begin
  60.  
  61. fldz #zero do st(0) tutaj przechowuje sume wszystkich wysokosci
  62.  
  63. PETLA:
  64. movss begin, %xmm0 #pierwszy argument dla make_x
  65. #drugi argument jest w %rdi
  66. movss _dx, %xmm1 #trzeci argument
  67.  
  68.  
  69. movq %rdi, prec
  70. movss %xmm0, xp
  71. movss %xmm1, dx
  72.  
  73. fild prec # i// Convert the integer operand (signed)
  74. # into extended-real and load it onto the floating-point stack.
  75. fmul dx # i*dx
  76. fadd xp # xp + i*dx
  77.  
  78. fstps result
  79. movss result, %xmm0 #pobranie wyniku
  80.  
  81. #w %xmm0 jest jest obliczony x dla ktorego policzymy teraz f(x)
  82.  
  83. movss %xmm0, x # pobranie wartosci do zmiennej x
  84. flds x
  85. fmul x
  86.  
  87. fisub two #odejmuje 2.0
  88. fstp result #pobranie wyniku
  89.  
  90. fadd result # w result trzymam wynik f(x) (wysokosc prostokata)
  91. #dodanie to do pozostalych wczesniej obliczonych
  92. #(na szczyt stosu wysokosci prostokata)
  93.  
  94.  
  95. dec %rdi #dekrementuje licznik
  96. cmp $0, %rdi #jesli 0 to konczymy prace
  97. je END
  98. jmp PETLA
  99.  
  100. END: # wynik = _dx(czyli szerekosc)*(f(x1)+f(x2)+f(x3)...f(xn)) (w st(0) jest wysokosc)
  101.  
  102. fmul _dx
  103. fstps result #wynik calkowania
  104.  
  105. #WYWOLANIE PRINTFA
  106.  
  107. movss result, %xmm0
  108. cvtss2sd %xmm0, %xmm0
  109. mov $.moj, %edi
  110. mov $1,%eax
  111. call printf
  112.  
  113. #####################
  114. #przekazuje wynik calkowania do xmm0 aby zwrocic wynik do C
  115. #movss result, %xmm0
  116.  
  117. movq %rbp, %rsp
  118. popq %rbp
  119. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement