A.D.Danilecki, Poznan, Polska
Politechnika Poznanska, Wydzial Informatyki i Zarzadzania
W tej chwili adanilecki _malpa_ cs.put.poznan.pl
Z wykorzystaniem wielu listow z uwagami od wielu autorow
Krótki wstęp do programowania z wykorzystaniem inline assemblera x86


A.6 Używanie koprocesora



Stos koprocesora
Słowo kontrolne koprocesora
Tag word
Słowo statusu koprocesora
wskaźnik instrukcji koprocesora
wskaźnik danych koprocesora

Koprocesor posiada osiem 80-bitowych rejestrów. Liczby w nich są przechowywane w rozszerzonym formacie rzeczywistym. Jeżeli liczbę ładujemy z pamięci bądź rejestrów do rejestrów koprocesora, jeżeli jest ona w innym formacie (np jest to liczna całkowita, całkowita w formacie BCD), to jest ona automatycznie konwertowana do rozszerzonego formatu rzeczywistego (extended real format). I na odwrót, gdy ładujemy liczbę z rejestrów koprocesora do pamięci bądź zwykłych rejestrów, możemy automatycznie ją skonwertować do jednego z formatów rozpoznawanego przez FPU.

Stos koprocesora


Kiedy odwołujemy się do rejestrów koprocesora , %st, %st(1) itd. powinniśmy mieć na uwadze przedziwny sposób w jaki koprocesor je traktuje. Mianowicie: koprocesor traktuje swoje osiem rejestrów jako jeden stos. %st0 oznacza szczyt stos, a %st7 najniżej położony element. Załadowanie z pamięci oznacza to położenie wartośći na stos, załadowanie z rejestrów koprocesora do pamięci oznacza zdjęcie wartośći ze stosu. Oznacza to, że %st wskazuje coraz to inny tak naprawdę rejestr. Jaki, możemy dowiedzieć się z słowa kontrolnego koprocesora, gdzie bity 11-13 wskazują bieżący wierzchołek stosu (liczba 0-7). Te trzy bity to pole TOP (top-of-stack). Czyli: ładując coś z pamięci do FPU, powoduję zmniejszenie TOP o 1 i następnie załadowanie liczby do rejestru wskazywanego przez TOP, czyli bieżącego %st. Jeżeli TOP wynosi binarnie 011 (decymalnie 3), to FADD %st,%st(2) tak naprawdę dodaje do siebie zawartość rejestrów trzeciego i piątego (pięć, bo st2, TOP równa się 3 , a 3+2=5). Trochę skomplikowane co?

Słowo kontrolne koprocesora .


Słowo to służy do kontroli sposobu wykonywania operacji matematycznych przez koprocesor. I tak np. bity 10 i 11 to Round Control (RC), i kolejno wartośći : 00 oznacza zaokrąglanie w kierunku najbliższej liczby maszynowej ( w przypadku równych odległości do liczby parzystej), 01 zaokrąglanie w dół (w kierunku -nieskończoność), 10 zaokrąglanie w góre (w kierunku + nieskończoność), 11 zaokrąglanie w kierunku zera. Manipulacje tymi wartościami są bardzo przydatne w matematyce interwałowej (A.Marlewski, A.Marciniak, Prodialog 7, "interwałowe reprezentacje liczb niemaszynowych w języku Object Pascal"). IC - bit sterowania nieskończonością (0 -nierozrożnianie +Nan i -Nan, 1- rozróżnianie znaku nieskończoności, (bit 12)
bit 8-9 PC sterowanie precyzją 00 krótka rzeczywiosta liczba(24 bity) 10 - 53 bity, 11- 64 bity
bity od 6 do 0: PM - maska precyzji, UM - maska niedomiaru, OM - maska nadmiaru ZM -maska dzielenia przez zero DM maska zdenormalizowanego operandu IM maska niedozwolnej operacji. Wartość 1 maski oznacza podjęcie przez koprocesor próby korekcji błedu, 0 natomiast generuje sygnał przerwania.

Słowo statusu koprocesora .


Słowo stanu koprocesora składa się z dwóch pól : pola warunków oraz pola statusu.
Pole statusu zawiera : (Bity B=15, C3=14, St=13-11, C2 -10,C1-9,C0-8,Es-7,Sf-6)
B -1 oznacza wykonywanie rozkazu przez koprocesor. W i387 i i486 równe ES
ES -Bit błędu, jedynka oznacza wystąpienie błędu w pracy
C0,C1,C2,C3- Bity kontrolne . Ustawiane są przez niektóre rozkazy koprocesora, np FCOM
SF - Bit błędu stosu. Występuje w razie zapisu wartości nieokreślonej do rejestrów stosu (przepełnienie C1=1) lub odczytania z rejestrów stosu wartości "pusty" (niedopełnienia, C1=0)
ST - wskażnik stosu
Pole warunków zawiera : (bity PE-5 IE 0)
PE-Znacznik precyzji. Równy jeden, gdy trzeba było zaokrąglać wynik
UE-Znacznik niedomiaru. Wartośc jeden oznacza że wynik jest zbyt mały by można go było poprawnie przedstawić w przyjętym formacie zmiennoprzecinkowym
OE- Znacznik nadmiaru.Wartośc jeden oznacza że wynik jest zbyt duży by można go było poprawnie przedstawić w przyjętym formacie zmiennoprzecinkowym
ZE- Znacznik dzielenia przez zero - wartość jeden oznacza dzielenie przez zero przy dzielniku różnym od zera
DE- Znacznik denormalizacji, którego wartość jeden zoancza że rozkaz usiłował wykonać operację na zdenormalizowanym operandzie.
IE-Znacznik błędnej operacji, wartość jeden pojawia się np. przy wyciąganiu pierwiastka z ujemnej liczby itp.

Tag word .


Zawiera osiem znaczników po 2 bity (TAG1=1,2 , TAg7=14,15) które ilustrują zawartość odpowiednich rejestrów zmiennoprzecinkowych (zawartość stosu) : 00 oznacza liczba poprawna, 01 prawda (zero) 10 wartość specjalna - nieskończoność, nie-liczba lub wartość zdenormalizowana, 11 - brak zawartości (pusty rejestr)

Instruction Pointer .


Dwa rejestry przechowujące adres wykonywanej instrukcji.

Data Pointer .


Dwa rejestry przechowujące adres operandu dla wykonywanej aktualnie instrukcji.