1
P
ROGRAMOWANIE ZMIENNOPRZECINKOWEJ JEDNOSTKI ARYTMETYCZNEJ
na podstawie:
W. Stanisøawski, D. Raczy ski: Programowanie systemowe mikroprocesorów rodziny x86,
PWN, 2010.
B. Drozdowski: Kurs asemblera -
http://rudy.mif.pg.gda.pl/~bogdro/dos/a_kurs05.htm
Architektura
W skøad FPU (zmiennoprzecinkowa jednostka arytmetyczna (ang. Float Point Unit) wchodzi:
osiem 80-cio bitowych rejestrów roboczych zorganizowanych w stos (R0 – R7),
16-bitowy rejestr stanu stosu (ang. Tag Field Register – TW),
rejestr sterowania (ang. Control Register - FPCR),
rejestr stanu (ang. State Register – FPSR),
rejestry adresu rozkazu (ang. Instruction Pointer – FIP) i adresu danych (ang. Data Pointer –
FDP) u ywane wyø cznie do obsøugi bø dów.
0
63
64
78
79
Mantysa
Wykøadnik
Znak
R7
R6
R5
R4
R3
R2
R1
R0
Bit
Pole
stanu
0
1
Rejestr sterowania FPCR
Rejestr stanu FPSR
Rejestr stanu stosu TW
0
15
Bit
Rejestry zmiennoprzecinkowej jednostki arytmetycznej
2
Stos rejestrów
Ka dy
rejestr
roboczy
mo e
przechowywa
liczb
zmiennoprzecinkow
w
formacie
(1-bitowy znak liczby, 15-bitowy wykøadnik oraz 64-bitowa mantysa). Rejestry robocze stanowi
o mioelementowy stos, którego aktualny wierzchoøek wskazywany jest przez 3-bitowy wska nik stosu
(ang. Stack Top Pointer), b d cy cz ci rejestru stanu (FPSR).
Rejestr znajduj cy si aktualnie na szczycie stosu okre lany jest przez ST (ang. Stack Top). Wszystkie
rozkazy FPU adresuj rejestry wzgl dem aktualnego szczytu stosu, a w j zyku assemblera u ywamy
nazw ST(i), gdzie i=0,...,7.
Odøo enie nowej warto ci na stos powoduje przesuni cie wska nika stosu (nowo odøo ona dana
znajduje si na szczycie), a rejestr b d cy poprzednio na wierzchoøku stosu (ST(0)) staje si rejestrem
ST(1).
Rejestr stanu stosu
Rejestr ten skøada si z o miu dwubitowych pól stanu, odpowiadaj cych poszczególnym rejestrom
roboczym FPU. Pole stanu mo e znale
si w jednym z czterech stanów:
00 – rejestr zawiera poprawn liczb ,
01 – rejestr zawiera liczb zero,
10 – rejestr zawiera symbol specjalny (np. NaN, Inf),
11 – rejestr jest pusty.
Rejestr sterowania
Rejestr ten zawiera bity steruj ce sposobem zaokr glania, dokøadno ci
oblicze
oraz bity
maskowania bø dów numerycznych.
(bit 12) IC - bit sterowania niesko czono ci :
0 - nierozro nianie +Nan i -Nan,
1- rozró nianie znaku niesko czono ci,
(bity 10 i 11) Round Control (RC) – bity sterowania zaokr glaniem:
00 zaokr glanie w kierunku najbli szej liczby maszynowej (0,5 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.
(bity 8-9) sterowanie precyzj (liczba bitów mantysy):
00 - krótka rzeczywista liczba (24 bity)
10 - 53 bity
11 - 64 bity
3
(bity 0-5) maskowanie bø dów numerycznych. Warto
1 maski oznacza podj cie przez koprocesor
próby korekcji bø du, 0 natomiast generuje sygnaø przerwania.
5 -> PM (Precision) - maska precyzji,
4 -> UM (Underflow) - maska niedomiaru,
3 -> OM (Overflow) - maska nadmiaru
2 -> ZM (Zero Divide) - maska dzielenia przez zero
1 -> DM (Denormalized Operand) - maska zdenormalizowanego operandu (bardzo maøe liczby)
5 -> IM maska niedozwolnej operacji.
Value in Hex Description
0C00
Rounding control mask
0C00
Truncate
0800
Round up
0400
Round down
0000
Round to nearest
0300
Precision control mask
0300
64-bit precision
0200
53-bit precision
0000
24-bit precision
003F
Exception mask
0001
Allow invalid numbers
0002
Allow denormals (very small numbers)
0004
Allow divide by zero
0008
Allow overflow
0010
Allow underflow
0020
Allow inexact precision
4
Rejestr stanu
Rejestr stanu procesora zawiera nast puj ce których ustawienie przez FPU oznacza, e podczas
wykonywania instrukcji wyst piø okre lony bø d numeryczny. Bity te odzwierciedlaj wszystkie
bø dy, które wyst piøy od momentu ich wyzerowania. Wyzerowanie wszystkich znaczników odbywa
si rozkazem FCLEX.
0 – IE (ang. Invalid Operation Exception) znacznik bø du niedozwolonej operacji,
1 – DE (ang. Denormalized Operand Exception) znacznik bø du zdenormalizowanego argumentu,
2 – ZE (ang. Zero Divide Exception) znacznik bø du dzielenia przez zero,
3 – OE (ang. Overflow Exception) znacznik bø du nadmiaru,
4 – UE (ang. Underflow Exception) znacznik bø du niedomiaru,
5 – PE (ang. Precision Exception) znacznik bø du niedokøadno ci wyniku.
6 – SF (ang. Stack Fault) znacznik bø du stosu,
7 – ES (ang. Error Summary) suma logiczna niezamaskowanych znaczników bø dów numerycznych ,
Poza znacznikami bø dów:
8,9,10,14 – C0,C1,C2,C3 (ang. Condition Code Bits) bity rodzaju wyniku ustawiane przez instrukcje
porównania,
11,12,13 – ST (ang. Stack Top Pointer) trzybitowe pole wska nika stosu,
15 – B (ang. Busy) znacznik zaj to ci FPU. Aktualnie dubluje stan bitu ES.
W wyniku porównania dwóch argumentów (instrukcje fcom itp.) ustawiane s bity rodzaju wyniku
C0...C3 (bity o numerach 8,9,10,14) w rejestrze stanu. Flagi te mo na nast pnie przenie do
rejestru flagowego procesora (poprzez rejestr AX).
FCOM
;porównanie, ustawienie bitów C0...C3
FSTSW AX
;przesøanie FPSR do AX
SAHF
;przesøanie odpowiednich bitów z AH do EFLAGS
C4
C3
C1
C0
0
7
8
15
Bity
FPSR
C4
C3
C1
C0
0
7
8
15
Bity
AX
FSTSW AX
ZF
PF
CF
0
7
8
15
Bity
EFLAGS
SAHF
5
Lista instrukcji zmiennoprzecinkowej jednostki arytmetycznej zawiera kilkadziesi t instrukcji
operuj cych na danych zmiennoprzecinkowych, caøkowitych binarnych oraz caøkowitych
dziesi tnych. Instrukcje mo na podzieli na kilka grup, a mianowicie: przesøania danych, operacje
arytmetyczne, porównania, obliczanie warto ci niektórych funkcji przest pnych oraz sterowanie.
Mnemoniki wszystkich instrukcji FPU rozpoczynaj si liter F. Je eli instrukcja dotyczy danych
zmiennoprzecinkowych, to bezpo rednio za liter F podana jest nazwa operacji (np. FADD). W
przypadku gdy operacja dotyczy danych caøkowitych, to za liter F pojawia si litera I (np. FIADD),
natomiast dla danych caøkowitych dziesi tnych – litera B (np. FBADD). Dla niektórych operacji
arytmetycznych mo na w instrukcji zmieni
kolejno
argumentów poprzez zamieszczenie w
mnemoniku instrukcji litery R (np. FSUBR, FDIVR). Je eli operacja zawiera zdj cie ze stosu wyniku
(argumentu), to mnemonik instrukcji ko czy si liter P.
1. Instrukcje przemieszczenia danych i øadowania staøych
Skøadnia instrukcji
Operacja
FLD m(32,64,80) real
ST(i)
m(32,64,80)
ST(0)
ST(i)
ST(0)
FILD m(16,32,64) int
FBLD m80bcd
m(16,32,64)
ST(0)
m80
ST(0)
FST m(32,64) real
ST(i)
FSTP m(32,64,80) real
ST(i)
ST(0)
m(32,64)
ST(0)
ST(i)
ST(0)
m(32,64,80), zwolnienie ST(0)
ST(0)
ST(i), zwolnienie ST(0)
FIST m(16,32) int
FISTP m(16,32,64) int
FBSTP m80bcd
ST(0)
m(16,32)
ST(0)
m(16,32,64), zwolnienie ST(0)
ST(0)
m80, zwolnienie ST(0)
FXCH
FXCH ST(i)
ST(0)
ST(1)
ST(0)
ST(i)
FLDZ
FLD1
FLDPI
FLDL2T
FLDL2E
FLDLG2
FLDLN2
0
ST(0)
1
ST(0)
ST(0)
log
2
10
ST(0)
log
2
e
ST(0)
log
10
2
ST(0)
log
e
2
ST(0)
6
2. Dziaøania matematyczne:
Instrukcje arytmetyczne posiadaj jeden z nast puj cych formatów: format stosowy, rejestrowy,
rejestrowy ze zdj ciem ze stosu, z argumentem w pami ci.
W formacie stosowym instrukcja arytmetyczna zapisywana jest bez argumentów, argumentami
domy lnymi s rejestry ST(0) i ST(1). Efektem wykonania instrukcji jest zast pienie dwóch
argumentów wynikiem operacji.
Format rejestrowy charakteryzuje si wyst pieniem w rozkazie dwóch argumentów, z których
jednym jest zawsze rejestr ST(0) a drugim dowolny rejestr roboczy ST(i).
W formacie rejestrowym ze zdj ciem ze stosu Po wykonaniu instrukcji, argument ródøowy jest
zdejmowany ze stosu.
Instrukcja w formacie z argumentem w pami ci wykorzystuje jako argument ródøowy komórk
pami ci o zadanym adresie, natomiast argumentem docelowym jest rejestr ST(0).
Skøadnia instrukcji
Operacja
FADD równowa ny FADDP ST(1),ST(0)
FADD ST(i),ST(0)
FADD ST(0),ST(i)
FADD m(32,64) real
ST(1) + ST(0)
ST(1), zwolnienie ST(0)
ST(i) + ST(0)
ST(i)
ST(0) + ST(i)
ST(0)
ST(0) + m(32,64)
ST(0)
FADDP ST(i),ST(0)
ST(i) + ST(0)
ST(i), zwolnienie ST(0)
FIADD m(16,32) int
ST(0) + m(16,32)
ST(0)
FSUB równowa ny FSUPB ST(1),ST(0)
FSUB ST(i),ST(0)
FSUB ST(0),ST(i)
FSUB m(32,64) real
ST(1) – ST(0)
ST(1), zwolnienie ST(0)
ST(i) – ST(0)
ST(i)
ST(0) – ST(i)
ST(0)
ST(0) – m(32,64)
ST(0)
FSUBR
FSUBR ST(i),ST(0)
FSUBR ST(0),ST(i)
FSUBR m(32,64) real
ST(0) – ST(1)
ST(1), zwolnienie ST(0)
ST(0) – ST(i)
ST(i)
ST(i) – ST(0)
ST(0)
m(32,64) – ST(0)
ST(0)
FSUBP ST(i),ST(0)
FSUBRP ST(i),ST(0)
ST(i) – ST(0)
ST(i), zwolnienie ST(0)
ST(0) – ST(i)
ST(i), zwolnienie ST(0)
FISUB m(16,32) int
FISUBR m(16,32) int
ST(0) – m(16,32)
ST(0)
m(16,32) – ST(0)
ST(0)
FMUL równowa ny FMULP ST(1),ST(0)
FMUL ST(i),ST(0)
FMUL ST(0),ST(i)
FMUL m(32,64) real
ST(0) * ST(1)
ST(1), zwolnienie ST(0)
ST(i) * ST(0)
ST(i)
ST(0) * ST(i)
ST(0)
ST(0) * m(32,64)
ST(0)
FMULP ST(i),ST(0)
ST(i) * ST(0)
ST(i), zwolnienie ST(0)
7
FIMUL m(16,32) int
ST(0) * m(16,32)
ST(0)
FDIV równowa ny FDIVP ST(1),ST(0)
FDIV ST(i),ST(0)
FDIV ST(0),ST(i)
FDIV m(32,64) real
ST(1) / ST(0)
ST(1), zwolnienie ST(0)
ST(i) / ST(0)
ST(i)
ST(0) / ST(i)
ST(0)
ST(0) / m(32,64)
ST(0)
FDIVR równowa ny FDIVP ST(1),ST(0)
FDIVR ST(i),ST(0)
FDIVR ST(0),ST(i)
FDIVR m(32,64) real
ST(0) / ST(1)
ST(1), zwolnienie ST(0)
ST(0) / ST(i)
ST(i)
ST(i) / ST(0)
ST(0)
m(32,64) /ST(0)
ST(0)
FDIVP ST(i),ST(0)
FDIVRP ST(i),ST(0)
ST(0) / ST(i)
ST(i), zwolnienie ST(0)
ST(0) / ST(i)
ST(i), zwolnienie ST(0)
FIDIV m(16,32) int
FIDIVR m(16,32) int
ST(0) / m(16,32)
ST(0)
m(16,32) / ST(0)
ST(0)
FSQRT
)
0
(
ST
ST(0)
FABS
)
0
(
ST
ST(0)
FCHS
-ST(0)
ST(0)
FPREM
st(0) = st(0) mod st(1)
3. Komendy porównania:
Instrukcje porównania porównuj argument podany w instrukcji z liczb zapisan na wierzchoøku
stosu ST(0). Argumentem instrukcji porównania mo e by rejestr roboczy ST(i), liczba
zmiennoprzecinkowa lub staøoprzecinkowa zapisana w pami ci.
Instrukcje FCOMP, FUCOMP i FICOMP po dokonaniu porównania zdejmuj ze stosu jeden
argument porównania ST(0), natomiast instrukcje FCOMPP i FUCOMPP porównuj liczby w
rejestrach ST(0) i ST(1), a nast pnie zdejmuj ze stosu obydwa argumenty.
Instrukcje FUCOM, FUCOMP oraz FUCOMPP dziaøaj analogicznie do instrukcji FCOM, FCOMP,
FCOMPP, lecz nie zgøaszaj bø du w przypadku gdy jeden z argumentów ma warto NaN.
W wyniku porównania dwóch argumentów ustawiane s bity rodzaju wyniku C0...C3 w
rejestrze stanu zmiennoprzecinkowej jednostki arytmetycznej FPSR. Po przeniesieniu zawarto ci
rejestru FPSR do rejestru AX przy pomocy instrukcji FSTSW AX, a nast pnie przepisaniu bitów
rejestru AH odpowiadaj cych znacznikom SF, ZF, AF, PF, CF do rejestru EFLAGS przy
pomocy instrukcji SAHF, mo na wykonywa instrukcje skoków warunkowych zale nie od
wyniku porównania.
W procesorach PENTIUM wprowadzono instrukcje FCOMI, FCOMIP, FUCOMI, FUCOMIP
które porównuj operandy w rejestrach ST(0) i ST(1) i ustawiaj bezpo rednio bity rejestru
flagowego EFLAGS: ZF, PF, CF, dzi ki czemu nie ma potrzeby u ywania instrukcji FSTSW
AX, oraz FAHF.
Zastosowanie instrukcji porównania i sposób wykonywania skoków warunkowych w zale no ci od
stanu bitów rodzaju wyników przedstawiono w poni szym fragmencie programu:
8
...
FCOM
;porównanie, ustawienie bitów C0...C3
FSTSW AX
;przesøanie FPSR do AX
SAHF
;przesøanie odpowiednich bitów z AH do EFLAGS
JP nieliczba
;skok przy ustawionym bicie PF
JB mniejsza
;skok je li mniejszy
JE rowna
;skok je li równy
...
wieksza:
;CF=0 i ZF=0 , ST(0) > ST(1)
...
mniejsza:
;CF=1 i ZF=0, ST(0) < ST(1)
...
rowna:
;CF=0 i ZF=1, ST(0) = ST(1)
...
nieliczba:
;PF=1, ST(0) ? ST(1)
...
Skøadnia instrukcji
Operacja
FCOM
FCOM ST(i)
FCOM m(32, 64) real
Porównanie ST(0) z ST(1)
Porównanie ST(0) z ST(i)
Porównanie ST(0) z m(32,64)
FCOMP
FCOMP ST(i)
FCOMP m(32,64) real
Porównanie ST(0) z ST(1), zwolnienie ST(0)
Porównanie ST(0) z ST(i) , zwolnienie ST(0)
Porównanie ST(0) z m(32,64), zwolnienie ST(0)
FCOMPP
Porównanie ST(0) z ST(1), zwolnienie ST(0) i ST(1)
FICOM m(16,32) int
FICOMP m(16,32) int
Porównanie ST(0) z m(16,32)
Porównanie ST(0) z m(16,32), zwolnienie ST(0)
FCOMI ST(0), ST(i)
FCOMIP ST(0), ST(i)
Porównanie ST(0) z ST(i), ustawienie ZF, PF, CF
Porównanie ST(0) z ST(i), ustawienie ZF, PF, CF
zwolnienie ST(0)
FUCOMI ST(0), ST(i)
FUCOMIP ST(0), ST(i)
Porównanie ST(0) z ST(i), ustawienie ZF, PF, CF
Porównanie ST(0) z ST(i), ustawienie ZF, PF, CF
zwolnienie ST(0)
FUCOM
FUCOM ST(i)
Porównanie ST(0) z ST(1)
Porównanie ST(0) z ST(i)
FUCOMP
FUCOMP ST(i)
Porównanie ST(0) z ST(1), zwolnienie ST(0)
Porównanie ST(0) z ST(i), zwolnienie ST(0)
FTST
Porównanie ST(0) z zerem
9
4. Instrukcje trygonometryczne:
Instrukcje te søu
do wyznaczania warto ci podstawowych funkcji trygonometrycznych,
wykøadniczych i logarytmicznych.
Skøadnia instrukcji
Operacja
FSIN
FCOS
FSINCOS
SIN(ST(0))
ST(0)
COS(ST(0))
ST(0)
SIN(ST(0))
ST(0); COS(ST(0)) ST(1)
FPTAN
FPATAN
TG(ST(0))
ST(1); 1.0 ST(0)
ARCTG(ST(1)/ST(0))
ST(0)
F2XM1
FYL2X
FYL2P1
1
2
)
0
(
ST
ST(0)
ST(1)* log
2
ST(0)
ST(0)
ST(1)* log
2
(ST(0)+1)
ST(0)
5. Instrukcje kontrolne:
o
FINIT/FNINIT - inicjalizacja FPU. Litera N po F oznacza, aby nie bra po uwag
potencjalnych niezaøatwionych wyj tków.
o
FLDCW, FSTCW/FNSTCW - Load/Store control word - zapisuje 16 kontrolnych bitów do
pami ci, gdzie mo na je zmienia np. aby zmieni sposób zaokr glania liczb.
o
FSTSW/FNSTSW - zapisz do pami ci (lub rejestru AX) søowo statusu, czyli stan FPU
o
FCLEX/FNCLEX - wyczy wyj tki
o
FLDENV, FSTENV/FNSTENV - wczytaj/zapisz rodowisko (rejestry stanu, kontrolny i
kilka innych, bez rejestrów danych). Wymaga 14 albo 28 bajtów pami ci, w zale no ci od
trybu pracy procesora (rzeczywisty - DOS lub chroniony - Windows/Linux).
o
FRSTOR, FSAVE/FNSAVE - jak wy ej, tylko e z rejestrami danych. Wymaga 94 lub 108
bajtów w pami ci, zale nie od trybu procesora.
o
FINCSTP, FDECSTP - zwi ksz/zmniejsz wska nik stosu - przesu st(0) na st(7), st(1) na
st(0) itd. oraz w drug stron , odpowiednio.
o
FFREE - zwolnij podany rejestr danych
o
FNOP - no operation.
o
WAIT/FWAIT - czekaj, a FPU sko czy prac . U ywane do synchronizacji z CPU.