Online: 0x07D (125)
haker.iиfø  — Etyczny hacking_
Spreading knowledge like a virus.

 haker.info Baza wiedzy

Asembler x86/x64 » Rejestry procesora

Rejestry koprocesora (FPU/x87)

Nazwa koprocesor pochodzi z dawnych czasów i oznacza osobny element wspomagający procesor w obliczeniach. W tym rozdziale przedstawiono rejestry koprocesora arytmetycznego nazywanego też jednostką zmiennoprzecinkową (ang. floating-point unit, FPU) czy krótko x87. Mimo, że określenie koprocesor pozostało, to aktualnie jest on zawarty w układzie procesora, a nie oddzielnie.

Koprocesor arytmetyczny powstał, aby przeprowadzać obliczenia na liczbach z większą dokładnością.

Główne typy danych używane przy operacjach zmiennoprzecinkowych to:

  • Wartość pojedynczej precyzji o rozmiarze 32 bitów,
  • Wartość podwójnej precyzji o rozmiarze 64 bitów,
  • Wartość o rozszerzonej precyzji o rozmiarze 80 bitów.

Rejestry koprocesora x87 zachowują się jak stos. Korzystając z jego instrukcji możliwe jest wykonywanie obliczeń relatywnie od wierzchołka stosu, ale nic nie stoi na przeszkodzie, aby odwoływać się do poszczególnych rejestrów indywidualnie (po nazwie np. st0, st1, st2, ..., st7).

fpu stack registers

Przy opisywaniu koprocesora x87 warto wspomnieć o rejestrze statusu nazywanym FPU Status Word. To w nim są informacje o aktualnym stanie jednostki zmiennoprzecinkowej. Bity od 13 do 11 w tym rejestrze wskazują na wierzchołek stosu określany jako TOP. Jak wcześniej wspomniano rejestry FPU są w formie stosu. Bity określane jako TOP zawierają fizyczny indeks wierzchołka stosu rejestrów.

Oprócz TOP wspomnę też o bitach C0...C3. Otóż są one ustawiane przez rozkazy porównania wartości. Pozostałe znaczniki (IE, DE, ZE etc.) dotyczą wyjątków (ang. exceptions).

fpu status word

Oprócz rejestru statusu istnieje też rejestr kontroli jednostki zmiennoprzecinkowej. Znacznik PC w tym rejestrze określa dokładność:

  • 00b – pojedyncza precyzja (24 bity),
  • 01b – zarezerwowane,
  • 10b – podwójna precyzja (53 bity)
  • 11b – rozszerzona podwójna precyzja (64 bity).

Natomiast RC dotyczy zaokrąglania, a jego możliwe wartości to:

  • 00b – zaokrąglanie do najbliższej wartości lub wartości parzystej w przypadku równej odległości,
  • 01b – zaokrąglanie w dół,
  • 10b – zaokrąglanie w górę,
  • 11b – zaokrąglanie w kierunku zera.

Pozostałe znaczniki to maski wyjątków. Określają one czy ma zostać rzucony wyjątek danego rodzaju. Wyjątki są domyślnie wyciszone (maskowane). Możemy zatem ustawić, które wyjątki chcemy aktywować.

fpu control word

Dawid Farbaniec

Wykaz literatury (bibliografia)

  • Advanced Micro Devices Inc., 2017 – AMD64 Architecture Programmer's Manual
  • Intel Corporation, 2019 – Intel 64 and IA-32 Architectures Software Developer's Manual
  • Randall Hyde, 2010 – Asembler. Sztuka programowania. Wydanie II, ISBN: 9788324628544
Wszystkie treści umieszczone na tej witrynie są chronione prawem autorskim. Surowo zabronione jest kopiowanie i rozpowszechnianie zawartości tej witryny bez zgody autora. Wszelkie opublikowane tutaj treści (w tym kody źródłowe i inne) służą wyłącznie celom informacyjnym oraz edukacyjnym. Właściciele tej witryny nie ponoszą odpowiedzialności za ewentualne niezgodne z prawem wykorzystanie zasobów dostępnych w witrynie. Użytkownik tej witryny oświadcza, że z zamieszczonych tutaj danych korzysta na własną odpowiedzialność. Wszelkie znaki towarowe i nazwy zastrzeżone zostały użyte jedynie w celach informacyjnych i należą wyłącznie do ich prawnych właścicieli. Korzystając z zasobów witryny haker.info oświadczasz, że akceptujesz powyższe warunki oraz politykę prywatności.