SHARE
TWEET

Untitled

a guest Jun 15th, 2019 59 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. LAB 5:
  2.  
  3. Temat: Jednostka zmiennoprzecinkowa (FPU)
  4.  
  5. Wykonane zadania:
  6. Program 1:
  7. Szereg Taylora dla arctg(x).
  8.  
  9.  
  10. Program 2:
  11. -funkcja w ASM sprawdzaj膮ca wskazan膮 flag臋 (dla okre艣lonego wyj膮tku) w Status Word,
  12. -funkcja w ASM modyfikuj膮ca ustawienia maskowania wyj膮tk贸w w Control Word (dla wskazanego wyj膮tku),
  13. -wykazanie r贸偶nicy w dzia艂aniu dla maskowania i nie maskowania wyj膮tk贸w.
  14.  
  15.  
  16. Om贸wienie dzia艂ania programu:
  17. Program 1
  18. Kod w j臋zyku C, do napisania kt贸rego zosta艂a wykorzystana wiedza z poprzednich zaj臋膰.
  19.  
  20. extern double taylor(double a, int b);
  21. int main(void)
  22. {
  23.     int y;
  24.     double x;
  25.     printf("x od -1 do 1: ");
  26.     scanf("%lf", &x);
  27.     printf("y: ");
  28.     scanf("%d", &y);
  29.     printf("Wynik: %lf\n", taylor(x, y));
  30.     return 0;
  31. }
  32.  
  33. Szereg Taylora dla arctg(x) realizujemy za pomoc膮:
  34. WZOR.
  35. Przyjmowane przez funkcj臋 argumenty, to ilo艣膰 wyraz贸w ci膮gu zapisane w rejestrze rdi oraz k膮t
  36. w rejestrze xmm0.
  37. Przekazujemy warto艣ci z rejestru xmm0 do rejestr贸w ST(0), ST(1) i ST(2) przez stos za pomoc膮 instrukcji fldl i fld.
  38.  
  39. sub     $8, %rsp
  40. movsd   %xmm0, (%rsp)
  41. fldl    (%rsp)  # NASZ WPISANY X
  42. fld     %st    
  43. fld     %st
  44.  
  45. Teraz w ST(0) znajduje si臋 wyraz ci膮gu, w ST(1)  suma ci膮gu, a w ST(2) znajduje si臋 X.
  46. Ustawiamy rejestr rsi na zero. Je偶eli warto艣膰 w rdi, czyli liczba wyraz贸w ci膮gu jest jemu r贸wna, to przechodzimy do ko艅ca. Je偶eli nie, to zwi臋kszamy licznik rsi i mno偶ymy ST(2) razy ST dwa razy, a nast臋pnie mno偶ymy -1.
  47.  
  48. movq $0, %rsi
  49. oblicz:
  50. cmp %rdi, %rsi
  51. je  dowidzenia
  52. inc %rsi
  53. fmul    %st(2), %st # RAZY X
  54. fmul    %st(2), %st # JESZCZE RAZ RAZY X
  55. fmull   jeden # RAZY -1
  56.  
  57. Do ST(0) umieszczany jest dzielnik, kt贸ry pocz膮tkowo ma warto艣膰 1. Dodajemy do niego warto艣膰 2, zapisujemy go i dzielimy wyraz przez ten dzielnik, czyli od ST(1) odejmujemy ST(0). Nast臋pnie dzielnik usuwamy, a wyraz ci膮gu dodajemy do sumy. Wykonujemy znowu p臋tl臋 "oblicz" do momentu, kiedy wykonamy po偶膮dan膮 ilo艣膰 krok贸w (wyraz贸w ci膮gu).
  58.  
  59. fldl    dzielnik # ST(0) JEST TERAZ DZIELNIKIEM
  60. faddl dwa #DODAJEMY 2
  61. fstpl dzielnik # SCIAGAMY ZE STOSU, ZAPISUJEMY W DZIELNIKU
  62. fldl  dzielnik #ZNOWU WSTAWIAMY DZIELNIK
  63. fdivr  %st, %st(1) # DZIELIMY WYRAZ PRZEZ DZIELNIK
  64. fstp %st # USUWAMY DZIELNIK
  65. fadd %st, %st(1) # DODANIE DO SUMY                      
  66. jmp oblicz #NASZA PETLA
  67.  
  68. Program 2
  69. W programie C stworzy艂am menu, w kt贸rym mo偶emy sprawdzi膰 Status Word, zmieni膰 wybran膮 mask臋 oraz podzieli膰 przez zero, by sprawdzi膰 poprawno艣膰 maski. Sprawdzanie flagi w Asemblerze.
  70.  
  71. SprawdzFlage:
  72. movq $0, %rax
  73. fstsw %ax
  74. fwait
  75. ret
  76.  
  77. Je偶eli wyj膮tek jest r贸wny zero, to jest brak wyj膮tk贸w. Nast臋pnie je偶eli reszta z dzielenia jest r贸wna 1, to wyst臋puje wyj膮tek Invalid operation exception, itd. Na przyk艂ad.
  78.  
  79. wyjatek = wyjatek >> 1;
  80.     if (wyjatek % 2 == 1)
  81.     {
  82.     printf("1. Denormalized operand exception flag\n");
  83.     }
  84.  
  85. Nast臋pnie zmiana wybranej maski w Asemblerze, wykonana jest za pomoc膮 operacji xor. Zmieniamy warto艣膰 wybranego bitu, w zale偶no艣ci od wybranej maski.
  86.  
  87. setFlag:
  88. fstcw controlWord
  89. fwait
  90. mov controlWord, %ax
  91. xor %di, %ax
  92. nop
  93. mov %ax, controlWord
  94. fldcw controlWord
  95. ret
  96.  
  97.  
  98.  
  99.  
  100.  
  101. Wybieramy mask臋 za pomoc膮 operacji w C
  102. int maska = 0;
  103.     maska = pow(2,choice);
  104.     setFlag(maska);
  105.    
  106.    
  107.    
  108. Test dzielenia przez zero wykonujemy w ten spos贸b, 偶e do rejestr贸w ST zapisujemy 0, a nast臋pnie 1 za pomoc膮 operacji fldz oraz fld1, a nast臋pnie wykonujemy dzielenie. W przypadku, gdy zamaskujemy wyj膮tek dzielenia przez zero i spr贸bujemy wykona膰 dzielenie pojawi nam si臋 komunikat o b艂臋dzie.
  109.  
  110. Wnioski:
  111. Wszystkie wykonane zadania dzia艂aj膮 poprawnie.
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top