4. Procesor – informacje ogólne

4.5. Lista instrukcji procesora

Poszczególne procesory mogą mieć różne listy instrukcji, które potrafią wykonać. Zazwyczaj procesory z jednej rodziny mają tą samą listę instrukcji. x86 to wspólna nazwa dla zestawu instrukcji rozumianych przez wszystkie procesory Intela i AMD do komputerów PC (instrukcje 32 bitowe), x64 – jak wyżej tylko instrukcje 64 bitowe. Istnieje też cały szereg innych zestawów instrukcji, zupełnie niekompatybilnych z powyższymi.

Historycznie rzecz ujmując, istniały różne podejścia do projektowania zestawów instrukcji i procesorów je wykonujących. Najpierw dominowało podejście, w którym wszelkie nowe operacje były implementowane jako nowe instrukcje. Zestaw instrukcji ciągle się rozrastał, jednocześnie komplikowała się struktura jednostek sterujących procesora. Jedna instrukcja mogła wykonywać kilka operacji niskiego poziomu, jak np. pobranie z pamięci, operację arytmetyczną i zapisanie wyniku w pamięci. Taki zestaw instrukcji jest nazywamy CISC (ang. Complex Instruction Set Computer). Cechy zestawu instrukcji CISC to:

  • duża liczba instrukcji,
  • mała optymalizacja – niektóre rozkazy potrzebują dużej liczby cykli zegarowych do ich wykonania,
  • występowanie złożonych, specjalistycznych rozkazów,
  • duża liczba trybów adresowania,
  • do pamięci może się odwoływać bezpośrednio duża liczba rozkazów,
  • powolne działanie dekodera rozkazów.

Jako alternatywa dla CISC, pod koniec lat 70, została zaprezentowana koncepcja zestawu instrukcji i architektury procesorów pod nazwą RISC (ang. Reduced Instruction Set Computer). Procesory działające w architekturze CISC miały bardzo rozbudowana listę rozkazów. Badanie jednak wykazały, że tylko nieliczna ich część jest wykorzystywana w statystycznym programie. Okazało się, że te najprostsze są wykonywane najczęściej. Badania wykazały, że 26-45% wykonywanych instrukcji to instrukcje wywoływania procedur i obsługi pętli, 13-15% instrukcje przypisania (operacje zapisu wartości rejestru do pamięci lub odwrotnie), 7-21% to instrukcje warunkowe, natomiast reszta to 1-3%. W związku z powyższym zaproponowano architekturę mikroprocesorów (RISC), której najważniejsze cechy to:

  • Zredukowana liczba rozkazów do niezbędnego minimum. Ich liczba wynosi kilkadziesiąt, podczas gdy w procesorach CISC sięga setek. Upraszcza to konstrukcję dekoderów instrukcji.
  • Redukcja trybów adresowania, dzięki czemu kody rozkazów są bardziej zunifikowane. Ma to na celu również uproszczenie dekodowania instrukcji.
  • Ograniczenie komunikacji pomiędzy pamięcią i procesorem. Do przesyłania danych pomiędzy pamięcią a rejestrami służą dedykowane instrukcje (load - załaduj, store - zapisz). Pozostałe instrukcje mogą operować wyłącznie na rejestrach.
  • Zwiększenie liczby rejestrów (32, 192, …), architektura x86 miała zaledwie 8 rejestrów. Ma to również ograniczyć liczbę odwołań do pamięci.
  • Dzięki przetwarzaniu potokowemu wszystkie rozkazy wykonują się w jednym cyklu maszynowym, co pozwala na uproszczenie bloku wykonawczego, a także implementację przetwarzania wielopotokowego.

Obecnie produkowane procesory Intela i AMD z punktu widzenia programisty są widziane jako CISC, ale ich jądro działa w trybie RISC. Jest to możliwe dzięki temu, że rozkazy CISC są przed wykonaniem rozbijane (sprzętowo) na mikrorozkazy RISC, które są następnie wykonywane przez bloki wykonawcze procesora.  

CISC i RISC nie są jedynymi koncepcjami budowy zestawu instrukcji i związanej z nimi architektury mikroprocesora. Jest ich znacznie więcej. Te wyżej wymienione kształtowały architekturę procesorów używanych w komputerach klasy PC. Watro jednak wymienić jeszcze jedną z tych koncepcji, a mianowicie VLIW (ang. Very Long Instruction Word). W oparciu o tą architekturę został skonstruowany procesor Intel Itanium, czyli pierwszy 64 bitowy procesor Intela. Jednak jego architektura nie pozwalała w sposób bezpośredni (i wydajny) wykonywać starych instrukcji x86. Wydaje się, że ten brak kompatybilności przyczynił się do braku popularności tego procesora. Obecnie używamy rozszerzenia x64, opracowanego przez firma AMD, które jest kompatybilne ze starymi rozkazami x86. Koncepcja VLIW opiera się, w uproszczeniu, na wykonywaniu przez procesor bardzo długich instrukcji, które są w zasadzie złożeniem wielu instrukcji prostych. O tym, jakie instrukcje są umieszczone w długim słowie decyduje kompilator. Jeśli te instrukcje da się wykonać równolegle (są one niezależne od siebie), to procesor będzie działał optymalnie i jednocześnie będzie miał znacznie prostszą konstrukcję. W procesorach CISC i RISC to procesor musi zdecydować, które instrukcje są niezależne, przewidzieć wszystkie skoki, aby program mógł być wykonywany równolegle.