Architektura zestawu instrukcji - Instruction set architecture

W informatyce , zestaw instrukcji architektury ( ISA ), zwany także architektura komputer , to abstrakcyjny model z komputerem . Urządzenie, które wykonuje instrukcje opisane przez ten ISA, takie jak jednostka centralna (CPU), nazywa się implementacją .

Ogólnie rzecz biorąc, ISA definiuje obsługiwane instrukcje , typy danych , rejestry , sprzętową obsługę zarządzania pamięcią główną , podstawowe cechy (takie jak spójność pamięci , tryby adresowania , pamięć wirtualna ) oraz model wejścia/wyjścia rodziny implementacji MSRF.

ISA określa zachowanie kodu maszynowego działającego na implementacjach tego ISA w sposób, który nie zależy od cech tej implementacji, zapewniając binarną zgodność między implementacjami. Umożliwia to wiele implementacji ISA, które różnią się cechami, takimi jak wydajność , rozmiar fizyczny i koszt pieniężny (między innymi), ale które są w stanie uruchomić ten sam kod maszynowy, dzięki czemu maszyna o niższej wydajności i tańszych kosztach może być zastąpione droższą, wydajniejszą maszyną bez konieczności wymiany oprogramowania. Umożliwia także ewolucję mikroarchitektur implementacji tego ISA, dzięki czemu nowsza, wydajniejsza implementacja ISA może uruchamiać oprogramowanie działające na poprzednich generacjach implementacji.

Jeśli system operacyjny utrzymuje standardowy i zgodny interfejs binarny aplikacji (ABI) dla określonego programu ISA, kod maszynowy będzie działał w przyszłych implementacjach tego programu ISA i systemu operacyjnego. Jeśli jednak program ISA obsługuje uruchamianie wielu systemów operacyjnych, nie gwarantuje, że kod maszynowy jednego systemu operacyjnego będzie działał w innym systemie operacyjnym, chyba że pierwszy system operacyjny obsługuje uruchamianie kodu maszynowego utworzonego dla innego systemu operacyjnego.

ISA można rozszerzyć, dodając instrukcje lub inne możliwości lub dodając obsługę większych adresów i wartości danych; implementacja rozszerzonego ISA nadal będzie mogła wykonywać kod maszynowy dla wersji ISA bez tych rozszerzeń. Kod maszynowy korzystający z tych rozszerzeń będzie działał tylko w implementacjach, które obsługują te rozszerzenia.

Kompatybilność binarna, którą zapewniają, sprawia, że ​​ISA są jedną z najbardziej podstawowych abstrakcji w informatyce .

Przegląd

Architektura zestawu instrukcji różni się od mikroarchitektury , która jest zbiorem technik projektowania procesora stosowanych w konkretnym procesorze do implementacji zestawu instrukcji. Procesory z różnymi mikroarchitekturami mogą mieć wspólny zestaw instrukcji. Na przykład, Intel Pentium i Advanced Micro Devices Athlon implementują prawie identyczne wersje zestawu instrukcji x86 , ale mają radykalnie różne konstrukcje wewnętrzne.

Koncepcja architektury , odrębna od projektu konkretnej maszyny, została opracowana przez Freda Brooksa w IBM w fazie projektowania System/360 .

Przed powstaniem NPL [System/360] projektanci komputerowi firmy mogli swobodnie realizować cele dotyczące kosztów nie tylko poprzez dobór technologii, ale także poprzez kształtowanie udoskonaleń funkcjonalnych i architektonicznych. W przeciwieństwie do tego, cel dotyczący kompatybilności SPREAD zakładał pojedynczą architekturę dla serii pięciu procesorów o szerokim zakresie kosztów i wydajności. Żaden z pięciu inżynierskich zespołów projektowych nie mógł liczyć na możliwość wprowadzenia zmian w specyfikacjach architektonicznych jako sposobu na złagodzenie trudności w osiąganiu celów dotyczących kosztów i wydajności.

Niektóre maszyny wirtualne , że wsparcie kodu bajtowego jako ISA takich jak Smalltalk , na maszynie wirtualnej Java i Microsoft „s Common Language Runtime , wdrożyć to tłumacząc kodu bajtowego dla powszechnie używanych ścieżek kod do natywnego kodu maszynowego. Ponadto te maszyny wirtualne wykonują rzadziej używane ścieżki kodu poprzez interpretację (patrz: Kompilacja just-in-time ). Transmeta zaimplementowała w ten sposób zestaw instrukcji x86 na procesorach VLIW .

Klasyfikacja MSRF

MSRF można klasyfikować na wiele różnych sposobów. Powszechną klasyfikacją jest złożoność architektoniczna . Komputer złożonego zestawu instrukcji (CISC) ma wiele instrukcji specjalistycznych, z których niektóre mogą być rzadko używane w programach praktycznych. Komputer ze zredukowanym zestawem instrukcji (RISC) upraszcza procesor, skutecznie implementując tylko instrukcje, które są często używane w programach, podczas gdy mniej powszechne operacje są implementowane jako podprogramy, których wynikowy dodatkowy czas wykonania procesora jest przesunięty przez rzadkie użycie.

Inne typy obejmują architektury z bardzo długimi słowami rozkazów (VLIW) oraz ściśle powiązane architektury z długimi słowami rozkazów (LIW) i jawnie równoległe architektury przetwarzania rozkazów (EPIC). Te architektury starają się wykorzystać równoległość na poziomie instrukcji przy mniejszej ilości sprzętu niż RISC i CISC, czyniąc kompilator odpowiedzialnym za wydawanie instrukcji i planowanie.

Badano architektury o jeszcze mniejszej złożoności, takie jak komputer z minimalnym zestawem instrukcji (MISC) i jeden komputer z zestawem instrukcji (OISC). Są to teoretycznie ważne typy, ale nie zostały skomercjalizowane.

Instrukcje

Język maszynowy jest zbudowany z oddzielnych instrukcji lub instrukcji . Na architekturze przetwarzania dana instrukcja może określać:

  • opcode (instrukcja do wykonania) np. dodaj, skopiuj, test
  • wszelkie jawne operandy:
rejestry
wartości dosłowne/stałe
tryby adresowania używane do dostępu do pamięci

Bardziej złożone operacje są tworzone przez połączenie tych prostych instrukcji, które są wykonywane sekwencyjnie lub w inny sposób, zgodnie z instrukcjami przepływu sterowania .

Rodzaje instrukcji

Przykłady operacji wspólnych dla wielu zestawów instrukcji obejmują:

Obsługa danych i operacje pamięciowe

  • Ustaw do rejestru na stałą wartość stałą.
  • Skopiuj dane z komórki pamięci lub rejestru do komórki pamięci lub rejestru (instrukcja maszynowa jest często nazywana move ; jednak termin ten jest mylący). Służy do przechowywania zawartości rejestru, wyniku obliczeń lub do pobierania przechowywanych danych w celu późniejszego wykonania obliczeń. Często nazywane operacjami ładowania i przechowywania .
  • Odczytuj i zapisuj dane z urządzeń sprzętowych.

Logiczne i arytmetyczne operacje

  • Dodać , odjąć , pomnożyć lub podzielić wartości dwóch rejestrów , umieszczając wynik w rejestrze , ewentualnie ustawiając jeden lub więcej kodów warunków w rejestrze stanu .
    • przyrost ,dekrementacja w niektórych ISA, oszczędzając pobieranie operandu w trywialnych przypadkach.
  • Wykonuj operacje bitowe , np. biorąc koniunkcję i alternatywę odpowiednich bitów w parze rejestrów, biorąc negację każdego bitu w rejestrze.
  • Porównaj dwie wartości w rejestrach (na przykład, aby sprawdzić, czy jedna jest mniejsza lub czy są równe).
  • Instrukcja zmiennoprzecinkową sdla arytmetyka na liczbach zmiennoprzecinkowych.

Kontroluj operacje przepływu

  • Przejdź do innej lokalizacji w programie i wykonaj tam instrukcje.
  • Warunkowo rozgałęziaj się do innej lokalizacji, jeśli spełniony jest określony warunek.
  • Pośrednio oddział do innej lokalizacji.
  • Wywołaj kolejny blok kodu, jednocześnie zapisując lokalizację następnej instrukcji jako punkt do powrotu.

Instrukcje koprocesora

  • Ładowanie/przechowywanie danych do iz koprocesora lub wymiana z rejestrami procesora.
  • Wykonywanie operacji koprocesorowych.

Złożone instrukcje

Procesory mogą zawierać „złożone” instrukcje w swoim zestawie instrukcji. Pojedyncza „złożona” instrukcja robi coś, co może wymagać wielu instrukcji na innych komputerach. Takie instrukcje są typowane przez instrukcje, które wykonują wiele kroków, kontrolują wiele jednostek funkcjonalnych lub w inny sposób pojawiają się na większą skalę niż większość prostych instrukcji realizowanych przez dany procesor. Niektóre przykłady „złożonych” instrukcji obejmują:

Instrukcje złożone są bardziej powszechne w zestawach instrukcji CISC niż w zestawach instrukcji RISC, ale zestawy instrukcji RISC również mogą je zawierać. Zestawy instrukcji RISC generalnie nie zawierają operacji ALU z operandami pamięci lub instrukcji do przenoszenia dużych bloków pamięci, ale większość zestawów instrukcji RISC zawiera instrukcje SIMD lub wektorowe, które wykonują te same operacje arytmetyczne na wielu fragmentach danych w tym samym czasie. Instrukcje SIMD mają możliwość manipulowania dużymi wektorami i macierzami w minimalnym czasie. Instrukcje SIMD umożliwiają łatwą równoległość algorytmów powszechnie zaangażowanych w przetwarzanie dźwięku, obrazu i wideo. Różne implementacje SIMD zostały wprowadzone na rynek pod nazwami handlowymi, takimi jak MMX , 3DNow! i AltiVec .

Kodowanie instrukcji

Jedna instrukcja może mieć kilka pól, które identyfikują operację logiczną, a także mogą zawierać adresy źródłowe i docelowe oraz wartości stałe. Jest to instrukcja MIPS "Add Immediate", która umożliwia wybór rejestrów źródłowych i docelowych oraz włączenie małej stałej.

W tradycyjnych architekturach instrukcja zawiera kod operacyjny, który określa operację do wykonania, taką jak dodanie zawartości pamięci do rejestru — oraz zero lub więcej specyfikatorów operandów , które mogą określać rejestry , lokalizacje pamięci lub dane literałowe. Specyfikatory operandów mogą mieć tryby adresowania określające ich znaczenie lub mogą znajdować się w stałych polach. W architekturach z bardzo długimi słowami instrukcji (VLIW), które obejmują wiele architektur mikrokodów , w jednej instrukcji określa się wiele jednoczesnych kodów operacyjnych i operandów.

Niektóre egzotyczne zestawy instrukcji nie mają pola kodu operacji, takie jak architektura wyzwalana transportem (TTA), tylko operand(y).

Maszyna wirtualna Forth i innych „ 0 argumentu ” zestawy instrukcji brak jakichkolwiek operandów pola specifier, takich jak niektóre maszyna stosowa tym NOSC.

Instrukcje warunkowe często mają pole predykatu — kilka bitów, które kodują określony warunek, aby spowodować wykonanie operacji, a nie jej niewykonanie. Na przykład, instrukcja rozgałęzienia warunkowego przekaże kontrolę, jeśli warunek jest prawdziwy, tak że wykonanie przechodzi do innej części programu, a nie przekaże kontroli, jeśli warunek jest fałszywy, tak że wykonanie będzie kontynuowane sekwencyjnie. Niektóre zestawy instrukcji mają również ruchy warunkowe, tak że ruch zostanie wykonany, a dane przechowywane w lokalizacji docelowej, jeśli warunek jest prawdziwy i niewykonany, oraz lokalizacja docelowa niezmodyfikowana, jeśli warunek jest fałszywy. Podobnie IBM z/Architecture ma instrukcję warunkowego przechowywania. Kilka zestawów instrukcji zawiera pole predykatu w każdej instrukcji; nazywa się to predykacją gałęzi .

Liczba operandów

Zestawy instrukcji można podzielić na kategorie według maksymalnej liczby argumentów wyraźnie określonych w instrukcjach.

(W poniższych przykładach a , b i c są adresami (bezpośrednimi lub obliczonymi) odnoszącymi się do komórek pamięci, podczas gdy reg1 itd. odnoszą się do rejestrów maszynowych.)

C = A+B
  • 0-operand (maszyny o zerowym adresie ), tzw. maszyny stosowe : Wszystkie operacje arytmetyczne odbywają się przy użyciu jednej lub dwóch górnych pozycji na stosie: push a, push b, add, pop c.
    • C = A+Bpotrzebuje czterech instrukcji . W przypadku maszyn ze stosem terminy „operand zerowy” i „adres zerowy” odnoszą się do instrukcji arytmetycznych, ale nie do wszystkich instrukcji, ponieważ w celu uzyskania dostępu do pamięci używane są jednooperandowe instrukcje push i pop.
  • 1 argumentu ( maszyny jeden adres ), tak zwane urządzenia akumulatorowe , w tym wczesne komputery i wiele małych mikrokontrolerów : Większość instrukcji określić pojedynczy prawy operand (czyli stała, rejestr lub komórka pamięci), z niejawnego akumulatora jako lewy operand (i miejsce docelowe, jeśli istnieje): load a, add b, store c.
    • C = A+Bpotrzebuje trzech instrukcji .
  • 2-operand — wiele maszyn CISC i RISC należy do tej kategorii:
    • CISC — move Ado C ; następnie add Bdo C .
      • C = A+Bpotrzebuje dwóch instrukcji . To skutecznie „przechowuje” wynik bez wyraźnej instrukcji przechowywania .
    • CISC — Często maszyny są ograniczone do jednego operandu pamięci na instrukcję: load a,reg1; add b,reg1; store reg1,c; Wymaga to pary ładowania/przechowywania dla dowolnego przemieszczenia pamięci, niezależnie od tego, czy addwynikiem jest rozszerzenie zapisane w innym miejscu, na przykład w C = A+B, czy w tej samej lokalizacji pamięci: A = A+B.
      • C = A+Bpotrzebuje trzech instrukcji .
    • RISC — Wymaganie jawnego ładowania pamięci, instrukcje będą następujące: load a,reg1; load b,reg2; add reg1,reg2; store reg2,c.
      • C = A+Bpotrzebuje czterech instrukcji .
  • 3-operand, pozwalający na lepsze ponowne wykorzystanie danych:
    • CISC — staje się albo pojedynczą instrukcją: add a,b,c
      • C = A+Bpotrzebuje jednej instrukcji .
    • CISC — Lub, na maszynach ograniczonych do dwóch operandów pamięci na instrukcję, move a,reg1; add reg1,b,c;
      • C = A+Bpotrzebuje dwóch instrukcji .
    • RISC — instrukcje arytmetyczne używają tylko rejestrów, dlatego potrzebne są wyraźne 2-argumentowe instrukcje ładowania/przechowywania: load a,reg1; load b,reg2; add reg1+reg2->reg3; store reg3,c;
      • C = A+Bpotrzebuje czterech instrukcji .
      • W przeciwieństwie do 2-argumentu lub 1-argumentu, wszystkie trzy wartości a, b i c w rejestrach są dostępne do ponownego wykorzystania.
  • więcej operandów — niektóre maszyny CISC pozwalają na różne tryby adresowania, które pozwalają na więcej niż 3 operandy (rejestry lub dostęp do pamięci), takie jak instrukcja oceny wielomianu VAX „POLY”.

Ze względu na dużą liczbę bitów potrzebnych do zakodowania trzech rejestrów instrukcji 3-operandowej, architektury RISC, które mają instrukcje 16-bitowe, są niezmiennie konstrukcjami 2-operandowymi, takimi jak Atmel AVR, TI MSP430 i niektóre wersje ARM Thumb . Architektury RISC z 32-bitowymi instrukcjami są zwykle projektami 3-operandowymi, takimi jak architektury ARM , AVR32 , MIPS , Power ISA i SPARC .

Każda instrukcja jawnie określa pewną liczbę operandów (rejestrów, lokalizacji pamięci lub wartości bezpośrednich) . Niektóre instrukcje niejawnie podają jeden lub oba operandy, na przykład przez przechowywanie na szczycie stosu lub w niejawnym rejestrze. Jeśli niektóre operandy są podane niejawnie, w instrukcji należy podać mniej operandów. Gdy „operand docelowy” jawnie określa miejsce docelowe, należy podać dodatkowy operand. W konsekwencji liczba argumentów zakodowanych w instrukcji może różnić się od matematycznie niezbędnej liczby argumentów operacji logicznej lub arytmetycznej ( arity ). Operandy są albo zakodowane w reprezentacji „opcode” instrukcji, albo są podawane jako wartości lub adresy następujące po opcodzie.

Zarejestruj ciśnienie

Ciśnienie rejestru mierzy dostępność wolnych rejestrów w dowolnym momencie podczas wykonywania programu. Ciśnienie rejestrów jest wysokie, gdy w użyciu jest duża liczba dostępnych rejestrów; w związku z tym im wyższe ciśnienie rejestru, tym częściej zawartość rejestru musi być wyrzucana do pamięci. Zwiększenie liczby rejestrów w architekturze zmniejsza presję rejestrów, ale zwiększa koszt.

Podczas gdy wbudowane zestawy instrukcji, takie jak Thumb, cierpią z powodu bardzo wysokiego ciśnienia rejestrów, ponieważ mają małe zestawy rejestrów, ISA ogólnego przeznaczenia, takie jak MIPS i Alpha, mają niskie ciśnienie rejestrów. ISA CISC, takie jak x86-64, oferują niskie ciśnienie rejestrów, pomimo posiadania mniejszych zestawów rejestrów. Wynika to z wielu trybów adresowania i optymalizacji (takich jak adresowanie podrejestrów, operandy pamięci w instrukcjach ALU, adresowanie bezwzględne, adresowanie względem komputera PC i rozlanie między rejestrami), które oferują CISC ISA.

Długość instrukcji

Rozmiar lub długość instrukcji jest bardzo zróżnicowana, od zaledwie czterech bitów w niektórych mikrokontrolerach do setek bitów w niektórych systemach VLIW . Procesory używane w komputerach osobistych , komputerów typu mainframe oraz superkomputery mają rozmiary instrukcji pomiędzy 8 i 64 bitów. Najdłuższa możliwa instrukcja na x86 ma 15 bajtów (120 bitów). W zestawie instrukcji różne instrukcje mogą mieć różną długość. W niektórych architekturach, w szczególności w większości komputerów o zredukowanym zestawie instrukcji (RISC),instrukcje mają stałą długość , zwykle odpowiadającą wielkości słowa tej architektury. W innych architekturach instrukcje mają zmienną długość, zazwyczaj całkowitą wielokrotność bajtu lub półsłowa . Niektóre, takie jak ARM z rozszerzeniem Thumb, mają mieszane kodowanie zmiennych, czyli dwa stałe, zwykle 32-bitowe i 16-bitowe kodowania, w których instrukcje nie mogą być dowolnie mieszane, ale muszą być przełączane między gałęzią (lub granicą wyjątku w ARMv8 ).

Zestaw instrukcji RISC zwykle ma stałą długość instrukcji (często 4 bajty = 32 bity), podczas gdy typowy zestaw instrukcji CISC może mieć instrukcje o bardzo różnej długości (od 1 do 15 bajtów dla x86). Instrukcje o stałej długości są mniej skomplikowane w obsłudze niż instrukcje o zmiennej długości z kilku powodów (nie trzeba na przykład sprawdzać, czy instrukcja obejmuje linię pamięci podręcznej lub granicę strony pamięci wirtualnej), a zatem są nieco łatwiejsze do optymalizacji pod kątem szybkości.

Gęstość kodu

Na początku lat 60. w komputerach pamięć główna była droga i bardzo ograniczona, nawet na komputerach typu mainframe. Minimalizowanie rozmiaru programu w celu upewnienia się, że zmieści się on w ograniczonej pamięci, było często kluczowe. Tak więc łączny rozmiar wszystkich instrukcji potrzebnych do wykonania określonego zadania, gęstość kodu , była ważną cechą każdego zestawu instrukcji. Pozostał ważny na początkowo niewielkich pamięciach minikomputerów, a następnie mikroprocesorów. Gęstość pozostaje dziś ważna w przypadku aplikacji na smartfony, aplikacji pobieranych do przeglądarek przez wolne połączenia internetowe oraz w pamięciach ROM dla aplikacji osadzonych. Bardziej ogólną zaletą zwiększonej gęstości jest lepsza skuteczność pamięci podręcznych i wstępnego pobierania instrukcji.

Komputery o dużej gęstości kodu często mają złożone instrukcje do wprowadzania procedur, sparametryzowanych zwrotów, pętli itp. (stąd retroaktywnie nazwane Computers Complex Instruction Set , CISC ). Jednak bardziej typowe lub częste instrukcje „CISC” po prostu łączą podstawową operację ALU, taką jak „add”, z dostępem do jednego lub więcej operandów w pamięci (przy użyciu trybów adresowania, takich jak bezpośredni, pośredni, indeksowany itp.) . Niektóre architektury mogą zezwalać na dwa lub trzy operandy (w tym wynik) bezpośrednio w pamięci lub mogą być zdolne do wykonywania funkcji, takich jak automatyczne zwiększanie wskaźnika itp. Zestawy instrukcji implementowanych programowo mogą mieć jeszcze bardziej złożone i potężne instrukcje.

Zmniejszone komputery zestawu instrukcji , RISC , zostały po raz pierwszy szeroko realizowane w okresie szybko rosnących podsystemów pamięci. Poświęcają gęstość kodu, aby uprościć obwody implementacyjne i próbują zwiększyć wydajność poprzez wyższe częstotliwości taktowania i większą liczbę rejestrów. Pojedyncza instrukcja RISC zazwyczaj wykonuje tylko jedną operację, taką jak „dodawanie” rejestrów lub „ładowanie” z komórki pamięci do rejestru. Zestaw instrukcji RISC ma zwykle stałą długość instrukcji , podczas gdy typowy zestaw instrukcji CISC ma instrukcje o bardzo różnej długości. Ponieważ jednak komputery RISC zwykle wymagają większej liczby i często dłuższych instrukcji do wykonania danego zadania, z natury rzeczy mniej optymalnie wykorzystują przepustowość magistrali i pamięć podręczną.

Niektóre wbudowane ISA RISC, takie jak Thumb i AVR32, zazwyczaj wykazują bardzo wysoką gęstość dzięki technice zwanej kompresją kodu. Technika ta pakuje dwie 16-bitowe instrukcje w jedno 32-bitowe słowo, które jest następnie rozpakowywane na etapie dekodowania i wykonywane jako dwie instrukcje.

Komputery z minimalnym zestawem instrukcji (MISC) są formą maszyny stosu , w której istnieje kilka oddzielnych instrukcji (16-64), dzięki czemu wiele instrukcji można dopasować do jednego słowa maszynowego. Implementacja tego typu rdzeni często wymaga niewielkiej ilości krzemu, dzięki czemu można je łatwo zrealizować w układzie FPGA lub w postaci wielordzeniowej . Gęstość kodu MISC jest podobna do gęstości kodu RISC; zwiększona gęstość instrukcji jest równoważona przez wymaganie większej liczby podstawowych instrukcji do wykonania zadania.

Przeprowadzono badania nad kompresją plików wykonywalnych jako mechanizmem poprawy gęstości kodu. Matematyka złożoności Kołmogorowa opisuje wyzwania i ograniczenia tego.

Reprezentacja

Instrukcje tworzące program rzadko są określane za pomocą ich wewnętrznej, numerycznej postaci ( kod maszynowy ); mogą być określone przez programistów używających języka asemblerowego lub, częściej, mogą być generowane z języków programowania wysokiego poziomu przez kompilatory .

Projekt

Projektowanie zestawów instrukcji to złożone zagadnienie. W historii mikroprocesora były dwa etapy. Pierwszym z nich był CISC (Complex Instruction Set Computer), który miał wiele różnych instrukcji. Jednak w latach 70. miejsca takie jak IBM przeprowadziły badania i odkryły, że wiele instrukcji z zestawu można wyeliminować. W rezultacie powstał komputer RISC (Reduced Instruction Set Computer), architektura wykorzystująca mniejszy zestaw instrukcji. Prostszy zestaw instrukcji może oferować większe prędkości, mniejszy rozmiar procesora i mniejsze zużycie energii. Jednak bardziej złożony zestaw może zoptymalizować typowe operacje, poprawić wydajność pamięci i pamięci podręcznej lub uprościć programowanie.

Niektórzy projektanci zestawów instrukcji rezerwują jeden lub więcej opkodów dla pewnego rodzaju wywołania systemowego lub przerwania programowego . Na przykład, MOS Technology 6502 używa 00 H , Zilog Z80 używa ośmiu kodów C7,CF,D7,DF,E7,EF,F7,FF H, podczas gdy Motorola 68000 używa kodów z zakresu A000..AFFF H .

Szybkie maszyny wirtualne są znacznie łatwiejsze do wdrożenia, jeśli zestaw instrukcji spełnia wymagania wirtualizacji Popka i Goldberga .

Slajdów NOP wykorzystywane w programowaniu odporności świadomy jest o wiele łatwiejsze do wdrożenia jeśli „unprogrammed” stan pamięci jest interpretowany jako NOP .

W systemach z wieloma procesorami nieblokujące algorytmy synchronizacji są znacznie łatwiejsze do zaimplementowania, jeśli zestaw instrukcji obejmuje obsługę czegoś takiego jak „ pobierz i dodaj ”, „ warunkowe ładowanie/przechowywanie ” (LL/SC) lub „atomowe porównanie i zamiana ”.

Implementacja zestawu instrukcji

Dowolny zestaw instrukcji można zaimplementować na wiele sposobów. Wszystkie sposoby implementacji określonego zestawu instrukcji zapewniają ten sam model programowania , a wszystkie implementacje tego zestawu instrukcji mogą uruchamiać te same pliki wykonywalne. Różne sposoby implementacji zestawu instrukcji dają różne kompromisy między kosztami, wydajnością, zużyciem energii, rozmiarem itp.

Projektując mikroarchitekturę procesora, inżynierowie używają bloków „okablowanych na stałe” obwodów elektronicznych (często projektowanych osobno), takich jak sumatory, multipleksery, liczniki, rejestry, jednostki ALU itp. Do opisu często używany jest pewien rodzaj języka przesyłania rejestrów. dekodowanie i sekwencjonowanie każdej instrukcji ISA przy użyciu tej fizycznej mikroarchitektury. Istnieją dwa podstawowe sposoby zbudowania jednostki sterującej w celu realizacji tego opisu (chociaż wiele projektów wykorzystuje pośrednie sposoby lub kompromisy):

  1. Niektóre komputery projektują "hardwire" pełne dekodowanie i sekwencjonowanie zestawu instrukcji (podobnie jak reszta mikroarchitektury).
  2. Inne projekty wykorzystują w tym celu procedury lub tabele mikrokodu (lub jedno i drugie) - zwykle jako wbudowane pamięci ROM lub PLA lub oba (chociaż w przeszłości używano oddzielnych pamięci RAM i ROM ). Western Digital MCP-1600 jest starszy przykład za pomocą dedykowanego, osobna ROM dla microcode.

Niektóre projekty wykorzystują kombinację konstrukcji przewodowej i mikrokodu dla jednostki sterującej.

Niektóre projekty procesorów wykorzystują zapisywalny magazyn sterowania — kompilują zestaw instrukcji do zapisywalnej pamięci RAM lub pamięci flash wewnątrz procesora (takiego jak procesor Rekursiv i Imsys Cjip ) lub FPGA ( przetwarzanie rekonfigurowalne ).

ISA może być również emulowany w oprogramowaniu przez interpreter . Oczywiście, z powodu narzutu na interpretację, jest to wolniejsze niż bezpośrednie uruchamianie programów na emulowanym sprzęcie, chyba że sprzęt, na którym działa emulator, jest o rząd wielkości szybszy. Obecnie powszechną praktyką wśród dostawców nowych ISA lub mikroarchitektur jest udostępnianie emulatorów oprogramowania dla programistów, zanim implementacja sprzętowa będzie gotowa.

Często szczegóły implementacji mają duży wpływ na poszczególne instrukcje wybrane do zestawu instrukcji. Na przykład wiele implementacji potoku instrukcji umożliwia tylko jedno ładowanie pamięci lub przechowywanie pamięci na instrukcję, co prowadzi do architektury ładowania-magazynu (RISC). W innym przykładzie niektóre wczesne sposoby implementacji potoku instrukcji doprowadziły do ​​powstania szczeliny opóźnienia .

Wymagania dotyczące szybkiego cyfrowego przetwarzania sygnałów posunęły się w przeciwnym kierunku – wymuszając implementację instrukcji w określony sposób. Na przykład, aby wykonać filtry cyfrowe wystarczająco szybko, instrukcja MAC w typowym cyfrowym procesorze sygnałowym (DSP) musi wykorzystywać rodzaj architektury Harvarda, która może jednocześnie pobierać instrukcję i dwa słowa danych i wymaga pojedynczego cyklu mnożenia-akumulacji mnożnik .

Zobacz też

Bibliografia

Dalsza lektura

Zewnętrzne linki