M E N U
Strona główna Assembler -kurs
Assembler -teksty
AntiCracking
API
Opisy narzędzi
Zabezpieczenia CD/DVD
Budowa plików
Sources
Linki
Kontakt

STATYSTYKI

stat4u
PRV.PL - Twoje miejsce w sieci.
Od 06.09.2000
Optymalizacja:
1024x768, IE5
  • Assembler - kurs

  • Koprocesor
  • Koprocesor to jednostka operująca na liczbach zmiennoprzecinkowych przeznaczona specjalnie do szybkich i dokładnych obliczeń matematycznych.

    Stos
    Koprocesor korzysta w obliczeniach z specjalnego stosu do którego przesyłamy dane przeznaczone do obliczeń, stos ten składa się z ośmiu "rejestrów" 80 bitowych (10 bajtowych):

    ST(0) - wierzchołek stosu

    ST(1)

    ST(2)

    ST(3)

    ST(4)

    ST(5)

    ST(6)

    ST(7)

    Typy danych
    Podczas obliczeń wykorzystujących koprocesor musimy wykorzystywać określone typy danych:

    Liczby całkowite:

    NazwaDeklaracjaTyp
    word integerdw16-bitowa liczba ze znakiem
    short integerdd32-bitowa liczba ze znakiem
    long integerdq64-bitowa liczba ze znakiem
    packed-decimaldtjest to 18 cyfrowa liczba w kodzie BCD

    Liczby rzeczywiste:

    Ich zapis podobny jest do typu double z C++, a więc liczba jest przedstawiona w postaci:

    LeX

    Gdzie L jest liczbą którą mnożymy przez 10 do potęgi X - e oznacza, że mamy do czynienia z typem rzeczywistym.

    Oto mały przykład:

    3e2= 300
    2.5e5= 250000
    1.34e-3= 0.00134

    Typ rzeczywisty można deklarować również z wykorzystaniem kropki:

    3e2= 300.0
    2.5e5= 250000.0
    1.34e-3= 0.00134

    A oto określone typy liczb rzeczywistych:

    NazwaDeklaracjaTyp
    short real (single)dd32 bitowa liczba zmiennoprzecinkowa
    long realdq64 bitowa liczba zmiennoprzecinkowa
    temp realdt80 bitowa liczba zmiennoprzecinkowa

    Jak widzimy deklaracje liczb całkowitych i rzeczywistych są podobne, dlatego też należy zwrócić szczególną uwagę na zapis deklaracji:

    numer1 dd 10- deklaracja liczby całkowitej
    numer2 dd 10.0- deklaracja liczby rzeczywistej


    Dodatkowe rejestry
    Koprocesor posiada także dwa rejestry dodatkowe w których określa tryb pracy koprocesora oraz jego stan:

    Rejestr kontrolny:

    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit

    Ja opiszę tylko 4 bity :

    7 - włączenie, wyłączenie przerwań wywoływanych w przypadku błędów:
    0 - wyłączenie
    1 - włączenie przerwań
    10,11- zaokrąglanie liczby (dla instrukcji FRNDINT):
    00 - do najbliższej liczby
    01 - w dół
    10 - w gore
    11 - obcięcie
    12 - rodzaj nieskończoności
    0 - nie rozróżnia
    1 - rozróżnia (dodatnia i ujemna)
    Rejestr stanu:

    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit

    Bity błędów (ustawiony = wystąpił błąd):

    0 - niewłaściwa operacja
    1 - zdenormalizowany argument
    2 - dzielenie przez zero
    3 - przepełnienie
    4 - niedopełnienie
    5 - precyzja


    Bity flag warunkowych:

    8,9 - flagi warunkowe (tak jak w procesorze) ich ustawienie określa nam wynik
    10,14 - porównania

    Instrukcje
    Koprocesor podobnie jak procesor posiada własne instrukcje:

    FINIT - inicjacja koprocesora
    FSTSW - kopiuje rejestr stanu do określonej komórki lub rejestru
    np.

    ...
    FSTSW AX;kopiuje rejestr stanu do AX
    ...

    FSTCW - to samo dla rejestru kontrolnego
    FLDCW - wstawianie określonej komórki lub rejestru do rejestru kontrolnego koprocesora
    np.

    ...
    FLDCW AX;kopiuje AX do rejestru kontrolnego
    ...

    Instrukcje ładujące dane:

    FILD - instrukcja lądująca liczby całkowite na wierzchołek stosu - ST(0)
    FBLD - instrukcja lądująca liczby w kodzie BCD
    FLD - instrukcja ta ładuje liczby rzeczywiste na wierzchołek stosu
    np.

    ...
    liczba dq 3.454345;liczba rzeczywista
    ...
    FLD liczba;ST(0)=liczba
    ...

    Instrukcje zdejmujące dane:

    FST - kopiuje zawartość wierzchołka (liczba rzeczywista) stosu w podane miejsce
    FSTP - przenosi zawartość wierzchołka stosu (liczba rzeczywista) w podane miejsce
    FIST - ładuje liczby całkowite we wskazane miejsce
    FISTP - przenosi liczby całkowite we wskazane miejsce
    FBST - ładuje liczby całkowite (w kodzie BCD) we wskazane miejsce
    FBSTP - przenosi liczby całkowite (w kodzie BCD) we wskazane miejsce
    np.

    ...
    liczba dq ?;deklaracja zmiennej
    ...
    FST liczba;liczba=ST(0)
    ...

    Podstawowe działania matematyczne:

    Dodawanie:

    FADD - dodaje dwie liczby rzeczywiste, może mieć 2 argumenty
    FIADD - dodaje dwie liczby całkowite (dwu- lub cztero- bajtowe),do jej użycia potrzebny jest jeden argument
    FADDP - w przeciwieństwie do poprzednich wymaga dwóch argumentów i po wykonaniu działania zdejmuje ze stosu drugi z nich
    np.

    ...
    liczba dw 123;liczba całkowita
    liczba2 dq 2.4435345;liczba rzeczywista
    FIADD liczba;ST(0)=ST(0)+liczba
    FADD liczba2;ST(0)=ST(0)+liczba2
    FADD ST(0),ST(1);ST(0)=ST(0)+ST(1)
    FADDP ST(0),ST(3);ST(0)=ST(0)+ST(3),zdjęcie ST(3)
    ...

    Odejmowanie:

    FSUB - odejmuje liczby rzeczywiste, dozwolone 1 lub 2 argumenty
    FISUB - odejmuje liczby całkowite (16 lub 32 bitowych), wymaga jednego argumentu (odjemnika)
    FISUBR - to samo co wyżej lecz odjemna i odjemnik zmieniają się miejscami
    FSUBP - odejmuje liczby rzeczywiste następnie zdejmując ze stosu drugi argument
    FSUBR - to samo co FSUB tylko zamienia kolejność odjemnej i odjemnika
    FSUBRP - to co wyżej, w dodatku zdejmuje drugi argument
    np.

    ...
    liczba dw 124;deklaracja liczby całkowitej
    liczba2 dq 24.254;deklaracja liczby rzeczywistej
    ...
    FISUB liczba;ST(0)=ST(0)-liczba
    FISUBR liczba;ST(0)=liczba-ST(0)
    FSUB liczba2;ST(0)=ST(0)-liczba2
    FSUBRP ST(0),ST(1);ST(0)=ST(1)-ST(0),zdejmuje ST(1)
    ...

    Dzielenie:

    FDIV - dzieli liczby zmiennoprzecinkowe (wymaga 1-2 argumentów obydwa musza mieć co najmniej 4 bajty)
    FIDIV - dzieli 16-32 bitowe liczby całkowite, wymaga jednego argumentu
    FIDIVR - to samo ale dzieli w odwrotnej kolejności
    FDIVR - to co FDIV tylko w odwrotnej kolejności
    FDIVP - to co FDIV ale usuwa ST(0) i przenosi pozostałe rejestry
    FDIVRP - dzieli liczby rzeczywiste w odwrotnej kolejności, usuwa ST(0) i przemieszcza w górę pozostałe rejestry
    np.

    ...
    liczba dw 234;liczba całkowita
    liczba2 dq 12.465;liczba rzeczywista
    ...
    FDIV liczba2;ST(0)=ST(0)/liczba2
    FDIV ST(0),ST(1);ST(0)=ST(0)/ST(1)
    FIDIV liczba;ST(0)=ST(0)/liczba
    FDIVRP ST(0),ST(1);st(0)=ST(1)/ST(0) i usuwa st(1)
    ...

    Mnożenie:

    FMUL - mnoży dwie liczby zmiennoprzecinkowe (4-8 bajtowe), dozwolone dwa argumenty
    FIMUL - mnoży dwie liczby całkowite (2-4 bajtowe), wymaga jednego argumentu
    FMULP - to samo co FMUL lecz zdejmuje ze stosu rejestr ST(0) (musimy podać dwa argumenty)
    np.

    ...
    liczba dw 156
    liczba2 dq 1.4354
    ...
    FMUL ST(0),liczba2;ST(0)=ST(0)*liczba
    FIMUL ST(0),liczba;ST(0)=ST(0)*liczba
    FMULP ST(1),ST(0);ST(1)=ST(1)*ST(0),usuwa ST(0)
    ...

    Koprocesor posiada także inne instrukcje matematyczne - ja opisze 7 podstawowych:

    FSIN - instrukcja ta pobiera wielkość konta (w radianach) z wierzchołka stosu ST(0) a następnieoblicza jego sinus i zwraca wynik w tym samym rejestrze
    FCOS - to samo dla cosinusa
    FPTAN - oblicza tangens na podstawie argumentu dostarczonego w ST(0), wynik zwracany jest jako ułamek w rejestrach:
    ST(0) - mianownik
    ST(1) - licznik
    FSINCOS - funkcja ta oblicza jednocześnie sinus i cosinus kata z wierzchołka stosu zwracającodpowiednio:
    ST(0) - cosinus kata
    ST(1) - sinus kata
    FCHS - zmienia znak liczby na wierzchołku stosu
    FABS - oblicza wartość bezwzględną liczby na wierzchołku stosu
    FSQRT - wyznacza pierwiastek drugiego stopnia z liczby na wierzchołku
    np.

    ...
    kat dd 1.5;deklaracja wielkości kata w radianach
    ...;oblicza tangens kata
    FPTAN
    FDIV ST(1),ST(0);wykonuje dzielenie licznik/mianownik
    ...

    A oto 5 bardzo przydatne instrukcje:

    FFREE - czyści podany jako parametr rejestr
    FXCHG - zamienia miejscami ST(0) i podany jako parametr rejestr stosu
    FINCSTP - przesuwa wszystkie rejestry koprocesora w stronę ST(0)
    FDECSTP - to zamo lecz w odwrotną stronę
    FRNDINT - zaokrągla wartość w ST(0) do liczby całkowitej

    W skład instrukcji koprocesora również wchodzą instrukcje porównujące:

    Instrukcje te dzielą się na :

    - porównujące liczby rzeczywiste:

    FCOM - porównuje ST(0) i argument, jeżeli nie podamy argumentu to porówna z ST(1)
    FCOMP - to samo ale usuwa ST(0)
    FCOMPP - porównuje ST(0) i ST(1) i usuwa obydwa
    FTST - porównuje ST(0) z 0.0
    FUCOM - porównuje ST(0) i ST(1)
    FUCOMP - porównuje ST(0) i ST(1), usuwa ST(0)
    FUCOMPP - porównuje ST(0) i ST(1), usuwa ST(0) i ST(1)

    - porównujące liczby całkowite:

    FICOM - porównuje ST(0) z argumentem
    FICOMP - porównuje ST(0) z argumentem, usuwa ST(0)

    np.

    ...
    liczba dd 345.54;liczba rzeczywista
    liczba2 dd 124.76;liczba rzeczywista
    ...
    FLD liczba;ładuje liczba do ST(0)
    FCOM liczba2;porównuje ST(0) z liczba2
    FSTSW AX;kopiuje rejestr stanu koprocesora do AX
    SAHF;kopiuje AX do rejestru flagowego procesora
    JZ skok;skacz jeżeli równe
    ...
    skok:;etykieta skoku (miejsce dokąd zostanie wykonany skok)
    ...

    Pamiętajmy, iż koprocesor nie posiada funkcji które reagowałyby po porównaniu dlatego też należy skopiować rejestr statusu do AX (lub komórki pamięci), a następnie skopiować flagi warunkowe do rejestru znaczników koprocesora, w ten sposób otrzymamy ustawione znaczniki operacji porównania.
    ©Copyright by FiXER 2001

    <<

    ©Copyright by zoomek 2001
    Wszelkie prawa zastrzeżone!