,
AKO3AKO3, Politechnika Gdańska ETI Informatyka Niestacjonarne, Sem III, Architektura komputerow
[ Pobierz całość w formacie PDF ]
Zasady kodowania instrukcji (rozkazów) ¨ wszelkie informacje w komputerze kodowane są w postaci ciągów zerojedynkowych — taka postać informacji wynika ze stosowania elementów elektronicznych, które pracują pewnie i stabilnie jako elementy dwustanowe; ¨ zatem również poszczególne instrukcje (rozkazy) programu muszą być przedstawiane w postaci ciągów zerojedynkowych; producent procesora (np. firma Intel) ustala szczegółowe zasady kodowania instrukcji, przyporządkowując każdej z nich ustalony ciąg zer i jedynek; przykładowo instrukcjom mnożenia i dzielenia przypisano następujące kody: mnożenie liczb 8-bitowych bez znaku 11110110..100 mnożenie liczb 32 (lub 16)-bitowych bez znaku 11110111..100 mnożenie liczb 8-bitowych ze znakiem 11110110..101 mnożenie liczb 32 (lub 16)-bitowych ze znakiem 11110111..101 dzielenie liczby 16-bitowej bez znaku przez liczbę 8-bitową 11110110..110 dzielenie liczby 64 (lub 32)-bitowej bez znaku przez liczbę 32 (16)-bitową 11110111..110 dzielenie liczby 16-bitowej ze znakiem przez liczbę 8-bitową 11110110..111 dzielenie liczby 64 (lub 32)-bitowej ze znakiem przez liczbę 32 (16)-bitową 11110111..111 ¨ obok kodu wykonywanej operacji instrukcja (rozkaz) zawiera także informacje o położeniu w pamięci przetwarzanych (np. mnożonych) liczb, jak również wskazania dokąd należy przesłać wynik obliczenia; 2 ¨ w niektórych typach procesorów (rzadko spotykanych) instrukcja zawiera informacje o położeniu kolejnej instrukcji, którą ma wykonać procesor — w procesorach Pentium pole to nie występuje, ponieważ położenie kolejnej instrukcji wskazuje rejestr EIP ; ¨ podsumowując, ciąg zerodynkowy opisujący instrukcję, która wykonuje operację dwuargumentową, np. dodawania A + B powinien zawierać następujące elementy (pola): 1. kod operacji (zakodowany opis wykonywanych czynności); 2. położenie pierwszego operandu ( A ); 3. położenie drugiego operandu ( B ); 4. dokąd przesłać wynik ( W ) ? 5. gdzie znajduje się kolejna instrukcja do wykonania ? (tylko wyjątkowo, jeśli w procesorze nie jest używany wskaźnik instrukcji); W ¬ ¨ w trakcie wieloletniego rozwoju informatyki opracowane najrozmaitsze sposoby kodowania instrukcji (rozkazów); w początkowym okresie rozwoju mikrokomputerów występowały silne ograniczenia sprzętowe, np. pojemność pamięci RAM wynosiła 32 KB; w tej sytuacji szczególną uwagę zwracano na możliwość kodowania programów za pomocą możliwie krótkiego kodu; 3 ¨ w celu zmniejszenia liczby bitów instrukcji w wielu procesorach, w tym także w Pentium, przyjęto różne ograniczenia: · wynik operacji przesyłany do lokacji, w której dotychczas znajdował się pierwszy operand ( A ) — w tej sytuacji pole (4) nie jest potrzebne; co najwyżej jeden operand ( A albo B ) może wskazywać na lokację pamięci, drugi operand lub oba operandy muszą wskazywać na rejestry; zauważmy, że w procesorze Pentium wskazanie pewnego bajtu pamięci w segmencie wymaga podania adresu 32-bitowego, podczas gdy wskazanie rejestru wymaga podania trzech bitów (bo jest 8 rejestrów ogólnego przeznaczenia); · ¨ w wielu przypadkach adres komórki pamięci, na której wykonywane jest działanie, wyznaczany jest w dość złożony sposób na podstawie adresu zawartego w instrukcji i zawartości rejestrów modyfikacji adresowych; zazwyczaj dostępnych jest kilka sposobów obliczania tego adresu, a sposób zastosowany w konkretnej instrukcji opisuje kilka bitów; ¨ w procesorach Pentium dla poszczególnych klas instrukcji stosowane są różne formaty kodowania; dla instrukcji (rozkazów) niesterujących istotne znaczenie ma tzw. podstawowy format rozkazu ; inne formaty stanowią często odmiany formatu podstawowego. Przypomnienie: po wykonaniu instrukcji niesterującej, jako następną procesor wykonuje instrukcję bezpośrednio przylegającą w pamięci do instrukcji właśnie wykonanej; innymi słowy: instrukcje niesterujące oddziaływują na wskaźnik instrukcji EIP wg poniższej formuły: EIP ¬ EIP + <liczba bajtów instrukcji> 4 Tryby adresowania ¨ w trybie rzeczywistym (i w trybie V86) standardowo używane są operandy 8- i 16-bitowe; jeśli jednak przed instrukcją wykonującą działanie na operandzie 16-bitowym zostanie umieszczony dodatkowy bajt 66H, to działanie zostanie wykonane na operandzie 32-bitowym; ten dodatkowy bajt nosi nazwę przedrostka rozmiaru operandu ; ¨ w trybie chronionym, bit D (czasami oznaczany także B — ang. default/big bit, dalsze wyjaśnienia zostaną podane przy omawianiu trybu chronionego) w deskryptorze segmentu kodu określa standardowy rozmiar operandów i adresów dla wszystkich instrukcji zawartych w segmencie: · D = 0 ® adresy 16-bitowe, operandy 8 lub 16 bitowe, albo D = 1 ® adresy 32-bitowe, operandy 8 lub 32 bitowe · ¨ segment kodu, w którym bit D = 0 nazywany jest segmentem 16- bitowym , jeśli zaś D = 1, to segment kodu nazywany jest segmentem 32-bitowym ; 5 ¨ w trybie chronionym istnieje również możliwość doraźnej zmiany trybu 16-bitowego na 32-bitowy lub odwrotnie: · jeśli program jest wykonywany w trybie 16-bitowym, to poprzedzenie rozkazu dodatkowym bajtem o kodzie 66H, tzw. przedrostkiem rozmiaru argumentu powoduje, że operacja zostanie wykonana na obiektach 32-bitowych (np. na rejestrze ECX ); ten sam bajt umieszczony przed instrukcją, jeśli procesor pracuje w trybie 32-bitowym powoduje, że operacja zostanie wykonana na obiektach 16-bitowych (np. na rejestrze CX ); analogiczną rolę pełni bajt o kodzie 67H ( przedrostek rozmiaru adresu ) w odniesieniu do rozmiarów adresu: jeśli procesor pracuje w trybie 16-bitowym, to poprzedzenie instrukcji bajtem 67H powoduje, że adres efektywny zostanie obliczony wg reguł dla trybu 32-bitowego, itd.; obliczony adres efektywny nie jest jeszcze adresem fizycznym — wyznaczenie adresu fizycznego w trybie chronionym wymaga wykonania dość złożonych operacji; · ¨ użycie dyrektywy .386 w typowym asemblerze powoduje, że tworzone są segmenty 32-bitowe; jeśli w takiej sytuacji potrzebny jest segment 16-bitowy, to dyrektywę SEGMENT należy zapisać w postaci nazwa SEGMENT use16 jeśli używane są dyrektywy skrócone .model , .code , .data , itd., to dyrektywa .model powinna być zapisana w postaci, np. .model use16 small ¨ rozmiar adresu odgrywa też istotną rolę w operacjach wykonywanych na stosie (np. PUSH ECX ) — i tak jeśli dla pewnej instrukcji obowiązuje adres 16-bitowy, to wierzchołek stosu dla tej instrukcji wskazuje rejestr SP , jeśli adres 32-bitowy — to rejestr ESP . [ Pobierz całość w formacie PDF ] |
Podobne
|