Rejestr stanu koprocesora
Rejestr stanu koprocesora
rejestr stanu koprocesora
rejestr stanu koprocesora
zawiera różne pola informujące o przebiegu
zawiera różne pola informujące o przebiegu
obliczeń, wystąpieniu specjalnych warunków, określa położenie
obliczeń, wystąpieniu specjalnych warunków, określa położenie
wierzchołka stosu i inne informacje
wierzchołka stosu i inne informacje
zawartość rejestru stanu koprocesora może być przesłana do rejestru
zawartość rejestru stanu koprocesora może być przesłana do rejestru
AX za pomocą rozkazu
AX za pomocą rozkazu
fstsw
fstsw
ax
ax
w języku C rejestr ten można odczytać za pomocą funkcji
w języku C rejestr ten można odczytać za pomocą funkcji
_status87
_status87
Rejestr sterujący koprocesora
Rejestr sterujący koprocesora
(1)
(1)
rejestr sterujący koprocesora
rejestr sterujący koprocesora
zawiera pola, które
zawiera pola, które
określają sposób działanie koprocesora
określają sposób działanie koprocesora
zawartość tego rejestru zmienia się wyłącznie
zawartość tego rejestru zmienia się wyłącznie
wskutek jawnego załadowania go przez program,
wskutek jawnego załadowania go przez program,
np. za pomocą rozkazu
np. za pomocą rozkazu
fldcw
fldcw
tryb_pracy
tryb_pracy
dw
dw
037FH ;
037FH ;
typowa wartość
typowa wartość
– — — – — — – — —
– — — – — — – — —
fldcw
fldcw
tryb_pracy
tryb_pracy
Rejestr sterujący koprocesora
Rejestr sterujący koprocesora
(2)
(2)
poprzez ustawienie odpowiednich bitów w tym
poprzez ustawienie odpowiednich bitów w tym
rejestrze można określić reguły zaokrąglania,
rejestrze można określić reguły zaokrąglania,
sposób reagowania koprocesora na pewne
sposób reagowania koprocesora na pewne
zdarzenia w trakcie obliczeń (np. dzielenie przez
zdarzenia w trakcie obliczeń (np. dzielenie przez
zero) i inne
zero) i inne
zawartość rejestru sterującego koprocesora można
zawartość rejestru sterującego koprocesora można
także odczytać i zapisać na poziomie języka C za
także odczytać i zapisać na poziomie języka C za
pomocą funkcji
pomocą funkcji
_control87
_control87
Rodzaje zaokrąglenia
Rodzaje zaokrąglenia
bity RC określają rodzaj stosowanego zaokrąglenia (do liczby
bity RC określają rodzaj stosowanego zaokrąglenia (do liczby
reprezentowalnej w formacie zmiennoprzecinkowym, na
reprezentowalnej w formacie zmiennoprzecinkowym, na
rysunku w postaci kropki):
rysunku w postaci kropki):
00 — zaokrąglenie do liczby najbliższej (zob. rys.)
00 — zaokrąglenie do liczby najbliższej (zob. rys.)
11 — zaokrąglenie w kierunku zera (zob. rys.)
11 — zaokrąglenie w kierunku zera (zob. rys.)
01 — zaokrąglenie w dół (w kierunku –
01 — zaokrąglenie w dół (w kierunku –
)
)
10 — zaokrąglenie w górę (w kierunku +
10 — zaokrąglenie w górę (w kierunku +
)
)
Rozkazy przesyłania danych (1)
Rozkazy przesyłania danych (1)
we wielu obliczeniach wykonywanych przez
we wielu obliczeniach wykonywanych przez
koprocesor jednym z argumentów jest rejestr
koprocesor jednym z argumentów jest rejestr
będący wierzchołkiem stosu rejestrów
będący wierzchołkiem stosu rejestrów
koprocesora
koprocesora
w operacjach przesyłania danych podstawowe
w operacjach przesyłania danych podstawowe
znaczenia mają dwa rozkazy:
znaczenia mają dwa rozkazy:
FLD
FLD
— ładowanie na wierzchołek stosu koproce-
— ładowanie na wierzchołek stosu koproce-
sora liczby zmiennoprzecinkowej pobranej z
sora liczby zmiennoprzecinkowej pobranej z
lokacji pamięci lub ze stosu koprocesora
lokacji pamięci lub ze stosu koprocesora
FST
FST
— przesłanie zawartości wierzchołka stosu
— przesłanie zawartości wierzchołka stosu
do lokacji pamięci lub do innego rejestru stosu
do lokacji pamięci lub do innego rejestru stosu
koprocesora
koprocesora
Rozkazy przesyłania danych (2)
Rozkazy przesyłania danych (2)
z
z
dq
dq
–27.6082
–27.6082
— — — — — —
— — — — — —
fld
fld
z
z
Rozkazy przesyłania danych (3)
Rozkazy przesyłania danych (3)
obok podstawowych rozkazów FLD i FST istnieje
obok podstawowych rozkazów FLD i FST istnieje
kilka odmian tych rozkazów przeznaczonych do
kilka odmian tych rozkazów przeznaczonych do
różnych zastosowań
różnych zastosowań
rozkaz FILD ładuje na wierzchołek stosu liczbę
rozkaz FILD ładuje na wierzchołek stosu liczbę
całkowitą pobraną z lokacji pamięci — przed
całkowitą pobraną z lokacji pamięci — przed
załadowaniem na stos format liczby jest
załadowaniem na stos format liczby jest
zmieniany na 80-bitowy (zmiennoprzecinkowy)
zmieniany na 80-bitowy (zmiennoprzecinkowy)
rozkaz FIST przesyła zawartość wierzchołka stosu
rozkaz FIST przesyła zawartość wierzchołka stosu
do lokacji pamięci z jednoczesnym
do lokacji pamięci z jednoczesnym
przekształceniem na format całkowity
przekształceniem na format całkowity
Rozkazy przesyłania danych (4)
Rozkazy przesyłania danych (4)
istnieją też rozkazy do przesyłania i konwersji liczb
istnieją też rozkazy do przesyłania i konwersji liczb
kodowanych w systemie BCD
kodowanych w systemie BCD
dostępnych jest kilka rozkazów, które wpisują
dostępnych jest kilka rozkazów, które wpisują
stałe matematyczne na wierzchołek stosu:
stałe matematyczne na wierzchołek stosu:
FLDZ
FLDZ
– ładowanie 0
– ładowanie 0
FLD1
FLD1
– ładowanie 1
– ładowanie 1
FLDPI
FLDPI
– ładowanie
– ładowanie
FLDL2E
FLDL2E
– ładowanie log
– ładowanie log
2
2
e
e
FLDL2T
FLDL2T
– ładowanie log
– ładowanie log
2
2
10
10
FLDLG2
FLDLG2
– ładowanie log
– ładowanie log
10
10
2
2
FLDLN2
FLDLN2
– ładowanie log
– ładowanie log
e
e
2
2
Działania arytmetyczne (1)
Działania arytmetyczne (1)
działania arytmetyczne wykonywane są przez
działania arytmetyczne wykonywane są przez
rozkazy:
rozkazy:
FADD
FADD
dodawanie
dodawanie
FSUB
FSUB
odejmowanie
odejmowanie
FMUL
FMUL
mnożenie
mnożenie
FDIV
FDIV
dzielenie
dzielenie
na operandach oznaczonych jako <źródło> i <cel>
na operandach oznaczonych jako <źródło> i <cel>
— rezultat wpisywany jest do <cel>
— rezultat wpisywany jest do <cel>
podstawowy format jest następujący:
podstawowy format jest następujący:
<cel>
<cel>
<cel>
<cel>
{
{
+,
+,
–
–
,
,
*
*
, /
, /
}
}
źródło
źródło
pierwszy operand
pierwszy operand
drugi operand
drugi operand
Działania arytmetyczne (2)
Działania arytmetyczne (2)
we wszystkich przypadkach jednym z operandów
we wszystkich przypadkach jednym z operandów
musi być wierzchołek stosu
musi być wierzchołek stosu
przykładowo rozkaz
przykładowo rozkaz
FDIV
FDIV
ST(5), ST(0)
ST(5), ST(0)
wykonuje obliczenie
wykonuje obliczenie
ST(0)
ST(5)
ST(5)
Wartości specjalne w koprocesorze
Wartości specjalne w koprocesorze
arytmetycznym (1)
arytmetycznym (1)
złożone obliczenia numeryczne trwają czasami
złożone obliczenia numeryczne trwają czasami
wiele godzin czy nawet dni
wiele godzin czy nawet dni
wystąpienie nadmiaru lub niedomiaru nie
wystąpienie nadmiaru lub niedomiaru nie
powinno powodować załamania programu
powinno powodować załamania programu
(praktyka wskazuje, że w złożonych obliczeniach
(praktyka wskazuje, że w złożonych obliczeniach
wyniki pośrednie z nadmiarem czy niedomiarem
wyniki pośrednie z nadmiarem czy niedomiarem
często mają niewielki wpływ na wynik końcowy)
często mają niewielki wpływ na wynik końcowy)
Wartości specjalne w koprocesorze
Wartości specjalne w koprocesorze
arytmetycznym (2)
arytmetycznym (2)
spośród dopuszczalnych wartości liczb wyłączono
spośród dopuszczalnych wartości liczb wyłączono
niektóre i nadano im znaczenie specjalne — takie
niektóre i nadano im znaczenie specjalne — takie
liczby określane są terminem
liczby określane są terminem
wartości specjalne
wartości specjalne
wartości specjalne mogą być argumentami
wartości specjalne mogą być argumentami
obliczeń tak jak zwykłe liczby — jeśli jeden z
obliczeń tak jak zwykłe liczby — jeśli jeden z
argumentów jest wartością specjalną, to wynik
argumentów jest wartością specjalną, to wynik
jest też wartością specjalną
jest też wartością specjalną
w koprocesorze arytmetycznym przyjęto, że
w koprocesorze arytmetycznym przyjęto, że
wszystkie liczby, których pole wykładnika zawiera
wszystkie liczby, których pole wykładnika zawiera
same zera lub same jedynki traktowane są jako
same zera lub same jedynki traktowane są jako
wartości specjalne
wartości specjalne
Wartości specjalne w koprocesorze
Wartości specjalne w koprocesorze
arytmetycznym (3)
arytmetycznym (3)
w szczególności wyróżnia się następujące
w szczególności wyróżnia się następujące
wartości specjalne
wartości specjalne
liczba 0 (pole mantysy i wykładnika zawiera
liczba 0 (pole mantysy i wykładnika zawiera
wyłącznie bity o wartości 0)
wyłącznie bity o wartości 0)
nieskończoność (pole mantysy zawiera same
nieskończoność (pole mantysy zawiera same
zera, pole wykładnika zawiera same jedynki)
zera, pole wykładnika zawiera same jedynki)
liczby z niedomiarem (pole wykładnika zawiera
liczby z niedomiarem (pole wykładnika zawiera
same zera, pole mantysy zawiera jest rózne od
same zera, pole mantysy zawiera jest rózne od
zera)
zera)
nieliczby (NaN) (pole wykładnika zawiera same
nieliczby (NaN) (pole wykładnika zawiera same
jedynki, pole mantysy jest różne od zera)
jedynki, pole mantysy jest różne od zera)
Wartości specjalne w koprocesorze
Wartości specjalne w koprocesorze
arytmetycznym (4)
arytmetycznym (4)
w zależności od ustawienia bitów w rejestrze
w zależności od ustawienia bitów w rejestrze
sterującym koprocesora, wystąpienie wartości
sterującym koprocesora, wystąpienie wartości
specjalnej może powodować generowanie wyjątku
specjalnej może powodować generowanie wyjątku
koprocesora, albo też obliczenia mogą być
koprocesora, albo też obliczenia mogą być
kontynuowane
kontynuowane
Przykład — obliczanie rezystancji
Przykład — obliczanie rezystancji
wypadkowej (1)
wypadkowej (1)
wartość rezystancji R dla podanego układu można
wartość rezystancji R dla podanego układu można
wyznaczyć z zależności
wyznaczyć z zależności
3
2
1
R
1
R
1
R
1
1
R
Przykład — obliczanie rezystancji
Przykład — obliczanie rezystancji
wypadkowej (2)
wypadkowej (2)
jeśli jedna z rezystancji ma wartość 0, to wystąpi
jeśli jedna z rezystancji ma wartość 0, to wystąpi
dzielenie przez 0, a w ślad za tym koprocesor
dzielenie przez 0, a w ślad za tym koprocesor
wygeneruje wyjątek
wygeneruje wyjątek
jeśli jednak przez rozpoczęciem obliczeń do bitu
jeśli jednak przez rozpoczęciem obliczeń do bitu
ZM
ZM
w rejestrze sterującym koprocesora zostanie
w rejestrze sterującym koprocesora zostanie
wpisane 1, to wyjątek nie wystąpi, a wynikiem
wpisane 1, to wyjątek nie wystąpi, a wynikiem
dzielenia będzie wartość specjalna
dzielenia będzie wartość specjalna
„nieskończoność” (same jedynki w polu
„nieskończoność” (same jedynki w polu
wykładnika, same zera w polu mantysy)
wykładnika, same zera w polu mantysy)
zatem, zamaskowanie wyjątku "dzielenie przez
zatem, zamaskowanie wyjątku "dzielenie przez
zero" pozwala na poprawne obliczenie rezystancji
zero" pozwala na poprawne obliczenie rezystancji
R podanego układu, także w przypadku, gdy
R podanego układu, także w przypadku, gdy
wartość rezystancji R1 lub R2 lub R3 wynosi 0
wartość rezystancji R1 lub R2 lub R3 wynosi 0
Niedokładny wynik
Niedokładny wynik
charakterystycznym przykładem wyjątku, który
charakterystycznym przykładem wyjątku, który
prawie zawsze jest maskowany jest
prawie zawsze jest maskowany jest
niedokładny
niedokładny
wynik
wynik
, który sygnalizowany jest przez ustawienie
, który sygnalizowany jest przez ustawienie
bitu PE (ang. precision exception)
bitu PE (ang. precision exception)
wyjątek
wyjątek
niedokładny wynik
niedokładny wynik
powstaje, gdy wynik
powstaje, gdy wynik
operacji nie może być dokładnie przedstawiony w
operacji nie może być dokładnie przedstawiony w
żądanym formacie, np. liczba
żądanym formacie, np. liczba
1/3 = (0.010101...)
1/3 = (0.010101...)
2
2
ma okresowe nieskończone rozwinięcie binarne i
ma okresowe nieskończone rozwinięcie binarne i
nie może przedstawiona dokładnie w postaci
nie może przedstawiona dokładnie w postaci
liczby zmiennoprzecinkowej, w której mantysa
liczby zmiennoprzecinkowej, w której mantysa
zajmuje ustaloną liczbę bitów
zajmuje ustaloną liczbę bitów
Niedozwolona operacja
Niedozwolona operacja
wyjątek
wyjątek
niedozwolona operacja
niedozwolona operacja
powstaje, gdy niemożliwe jest
powstaje, gdy niemożliwe jest
żadne inne działanie, np. próba obliczenia pierwiastka z liczby
żadne inne działanie, np. próba obliczenia pierwiastka z liczby
ujemnej, próba użycia pustego rejestru stosu
ujemnej, próba użycia pustego rejestru stosu
jeśli bit IE jest zamaskowany (tj. IM = 1), to wynikiem operacji
jeśli bit IE jest zamaskowany (tj. IM = 1), to wynikiem operacji
jest
jest
nieliczba
nieliczba
– NaN (ang. Not a Number)
– NaN (ang. Not a Number)
przykładowo, jeśli bit IE jest zamaskowany, to rozkaz FSQRT dla
przykładowo, jeśli bit IE jest zamaskowany, to rozkaz FSQRT dla
operandu –2 daje wynik:
operandu –2 daje wynik:
Zasady kodowania
Zasady kodowania
instrukcji (rozkazów) (1)
instrukcji (rozkazów) (1)
wszelkie informacje w komputerze kodowane są w
wszelkie informacje w komputerze kodowane są w
postaci ciągów zerojedynkowych — taka postać
postaci ciągów zerojedynkowych — taka postać
informacji wynika ze stosowania elementów
informacji wynika ze stosowania elementów
elektronicznych, które pracują pewnie i stabilnie
elektronicznych, które pracują pewnie i stabilnie
jako elementy dwustanowe
jako elementy dwustanowe
zatem również poszczególne instrukcje programu
zatem również poszczególne instrukcje programu
muszą być przedstawiane w postaci ciągów zero-
muszą być przedstawiane w postaci ciągów zero-
jedynkowych; producent procesora (np. firma Intel)
jedynkowych; producent procesora (np. firma Intel)
ustala szczegółowe zasady kodowania rozkazów,
ustala szczegółowe zasady kodowania rozkazów,
przyporządkowując każdemu z nich ustalony ciąg
przyporządkowując każdemu z nich ustalony ciąg
zer i jedynek; przykładowo rozkazom mnożenia i
zer i jedynek; przykładowo rozkazom mnożenia i
dzielenia przypisano następujące kody:
dzielenia przypisano następujące kody:
Zasady kodowania
Zasady kodowania
instrukcji (rozkazów) (2)
instrukcji (rozkazów) (2)
mnożenie liczb 8-bitowych bez znaku 11110110..100
mnożenie liczb 8-bitowych bez znaku 11110110..100
mnożenie liczb 32 (lub 16)-bitowych bez znaku 11110111..100
mnożenie liczb 32 (lub 16)-bitowych bez znaku 11110111..100
mnożenie liczb 8-bitowych ze znakiem 11110110..101
mnożenie liczb 8-bitowych ze znakiem 11110110..101
mnożenie liczb 32 (lub 16)-bitowych ze znakiem 11110111..101
mnożenie liczb 32 (lub 16)-bitowych ze znakiem 11110111..101
dzielenie liczby 16-bitowej bez znaku przez liczbę 8-bitową
dzielenie liczby 16-bitowej bez znaku przez liczbę 8-bitową
11110110..110
11110110..110
dzielenie liczby 64 (lub 32)-bitowej bez znaku przez liczbę 32
dzielenie liczby 64 (lub 32)-bitowej bez znaku przez liczbę 32
(16)-bitową 11110111..110
(16)-bitową 11110111..110
dzielenie liczby 16-bitowej ze znakiem przez liczbę 8-bitową
dzielenie liczby 16-bitowej ze znakiem przez liczbę 8-bitową
11110110..111
11110110..111
dzielenie liczby 64 (lub 32)-bitowej ze znakiem przez liczbę 32
dzielenie liczby 64 (lub 32)-bitowej ze znakiem przez liczbę 32
(16)-bitową 11110111..111
(16)-bitową 11110111..111
Kodowanie operacji
Kodowanie operacji
dwuargumentowych (1)
dwuargumentowych (1)
ciąg zerojedynkowy opisujący instrukcję, która
ciąg zerojedynkowy opisujący instrukcję, która
wykonuje operację dwuargumentową, np.
wykonuje operację dwuargumentową, np.
dodawania W
dodawania W
A + B
A + B
powinien zawierać następujące elementy (pola):
powinien zawierać następujące elementy (pola):
1.
1.
kod operacji (zakodowany opis wykonywanych
kod operacji (zakodowany opis wykonywanych
czynności)
czynności)
2.
2.
położenie pierwszego operandu (A)
położenie pierwszego operandu (A)
3.
3.
położenie drugiego operandu (B)
położenie drugiego operandu (B)
4.
4.
informacje dokąd przesłać wynik (W)
informacje dokąd przesłać wynik (W)
5.
5.
gdzie znajduje się kolejna instrukcja do
gdzie znajduje się kolejna instrukcja do
wykonania ? (tylko wyjątkowo, jeśli w procesorze
wykonania ? (tylko wyjątkowo, jeśli w procesorze
nie jest używany wskaźnik instrukcji)
nie jest używany wskaźnik instrukcji)
Kodowanie operacji
Kodowanie operacji
dwuargumentowych (2)
dwuargumentowych (2)
konstruktorzy procesorów, wybierając sposób
konstruktorzy procesorów, wybierając sposób
kodowania rozkazów, zwracają szczególną uwagę
kodowania rozkazów, zwracają szczególną uwagę
na możliwość kodowania programów za pomocą
na możliwość kodowania programów za pomocą
możliwie krótkiego kodu
możliwie krótkiego kodu
w celu zmniejszenia liczby bitów rozkazu w wielu
w celu zmniejszenia liczby bitów rozkazu w wielu
procesorach, w tym także w architekturze IA–32,
procesorach, w tym także w architekturze IA–32,
przyjęto różne ograniczenia:
przyjęto różne ograniczenia:
1. wynik operacji przesyłany do lokacji, w której
1. wynik operacji przesyłany do lokacji, w której
dotychczas znajdował się pierwszy operand (A)
dotychczas znajdował się pierwszy operand (A)
Kodowanie operacji
Kodowanie operacji
dwuargumentowych (3)
dwuargumentowych (3)
2. co najwyżej jeden operand (A albo B) może
2. co najwyżej jeden operand (A albo B) może
wskazywać na lokację pamięci, drugi operand lub
wskazywać na lokację pamięci, drugi operand lub
oba operandy muszą wskazywać na rejestry
oba operandy muszą wskazywać na rejestry
3. położenie lokacji pamięci może być określone
3. położenie lokacji pamięci może być określone
przez zawartość rejestru (modyfikacji adresowej)
przez zawartość rejestru (modyfikacji adresowej)
Podstawowy format
Podstawowy format
rozkazu w architekturze
rozkazu w architekturze
IA–32 (1)
IA–32 (1)
W architekturze IA–32 zdefiniowano kilkanaście
W architekturze IA–32 zdefiniowano kilkanaście
formatów rozkazów sterujących (skoków) i
formatów rozkazów sterujących (skoków) i
niesterujących
niesterujących
formaty rozkazów niesterujących wywodzą się z
formaty rozkazów niesterujących wywodzą się z
tzw. formatu podstawowego
tzw. formatu podstawowego
Podstawowy format
Podstawowy format
rozkazu w architekturze
rozkazu w architekturze
IA–32 (2)
IA–32 (2)
Trzybitowe pole
Trzybitowe pole
reg
reg
identyfikuje rejestr procesora, w
identyfikuje rejestr procesora, w
którym znajduje się jeden z operandów
którym znajduje się jeden z operandów
Jeśli przed kodem rozkazu zostanie umieszczony
Jeśli przed kodem rozkazu zostanie umieszczony
dodatkowy bajt 66H (
dodatkowy bajt 66H (
przedrostek rozmiaru operandu
przedrostek rozmiaru operandu
),
),
to działanie zostanie wykonane na operandzie 16-
to działanie zostanie wykonane na operandzie 16-
bitowym (a nie na 32-bitowym)
bitowym (a nie na 32-bitowym)
reg
000
001
010
011
100
101
110
111
w = 0
AL
CL
DL
BL
AH
CH
DH
BH
w = 1
AX
CX
DX
BX
SP
BP
SI
DI
w = 1
EAX
ECX
EDX
EBX
ESP
EBP
ESI
EDI
Podstawowy format
Podstawowy format
rozkazu w architekturze
rozkazu w architekturze
IA–32 (3)
IA–32 (3)
Drugi operand może znajdować się także w
Drugi operand może znajdować się także w
rejestrze (gdy dwubitowe pole
rejestrze (gdy dwubitowe pole
mod=11
mod=11
) — w
) — w
takim przypadku kod rejestru podany jest w 3-
takim przypadku kod rejestru podany jest w 3-
bitowym polu
bitowym polu
r/m
r/m
przyjęty sposób kodowania, w zależności od stanu
przyjęty sposób kodowania, w zależności od stanu
bitu d umożliwia przesłanie wyniku do:
bitu d umożliwia przesłanie wyniku do:
•
obiektu wskazanego przez pole r/m, gdy
obiektu wskazanego przez pole r/m, gdy
d = 0
d = 0
;
;
•
obiektu wskazanego przez pole reg, gdy
obiektu wskazanego przez pole reg, gdy
d = 1
d = 1
;
;
Podstawowy format
Podstawowy format
rozkazu w architekturze
rozkazu w architekturze
IA–32 (4)
IA–32 (4)
Drugi operand może znajdować się także w
Drugi operand może znajdować się także w
rejestrze (gdy dwubitowe pole
rejestrze (gdy dwubitowe pole
mod=11
mod=11
) — w
) — w
takim przypadku kod rejestru podany jest w 3-
takim przypadku kod rejestru podany jest w 3-
bitowym polu
bitowym polu
r/m
r/m
Jeśli drugi operand znajduje się w lokacji pamięci
Jeśli drugi operand znajduje się w lokacji pamięci
(gdy pole mod=00,01,10), to pole
(gdy pole mod=00,01,10), to pole
r/m
r/m
określa
określa
sposób obliczania adresu efektywnego wg
sposób obliczania adresu efektywnego wg
podanej tablicy
podanej tablicy
Podstawowy format
Podstawowy format
rozkazu w architekturze
rozkazu w architekturze
IA–32 (5)
IA–32 (5)
Podstawowy format
Podstawowy format
rozkazu w architekturze
rozkazu w architekturze
IA–32 (6)
IA–32 (6)
Pole
Pole
mod
mod
określa długość (liczbę bajtów) pola
określa długość (liczbę bajtów) pola
przesunięcia
przesunięcia
w przypadku mod=00 pole przesunięcie nie
w przypadku mod=00 pole przesunięcie nie
występuje, gdy mod = 01, to pole przesunięcia
występuje, gdy mod = 01, to pole przesunięcia
jest 1-bajtowe, a gdy mod = 10, to pole
jest 1-bajtowe, a gdy mod = 10, to pole
przesunięcia jest 4-bajtowe
przesunięcia jest 4-bajtowe
Kodowanie złożonych
Kodowanie złożonych
schematów adresowania
schematów adresowania
(1)
(1)
W architekturze IA–32 wartość wyrażenia
W architekturze IA–32 wartość wyrażenia
adresowego rozkazu może zależeć od zawartości
adresowego rozkazu może zależeć od zawartości
dwóch rejestrów modyfikacji adresowych, np.
dwóch rejestrów modyfikacji adresowych, np.
add
add
edx, tablica[ebx+esi]
edx, tablica[ebx+esi]
Kodowanie takich rozkazów wymaga
Kodowanie takich rozkazów wymaga
wprowadzenia dodatkowego bajtu oznaczonego
wprowadzenia dodatkowego bajtu oznaczonego
symbolem
symbolem
SIB
SIB
Obecność tego bajtu wskazuje pole
Obecność tego bajtu wskazuje pole
r/m=100
r/m=100
(w
(w
drugim bajcie)
drugim bajcie)
Kodowanie złożonych
Kodowanie złożonych
schematów adresowania
schematów adresowania
(2)
(2)
Pole
Pole
base
base
(3 bity) określa pierwszy rejestr
(3 bity) określa pierwszy rejestr
modyfikacji, a pole
modyfikacji, a pole
index
index
(3 bity) określa drugi
(3 bity) określa drugi
rejestr modyfikacji
rejestr modyfikacji
Pole
Pole
ss
ss
(2 bity) określa współczynnik skalowania,
(2 bity) określa współczynnik skalowania,
np.
np.
sub
sub
wyniki[ecx+edi*4], bx
wyniki[ecx+edi*4], bx
Kodowanie złożonych
Kodowanie złożonych
schematów adresowania
schematów adresowania
(3)
(3)
Jeśli występuje bajt SIB, to w trakcie obliczania
Jeśli występuje bajt SIB, to w trakcie obliczania
wartości adresu efektywnego zawartość drugiego
wartości adresu efektywnego zawartość drugiego
rejestru modyfikacji jest mnożona przez
rejestru modyfikacji jest mnożona przez
współczynnik skalowania, który przyjmuje
współczynnik skalowania, który przyjmuje
wartości: 1 (gdy ss=00), 2 (gdy ss=01), 4 (gdy
wartości: 1 (gdy ss=00), 2 (gdy ss=01), 4 (gdy
ss=10), 8 (gdy ss=11). np.
ss=10), 8 (gdy ss=11). np.
Przypadki szczególne
Przypadki szczególne
kodowania (1)
kodowania (1)
W podanej wcześniej tabeli wymieniono 8 różnych
W podanej wcześniej tabeli wymieniono 8 różnych
sposobów obliczania adresu efektywnego, ale w
sposobów obliczania adresu efektywnego, ale w
każdym z nich zawartość pola przesunięcie jest
każdym z nich zawartość pola przesunięcie jest
sumowana z zawartością jakiegoś rejestru
sumowana z zawartością jakiegoś rejestru
w praktyce programowania zdarza się dość
w praktyce programowania zdarza się dość
często, że adres lokacji pamięci, na której ma być
często, że adres lokacji pamięci, na której ma być
wykonana operacja podany jest w polu
wykonana operacja podany jest w polu
przesunięcie i nie potrzeba do niego niczego
przesunięcie i nie potrzeba do niego niczego
dodawać — wydaje się, że konstruktorzy
dodawać — wydaje się, że konstruktorzy
procesora nie uwzględnili tego przypadku
procesora nie uwzględnili tego przypadku
Przypadki szczególne
Przypadki szczególne
kodowania (2)
kodowania (2)
Powstałą sytuację rozwiązano poprzez
Powstałą sytuację rozwiązano poprzez
wprowadzenie przypadku specjalnego: gdy pola
wprowadzenie przypadku specjalnego: gdy pola
mod=00
mod=00
i
i
r/m=101
r/m=101
, to adres efektywny
, to adres efektywny
określony jest wyłącznie przez zawartość 32-
określony jest wyłącznie przez zawartość 32-
bitowego pola przesunięcie (modyfikacja
bitowego pola przesunięcie (modyfikacja
adresowa nie występuje)
adresowa nie występuje)
Przykłady kodowania (1)
Przykłady kodowania (1)
Przykłady kodowania (2)
Przykłady kodowania (2)