Advertisement
Guest User

Untitled

a guest
Jan 6th, 2014
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.03 KB | None | 0 0
  1. section .text use32
  2. global _arctg
  3. _arctg:
  4.  
  5. %idefine x [ebp+8]
  6. %idefine dokl [ebp+12]
  7. push ebp
  8. mov ebp, esp
  9.  
  10.  
  11. finit
  12. fld dword x
  13. ;?fst dword x
  14. fild dword dokl
  15. ; st1 x st0 dokl
  16. fld1
  17. fsubp st1,st0
  18. ; st1 x st0 dokl-1 (tak jak we wzorze od zera->do n-1)
  19. fldz ; nowa dokladnosc -> dokl !! dopoki bd rowne :X !
  20. ; st2 x st1 dokl-1 st0 0 <-mnoznik do tego!
  21.  
  22. fld1 ;jezeli tu bd jedynka to wyraz bedzie dodatni!!
  23. ; st3 x st2 dokl-1 st1 0 <-mnoznik do tego! st0 1(znaku)
  24.  
  25.  
  26. ;na obliczenia:
  27. fldz
  28. ; st4 x st3 dokl-1 st2 0 <-mnoznik do tego! st1 1(znaku)=1 st0 obliczenia=1
  29.  
  30. licz_kolejny_wyraz_szeregu:
  31.  
  32. ;to wiemy, ze nastepny bedzie ujemny, jesli bedzie nastepny.
  33. ; st4 x st3 dokl-1 st2 0 <-mnoznik do tego! st1 1(znaku)=1 st0 obliczenia=1
  34. ;ustawiam znak st2->'0'
  35.  
  36.  
  37. ;1.sprawdzamy znak:
  38.  
  39. fld1
  40. fcomp st2 ; jakiego znaku?
  41. fstsw ax
  42. sahf
  43. je dodatni
  44. ;jmp ujemny
  45. ujemny:
  46. ;dodaje 1 do bitu znaku '1' = dodatni ,
  47. fld1
  48. faddp st2,st0
  49. ;to samo co w dodatni, ale ze zmiana znaku
  50.  
  51. jmp dodatni_gdzie_bit_znaku_rowny_1
  52.  
  53.  
  54.  
  55. dodatni:
  56. ;odejmuje 1 od bitu znaku '1' = dodatni ,
  57. fld1
  58. fsubp st2,st0
  59. dodatni_gdzie_bit_znaku_rowny_1:
  60. ;mozemy przejsc do liczenia pierwszego wyrazu(dodatniego)
  61. ;najpierw x^(2n+1)
  62. ;fld1 ;1szy nowy element
  63. ;petla do potegi ^2n+1, gdzie n->stała; np.3 razy
  64. ;fmul st0,st5 ; st0 x
  65. ;stworzymy biezace 2n+1 :o
  66. ; st4 x st3 dokl-1 st2 0 <-mnoznik do tego! st1 1(znaku)=0 st0 obliczenia=1
  67. fld1 ;1szy nowy element
  68. fld1
  69. faddp ; mamy 2 , teraz razy biezace 'n'
  70. fmul st0,st3
  71. ; st5 x st4 dokl-1 st3 0 <-mnoznik do tego! st2 1(znaku)=0 st1 obliczenia=1 st0 2*0
  72. fld1
  73. faddp st1,st0 ; jest '1' przy pierwszej rundzie.
  74. ; st5 x st4 dokl-1 st3 0 <-mnoznik do tego! st2 1(znaku)=0 st1 obliczenia=1 st0 1->mnoznik_obecnej_petli
  75. ;licznik petli utworzony, wiec liczmy w petli !
  76. fld1 ;2-gi nowy element
  77. ; st6 x st5 dokl-1 st4 0 <-mnoznik do tego! st3 1(znaku)=0 st2 obliczenia=1 st1 1->mnoznik_obecnej_petli st0 1
  78. potegowanie:
  79. fmul st0,st6 ; st0 x
  80. ; st6 x st5 dokl-1 st4 0 <-mnoznik do tego! st3 1(znaku)=0 st2 obliczenia=1 st1 1->mnoznik_obecnej_petli st0 x
  81. ;odjac 1 od licznika i sprawdzic czy jest rowny zero.
  82. fld1
  83. fsubp st2,st0
  84. ; st6 x st5 dokl-1 st4 0 <-mnoznik do tego! st3 1(znaku)=0 st2 obliczenia=1 st1 0->mnoznik_obecnej_petli st0 x
  85. ;porownanie wartosc licznika z zerem:
  86. fldz
  87. fcomp st2
  88. ; st6 x st5 dokl-1 st4 0 <-mnoznik do tego! st3 1(znaku)=0 st2 obliczenia=1 st1 0->mnoznik_obecnej_petli st0 x
  89. sahf
  90. je licznik_rowny_zero
  91. jmp potegowanie
  92.  
  93.  
  94. licznik_rowny_zero:
  95. ;teraz mianownik i dzielimy:
  96. fxch st1 ;zamian 'potegi' z licznikiem petli
  97.  
  98. ; st6 x st5 dokl-1 st4 0 <-mnoznik do tego! st3 1(znaku)=0 st2 obliczenia=1 st1 x st0 0->mnoznik_obecnej_petli
  99. ;od nowa ustawiam nowy mnoznik biezacej petli
  100. fld1
  101. faddp st1,st0
  102. fld1
  103. faddp st1,st0
  104. fmul st0,st4
  105. fld1
  106. faddp st1,st0
  107. ; st6 x st5 dokl-1 st4 0 <-mnoznik do tego! st3 1(znaku)=0 st2 obliczenia=1 st1 x st0 mianownik: 2n+1 ->1
  108. fdivp st1,st0
  109. ; st5 x st4 dokl-1 st3 0 <-mnoznik do tego! st2 1(znaku)=0 st1 obliczenia=1 st0 x/(2n+1)
  110. ;fmulp st1,st0
  111. ;zabawa ze znakiem: jezeli bit_znaku = 0 liczba dodatnia, jezeli bit_znaku = 1 , liczba ujemna, zmieniamy znak
  112.  
  113.  
  114. fld1
  115. fcomp st3
  116. sahf
  117. je ujemna_jednak
  118. jmp dodatnia_jednak
  119. ujemna_jednak:
  120. fchs ;zmieniam znak i tyle.
  121.  
  122. dodatnia_jednak:
  123.  
  124.  
  125. faddp st1,st0
  126. ; st4 x st3 dokl-1 st2 0 <-mnoznik do tego! st1 1(znaku)=0 st0 obliczenia= x/(2n+1)
  127.  
  128. ; st4 x st3 dokl-1 st2 0 <-mnoznik do tego! st1 1(znaku)=0 st0 +/- obliczenia= x/(2n+1)
  129. ;obliczyłem 1-szy wyraz szeregu czas na sprawdzenie czy mnoznik_do_tego = dokladnosci wyrazow jakie chcemy:
  130. fld1 ;st0 = 1
  131. fmul st0,st3 ;st0 = st3
  132. fcomp st4 ; 0 = dokl -1 ??
  133. fstsw ax
  134. sahf
  135. fld1 ; dodajmy do mnoznika 1
  136. faddp st3,st0
  137.  
  138. jne licz_kolejny_wyraz_szeregu
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148. ;fst dword dokl
  149. ;mov eax, dokl
  150. leave
  151. ret
  152.  
  153.  
  154.  
  155.  
  156.  
  157. section .data
  158. mnoznik: dd 1.0
  159. cos dd 1.0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement