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
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.
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 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 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.
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)
Dwa rejestry przechowujące adres wykonywanej instrukcji.
Dwa rejestry przechowujące adres operandu dla wykonywanej aktualnie instrukcji.