Advertisement
Guest User

Untitled

a guest
Jun 15th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.64 KB | None | 0 0
  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.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement