Programowanie w asemblerze Obliczenia zmiennopozycyjne
Transkrypt
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Programowanie w asemblerze Obliczenia zmiennopozycyjne Zbigniew Jurkiewicz, Instytut Informatyki UW 17 stycznia 2017 Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Reprezentacja w Standardzie 754 IEEE Mantysa i wykładnik (cecha) m × 2w W znormalizowanej liczbie mantysa jest liczba˛ „stałopozycyjna” ˛ postaci 1.bbbbbbbbbb..., np. 1.0110001110111 × 27 Dwa standardowe formaty IEEE: single precision (32 bity) i double precision (64 bity) W FPU Intela dodatkowo extended precision (80 bitów). Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Klasy liczb: zera ze znakiem znormalizowane nieznormalizowane liczby skończone nieskończoności ze znakiem NaNs (Not a Number : nie liczby) liczby nieokreślone (indefinite) Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Zera Znak zera pozwala stwierdzić kierunek powstania underflow pozwala stwierdzić znak nieskończoności, z której wzieto ˛ odwrotność przydaje sie˛ przy arytmetyce przedziałowej Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Normalizacja Brak normalizacji oznacza zmniejszenie dokładności (liczby binarnych cyfr znaczacych). ˛ Otrzymanie wyniku nieznormalizowanego oznacza underflow condition (#U). W FPU Intela: floating-point underflow exception = powstanie wyniku nieznormalizowanego floating-point denormal-operand exception = wykrycie, że nieznormalizowana liczba jest argumentem operacji. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Nieskończoności Nieskończoności można porównywać i używać ich w operacjach arytmetycznych. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne NaN Rodzaje NaN: m = 1.0xxxxxxx m = 1.1xxxxxxx m = 1.10000000 SNaN (Signaling Nan) jako operand sygnalizuja˛ floating-point invalid-operation exception, trzeba je tworzyć programowo (procesor ich nie generuje) QNaN (Quiet NaN) moga˛ być w zasadzie operandami w operacjach arytmetycznych floating-point indefinite Wykorzystanie: kompilator wypełnia niezainicjowane elementy tablicy NaNami zawierajacymi ˛ indeks elementu. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne IEEE single precision górny bit (31) to bit znaku s 8 bitów (23..30) na wykładnik w 23 dolne bity (0..22) na mantyse˛ m znormalizowana mantysa ma zawsze postać 1.bbbbbbbbbb..., wiec ˛ dla oszcz˛edności górnej jedynki nie przechowujemy. cecha przesunieta ˛ o 127. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne IEEE single precision Przypadki specjalne w = 0 & m = 0: liczba 0 (zależnie od znaku +0 lub -0) w = 0 & m 6= 0: liczba nieznormalizowana w = 255 & m = 0: nieskończoność (∞) w = 255 & m 6= 0: NaN (Not a Number) — nieokreślony wynik Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne IEEE double precision górny bit (63) to bit znaku s 11 bitów (52..62) na wykładnik 52 dolne bity (0..51) na mantyse˛ Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Technologie Intela Poczatkowo ˛ obliczenia zmiennopozycyjne wykonywano na osobnym koprocesorze zwanym FPU (Floating Point Unit). W kolejnych modelach został on wbudowany w główny procesor. Technologia MMX umożliwia obliczenia równoległe na spakowanych liczbach całkowitych. Pojawiła sie˛ w Pentium MMX i Pentium II. Technologia SSE umożliwia obliczenia na spakowanych liczbach zmiennopozycyjnych pojedynczej precyzji. Używa osobnych rejestrów 128-bitowych. Pojawiła sie˛ w Pentium III. Technologia SSE2 dodaje spakowane liczby zmiennopozycyjne podwójnej precyzji i spakowane liczby całkowite różnych rozmiarów oraz dodatkowe operacje. W Pentium 4. Technologia SSE3 to tylko dodatkowe operacje. W Pentium 4HT i Xeonie. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne FPU Intela Kiedyś był rzeczywiście odrebnym ˛ układem (tzw. koprocesor matematyczny), obecnie wbudowany, ale rozdzielenie architektur zostało w postaci osobnego środowiska obliczeniowego Na przykład instrukcje FPU nie moga˛ siegać ˛ do normalnych rejestrów (EAX itp.), bo to „inny procesor”. Odrebny ˛ zestaw rejestrów st0, st1, ..., st7, tworzacych ˛ stos (st0 na wierzchu). Obliczenia (prawie) zawsze z użyciem wierzchołka stosu. Osobny rejestr stanu („flagi”), niewidoczny dla normalnego procesora oraz rejestr sterujacy. ˛ Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Flagi stanu Bity i maski w dwóch miejscach: dla instrukcji FPU x87 FPU status word: bity 0..5 x87 FPU control word: maski 0..5 dla obliczeń SIMD w instrukcjach SSE/SSE2/SSE3 rejestr MXCSR: flagi w bitach 0..5, maski w bitach 7..12. Bity flag (stanu) sa˛ „lepkie”: pozostaja˛ ustawione aż do recznego ˛ wyzerowania. Można wiec ˛ zamaskować wszystkie wyjatki ˛ i po wykonaniu całego obliczenia zobaczyć, co sie˛ działo Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Wyjatki ˛ W procesorach Intela jest 6 klas wyjatków ˛ z bitami i maskami precomputation Invalid operation (#I), bit IE, maska ME. przepełnienie stosu lub pusty stos (#IS) błedna ˛ operacja arytmetyczna (#IA), np. dzielenie ∞ przez ∞ lub zera przez zero Divide-by-zero (#Z), bit IZ, maska MZ itd. Denormalized operand (#D), brak w standardzie IEEE postcomputation Numeric Overflow (#O) Numeric underflow (#U) Inexact result (precision) (#P), bardzo cz˛este, np. 1/3 Gdy maska ustawiona, to domyślna obsługa wyjatku, ˛ wpp. wyjatek ˛ zgłaszany Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Instrukcje: ładowanie i zapisywanie FLD miejsce Przekłada zawartość miejsca na wierzch stosu. Miejsce może być także rejestrem procesora FPU. FILD miejsce Pobiera liczbe˛ całkowita˛ z pamieci, ˛ zamienia na format zmiennopozycyjny i dokłada na stos FLD1 Kładzie jedynk˛e na wierzchołku stosu FLDZ Kładzie zero na wierzchołku stosu FXCH stn Zamienia miejscami podany rejestr i wierzchołek stosu Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Instrukcje: ładowanie i zapisywanie FST miejsce Przekłada zawartość wierzchołka stosu w podane miejsce (może to być także rejestr procesora FPU). FSTP miejsce To samo, ale ze zdjeciem ˛ ze stosu. FIST miejsce Zamienia liczbe˛ z wierzchołka stosu na całkowita˛ dwu- lub czterobajtowa˛ i zapisuje w podane miejsce FISTP miejsce To samo, ale ze zdjeciem ˛ ze stosu; można dostać liczbe˛ 8-bajtowa. ˛ Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Instrukcje: arytmetyka FADD miejsce Dodaje zawartość miejsca do wierzchołka stosu (st0). FADD rejestr,st0 Dodaje zawartość wierzchołka stosu (st0) do rejestru. FADDP rejestr,st0 To samo ze zdjeciem ˛ ze stosu. FIADD miejsce Dodaje liczbe˛ całkowita˛ z miejsca do wierzchołka stosu (st0). Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Przykład [Carter] Przykład sumowania tablicy: SIZE equ 10 array sum section .bss resq SIZE resq 1 section .text mov ecx, SIZE mov esi, array fldz ;inicjujemy st0 lp: fadd add loop fstp qword [esi] esi, 8 lp qword sum Zbigniew Jurkiewicz, Instytut Informatyki UW ;kolejny element ;krok ;zapisanie wyniku Programowanie w asemblerze Obliczenia zmiennopozycyjne Instrukcje: arytmetyka Dla odejmowania mamy dwa razy wiecej ˛ instrukcji, bo to nie jest operacja przemienna, przykłady: FSUB miejsce Odejmuje zawartość miejsca od wierzchołka stosu (st0). FSUBR rejestr,st0 Odejmuje zawartość wierzchołka stosu (st0) od rejestru, wynik do do st0. FSUBR rejestr,st0 To samo, ale wynik do rejestru. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Instrukcje: arytmetyka i porównania Mnożenie i dzielenie analogicznie jak dodawanie i odejmowanie. FCOM miejsce Porównuje miejsce z wierzchołkiem stosu (st0). FCOMP miejsce To samo ze zdjeciem ˛ ze stosu. FCOMPP Porównuje st0 z st1 i usuwa oba ze stosu. FTST Porównuje st0 z zerem. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Instrukcje: porównania Instrukcje warunkowe procesora nie uwzgledniaj ˛ a˛ rejestru stanu FPU, dlatego trzeba go najpierw przepisać do EFLAGS. FSTSW miejsce Zapisuje rejestr stanu w podane miejsce, zwykle jest to rejestr AX. Po przerzuceniu do AX instrukcja˛ SAHF można flagi przerzucić do EFLAGS. Jako skoków warunkowych należy używać JA, JB i JZ (inaczej mówiac, ˛ liczby zmiennopozycyjne traktujemy jak liczby całkowite bez znaku). Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Instrukcje porównania: przykład [Carter] ;;; if (x > y) fld qword [x] fcomp qword [y] fstsw ax ;przeniesienie rejestru stanu sahf jna else_part then_part: ;kod dla then jmp end_if else_part: ;kod dla else end_if: Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Instrukcje porównania Od Pentium Pro dwie nowe instrukcje porównania bezpośrednio modyfikujace ˛ EFLAGS, ale operujace ˛ tylko na rejestrach. COMI rejestr Porównuje rejestr z st0. COMIP rejestr To samo ze zdjeciem ˛ ze stosu. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Instrukcje porównania: przykład global dmax %define a1 ebp+8 %define a2 ebp+16 section .text dmax: push ebp mov ebp,esp fld qword [a1] fld qword [a2] fcomi st1 ja a2_mniejszy fxchg st1 a2_mniejszy: pop ebp ret Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Instrukcje „matematyczne” FSQRT Zastepuje ˛ wierzchołek stosu (st0) przez jego pierwiastek kwadratowy. FSIN, FCOS, FPTAN To samo dla funkcji sin, cos i tan. Argument w radianach! FPTAN Oblicza tan od wierzchołka stosu (st0) i zastepuje ˛ go, a nastepnie ˛ dokłada 1.0 na wierzchołek stosu (pamiatka ˛ z czasów, gdy było tylko FPTAN, a nie było FSIN i FCOS). FLDPI, FLDL2E, FLDLN2 Umieszczaja˛ na wierzchołku stosu π, log2 e, ln 2. „Dziwne” logarytmy. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Synchronizacja Procesor właściwy („całkowity”) i jednostka FPU to odrebne ˛ środowiska obliczeniowe. Moga˛ pracować równolegle, tzn. podczas wykonywania operacji zmiennopozycyjnej równocześnie wykonuja˛ sie˛ (o ile to możliwe) „normalne” instrukcje. Problem z obsługa˛ wyjatków ˛ zmiennopozycyjnych: komórki pamieci, ˛ które spowodowały wystapienie ˛ wyjatku, ˛ mogły już zostać nadpisane przez normalne instrukcje. Stawia to pod znakiem zapytania możliwość analizy sytuacji i naprawy w procedurach obsługi. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne Synchronizacja FWAIT Wprowadzono instrukcje˛ FWAIT do umieszczania w kodzie bezpośrednio po instrukcji mogacej ˛ powodować wyjatek ˛ — blokuje ona chwilowo wykonanie dalszych instrukcji. Cz˛esto ten sam efekt można osiagn ˛ ać ˛ po prostu zmieniajac ˛ kolejność instrukcji, np. ciag ˛ fild [count] inc [count] fsqrt zmieniamy na fild [count] fsqrt inc [count] Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne MMX Rozszerzenie MMX procesorów Pentium daje możliwość równoczesnego wykonywania tych samych operacji na wielu argumentach. Jest to jak gdyby miniaturowy procesor wektorowy. Inna˛ ciekawa˛ cecha˛ MMX jest stosowanie arytmetyki z nasycaniem (saturation) — przy przekroczeniu zakresu wynikiem jest najwieksza ˛ reprezentowalna wartość (nie ma „zawijania”). Taki sposób obliczeń stosuje sie˛ czasem w przypadku przetwarzania danych audiowizualnych. Przy korzystaniu z rozszerzenia MMX należy pamietać, że praca w trybie MMX wyklucza operacje zmiennopozycyjne i odwrotnie (bo korzystaja˛ z tych samych rejestrów, tylko różnie je nazywaja), ˛ konieczne jest jawne przechodzenie miedzy ˛ trybami. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze Obliczenia zmiennopozycyjne