Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .bss
- # zmienne
- .comm prec, 8
- .comm begin, 4
- .comm end, 4
- .comm suma, 4
- .comm _dx, 4
- .comm x, 4
- .comm xp, 4
- .comm i, 4
- .comm dx, 4
- .comm result, 4
- .data
- two: .long 2
- cztery: .long 4
- .moj:
- .string "wynik calkowania %f \n"
- .text
- .global calka
- .type calka, @function
- calka:
- pushq %rbp
- movq %rsp, %rbp
- #################################################
- # Do funkcji sa przekazywane 3 parametry #
- # Pierwszy arg to dokladnosc w %rsi #
- # Drugi to poczatek przedzialu calkowania %xmm0 #
- # Trzeci to koniec przedzialu calkowania %xmm1 #
- #################################################
- #################################################
- # Pierwszym krokiem algorytmu jest wyznaczenie #
- # szerokosci prostokata dx: #
- # dx = (xk - xp)/n #
- #################################################
- movq %rdi, prec #pobranie precyzji
- movss %xmm0, begin #pobranie dolnej granicy
- movss %xmm1, end #pobranie gornej granicy
- flds end #xk
- fsub begin #(xk - xp)
- fidiv prec #((xk - xp)/n
- fstps _dx #pobranie wyliczonego przedzialu
- movss x1, %xmm0
- movss %xmm0, begin
- fldz #zero do st(0) tutaj przechowuje sume wszystkich wysokosci
- PETLA:
- movss begin, %xmm0 #pierwszy argument dla make_x
- #drugi argument jest w %rdi
- movss _dx, %xmm1 #trzeci argument
- movq %rdi, prec
- movss %xmm0, xp
- movss %xmm1, dx
- fild prec # i// Convert the integer operand (signed)
- # into extended-real and load it onto the floating-point stack.
- fmul dx # i*dx
- fadd xp # xp + i*dx
- fstps result
- movss result, %xmm0 #pobranie wyniku
- #w %xmm0 jest jest obliczony x dla ktorego policzymy teraz f(x)
- movss %xmm0, x # pobranie wartosci do zmiennej x
- flds x
- fmul x
- fisub two #odejmuje 2.0
- fstp result #pobranie wyniku
- fadd result # w result trzymam wynik f(x) (wysokosc prostokata)
- #dodanie to do pozostalych wczesniej obliczonych
- #(na szczyt stosu wysokosci prostokata)
- dec %rdi #dekrementuje licznik
- cmp $0, %rdi #jesli 0 to konczymy prace
- je END
- jmp PETLA
- END: # wynik = _dx(czyli szerekosc)*(f(x1)+f(x2)+f(x3)...f(xn)) (w st(0) jest wysokosc)
- fmul _dx
- fstps result #wynik calkowania
- #WYWOLANIE PRINTFA
- movss result, %xmm0
- cvtss2sd %xmm0, %xmm0
- mov $.moj, %edi
- mov $1,%eax
- call printf
- #####################
- #przekazuje wynik calkowania do xmm0 aby zwrocic wynik do C
- #movss result, %xmm0
- movq %rbp, %rsp
- popq %rbp
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement